119625d8cSopenharmony_ciuse clap::{arg, error::ErrorKind, Arg, ArgAction, Command}; 219625d8cSopenharmony_ci 319625d8cSopenharmony_ciuse super::utils; 419625d8cSopenharmony_ci 519625d8cSopenharmony_ci#[test] 619625d8cSopenharmony_cifn subcommand() { 719625d8cSopenharmony_ci let m = Command::new("test") 819625d8cSopenharmony_ci .subcommand( 919625d8cSopenharmony_ci Command::new("some").arg( 1019625d8cSopenharmony_ci Arg::new("test") 1119625d8cSopenharmony_ci .short('t') 1219625d8cSopenharmony_ci .long("test") 1319625d8cSopenharmony_ci .action(ArgAction::Set) 1419625d8cSopenharmony_ci .help("testing testing"), 1519625d8cSopenharmony_ci ), 1619625d8cSopenharmony_ci ) 1719625d8cSopenharmony_ci .arg(Arg::new("other").long("other")) 1819625d8cSopenharmony_ci .try_get_matches_from(vec!["myprog", "some", "--test", "testing"]) 1919625d8cSopenharmony_ci .unwrap(); 2019625d8cSopenharmony_ci 2119625d8cSopenharmony_ci assert_eq!(m.subcommand_name().unwrap(), "some"); 2219625d8cSopenharmony_ci let sub_m = m.subcommand_matches("some").unwrap(); 2319625d8cSopenharmony_ci assert!(sub_m.contains_id("test")); 2419625d8cSopenharmony_ci assert_eq!( 2519625d8cSopenharmony_ci sub_m.get_one::<String>("test").map(|v| v.as_str()).unwrap(), 2619625d8cSopenharmony_ci "testing" 2719625d8cSopenharmony_ci ); 2819625d8cSopenharmony_ci} 2919625d8cSopenharmony_ci 3019625d8cSopenharmony_ci#[test] 3119625d8cSopenharmony_cifn subcommand_none_given() { 3219625d8cSopenharmony_ci let m = Command::new("test") 3319625d8cSopenharmony_ci .subcommand( 3419625d8cSopenharmony_ci Command::new("some").arg( 3519625d8cSopenharmony_ci Arg::new("test") 3619625d8cSopenharmony_ci .short('t') 3719625d8cSopenharmony_ci .long("test") 3819625d8cSopenharmony_ci .action(ArgAction::Set) 3919625d8cSopenharmony_ci .help("testing testing"), 4019625d8cSopenharmony_ci ), 4119625d8cSopenharmony_ci ) 4219625d8cSopenharmony_ci .arg(Arg::new("other").long("other")) 4319625d8cSopenharmony_ci .try_get_matches_from(vec![""]) 4419625d8cSopenharmony_ci .unwrap(); 4519625d8cSopenharmony_ci 4619625d8cSopenharmony_ci assert!(m.subcommand_name().is_none()); 4719625d8cSopenharmony_ci} 4819625d8cSopenharmony_ci 4919625d8cSopenharmony_ci#[test] 5019625d8cSopenharmony_cifn subcommand_multiple() { 5119625d8cSopenharmony_ci let m = Command::new("test") 5219625d8cSopenharmony_ci .subcommands(vec![ 5319625d8cSopenharmony_ci Command::new("some").arg( 5419625d8cSopenharmony_ci Arg::new("test") 5519625d8cSopenharmony_ci .short('t') 5619625d8cSopenharmony_ci .long("test") 5719625d8cSopenharmony_ci .action(ArgAction::Set) 5819625d8cSopenharmony_ci .help("testing testing"), 5919625d8cSopenharmony_ci ), 6019625d8cSopenharmony_ci Command::new("add").arg(Arg::new("roster").short('r')), 6119625d8cSopenharmony_ci ]) 6219625d8cSopenharmony_ci .arg(Arg::new("other").long("other")) 6319625d8cSopenharmony_ci .try_get_matches_from(vec!["myprog", "some", "--test", "testing"]) 6419625d8cSopenharmony_ci .unwrap(); 6519625d8cSopenharmony_ci 6619625d8cSopenharmony_ci assert!(m.subcommand_matches("some").is_some()); 6719625d8cSopenharmony_ci assert!(m.subcommand_matches("add").is_none()); 6819625d8cSopenharmony_ci assert_eq!(m.subcommand_name().unwrap(), "some"); 6919625d8cSopenharmony_ci let sub_m = m.subcommand_matches("some").unwrap(); 7019625d8cSopenharmony_ci assert!(sub_m.contains_id("test")); 7119625d8cSopenharmony_ci assert_eq!( 7219625d8cSopenharmony_ci sub_m.get_one::<String>("test").map(|v| v.as_str()).unwrap(), 7319625d8cSopenharmony_ci "testing" 7419625d8cSopenharmony_ci ); 7519625d8cSopenharmony_ci} 7619625d8cSopenharmony_ci 7719625d8cSopenharmony_ci#[test] 7819625d8cSopenharmony_cifn single_alias() { 7919625d8cSopenharmony_ci let m = Command::new("myprog") 8019625d8cSopenharmony_ci .subcommand(Command::new("test").alias("do-stuff")) 8119625d8cSopenharmony_ci .try_get_matches_from(vec!["myprog", "do-stuff"]) 8219625d8cSopenharmony_ci .unwrap(); 8319625d8cSopenharmony_ci assert_eq!(m.subcommand_name(), Some("test")); 8419625d8cSopenharmony_ci} 8519625d8cSopenharmony_ci 8619625d8cSopenharmony_ci#[test] 8719625d8cSopenharmony_cifn multiple_aliases() { 8819625d8cSopenharmony_ci let m = Command::new("myprog") 8919625d8cSopenharmony_ci .subcommand(Command::new("test").aliases(["do-stuff", "test-stuff"])) 9019625d8cSopenharmony_ci .try_get_matches_from(vec!["myprog", "test-stuff"]) 9119625d8cSopenharmony_ci .unwrap(); 9219625d8cSopenharmony_ci assert_eq!(m.subcommand_name(), Some("test")); 9319625d8cSopenharmony_ci} 9419625d8cSopenharmony_ci 9519625d8cSopenharmony_ci#[test] 9619625d8cSopenharmony_ci#[cfg(feature = "suggestions")] 9719625d8cSopenharmony_ci#[cfg(feature = "error-context")] 9819625d8cSopenharmony_cifn subcmd_did_you_mean_output() { 9919625d8cSopenharmony_ci #[cfg(feature = "suggestions")] 10019625d8cSopenharmony_ci static DYM_SUBCMD: &str = "\ 10119625d8cSopenharmony_cierror: unrecognized subcommand 'subcm' 10219625d8cSopenharmony_ci 10319625d8cSopenharmony_ci note: subcommand 'subcmd' exists 10419625d8cSopenharmony_ci note: to pass 'subcm' as a value, use 'dym -- subcm' 10519625d8cSopenharmony_ci 10619625d8cSopenharmony_ciUsage: dym [COMMAND] 10719625d8cSopenharmony_ci 10819625d8cSopenharmony_ciFor more information, try '--help'. 10919625d8cSopenharmony_ci"; 11019625d8cSopenharmony_ci 11119625d8cSopenharmony_ci let cmd = Command::new("dym").subcommand(Command::new("subcmd")); 11219625d8cSopenharmony_ci utils::assert_output(cmd, "dym subcm", DYM_SUBCMD, true); 11319625d8cSopenharmony_ci} 11419625d8cSopenharmony_ci 11519625d8cSopenharmony_ci#[test] 11619625d8cSopenharmony_ci#[cfg(feature = "suggestions")] 11719625d8cSopenharmony_ci#[cfg(feature = "error-context")] 11819625d8cSopenharmony_cifn subcmd_did_you_mean_output_ambiguous() { 11919625d8cSopenharmony_ci #[cfg(feature = "suggestions")] 12019625d8cSopenharmony_ci static DYM_SUBCMD_AMBIGUOUS: &str = "\ 12119625d8cSopenharmony_cierror: unrecognized subcommand 'te' 12219625d8cSopenharmony_ci 12319625d8cSopenharmony_ci note: subcommands 'test', 'temp' exist 12419625d8cSopenharmony_ci note: to pass 'te' as a value, use 'dym -- te' 12519625d8cSopenharmony_ci 12619625d8cSopenharmony_ciUsage: dym [COMMAND] 12719625d8cSopenharmony_ci 12819625d8cSopenharmony_ciFor more information, try '--help'. 12919625d8cSopenharmony_ci"; 13019625d8cSopenharmony_ci 13119625d8cSopenharmony_ci let cmd = Command::new("dym") 13219625d8cSopenharmony_ci .subcommand(Command::new("test")) 13319625d8cSopenharmony_ci .subcommand(Command::new("temp")); 13419625d8cSopenharmony_ci utils::assert_output(cmd, "dym te", DYM_SUBCMD_AMBIGUOUS, true); 13519625d8cSopenharmony_ci} 13619625d8cSopenharmony_ci 13719625d8cSopenharmony_ci#[test] 13819625d8cSopenharmony_ci#[cfg(feature = "suggestions")] 13919625d8cSopenharmony_ci#[cfg(feature = "error-context")] 14019625d8cSopenharmony_cifn subcmd_did_you_mean_output_arg() { 14119625d8cSopenharmony_ci static EXPECTED: &str = "\ 14219625d8cSopenharmony_cierror: unexpected argument '--subcmarg' found 14319625d8cSopenharmony_ci 14419625d8cSopenharmony_ci note: 'subcmd --subcmdarg' exists 14519625d8cSopenharmony_ci 14619625d8cSopenharmony_ciUsage: dym [COMMAND] 14719625d8cSopenharmony_ci 14819625d8cSopenharmony_ciFor more information, try '--help'. 14919625d8cSopenharmony_ci"; 15019625d8cSopenharmony_ci 15119625d8cSopenharmony_ci let cmd = Command::new("dym") 15219625d8cSopenharmony_ci .subcommand(Command::new("subcmd").arg(arg!(-s --subcmdarg <subcmdarg> "tests"))); 15319625d8cSopenharmony_ci 15419625d8cSopenharmony_ci utils::assert_output(cmd, "dym --subcmarg subcmd", EXPECTED, true); 15519625d8cSopenharmony_ci} 15619625d8cSopenharmony_ci 15719625d8cSopenharmony_ci#[test] 15819625d8cSopenharmony_ci#[cfg(feature = "suggestions")] 15919625d8cSopenharmony_ci#[cfg(feature = "error-context")] 16019625d8cSopenharmony_cifn subcmd_did_you_mean_output_arg_false_positives() { 16119625d8cSopenharmony_ci static EXPECTED: &str = "\ 16219625d8cSopenharmony_cierror: unexpected argument '--subcmarg' found 16319625d8cSopenharmony_ci 16419625d8cSopenharmony_ciUsage: dym [COMMAND] 16519625d8cSopenharmony_ci 16619625d8cSopenharmony_ciFor more information, try '--help'. 16719625d8cSopenharmony_ci"; 16819625d8cSopenharmony_ci 16919625d8cSopenharmony_ci let cmd = Command::new("dym") 17019625d8cSopenharmony_ci .subcommand(Command::new("subcmd").arg(arg!(-s --subcmdarg <subcmdarg> "tests"))); 17119625d8cSopenharmony_ci 17219625d8cSopenharmony_ci utils::assert_output(cmd, "dym --subcmarg foo", EXPECTED, true); 17319625d8cSopenharmony_ci} 17419625d8cSopenharmony_ci 17519625d8cSopenharmony_ci#[test] 17619625d8cSopenharmony_cifn alias_help() { 17719625d8cSopenharmony_ci let m = Command::new("myprog") 17819625d8cSopenharmony_ci .subcommand(Command::new("test").alias("do-stuff")) 17919625d8cSopenharmony_ci .try_get_matches_from(vec!["myprog", "help", "do-stuff"]); 18019625d8cSopenharmony_ci assert!(m.is_err()); 18119625d8cSopenharmony_ci assert_eq!(m.unwrap_err().kind(), ErrorKind::DisplayHelp); 18219625d8cSopenharmony_ci} 18319625d8cSopenharmony_ci 18419625d8cSopenharmony_ci#[test] 18519625d8cSopenharmony_cifn visible_aliases_help_output() { 18619625d8cSopenharmony_ci static VISIBLE_ALIAS_HELP: &str = "\ 18719625d8cSopenharmony_ciUsage: clap-test [COMMAND] 18819625d8cSopenharmony_ci 18919625d8cSopenharmony_ciCommands: 19019625d8cSopenharmony_ci test Some help [aliases: dongle, done] 19119625d8cSopenharmony_ci help Print this message or the help of the given subcommand(s) 19219625d8cSopenharmony_ci 19319625d8cSopenharmony_ciOptions: 19419625d8cSopenharmony_ci -h, --help Print help 19519625d8cSopenharmony_ci -V, --version Print version 19619625d8cSopenharmony_ci"; 19719625d8cSopenharmony_ci 19819625d8cSopenharmony_ci let cmd = Command::new("clap-test").version("2.6").subcommand( 19919625d8cSopenharmony_ci Command::new("test") 20019625d8cSopenharmony_ci .about("Some help") 20119625d8cSopenharmony_ci .alias("invisible") 20219625d8cSopenharmony_ci .visible_alias("dongle") 20319625d8cSopenharmony_ci .visible_alias("done"), 20419625d8cSopenharmony_ci ); 20519625d8cSopenharmony_ci utils::assert_output(cmd, "clap-test --help", VISIBLE_ALIAS_HELP, false); 20619625d8cSopenharmony_ci} 20719625d8cSopenharmony_ci 20819625d8cSopenharmony_ci#[test] 20919625d8cSopenharmony_cifn invisible_aliases_help_output() { 21019625d8cSopenharmony_ci static INVISIBLE_ALIAS_HELP: &str = "\ 21119625d8cSopenharmony_ciUsage: clap-test [COMMAND] 21219625d8cSopenharmony_ci 21319625d8cSopenharmony_ciCommands: 21419625d8cSopenharmony_ci test Some help 21519625d8cSopenharmony_ci help Print this message or the help of the given subcommand(s) 21619625d8cSopenharmony_ci 21719625d8cSopenharmony_ciOptions: 21819625d8cSopenharmony_ci -h, --help Print help 21919625d8cSopenharmony_ci -V, --version Print version 22019625d8cSopenharmony_ci"; 22119625d8cSopenharmony_ci 22219625d8cSopenharmony_ci let cmd = Command::new("clap-test") 22319625d8cSopenharmony_ci .version("2.6") 22419625d8cSopenharmony_ci .subcommand(Command::new("test").about("Some help").alias("invisible")); 22519625d8cSopenharmony_ci utils::assert_output(cmd, "clap-test --help", INVISIBLE_ALIAS_HELP, false); 22619625d8cSopenharmony_ci} 22719625d8cSopenharmony_ci 22819625d8cSopenharmony_ci#[test] 22919625d8cSopenharmony_ci#[cfg(feature = "unstable-replace")] 23019625d8cSopenharmony_cifn replace() { 23119625d8cSopenharmony_ci let m = Command::new("prog") 23219625d8cSopenharmony_ci .subcommand( 23319625d8cSopenharmony_ci Command::new("module").subcommand(Command::new("install").about("Install module")), 23419625d8cSopenharmony_ci ) 23519625d8cSopenharmony_ci .replace("install", ["module", "install"]) 23619625d8cSopenharmony_ci .try_get_matches_from(vec!["prog", "install"]) 23719625d8cSopenharmony_ci .unwrap(); 23819625d8cSopenharmony_ci 23919625d8cSopenharmony_ci assert_eq!(m.subcommand_name(), Some("module")); 24019625d8cSopenharmony_ci assert_eq!( 24119625d8cSopenharmony_ci m.subcommand_matches("module").unwrap().subcommand_name(), 24219625d8cSopenharmony_ci Some("install") 24319625d8cSopenharmony_ci ); 24419625d8cSopenharmony_ci} 24519625d8cSopenharmony_ci 24619625d8cSopenharmony_ci#[test] 24719625d8cSopenharmony_cifn issue_1031_args_with_same_name() { 24819625d8cSopenharmony_ci let res = Command::new("prog") 24919625d8cSopenharmony_ci .arg(arg!(--"ui-path" <PATH>).required(true)) 25019625d8cSopenharmony_ci .subcommand(Command::new("signer")) 25119625d8cSopenharmony_ci .try_get_matches_from(vec!["prog", "--ui-path", "signer"]); 25219625d8cSopenharmony_ci 25319625d8cSopenharmony_ci assert!(res.is_ok(), "{:?}", res.unwrap_err().kind()); 25419625d8cSopenharmony_ci let m = res.unwrap(); 25519625d8cSopenharmony_ci assert_eq!( 25619625d8cSopenharmony_ci m.get_one::<String>("ui-path").map(|v| v.as_str()), 25719625d8cSopenharmony_ci Some("signer") 25819625d8cSopenharmony_ci ); 25919625d8cSopenharmony_ci} 26019625d8cSopenharmony_ci 26119625d8cSopenharmony_ci#[test] 26219625d8cSopenharmony_cifn issue_1031_args_with_same_name_no_more_vals() { 26319625d8cSopenharmony_ci let res = Command::new("prog") 26419625d8cSopenharmony_ci .arg(arg!(--"ui-path" <PATH>).required(true)) 26519625d8cSopenharmony_ci .subcommand(Command::new("signer")) 26619625d8cSopenharmony_ci .try_get_matches_from(vec!["prog", "--ui-path", "value", "signer"]); 26719625d8cSopenharmony_ci 26819625d8cSopenharmony_ci assert!(res.is_ok(), "{:?}", res.unwrap_err().kind()); 26919625d8cSopenharmony_ci let m = res.unwrap(); 27019625d8cSopenharmony_ci assert_eq!( 27119625d8cSopenharmony_ci m.get_one::<String>("ui-path").map(|v| v.as_str()), 27219625d8cSopenharmony_ci Some("value") 27319625d8cSopenharmony_ci ); 27419625d8cSopenharmony_ci assert_eq!(m.subcommand_name(), Some("signer")); 27519625d8cSopenharmony_ci} 27619625d8cSopenharmony_ci 27719625d8cSopenharmony_ci#[test] 27819625d8cSopenharmony_cifn issue_1161_multiple_hyphen_hyphen() { 27919625d8cSopenharmony_ci // from example 22 28019625d8cSopenharmony_ci let res = Command::new("myprog") 28119625d8cSopenharmony_ci .arg(Arg::new("eff").short('f')) 28219625d8cSopenharmony_ci .arg(Arg::new("pea").short('p').action(ArgAction::Set)) 28319625d8cSopenharmony_ci .arg( 28419625d8cSopenharmony_ci Arg::new("slop") 28519625d8cSopenharmony_ci .action(ArgAction::Set) 28619625d8cSopenharmony_ci .num_args(1..) 28719625d8cSopenharmony_ci .last(true), 28819625d8cSopenharmony_ci ) 28919625d8cSopenharmony_ci .try_get_matches_from(vec![ 29019625d8cSopenharmony_ci "-f", 29119625d8cSopenharmony_ci "-p=bob", 29219625d8cSopenharmony_ci "--", 29319625d8cSopenharmony_ci "sloppy", 29419625d8cSopenharmony_ci "slop", 29519625d8cSopenharmony_ci "-a", 29619625d8cSopenharmony_ci "--", 29719625d8cSopenharmony_ci "subprogram", 29819625d8cSopenharmony_ci "position", 29919625d8cSopenharmony_ci "args", 30019625d8cSopenharmony_ci ]); 30119625d8cSopenharmony_ci 30219625d8cSopenharmony_ci assert!(res.is_ok(), "{:?}", res.unwrap_err().kind()); 30319625d8cSopenharmony_ci let m = res.unwrap(); 30419625d8cSopenharmony_ci 30519625d8cSopenharmony_ci let expected = Some(vec![ 30619625d8cSopenharmony_ci "sloppy", 30719625d8cSopenharmony_ci "slop", 30819625d8cSopenharmony_ci "-a", 30919625d8cSopenharmony_ci "--", 31019625d8cSopenharmony_ci "subprogram", 31119625d8cSopenharmony_ci "position", 31219625d8cSopenharmony_ci "args", 31319625d8cSopenharmony_ci ]); 31419625d8cSopenharmony_ci let actual = m 31519625d8cSopenharmony_ci .get_many::<String>("slop") 31619625d8cSopenharmony_ci .map(|vals| vals.map(|s| s.as_str()).collect::<Vec<_>>()); 31719625d8cSopenharmony_ci 31819625d8cSopenharmony_ci assert_eq!(expected, actual); 31919625d8cSopenharmony_ci} 32019625d8cSopenharmony_ci 32119625d8cSopenharmony_ci#[test] 32219625d8cSopenharmony_cifn issue_1722_not_emit_error_when_arg_follows_similar_to_a_subcommand() { 32319625d8cSopenharmony_ci let m = Command::new("myprog") 32419625d8cSopenharmony_ci .subcommand(Command::new("subcommand")) 32519625d8cSopenharmony_ci .arg(Arg::new("argument")) 32619625d8cSopenharmony_ci .try_get_matches_from(vec!["myprog", "--", "subcommand"]); 32719625d8cSopenharmony_ci assert_eq!( 32819625d8cSopenharmony_ci m.unwrap().get_one::<String>("argument").map(|v| v.as_str()), 32919625d8cSopenharmony_ci Some("subcommand") 33019625d8cSopenharmony_ci ); 33119625d8cSopenharmony_ci} 33219625d8cSopenharmony_ci 33319625d8cSopenharmony_ci#[test] 33419625d8cSopenharmony_cifn subcommand_placeholder_test() { 33519625d8cSopenharmony_ci let mut cmd = Command::new("myprog") 33619625d8cSopenharmony_ci .subcommand(Command::new("subcommand")) 33719625d8cSopenharmony_ci .subcommand_value_name("TEST_PLACEHOLDER") 33819625d8cSopenharmony_ci .subcommand_help_heading("TEST_HEADER"); 33919625d8cSopenharmony_ci 34019625d8cSopenharmony_ci assert_eq!( 34119625d8cSopenharmony_ci &cmd.render_usage().to_string(), 34219625d8cSopenharmony_ci "Usage: myprog [TEST_PLACEHOLDER]" 34319625d8cSopenharmony_ci ); 34419625d8cSopenharmony_ci 34519625d8cSopenharmony_ci let help_text = cmd.render_help().to_string(); 34619625d8cSopenharmony_ci 34719625d8cSopenharmony_ci assert!(help_text.contains("TEST_HEADER:")); 34819625d8cSopenharmony_ci} 34919625d8cSopenharmony_ci 35019625d8cSopenharmony_ci#[test] 35119625d8cSopenharmony_ci#[cfg(feature = "error-context")] 35219625d8cSopenharmony_cifn subcommand_used_after_double_dash() { 35319625d8cSopenharmony_ci static SUBCMD_AFTER_DOUBLE_DASH: &str = "\ 35419625d8cSopenharmony_cierror: unexpected argument 'subcmd' found 35519625d8cSopenharmony_ci 35619625d8cSopenharmony_ci note: subcommand 'subcmd' exists; to use it, remove the '--' before it 35719625d8cSopenharmony_ci 35819625d8cSopenharmony_ciUsage: cmd [COMMAND] 35919625d8cSopenharmony_ci 36019625d8cSopenharmony_ciFor more information, try '--help'. 36119625d8cSopenharmony_ci"; 36219625d8cSopenharmony_ci 36319625d8cSopenharmony_ci let cmd = Command::new("cmd").subcommand(Command::new("subcmd")); 36419625d8cSopenharmony_ci 36519625d8cSopenharmony_ci utils::assert_output(cmd, "cmd -- subcmd", SUBCMD_AFTER_DOUBLE_DASH, true); 36619625d8cSopenharmony_ci} 36719625d8cSopenharmony_ci 36819625d8cSopenharmony_ci#[test] 36919625d8cSopenharmony_cifn subcommand_after_argument() { 37019625d8cSopenharmony_ci let m = Command::new("myprog") 37119625d8cSopenharmony_ci .arg(Arg::new("some_text")) 37219625d8cSopenharmony_ci .subcommand(Command::new("test")) 37319625d8cSopenharmony_ci .try_get_matches_from(vec!["myprog", "teat", "test"]) 37419625d8cSopenharmony_ci .unwrap(); 37519625d8cSopenharmony_ci assert_eq!( 37619625d8cSopenharmony_ci m.get_one::<String>("some_text").map(|v| v.as_str()), 37719625d8cSopenharmony_ci Some("teat") 37819625d8cSopenharmony_ci ); 37919625d8cSopenharmony_ci assert_eq!(m.subcommand().unwrap().0, "test"); 38019625d8cSopenharmony_ci} 38119625d8cSopenharmony_ci 38219625d8cSopenharmony_ci#[test] 38319625d8cSopenharmony_cifn subcommand_after_argument_looks_like_help() { 38419625d8cSopenharmony_ci let m = Command::new("myprog") 38519625d8cSopenharmony_ci .arg(Arg::new("some_text")) 38619625d8cSopenharmony_ci .subcommand(Command::new("test")) 38719625d8cSopenharmony_ci .try_get_matches_from(vec!["myprog", "helt", "test"]) 38819625d8cSopenharmony_ci .unwrap(); 38919625d8cSopenharmony_ci assert_eq!( 39019625d8cSopenharmony_ci m.get_one::<String>("some_text").map(|v| v.as_str()), 39119625d8cSopenharmony_ci Some("helt") 39219625d8cSopenharmony_ci ); 39319625d8cSopenharmony_ci assert_eq!(m.subcommand().unwrap().0, "test"); 39419625d8cSopenharmony_ci} 39519625d8cSopenharmony_ci 39619625d8cSopenharmony_ci#[test] 39719625d8cSopenharmony_cifn issue_2494_subcommand_is_present() { 39819625d8cSopenharmony_ci let cmd = Command::new("opt") 39919625d8cSopenharmony_ci .arg(Arg::new("global").long("global").action(ArgAction::SetTrue)) 40019625d8cSopenharmony_ci .subcommand(Command::new("global")); 40119625d8cSopenharmony_ci 40219625d8cSopenharmony_ci let m = cmd 40319625d8cSopenharmony_ci .clone() 40419625d8cSopenharmony_ci .try_get_matches_from(["opt", "--global", "global"]) 40519625d8cSopenharmony_ci .unwrap(); 40619625d8cSopenharmony_ci assert_eq!(m.subcommand_name().unwrap(), "global"); 40719625d8cSopenharmony_ci assert!(*m.get_one::<bool>("global").expect("defaulted by clap")); 40819625d8cSopenharmony_ci 40919625d8cSopenharmony_ci let m = cmd 41019625d8cSopenharmony_ci .clone() 41119625d8cSopenharmony_ci .try_get_matches_from(["opt", "--global"]) 41219625d8cSopenharmony_ci .unwrap(); 41319625d8cSopenharmony_ci assert!(m.subcommand_name().is_none()); 41419625d8cSopenharmony_ci assert!(*m.get_one::<bool>("global").expect("defaulted by clap")); 41519625d8cSopenharmony_ci 41619625d8cSopenharmony_ci let m = cmd.try_get_matches_from(["opt", "global"]).unwrap(); 41719625d8cSopenharmony_ci assert_eq!(m.subcommand_name().unwrap(), "global"); 41819625d8cSopenharmony_ci assert!(!*m.get_one::<bool>("global").expect("defaulted by clap")); 41919625d8cSopenharmony_ci} 42019625d8cSopenharmony_ci 42119625d8cSopenharmony_ci#[test] 42219625d8cSopenharmony_ci#[cfg(feature = "error-context")] 42319625d8cSopenharmony_cifn subcommand_not_recognized() { 42419625d8cSopenharmony_ci let cmd = Command::new("fake") 42519625d8cSopenharmony_ci .subcommand(Command::new("sub")) 42619625d8cSopenharmony_ci .disable_help_subcommand(true) 42719625d8cSopenharmony_ci .infer_subcommands(true); 42819625d8cSopenharmony_ci utils::assert_output( 42919625d8cSopenharmony_ci cmd, 43019625d8cSopenharmony_ci "fake help", 43119625d8cSopenharmony_ci "error: unrecognized subcommand 'help' 43219625d8cSopenharmony_ci 43319625d8cSopenharmony_ciUsage: fake [COMMAND] 43419625d8cSopenharmony_ci 43519625d8cSopenharmony_ciFor more information, try '--help'. 43619625d8cSopenharmony_ci", 43719625d8cSopenharmony_ci true, 43819625d8cSopenharmony_ci ); 43919625d8cSopenharmony_ci} 44019625d8cSopenharmony_ci 44119625d8cSopenharmony_ci#[test] 44219625d8cSopenharmony_cifn busybox_like_multicall() { 44319625d8cSopenharmony_ci fn applet_commands() -> [Command; 2] { 44419625d8cSopenharmony_ci [Command::new("true"), Command::new("false")] 44519625d8cSopenharmony_ci } 44619625d8cSopenharmony_ci let cmd = Command::new("busybox") 44719625d8cSopenharmony_ci .multicall(true) 44819625d8cSopenharmony_ci .subcommand(Command::new("busybox").subcommands(applet_commands())) 44919625d8cSopenharmony_ci .subcommands(applet_commands()); 45019625d8cSopenharmony_ci 45119625d8cSopenharmony_ci let m = cmd 45219625d8cSopenharmony_ci .clone() 45319625d8cSopenharmony_ci .try_get_matches_from(["busybox", "true"]) 45419625d8cSopenharmony_ci .unwrap(); 45519625d8cSopenharmony_ci assert_eq!(m.subcommand_name(), Some("busybox")); 45619625d8cSopenharmony_ci assert_eq!(m.subcommand().unwrap().1.subcommand_name(), Some("true")); 45719625d8cSopenharmony_ci 45819625d8cSopenharmony_ci let m = cmd.clone().try_get_matches_from(["true"]).unwrap(); 45919625d8cSopenharmony_ci assert_eq!(m.subcommand_name(), Some("true")); 46019625d8cSopenharmony_ci 46119625d8cSopenharmony_ci let m = cmd.clone().try_get_matches_from(["a.out"]); 46219625d8cSopenharmony_ci assert!(m.is_err()); 46319625d8cSopenharmony_ci assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidSubcommand); 46419625d8cSopenharmony_ci} 46519625d8cSopenharmony_ci 46619625d8cSopenharmony_ci#[test] 46719625d8cSopenharmony_cifn hostname_like_multicall() { 46819625d8cSopenharmony_ci let mut cmd = Command::new("hostname") 46919625d8cSopenharmony_ci .multicall(true) 47019625d8cSopenharmony_ci .subcommand(Command::new("hostname")) 47119625d8cSopenharmony_ci .subcommand(Command::new("dnsdomainname")); 47219625d8cSopenharmony_ci 47319625d8cSopenharmony_ci let m = cmd.clone().try_get_matches_from(["hostname"]).unwrap(); 47419625d8cSopenharmony_ci assert_eq!(m.subcommand_name(), Some("hostname")); 47519625d8cSopenharmony_ci 47619625d8cSopenharmony_ci let m = cmd.clone().try_get_matches_from(["dnsdomainname"]).unwrap(); 47719625d8cSopenharmony_ci assert_eq!(m.subcommand_name(), Some("dnsdomainname")); 47819625d8cSopenharmony_ci 47919625d8cSopenharmony_ci let m = cmd.clone().try_get_matches_from(["a.out"]); 48019625d8cSopenharmony_ci assert!(m.is_err()); 48119625d8cSopenharmony_ci assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidSubcommand); 48219625d8cSopenharmony_ci 48319625d8cSopenharmony_ci let m = cmd.try_get_matches_from_mut(["hostname", "hostname"]); 48419625d8cSopenharmony_ci assert!(m.is_err()); 48519625d8cSopenharmony_ci assert_eq!(m.unwrap_err().kind(), ErrorKind::UnknownArgument); 48619625d8cSopenharmony_ci 48719625d8cSopenharmony_ci let m = cmd.try_get_matches_from(["hostname", "dnsdomainname"]); 48819625d8cSopenharmony_ci assert!(m.is_err()); 48919625d8cSopenharmony_ci assert_eq!(m.unwrap_err().kind(), ErrorKind::UnknownArgument); 49019625d8cSopenharmony_ci} 49119625d8cSopenharmony_ci 49219625d8cSopenharmony_ci#[test] 49319625d8cSopenharmony_ci#[cfg(feature = "error-context")] 49419625d8cSopenharmony_cifn bad_multicall_command_error() { 49519625d8cSopenharmony_ci let cmd = Command::new("repl") 49619625d8cSopenharmony_ci .version("1.0.0") 49719625d8cSopenharmony_ci .propagate_version(true) 49819625d8cSopenharmony_ci .multicall(true) 49919625d8cSopenharmony_ci .subcommand(Command::new("foo")) 50019625d8cSopenharmony_ci .subcommand(Command::new("bar")); 50119625d8cSopenharmony_ci 50219625d8cSopenharmony_ci let err = cmd.clone().try_get_matches_from(["world"]).unwrap_err(); 50319625d8cSopenharmony_ci assert_eq!(err.kind(), ErrorKind::InvalidSubcommand); 50419625d8cSopenharmony_ci static HELLO_EXPECTED: &str = "\ 50519625d8cSopenharmony_cierror: unrecognized subcommand 'world' 50619625d8cSopenharmony_ci 50719625d8cSopenharmony_ciUsage: <COMMAND> 50819625d8cSopenharmony_ci 50919625d8cSopenharmony_ciFor more information, try 'help'. 51019625d8cSopenharmony_ci"; 51119625d8cSopenharmony_ci utils::assert_eq(HELLO_EXPECTED, err.to_string()); 51219625d8cSopenharmony_ci 51319625d8cSopenharmony_ci #[cfg(feature = "suggestions")] 51419625d8cSopenharmony_ci { 51519625d8cSopenharmony_ci let err = cmd.clone().try_get_matches_from(["baz"]).unwrap_err(); 51619625d8cSopenharmony_ci assert_eq!(err.kind(), ErrorKind::InvalidSubcommand); 51719625d8cSopenharmony_ci static BAZ_EXPECTED: &str = "\ 51819625d8cSopenharmony_cierror: unrecognized subcommand 'baz' 51919625d8cSopenharmony_ci 52019625d8cSopenharmony_ci note: subcommand 'bar' exists 52119625d8cSopenharmony_ci note: to pass 'baz' as a value, use ' -- baz' 52219625d8cSopenharmony_ci 52319625d8cSopenharmony_ciUsage: <COMMAND> 52419625d8cSopenharmony_ci 52519625d8cSopenharmony_ciFor more information, try 'help'. 52619625d8cSopenharmony_ci"; 52719625d8cSopenharmony_ci utils::assert_eq(BAZ_EXPECTED, err.to_string()); 52819625d8cSopenharmony_ci } 52919625d8cSopenharmony_ci 53019625d8cSopenharmony_ci // Verify whatever we did to get the above to work didn't disable `--help` and `--version`. 53119625d8cSopenharmony_ci 53219625d8cSopenharmony_ci let err = cmd 53319625d8cSopenharmony_ci .clone() 53419625d8cSopenharmony_ci .try_get_matches_from(["foo", "--help"]) 53519625d8cSopenharmony_ci .unwrap_err(); 53619625d8cSopenharmony_ci assert_eq!(err.kind(), ErrorKind::DisplayHelp); 53719625d8cSopenharmony_ci 53819625d8cSopenharmony_ci let err = cmd 53919625d8cSopenharmony_ci .clone() 54019625d8cSopenharmony_ci .try_get_matches_from(["foo", "--version"]) 54119625d8cSopenharmony_ci .unwrap_err(); 54219625d8cSopenharmony_ci assert_eq!(err.kind(), ErrorKind::DisplayVersion); 54319625d8cSopenharmony_ci} 54419625d8cSopenharmony_ci 54519625d8cSopenharmony_ci#[test] 54619625d8cSopenharmony_ci#[should_panic = "Command repl: Arguments like oh-no cannot be set on a multicall command"] 54719625d8cSopenharmony_cifn cant_have_args_with_multicall() { 54819625d8cSopenharmony_ci let mut cmd = Command::new("repl") 54919625d8cSopenharmony_ci .version("1.0.0") 55019625d8cSopenharmony_ci .propagate_version(true) 55119625d8cSopenharmony_ci .multicall(true) 55219625d8cSopenharmony_ci .subcommand(Command::new("foo")) 55319625d8cSopenharmony_ci .subcommand(Command::new("bar")) 55419625d8cSopenharmony_ci .arg(Arg::new("oh-no")); 55519625d8cSopenharmony_ci cmd.build(); 55619625d8cSopenharmony_ci} 55719625d8cSopenharmony_ci 55819625d8cSopenharmony_ci#[test] 55919625d8cSopenharmony_cifn multicall_help_flag() { 56019625d8cSopenharmony_ci static EXPECTED: &str = "\ 56119625d8cSopenharmony_ciUsage: foo bar [value] 56219625d8cSopenharmony_ci 56319625d8cSopenharmony_ciArguments: 56419625d8cSopenharmony_ci [value] 56519625d8cSopenharmony_ci 56619625d8cSopenharmony_ciOptions: 56719625d8cSopenharmony_ci -h, --help Print help 56819625d8cSopenharmony_ci -V, --version Print version 56919625d8cSopenharmony_ci"; 57019625d8cSopenharmony_ci let cmd = Command::new("repl") 57119625d8cSopenharmony_ci .version("1.0.0") 57219625d8cSopenharmony_ci .propagate_version(true) 57319625d8cSopenharmony_ci .multicall(true) 57419625d8cSopenharmony_ci .subcommand(Command::new("foo").subcommand(Command::new("bar").arg(Arg::new("value")))); 57519625d8cSopenharmony_ci utils::assert_output(cmd, "foo bar --help", EXPECTED, false); 57619625d8cSopenharmony_ci} 57719625d8cSopenharmony_ci 57819625d8cSopenharmony_ci#[test] 57919625d8cSopenharmony_cifn multicall_help_subcommand() { 58019625d8cSopenharmony_ci static EXPECTED: &str = "\ 58119625d8cSopenharmony_ciUsage: foo bar [value] 58219625d8cSopenharmony_ci 58319625d8cSopenharmony_ciArguments: 58419625d8cSopenharmony_ci [value] 58519625d8cSopenharmony_ci 58619625d8cSopenharmony_ciOptions: 58719625d8cSopenharmony_ci -h, --help Print help 58819625d8cSopenharmony_ci -V, --version Print version 58919625d8cSopenharmony_ci"; 59019625d8cSopenharmony_ci let cmd = Command::new("repl") 59119625d8cSopenharmony_ci .version("1.0.0") 59219625d8cSopenharmony_ci .propagate_version(true) 59319625d8cSopenharmony_ci .multicall(true) 59419625d8cSopenharmony_ci .subcommand(Command::new("foo").subcommand(Command::new("bar").arg(Arg::new("value")))); 59519625d8cSopenharmony_ci utils::assert_output(cmd, "help foo bar", EXPECTED, false); 59619625d8cSopenharmony_ci} 59719625d8cSopenharmony_ci 59819625d8cSopenharmony_ci#[test] 59919625d8cSopenharmony_cifn multicall_render_help() { 60019625d8cSopenharmony_ci static EXPECTED: &str = "\ 60119625d8cSopenharmony_ciUsage: foo bar [value] 60219625d8cSopenharmony_ci 60319625d8cSopenharmony_ciArguments: 60419625d8cSopenharmony_ci [value] 60519625d8cSopenharmony_ci 60619625d8cSopenharmony_ciOptions: 60719625d8cSopenharmony_ci -h, --help Print help 60819625d8cSopenharmony_ci -V, --version Print version 60919625d8cSopenharmony_ci"; 61019625d8cSopenharmony_ci let mut cmd = Command::new("repl") 61119625d8cSopenharmony_ci .version("1.0.0") 61219625d8cSopenharmony_ci .propagate_version(true) 61319625d8cSopenharmony_ci .multicall(true) 61419625d8cSopenharmony_ci .subcommand(Command::new("foo").subcommand(Command::new("bar").arg(Arg::new("value")))); 61519625d8cSopenharmony_ci cmd.build(); 61619625d8cSopenharmony_ci let subcmd = cmd.find_subcommand_mut("foo").unwrap(); 61719625d8cSopenharmony_ci let subcmd = subcmd.find_subcommand_mut("bar").unwrap(); 61819625d8cSopenharmony_ci 61919625d8cSopenharmony_ci let help = subcmd.render_help().to_string(); 62019625d8cSopenharmony_ci utils::assert_eq(EXPECTED, help); 62119625d8cSopenharmony_ci} 62219625d8cSopenharmony_ci 62319625d8cSopenharmony_ci#[test] 62419625d8cSopenharmony_ci#[should_panic = "Command test: command name `repeat` is duplicated"] 62519625d8cSopenharmony_cifn duplicate_subcommand() { 62619625d8cSopenharmony_ci Command::new("test") 62719625d8cSopenharmony_ci .subcommand(Command::new("repeat")) 62819625d8cSopenharmony_ci .subcommand(Command::new("repeat")) 62919625d8cSopenharmony_ci .build() 63019625d8cSopenharmony_ci} 63119625d8cSopenharmony_ci 63219625d8cSopenharmony_ci#[test] 63319625d8cSopenharmony_ci#[should_panic = "Command test: command `unique` alias `repeat` is duplicated"] 63419625d8cSopenharmony_cifn duplicate_subcommand_alias() { 63519625d8cSopenharmony_ci Command::new("test") 63619625d8cSopenharmony_ci .subcommand(Command::new("repeat")) 63719625d8cSopenharmony_ci .subcommand(Command::new("unique").alias("repeat")) 63819625d8cSopenharmony_ci .build() 63919625d8cSopenharmony_ci} 640