119625d8cSopenharmony_ciuse clap::{arg, Arg, ArgAction, Command}; 219625d8cSopenharmony_ci 319625d8cSopenharmony_ci#[test] 419625d8cSopenharmony_cifn issue_1076() { 519625d8cSopenharmony_ci let mut cmd = Command::new("myprog") 619625d8cSopenharmony_ci .arg( 719625d8cSopenharmony_ci Arg::new("GLOBAL_ARG") 819625d8cSopenharmony_ci .long("global-arg") 919625d8cSopenharmony_ci .help("Specifies something needed by the subcommands") 1019625d8cSopenharmony_ci .global(true) 1119625d8cSopenharmony_ci .action(ArgAction::Set) 1219625d8cSopenharmony_ci .default_value("default_value"), 1319625d8cSopenharmony_ci ) 1419625d8cSopenharmony_ci .arg( 1519625d8cSopenharmony_ci Arg::new("GLOBAL_FLAG") 1619625d8cSopenharmony_ci .long("global-flag") 1719625d8cSopenharmony_ci .help("Specifies something needed by the subcommands") 1819625d8cSopenharmony_ci .global(true) 1919625d8cSopenharmony_ci .action(ArgAction::Set), 2019625d8cSopenharmony_ci ) 2119625d8cSopenharmony_ci .subcommand(Command::new("outer").subcommand(Command::new("inner"))); 2219625d8cSopenharmony_ci let _ = cmd.try_get_matches_from_mut(vec!["myprog"]); 2319625d8cSopenharmony_ci let _ = cmd.try_get_matches_from_mut(vec!["myprog"]); 2419625d8cSopenharmony_ci let _ = cmd.try_get_matches_from_mut(vec!["myprog"]); 2519625d8cSopenharmony_ci} 2619625d8cSopenharmony_ci 2719625d8cSopenharmony_ci#[test] 2819625d8cSopenharmony_cifn propagate_global_arg_in_subcommand_to_subsubcommand_1385() { 2919625d8cSopenharmony_ci let m1 = Command::new("foo") 3019625d8cSopenharmony_ci .subcommand( 3119625d8cSopenharmony_ci Command::new("sub1") 3219625d8cSopenharmony_ci .arg( 3319625d8cSopenharmony_ci Arg::new("arg1") 3419625d8cSopenharmony_ci .long("arg1") 3519625d8cSopenharmony_ci .action(ArgAction::Set) 3619625d8cSopenharmony_ci .global(true), 3719625d8cSopenharmony_ci ) 3819625d8cSopenharmony_ci .subcommand(Command::new("sub1a")), 3919625d8cSopenharmony_ci ) 4019625d8cSopenharmony_ci .try_get_matches_from(["foo", "sub1", "--arg1", "v1", "sub1a"]) 4119625d8cSopenharmony_ci .unwrap(); 4219625d8cSopenharmony_ci assert_eq!( 4319625d8cSopenharmony_ci "v1", 4419625d8cSopenharmony_ci m1.subcommand_matches("sub1") 4519625d8cSopenharmony_ci .unwrap() 4619625d8cSopenharmony_ci .subcommand_matches("sub1a") 4719625d8cSopenharmony_ci .unwrap() 4819625d8cSopenharmony_ci .get_one::<String>("arg1") 4919625d8cSopenharmony_ci .map(|v| v.as_str()) 5019625d8cSopenharmony_ci .unwrap() 5119625d8cSopenharmony_ci ); 5219625d8cSopenharmony_ci} 5319625d8cSopenharmony_ci 5419625d8cSopenharmony_ci#[test] 5519625d8cSopenharmony_cifn propagate_global_arg_to_subcommand_in_subsubcommand_2053() { 5619625d8cSopenharmony_ci let m = Command::new("opts") 5719625d8cSopenharmony_ci .arg(arg!(--"global-flag").global(true)) 5819625d8cSopenharmony_ci .arg(arg!(--"global-str" <str>).global(true)) 5919625d8cSopenharmony_ci .subcommand( 6019625d8cSopenharmony_ci Command::new("test") 6119625d8cSopenharmony_ci .arg(arg!(--"sub-flag").global(true)) 6219625d8cSopenharmony_ci .arg(arg!(--"sub-str" <str>).global(true)) 6319625d8cSopenharmony_ci .subcommand(Command::new("test")), 6419625d8cSopenharmony_ci ) 6519625d8cSopenharmony_ci .try_get_matches_from([ 6619625d8cSopenharmony_ci "cmd", 6719625d8cSopenharmony_ci "test", 6819625d8cSopenharmony_ci "test", 6919625d8cSopenharmony_ci "--global-flag", 7019625d8cSopenharmony_ci "--global-str", 7119625d8cSopenharmony_ci "hello", 7219625d8cSopenharmony_ci "--sub-flag", 7319625d8cSopenharmony_ci "--sub-str", 7419625d8cSopenharmony_ci "world", 7519625d8cSopenharmony_ci ]) 7619625d8cSopenharmony_ci .unwrap(); 7719625d8cSopenharmony_ci assert_eq!( 7819625d8cSopenharmony_ci Some("world"), 7919625d8cSopenharmony_ci m.subcommand_matches("test") 8019625d8cSopenharmony_ci .unwrap() 8119625d8cSopenharmony_ci .get_one::<String>("sub-str") 8219625d8cSopenharmony_ci .map(|v| v.as_str()) 8319625d8cSopenharmony_ci ); 8419625d8cSopenharmony_ci} 8519625d8cSopenharmony_ci 8619625d8cSopenharmony_ci#[test] 8719625d8cSopenharmony_cifn global_arg_available_in_subcommand() { 8819625d8cSopenharmony_ci let m = Command::new("opt") 8919625d8cSopenharmony_ci .args([ 9019625d8cSopenharmony_ci Arg::new("global") 9119625d8cSopenharmony_ci .global(true) 9219625d8cSopenharmony_ci .long("global") 9319625d8cSopenharmony_ci .action(ArgAction::SetTrue), 9419625d8cSopenharmony_ci Arg::new("not") 9519625d8cSopenharmony_ci .global(false) 9619625d8cSopenharmony_ci .long("not") 9719625d8cSopenharmony_ci .action(ArgAction::SetTrue), 9819625d8cSopenharmony_ci ]) 9919625d8cSopenharmony_ci .subcommand(Command::new("ping")) 10019625d8cSopenharmony_ci .try_get_matches_from(["opt", "ping", "--global"]) 10119625d8cSopenharmony_ci .unwrap(); 10219625d8cSopenharmony_ci 10319625d8cSopenharmony_ci assert!(*m.get_one::<bool>("global").expect("defaulted by clap")); 10419625d8cSopenharmony_ci assert!(*m 10519625d8cSopenharmony_ci .subcommand_matches("ping") 10619625d8cSopenharmony_ci .unwrap() 10719625d8cSopenharmony_ci .get_one::<bool>("global") 10819625d8cSopenharmony_ci .expect("defaulted by clap")); 10919625d8cSopenharmony_ci} 11019625d8cSopenharmony_ci 11119625d8cSopenharmony_ci#[test] 11219625d8cSopenharmony_cifn deeply_nested_discovery() { 11319625d8cSopenharmony_ci let cmd = Command::new("a") 11419625d8cSopenharmony_ci .arg(arg!(--"long-a").global(true).action(ArgAction::SetTrue)) 11519625d8cSopenharmony_ci .subcommand( 11619625d8cSopenharmony_ci Command::new("b") 11719625d8cSopenharmony_ci .arg(arg!(--"long-b").global(true).action(ArgAction::SetTrue)) 11819625d8cSopenharmony_ci .subcommand( 11919625d8cSopenharmony_ci Command::new("c") 12019625d8cSopenharmony_ci .arg(arg!(--"long-c").global(true).action(ArgAction::SetTrue)) 12119625d8cSopenharmony_ci .subcommand(Command::new("d")), 12219625d8cSopenharmony_ci ), 12319625d8cSopenharmony_ci ); 12419625d8cSopenharmony_ci 12519625d8cSopenharmony_ci let m = cmd 12619625d8cSopenharmony_ci .try_get_matches_from(["a", "b", "c", "d", "--long-a", "--long-b", "--long-c"]) 12719625d8cSopenharmony_ci .unwrap(); 12819625d8cSopenharmony_ci assert!(*m.get_one::<bool>("long-a").expect("defaulted by clap")); 12919625d8cSopenharmony_ci let m = m.subcommand_matches("b").unwrap(); 13019625d8cSopenharmony_ci assert!(*m.get_one::<bool>("long-b").expect("defaulted by clap")); 13119625d8cSopenharmony_ci let m = m.subcommand_matches("c").unwrap(); 13219625d8cSopenharmony_ci assert!(*m.get_one::<bool>("long-c").expect("defaulted by clap")); 13319625d8cSopenharmony_ci} 13419625d8cSopenharmony_ci 13519625d8cSopenharmony_ci#[test] 13619625d8cSopenharmony_cifn global_overrides_default() { 13719625d8cSopenharmony_ci let cmd = Command::new("test") 13819625d8cSopenharmony_ci .arg( 13919625d8cSopenharmony_ci Arg::new("name") 14019625d8cSopenharmony_ci .long("name") 14119625d8cSopenharmony_ci .global(true) 14219625d8cSopenharmony_ci .action(ArgAction::Set) 14319625d8cSopenharmony_ci .default_value("from_default"), 14419625d8cSopenharmony_ci ) 14519625d8cSopenharmony_ci .subcommand(Command::new("sub")); 14619625d8cSopenharmony_ci 14719625d8cSopenharmony_ci let m = cmd.clone().try_get_matches_from(["test"]).unwrap(); 14819625d8cSopenharmony_ci assert_eq!( 14919625d8cSopenharmony_ci m.get_one::<String>("name").unwrap().as_str(), 15019625d8cSopenharmony_ci "from_default" 15119625d8cSopenharmony_ci ); 15219625d8cSopenharmony_ci 15319625d8cSopenharmony_ci let m = cmd 15419625d8cSopenharmony_ci .clone() 15519625d8cSopenharmony_ci .try_get_matches_from(["test", "--name", "from_arg"]) 15619625d8cSopenharmony_ci .unwrap(); 15719625d8cSopenharmony_ci assert_eq!(m.get_one::<String>("name").unwrap().as_str(), "from_arg"); 15819625d8cSopenharmony_ci 15919625d8cSopenharmony_ci let m = cmd 16019625d8cSopenharmony_ci .clone() 16119625d8cSopenharmony_ci .try_get_matches_from(["test", "--name", "from_arg", "sub"]) 16219625d8cSopenharmony_ci .unwrap(); 16319625d8cSopenharmony_ci assert_eq!(m.get_one::<String>("name").unwrap().as_str(), "from_arg"); 16419625d8cSopenharmony_ci 16519625d8cSopenharmony_ci let m = cmd 16619625d8cSopenharmony_ci .clone() 16719625d8cSopenharmony_ci .try_get_matches_from(["test", "sub", "--name", "from_arg"]) 16819625d8cSopenharmony_ci .unwrap(); 16919625d8cSopenharmony_ci assert_eq!(m.get_one::<String>("name").unwrap().as_str(), "from_arg"); 17019625d8cSopenharmony_ci} 17119625d8cSopenharmony_ci 17219625d8cSopenharmony_ci#[test] 17319625d8cSopenharmony_ci#[cfg(feature = "env")] 17419625d8cSopenharmony_cifn global_overrides_env() { 17519625d8cSopenharmony_ci std::env::set_var("GLOBAL_OVERRIDES_ENV", "from_env"); 17619625d8cSopenharmony_ci 17719625d8cSopenharmony_ci let cmd = Command::new("test") 17819625d8cSopenharmony_ci .arg( 17919625d8cSopenharmony_ci Arg::new("name") 18019625d8cSopenharmony_ci .long("name") 18119625d8cSopenharmony_ci .global(true) 18219625d8cSopenharmony_ci .action(ArgAction::Set) 18319625d8cSopenharmony_ci .env("GLOBAL_OVERRIDES_ENV"), 18419625d8cSopenharmony_ci ) 18519625d8cSopenharmony_ci .subcommand(Command::new("sub")); 18619625d8cSopenharmony_ci 18719625d8cSopenharmony_ci let m = cmd.clone().try_get_matches_from(["test"]).unwrap(); 18819625d8cSopenharmony_ci assert_eq!(m.get_one::<String>("name").unwrap().as_str(), "from_env"); 18919625d8cSopenharmony_ci 19019625d8cSopenharmony_ci let m = cmd 19119625d8cSopenharmony_ci .clone() 19219625d8cSopenharmony_ci .try_get_matches_from(["test", "--name", "from_arg"]) 19319625d8cSopenharmony_ci .unwrap(); 19419625d8cSopenharmony_ci assert_eq!(m.get_one::<String>("name").unwrap().as_str(), "from_arg"); 19519625d8cSopenharmony_ci 19619625d8cSopenharmony_ci let m = cmd 19719625d8cSopenharmony_ci .clone() 19819625d8cSopenharmony_ci .try_get_matches_from(["test", "--name", "from_arg", "sub"]) 19919625d8cSopenharmony_ci .unwrap(); 20019625d8cSopenharmony_ci assert_eq!(m.get_one::<String>("name").unwrap().as_str(), "from_arg"); 20119625d8cSopenharmony_ci 20219625d8cSopenharmony_ci let m = cmd 20319625d8cSopenharmony_ci .clone() 20419625d8cSopenharmony_ci .try_get_matches_from(["test", "sub", "--name", "from_arg"]) 20519625d8cSopenharmony_ci .unwrap(); 20619625d8cSopenharmony_ci assert_eq!(m.get_one::<String>("name").unwrap().as_str(), "from_arg"); 20719625d8cSopenharmony_ci} 208