119625d8cSopenharmony_ciuse std::ffi::OsString; 219625d8cSopenharmony_ci 319625d8cSopenharmony_ciuse super::utils; 419625d8cSopenharmony_ci 519625d8cSopenharmony_ciuse clap::{arg, error::ErrorKind, Arg, ArgAction, Command}; 619625d8cSopenharmony_ci 719625d8cSopenharmony_cistatic ALLOW_EXT_SC: &str = "\ 819625d8cSopenharmony_ciUsage: clap-test [COMMAND] 919625d8cSopenharmony_ci 1019625d8cSopenharmony_ciOptions: 1119625d8cSopenharmony_ci -h, --help Print help 1219625d8cSopenharmony_ci -V, --version Print version 1319625d8cSopenharmony_ci"; 1419625d8cSopenharmony_ci 1519625d8cSopenharmony_cistatic DONT_COLLAPSE_ARGS: &str = "\ 1619625d8cSopenharmony_ciUsage: clap-test [arg1] [arg2] [arg3] 1719625d8cSopenharmony_ci 1819625d8cSopenharmony_ciArguments: 1919625d8cSopenharmony_ci [arg1] some 2019625d8cSopenharmony_ci [arg2] some 2119625d8cSopenharmony_ci [arg3] some 2219625d8cSopenharmony_ci 2319625d8cSopenharmony_ciOptions: 2419625d8cSopenharmony_ci -h, --help Print help 2519625d8cSopenharmony_ci -V, --version Print version 2619625d8cSopenharmony_ci"; 2719625d8cSopenharmony_ci 2819625d8cSopenharmony_ci#[test] 2919625d8cSopenharmony_cifn sub_command_negate_required() { 3019625d8cSopenharmony_ci Command::new("sub_command_negate") 3119625d8cSopenharmony_ci .subcommand_negates_reqs(true) 3219625d8cSopenharmony_ci .arg(Arg::new("test").required(true).index(1)) 3319625d8cSopenharmony_ci .subcommand(Command::new("sub1")) 3419625d8cSopenharmony_ci .try_get_matches_from(vec!["myprog", "sub1"]) 3519625d8cSopenharmony_ci .unwrap(); 3619625d8cSopenharmony_ci} 3719625d8cSopenharmony_ci 3819625d8cSopenharmony_ci#[test] 3919625d8cSopenharmony_cifn sub_command_negate_required_2() { 4019625d8cSopenharmony_ci let result = Command::new("sub_command_negate") 4119625d8cSopenharmony_ci .subcommand_negates_reqs(true) 4219625d8cSopenharmony_ci .arg(Arg::new("test").required(true).index(1)) 4319625d8cSopenharmony_ci .subcommand(Command::new("sub1")) 4419625d8cSopenharmony_ci .try_get_matches_from(vec![""]); 4519625d8cSopenharmony_ci assert!(result.is_err()); 4619625d8cSopenharmony_ci let err = result.err().unwrap(); 4719625d8cSopenharmony_ci assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument); 4819625d8cSopenharmony_ci} 4919625d8cSopenharmony_ci 5019625d8cSopenharmony_ci#[test] 5119625d8cSopenharmony_cifn sub_command_required() { 5219625d8cSopenharmony_ci let result = Command::new("sc_required") 5319625d8cSopenharmony_ci .subcommand_required(true) 5419625d8cSopenharmony_ci .subcommand(Command::new("sub1")) 5519625d8cSopenharmony_ci .try_get_matches_from(vec![""]); 5619625d8cSopenharmony_ci assert!(result.is_err()); 5719625d8cSopenharmony_ci let err = result.err().unwrap(); 5819625d8cSopenharmony_ci assert_eq!(err.kind(), ErrorKind::MissingSubcommand); 5919625d8cSopenharmony_ci} 6019625d8cSopenharmony_ci 6119625d8cSopenharmony_ci#[test] 6219625d8cSopenharmony_ci#[cfg(feature = "error-context")] 6319625d8cSopenharmony_cifn sub_command_required_error() { 6419625d8cSopenharmony_ci static ERROR: &str = "\ 6519625d8cSopenharmony_cierror: 'sc_required' requires a subcommand but one was not provided 6619625d8cSopenharmony_ci [subcommands: sub1, help] 6719625d8cSopenharmony_ci 6819625d8cSopenharmony_ciUsage: sc_required <COMMAND> 6919625d8cSopenharmony_ci 7019625d8cSopenharmony_ciFor more information, try '--help'. 7119625d8cSopenharmony_ci"; 7219625d8cSopenharmony_ci 7319625d8cSopenharmony_ci let cmd = Command::new("sc_required") 7419625d8cSopenharmony_ci .subcommand_required(true) 7519625d8cSopenharmony_ci .subcommand(Command::new("sub1")); 7619625d8cSopenharmony_ci utils::assert_output(cmd, "sc_required", ERROR, true); 7719625d8cSopenharmony_ci} 7819625d8cSopenharmony_ci 7919625d8cSopenharmony_ci#[test] 8019625d8cSopenharmony_cifn arg_required_else_help() { 8119625d8cSopenharmony_ci let result = Command::new("arg_required") 8219625d8cSopenharmony_ci .arg_required_else_help(true) 8319625d8cSopenharmony_ci .arg(Arg::new("test").index(1)) 8419625d8cSopenharmony_ci .try_get_matches_from(vec![""]); 8519625d8cSopenharmony_ci 8619625d8cSopenharmony_ci assert!(result.is_err()); 8719625d8cSopenharmony_ci let err = result.err().unwrap(); 8819625d8cSopenharmony_ci assert_eq!( 8919625d8cSopenharmony_ci err.kind(), 9019625d8cSopenharmony_ci ErrorKind::DisplayHelpOnMissingArgumentOrSubcommand 9119625d8cSopenharmony_ci ); 9219625d8cSopenharmony_ci} 9319625d8cSopenharmony_ci 9419625d8cSopenharmony_ci#[test] 9519625d8cSopenharmony_cifn arg_required_else_help_over_req_arg() { 9619625d8cSopenharmony_ci let result = Command::new("arg_required") 9719625d8cSopenharmony_ci .arg_required_else_help(true) 9819625d8cSopenharmony_ci .arg(Arg::new("test").index(1).required(true)) 9919625d8cSopenharmony_ci .try_get_matches_from(vec![""]); 10019625d8cSopenharmony_ci 10119625d8cSopenharmony_ci assert!(result.is_err()); 10219625d8cSopenharmony_ci let err = result.err().unwrap(); 10319625d8cSopenharmony_ci assert_eq!( 10419625d8cSopenharmony_ci err.kind(), 10519625d8cSopenharmony_ci ErrorKind::DisplayHelpOnMissingArgumentOrSubcommand 10619625d8cSopenharmony_ci ); 10719625d8cSopenharmony_ci} 10819625d8cSopenharmony_ci 10919625d8cSopenharmony_ci#[test] 11019625d8cSopenharmony_cifn arg_required_else_help_over_req_subcommand() { 11119625d8cSopenharmony_ci let result = Command::new("sub_required") 11219625d8cSopenharmony_ci .arg_required_else_help(true) 11319625d8cSopenharmony_ci .subcommand_required(true) 11419625d8cSopenharmony_ci .subcommand(Command::new("sub1")) 11519625d8cSopenharmony_ci .try_get_matches_from(vec![""]); 11619625d8cSopenharmony_ci 11719625d8cSopenharmony_ci assert!(result.is_err()); 11819625d8cSopenharmony_ci let err = result.err().unwrap(); 11919625d8cSopenharmony_ci assert_eq!( 12019625d8cSopenharmony_ci err.kind(), 12119625d8cSopenharmony_ci ErrorKind::DisplayHelpOnMissingArgumentOrSubcommand 12219625d8cSopenharmony_ci ); 12319625d8cSopenharmony_ci} 12419625d8cSopenharmony_ci 12519625d8cSopenharmony_ci#[test] 12619625d8cSopenharmony_cifn arg_required_else_help_with_default() { 12719625d8cSopenharmony_ci let result = Command::new("arg_required") 12819625d8cSopenharmony_ci .arg_required_else_help(true) 12919625d8cSopenharmony_ci .arg(arg!(--input <PATH>).default_value("-")) 13019625d8cSopenharmony_ci .try_get_matches_from(vec![""]); 13119625d8cSopenharmony_ci 13219625d8cSopenharmony_ci assert!(result.is_err()); 13319625d8cSopenharmony_ci let err = result.err().unwrap(); 13419625d8cSopenharmony_ci assert_eq!( 13519625d8cSopenharmony_ci err.kind(), 13619625d8cSopenharmony_ci ErrorKind::DisplayHelpOnMissingArgumentOrSubcommand 13719625d8cSopenharmony_ci ); 13819625d8cSopenharmony_ci} 13919625d8cSopenharmony_ci 14019625d8cSopenharmony_ci#[test] 14119625d8cSopenharmony_cifn arg_required_else_help_error_message() { 14219625d8cSopenharmony_ci static ARG_REQUIRED_ELSE_HELP: &str = "\ 14319625d8cSopenharmony_ciUsage: test [OPTIONS] 14419625d8cSopenharmony_ci 14519625d8cSopenharmony_ciOptions: 14619625d8cSopenharmony_ci -i, --info Provides more info 14719625d8cSopenharmony_ci -h, --help Print help 14819625d8cSopenharmony_ci -V, --version Print version 14919625d8cSopenharmony_ci"; 15019625d8cSopenharmony_ci 15119625d8cSopenharmony_ci let cmd = Command::new("test") 15219625d8cSopenharmony_ci .arg_required_else_help(true) 15319625d8cSopenharmony_ci .version("1.0") 15419625d8cSopenharmony_ci .arg( 15519625d8cSopenharmony_ci Arg::new("info") 15619625d8cSopenharmony_ci .help("Provides more info") 15719625d8cSopenharmony_ci .short('i') 15819625d8cSopenharmony_ci .long("info") 15919625d8cSopenharmony_ci .action(ArgAction::SetTrue), 16019625d8cSopenharmony_ci ); 16119625d8cSopenharmony_ci utils::assert_output( 16219625d8cSopenharmony_ci cmd, 16319625d8cSopenharmony_ci "test", 16419625d8cSopenharmony_ci ARG_REQUIRED_ELSE_HELP, 16519625d8cSopenharmony_ci true, // Unlike normal displaying of help, we should provide a fatal exit code 16619625d8cSopenharmony_ci ); 16719625d8cSopenharmony_ci} 16819625d8cSopenharmony_ci 16919625d8cSopenharmony_ci#[cfg(not(feature = "suggestions"))] 17019625d8cSopenharmony_ci#[test] 17119625d8cSopenharmony_cifn infer_subcommands_fail_no_args() { 17219625d8cSopenharmony_ci let m = Command::new("prog") 17319625d8cSopenharmony_ci .infer_subcommands(true) 17419625d8cSopenharmony_ci .subcommand(Command::new("test")) 17519625d8cSopenharmony_ci .subcommand(Command::new("temp")) 17619625d8cSopenharmony_ci .try_get_matches_from(vec!["prog", "te"]); 17719625d8cSopenharmony_ci assert!(m.is_err(), "{:#?}", m.unwrap()); 17819625d8cSopenharmony_ci assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidSubcommand); 17919625d8cSopenharmony_ci} 18019625d8cSopenharmony_ci 18119625d8cSopenharmony_ci#[cfg(feature = "suggestions")] 18219625d8cSopenharmony_ci#[test] 18319625d8cSopenharmony_cifn infer_subcommands_fail_no_args() { 18419625d8cSopenharmony_ci let m = Command::new("prog") 18519625d8cSopenharmony_ci .infer_subcommands(true) 18619625d8cSopenharmony_ci .subcommand(Command::new("test")) 18719625d8cSopenharmony_ci .subcommand(Command::new("temp")) 18819625d8cSopenharmony_ci .try_get_matches_from(vec!["prog", "te"]); 18919625d8cSopenharmony_ci assert!(m.is_err(), "{:#?}", m.unwrap()); 19019625d8cSopenharmony_ci assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidSubcommand); 19119625d8cSopenharmony_ci} 19219625d8cSopenharmony_ci 19319625d8cSopenharmony_ci#[test] 19419625d8cSopenharmony_cifn infer_subcommands_fail_with_args() { 19519625d8cSopenharmony_ci let m = Command::new("prog") 19619625d8cSopenharmony_ci .infer_subcommands(true) 19719625d8cSopenharmony_ci .arg(Arg::new("some")) 19819625d8cSopenharmony_ci .subcommand(Command::new("test")) 19919625d8cSopenharmony_ci .subcommand(Command::new("temp")) 20019625d8cSopenharmony_ci .try_get_matches_from(vec!["prog", "t"]); 20119625d8cSopenharmony_ci assert!(m.is_ok(), "{:?}", m.unwrap_err().kind()); 20219625d8cSopenharmony_ci assert_eq!( 20319625d8cSopenharmony_ci m.unwrap().get_one::<String>("some").map(|v| v.as_str()), 20419625d8cSopenharmony_ci Some("t") 20519625d8cSopenharmony_ci ); 20619625d8cSopenharmony_ci} 20719625d8cSopenharmony_ci 20819625d8cSopenharmony_ci#[test] 20919625d8cSopenharmony_cifn infer_subcommands_fail_with_args2() { 21019625d8cSopenharmony_ci let m = Command::new("prog") 21119625d8cSopenharmony_ci .infer_subcommands(true) 21219625d8cSopenharmony_ci .arg(Arg::new("some")) 21319625d8cSopenharmony_ci .subcommand(Command::new("test")) 21419625d8cSopenharmony_ci .subcommand(Command::new("temp")) 21519625d8cSopenharmony_ci .try_get_matches_from(vec!["prog", "te"]); 21619625d8cSopenharmony_ci assert!(m.is_ok(), "{:?}", m.unwrap_err().kind()); 21719625d8cSopenharmony_ci assert_eq!( 21819625d8cSopenharmony_ci m.unwrap().get_one::<String>("some").map(|v| v.as_str()), 21919625d8cSopenharmony_ci Some("te") 22019625d8cSopenharmony_ci ); 22119625d8cSopenharmony_ci} 22219625d8cSopenharmony_ci 22319625d8cSopenharmony_ci#[test] 22419625d8cSopenharmony_cifn infer_subcommands_pass() { 22519625d8cSopenharmony_ci let m = Command::new("prog") 22619625d8cSopenharmony_ci .infer_subcommands(true) 22719625d8cSopenharmony_ci .subcommand(Command::new("test")) 22819625d8cSopenharmony_ci .try_get_matches_from(vec!["prog", "te"]) 22919625d8cSopenharmony_ci .unwrap(); 23019625d8cSopenharmony_ci assert_eq!(m.subcommand_name(), Some("test")); 23119625d8cSopenharmony_ci} 23219625d8cSopenharmony_ci 23319625d8cSopenharmony_ci#[test] 23419625d8cSopenharmony_cifn infer_subcommands_pass_close() { 23519625d8cSopenharmony_ci let m = Command::new("prog") 23619625d8cSopenharmony_ci .infer_subcommands(true) 23719625d8cSopenharmony_ci .subcommand(Command::new("test")) 23819625d8cSopenharmony_ci .subcommand(Command::new("temp")) 23919625d8cSopenharmony_ci .try_get_matches_from(vec!["prog", "tes"]) 24019625d8cSopenharmony_ci .unwrap(); 24119625d8cSopenharmony_ci assert_eq!(m.subcommand_name(), Some("test")); 24219625d8cSopenharmony_ci} 24319625d8cSopenharmony_ci 24419625d8cSopenharmony_ci#[test] 24519625d8cSopenharmony_cifn infer_subcommands_pass_exact_match() { 24619625d8cSopenharmony_ci let m = Command::new("prog") 24719625d8cSopenharmony_ci .infer_subcommands(true) 24819625d8cSopenharmony_ci .subcommand(Command::new("test")) 24919625d8cSopenharmony_ci .subcommand(Command::new("testa")) 25019625d8cSopenharmony_ci .subcommand(Command::new("testb")) 25119625d8cSopenharmony_ci .try_get_matches_from(vec!["prog", "test"]) 25219625d8cSopenharmony_ci .unwrap(); 25319625d8cSopenharmony_ci assert_eq!(m.subcommand_name(), Some("test")); 25419625d8cSopenharmony_ci} 25519625d8cSopenharmony_ci 25619625d8cSopenharmony_ci#[cfg(feature = "suggestions")] 25719625d8cSopenharmony_ci#[test] 25819625d8cSopenharmony_cifn infer_subcommands_fail_suggestions() { 25919625d8cSopenharmony_ci let m = Command::new("prog") 26019625d8cSopenharmony_ci .infer_subcommands(true) 26119625d8cSopenharmony_ci .subcommand(Command::new("test")) 26219625d8cSopenharmony_ci .subcommand(Command::new("temp")) 26319625d8cSopenharmony_ci .try_get_matches_from(vec!["prog", "temps"]); 26419625d8cSopenharmony_ci assert!(m.is_err(), "{:#?}", m.unwrap()); 26519625d8cSopenharmony_ci assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidSubcommand); 26619625d8cSopenharmony_ci} 26719625d8cSopenharmony_ci 26819625d8cSopenharmony_ci#[cfg(not(feature = "suggestions"))] 26919625d8cSopenharmony_ci#[test] 27019625d8cSopenharmony_cifn infer_subcommands_fail_suggestions() { 27119625d8cSopenharmony_ci let m = Command::new("prog") 27219625d8cSopenharmony_ci .infer_subcommands(true) 27319625d8cSopenharmony_ci .subcommand(Command::new("test")) 27419625d8cSopenharmony_ci .subcommand(Command::new("temp")) 27519625d8cSopenharmony_ci .try_get_matches_from(vec!["prog", "temps"]); 27619625d8cSopenharmony_ci assert!(m.is_err(), "{:#?}", m.unwrap()); 27719625d8cSopenharmony_ci assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidSubcommand); 27819625d8cSopenharmony_ci} 27919625d8cSopenharmony_ci 28019625d8cSopenharmony_ci#[test] 28119625d8cSopenharmony_cifn no_bin_name() { 28219625d8cSopenharmony_ci let result = Command::new("arg_required") 28319625d8cSopenharmony_ci .no_binary_name(true) 28419625d8cSopenharmony_ci .arg(Arg::new("test").required(true).index(1)) 28519625d8cSopenharmony_ci .try_get_matches_from(vec!["testing"]); 28619625d8cSopenharmony_ci assert!(result.is_ok(), "{}", result.unwrap_err()); 28719625d8cSopenharmony_ci let matches = result.unwrap(); 28819625d8cSopenharmony_ci assert_eq!( 28919625d8cSopenharmony_ci matches 29019625d8cSopenharmony_ci .get_one::<String>("test") 29119625d8cSopenharmony_ci .map(|v| v.as_str()) 29219625d8cSopenharmony_ci .unwrap(), 29319625d8cSopenharmony_ci "testing" 29419625d8cSopenharmony_ci ); 29519625d8cSopenharmony_ci} 29619625d8cSopenharmony_ci 29719625d8cSopenharmony_ci#[test] 29819625d8cSopenharmony_cifn skip_possible_values() { 29919625d8cSopenharmony_ci static SKIP_POS_VALS: &str = "\ 30019625d8cSopenharmony_citests stuff 30119625d8cSopenharmony_ci 30219625d8cSopenharmony_ciUsage: test [OPTIONS] [arg1] 30319625d8cSopenharmony_ci 30419625d8cSopenharmony_ciArguments: 30519625d8cSopenharmony_ci [arg1] some pos arg 30619625d8cSopenharmony_ci 30719625d8cSopenharmony_ciOptions: 30819625d8cSopenharmony_ci -o, --opt <opt> some option 30919625d8cSopenharmony_ci -h, --help Print help 31019625d8cSopenharmony_ci -V, --version Print version 31119625d8cSopenharmony_ci"; 31219625d8cSopenharmony_ci 31319625d8cSopenharmony_ci let cmd = Command::new("test") 31419625d8cSopenharmony_ci .author("Kevin K.") 31519625d8cSopenharmony_ci .about("tests stuff") 31619625d8cSopenharmony_ci .version("1.3") 31719625d8cSopenharmony_ci .hide_possible_values(true) 31819625d8cSopenharmony_ci .args([ 31919625d8cSopenharmony_ci arg!(-o --opt <opt> "some option").value_parser(["one", "two"]), 32019625d8cSopenharmony_ci arg!([arg1] "some pos arg").value_parser(["three", "four"]), 32119625d8cSopenharmony_ci ]); 32219625d8cSopenharmony_ci 32319625d8cSopenharmony_ci utils::assert_output(cmd, "test --help", SKIP_POS_VALS, false); 32419625d8cSopenharmony_ci} 32519625d8cSopenharmony_ci 32619625d8cSopenharmony_ci#[test] 32719625d8cSopenharmony_cifn stop_delim_values_only_pos_follows() { 32819625d8cSopenharmony_ci let r = Command::new("onlypos") 32919625d8cSopenharmony_ci .dont_delimit_trailing_values(true) 33019625d8cSopenharmony_ci .args([arg!(f: -f <flag> "some opt"), arg!([arg] ... "some arg")]) 33119625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--", "-f", "-g,x"]); 33219625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 33319625d8cSopenharmony_ci let m = r.unwrap(); 33419625d8cSopenharmony_ci assert!(m.contains_id("arg")); 33519625d8cSopenharmony_ci assert!(!m.contains_id("f")); 33619625d8cSopenharmony_ci assert_eq!( 33719625d8cSopenharmony_ci m.get_many::<String>("arg") 33819625d8cSopenharmony_ci .unwrap() 33919625d8cSopenharmony_ci .map(|v| v.as_str()) 34019625d8cSopenharmony_ci .collect::<Vec<_>>(), 34119625d8cSopenharmony_ci ["-f", "-g,x"] 34219625d8cSopenharmony_ci ); 34319625d8cSopenharmony_ci} 34419625d8cSopenharmony_ci 34519625d8cSopenharmony_ci#[test] 34619625d8cSopenharmony_cifn dont_delim_values_trailingvararg() { 34719625d8cSopenharmony_ci let m = Command::new("positional") 34819625d8cSopenharmony_ci .dont_delimit_trailing_values(true) 34919625d8cSopenharmony_ci .arg(arg!([opt] ... "some pos").trailing_var_arg(true)) 35019625d8cSopenharmony_ci .try_get_matches_from(vec!["", "test", "--foo", "-Wl,-bar"]) 35119625d8cSopenharmony_ci .unwrap(); 35219625d8cSopenharmony_ci assert!(m.contains_id("opt")); 35319625d8cSopenharmony_ci assert_eq!( 35419625d8cSopenharmony_ci m.get_many::<String>("opt") 35519625d8cSopenharmony_ci .unwrap() 35619625d8cSopenharmony_ci .map(|v| v.as_str()) 35719625d8cSopenharmony_ci .collect::<Vec<_>>(), 35819625d8cSopenharmony_ci ["test", "--foo", "-Wl,-bar"] 35919625d8cSopenharmony_ci ); 36019625d8cSopenharmony_ci} 36119625d8cSopenharmony_ci 36219625d8cSopenharmony_ci#[test] 36319625d8cSopenharmony_cifn delim_values_only_pos_follows() { 36419625d8cSopenharmony_ci let r = Command::new("onlypos") 36519625d8cSopenharmony_ci .args([arg!(f: -f [flag] "some opt"), arg!([arg] ... "some arg")]) 36619625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--", "-f", "-g,x"]); 36719625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 36819625d8cSopenharmony_ci let m = r.unwrap(); 36919625d8cSopenharmony_ci assert!(m.contains_id("arg")); 37019625d8cSopenharmony_ci assert!(!m.contains_id("f")); 37119625d8cSopenharmony_ci assert_eq!( 37219625d8cSopenharmony_ci m.get_many::<String>("arg") 37319625d8cSopenharmony_ci .unwrap() 37419625d8cSopenharmony_ci .map(|v| v.as_str()) 37519625d8cSopenharmony_ci .collect::<Vec<_>>(), 37619625d8cSopenharmony_ci ["-f", "-g,x"] 37719625d8cSopenharmony_ci ); 37819625d8cSopenharmony_ci} 37919625d8cSopenharmony_ci 38019625d8cSopenharmony_ci#[test] 38119625d8cSopenharmony_cifn delim_values_trailingvararg() { 38219625d8cSopenharmony_ci let m = Command::new("positional") 38319625d8cSopenharmony_ci .arg(arg!([opt] ... "some pos").trailing_var_arg(true)) 38419625d8cSopenharmony_ci .try_get_matches_from(vec!["", "test", "--foo", "-Wl,-bar"]) 38519625d8cSopenharmony_ci .unwrap(); 38619625d8cSopenharmony_ci assert!(m.contains_id("opt")); 38719625d8cSopenharmony_ci assert_eq!( 38819625d8cSopenharmony_ci m.get_many::<String>("opt") 38919625d8cSopenharmony_ci .unwrap() 39019625d8cSopenharmony_ci .map(|v| v.as_str()) 39119625d8cSopenharmony_ci .collect::<Vec<_>>(), 39219625d8cSopenharmony_ci ["test", "--foo", "-Wl,-bar"] 39319625d8cSopenharmony_ci ); 39419625d8cSopenharmony_ci} 39519625d8cSopenharmony_ci 39619625d8cSopenharmony_ci#[test] 39719625d8cSopenharmony_cifn delim_values_only_pos_follows_with_delim() { 39819625d8cSopenharmony_ci let r = Command::new("onlypos") 39919625d8cSopenharmony_ci .args([ 40019625d8cSopenharmony_ci arg!(f: -f [flag] "some opt"), 40119625d8cSopenharmony_ci arg!([arg] ... "some arg").value_delimiter(','), 40219625d8cSopenharmony_ci ]) 40319625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--", "-f", "-g,x"]); 40419625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 40519625d8cSopenharmony_ci let m = r.unwrap(); 40619625d8cSopenharmony_ci assert!(m.contains_id("arg")); 40719625d8cSopenharmony_ci assert!(!m.contains_id("f")); 40819625d8cSopenharmony_ci assert_eq!( 40919625d8cSopenharmony_ci m.get_many::<String>("arg") 41019625d8cSopenharmony_ci .unwrap() 41119625d8cSopenharmony_ci .map(|v| v.as_str()) 41219625d8cSopenharmony_ci .collect::<Vec<_>>(), 41319625d8cSopenharmony_ci ["-f", "-g", "x"] 41419625d8cSopenharmony_ci ); 41519625d8cSopenharmony_ci} 41619625d8cSopenharmony_ci 41719625d8cSopenharmony_ci#[test] 41819625d8cSopenharmony_cifn delim_values_trailingvararg_with_delim() { 41919625d8cSopenharmony_ci let m = Command::new("positional") 42019625d8cSopenharmony_ci .arg( 42119625d8cSopenharmony_ci arg!([opt] ... "some pos") 42219625d8cSopenharmony_ci .value_delimiter(',') 42319625d8cSopenharmony_ci .trailing_var_arg(true), 42419625d8cSopenharmony_ci ) 42519625d8cSopenharmony_ci .try_get_matches_from(vec!["", "test", "--foo", "-Wl,-bar"]) 42619625d8cSopenharmony_ci .unwrap(); 42719625d8cSopenharmony_ci assert!(m.contains_id("opt")); 42819625d8cSopenharmony_ci assert_eq!( 42919625d8cSopenharmony_ci m.get_many::<String>("opt") 43019625d8cSopenharmony_ci .unwrap() 43119625d8cSopenharmony_ci .map(|v| v.as_str()) 43219625d8cSopenharmony_ci .collect::<Vec<_>>(), 43319625d8cSopenharmony_ci ["test", "--foo", "-Wl", "-bar"] 43419625d8cSopenharmony_ci ); 43519625d8cSopenharmony_ci} 43619625d8cSopenharmony_ci 43719625d8cSopenharmony_ci#[test] 43819625d8cSopenharmony_cifn leading_hyphen_short() { 43919625d8cSopenharmony_ci let res = Command::new("leadhy") 44019625d8cSopenharmony_ci .arg(Arg::new("some").allow_hyphen_values(true)) 44119625d8cSopenharmony_ci .arg(Arg::new("other").short('o').action(ArgAction::SetTrue)) 44219625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-bar", "-o"]); 44319625d8cSopenharmony_ci assert!(res.is_ok(), "Error: {:?}", res.unwrap_err().kind()); 44419625d8cSopenharmony_ci let m = res.unwrap(); 44519625d8cSopenharmony_ci assert!(m.contains_id("some")); 44619625d8cSopenharmony_ci assert!(m.contains_id("other")); 44719625d8cSopenharmony_ci assert_eq!( 44819625d8cSopenharmony_ci m.get_one::<String>("some").map(|v| v.as_str()).unwrap(), 44919625d8cSopenharmony_ci "-bar" 45019625d8cSopenharmony_ci ); 45119625d8cSopenharmony_ci assert_eq!( 45219625d8cSopenharmony_ci *m.get_one::<bool>("other").expect("defaulted by clap"), 45319625d8cSopenharmony_ci true 45419625d8cSopenharmony_ci ); 45519625d8cSopenharmony_ci} 45619625d8cSopenharmony_ci 45719625d8cSopenharmony_ci#[test] 45819625d8cSopenharmony_cifn leading_hyphen_long() { 45919625d8cSopenharmony_ci let res = Command::new("leadhy") 46019625d8cSopenharmony_ci .arg(Arg::new("some").allow_hyphen_values(true)) 46119625d8cSopenharmony_ci .arg(Arg::new("other").short('o').action(ArgAction::SetTrue)) 46219625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--bar", "-o"]); 46319625d8cSopenharmony_ci assert!(res.is_ok(), "Error: {:?}", res.unwrap_err().kind()); 46419625d8cSopenharmony_ci let m = res.unwrap(); 46519625d8cSopenharmony_ci assert!(m.contains_id("some")); 46619625d8cSopenharmony_ci assert!(m.contains_id("other")); 46719625d8cSopenharmony_ci assert_eq!( 46819625d8cSopenharmony_ci m.get_one::<String>("some").map(|v| v.as_str()).unwrap(), 46919625d8cSopenharmony_ci "--bar" 47019625d8cSopenharmony_ci ); 47119625d8cSopenharmony_ci assert_eq!( 47219625d8cSopenharmony_ci *m.get_one::<bool>("other").expect("defaulted by clap"), 47319625d8cSopenharmony_ci true 47419625d8cSopenharmony_ci ); 47519625d8cSopenharmony_ci} 47619625d8cSopenharmony_ci 47719625d8cSopenharmony_ci#[test] 47819625d8cSopenharmony_cifn leading_hyphen_opt() { 47919625d8cSopenharmony_ci let res = Command::new("leadhy") 48019625d8cSopenharmony_ci .arg( 48119625d8cSopenharmony_ci Arg::new("some") 48219625d8cSopenharmony_ci .action(ArgAction::Set) 48319625d8cSopenharmony_ci .long("opt") 48419625d8cSopenharmony_ci .allow_hyphen_values(true), 48519625d8cSopenharmony_ci ) 48619625d8cSopenharmony_ci .arg(Arg::new("other").short('o').action(ArgAction::SetTrue)) 48719625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--opt", "--bar", "-o"]); 48819625d8cSopenharmony_ci assert!(res.is_ok(), "Error: {:?}", res.unwrap_err().kind()); 48919625d8cSopenharmony_ci let m = res.unwrap(); 49019625d8cSopenharmony_ci assert!(m.contains_id("some")); 49119625d8cSopenharmony_ci assert!(m.contains_id("other")); 49219625d8cSopenharmony_ci assert_eq!( 49319625d8cSopenharmony_ci m.get_one::<String>("some").map(|v| v.as_str()).unwrap(), 49419625d8cSopenharmony_ci "--bar" 49519625d8cSopenharmony_ci ); 49619625d8cSopenharmony_ci assert_eq!( 49719625d8cSopenharmony_ci *m.get_one::<bool>("other").expect("defaulted by clap"), 49819625d8cSopenharmony_ci true 49919625d8cSopenharmony_ci ); 50019625d8cSopenharmony_ci} 50119625d8cSopenharmony_ci 50219625d8cSopenharmony_ci#[test] 50319625d8cSopenharmony_cifn allow_negative_numbers_success() { 50419625d8cSopenharmony_ci let res = Command::new("negnum") 50519625d8cSopenharmony_ci .arg(Arg::new("panum").allow_negative_numbers(true)) 50619625d8cSopenharmony_ci .arg( 50719625d8cSopenharmony_ci Arg::new("onum") 50819625d8cSopenharmony_ci .short('o') 50919625d8cSopenharmony_ci .action(ArgAction::Set) 51019625d8cSopenharmony_ci .allow_negative_numbers(true), 51119625d8cSopenharmony_ci ) 51219625d8cSopenharmony_ci .try_get_matches_from(vec!["negnum", "-20", "-o", "-1.2"]); 51319625d8cSopenharmony_ci assert!(res.is_ok(), "Error: {:?}", res.unwrap_err().kind()); 51419625d8cSopenharmony_ci let m = res.unwrap(); 51519625d8cSopenharmony_ci assert_eq!( 51619625d8cSopenharmony_ci m.get_one::<String>("panum").map(|v| v.as_str()).unwrap(), 51719625d8cSopenharmony_ci "-20" 51819625d8cSopenharmony_ci ); 51919625d8cSopenharmony_ci assert_eq!( 52019625d8cSopenharmony_ci m.get_one::<String>("onum").map(|v| v.as_str()).unwrap(), 52119625d8cSopenharmony_ci "-1.2" 52219625d8cSopenharmony_ci ); 52319625d8cSopenharmony_ci} 52419625d8cSopenharmony_ci 52519625d8cSopenharmony_ci#[test] 52619625d8cSopenharmony_cifn allow_negative_numbers_fail() { 52719625d8cSopenharmony_ci let res = Command::new("negnum") 52819625d8cSopenharmony_ci .arg(Arg::new("panum").allow_negative_numbers(true)) 52919625d8cSopenharmony_ci .arg( 53019625d8cSopenharmony_ci Arg::new("onum") 53119625d8cSopenharmony_ci .short('o') 53219625d8cSopenharmony_ci .action(ArgAction::Set) 53319625d8cSopenharmony_ci .allow_negative_numbers(true), 53419625d8cSopenharmony_ci ) 53519625d8cSopenharmony_ci .try_get_matches_from(vec!["negnum", "--foo", "-o", "-1.2"]); 53619625d8cSopenharmony_ci assert!(res.is_err()); 53719625d8cSopenharmony_ci assert_eq!(res.unwrap_err().kind(), ErrorKind::UnknownArgument) 53819625d8cSopenharmony_ci} 53919625d8cSopenharmony_ci 54019625d8cSopenharmony_ci#[test] 54119625d8cSopenharmony_cifn trailing_var_arg_with_hyphen_values_escape_first() { 54219625d8cSopenharmony_ci assert_trailing_var_args(&["test", "--", "foo", "bar"], Some(&["foo", "bar"]), false); 54319625d8cSopenharmony_ci} 54419625d8cSopenharmony_ci 54519625d8cSopenharmony_ci#[test] 54619625d8cSopenharmony_cifn trailing_var_arg_with_hyphen_values_escape_middle() { 54719625d8cSopenharmony_ci assert_trailing_var_args( 54819625d8cSopenharmony_ci &["test", "foo", "--", "bar"], 54919625d8cSopenharmony_ci Some(&["foo", "--", "bar"]), 55019625d8cSopenharmony_ci false, 55119625d8cSopenharmony_ci ); 55219625d8cSopenharmony_ci} 55319625d8cSopenharmony_ci 55419625d8cSopenharmony_ci#[test] 55519625d8cSopenharmony_cifn trailing_var_arg_with_hyphen_values_short_first() { 55619625d8cSopenharmony_ci assert_trailing_var_args(&["test", "-p", "foo", "bar"], Some(&["foo", "bar"]), true); 55719625d8cSopenharmony_ci} 55819625d8cSopenharmony_ci 55919625d8cSopenharmony_ci#[test] 56019625d8cSopenharmony_cifn trailing_var_arg_with_hyphen_values_short_middle() { 56119625d8cSopenharmony_ci assert_trailing_var_args( 56219625d8cSopenharmony_ci &["test", "foo", "-p", "bar"], 56319625d8cSopenharmony_ci Some(&["foo", "-p", "bar"]), 56419625d8cSopenharmony_ci false, 56519625d8cSopenharmony_ci ); 56619625d8cSopenharmony_ci} 56719625d8cSopenharmony_ci 56819625d8cSopenharmony_ci#[test] 56919625d8cSopenharmony_cifn trailing_var_arg_with_hyphen_values_long_first() { 57019625d8cSopenharmony_ci assert_trailing_var_args( 57119625d8cSopenharmony_ci &["test", "--prog", "foo", "bar"], 57219625d8cSopenharmony_ci Some(&["foo", "bar"]), 57319625d8cSopenharmony_ci true, 57419625d8cSopenharmony_ci ); 57519625d8cSopenharmony_ci} 57619625d8cSopenharmony_ci 57719625d8cSopenharmony_ci#[test] 57819625d8cSopenharmony_cifn trailing_var_arg_with_hyphen_values_long_middle() { 57919625d8cSopenharmony_ci assert_trailing_var_args( 58019625d8cSopenharmony_ci &["test", "foo", "--prog", "bar"], 58119625d8cSopenharmony_ci Some(&["foo", "--prog", "bar"]), 58219625d8cSopenharmony_ci false, 58319625d8cSopenharmony_ci ); 58419625d8cSopenharmony_ci} 58519625d8cSopenharmony_ci 58619625d8cSopenharmony_ci#[track_caller] 58719625d8cSopenharmony_cifn assert_trailing_var_args( 58819625d8cSopenharmony_ci input: &[&str], 58919625d8cSopenharmony_ci expected_var_arg: Option<&[&str]>, 59019625d8cSopenharmony_ci expected_flag: bool, 59119625d8cSopenharmony_ci) { 59219625d8cSopenharmony_ci let cmd = Command::new("test").arg(arg!(-p - -prog)).arg( 59319625d8cSopenharmony_ci arg!([opt] ... "some pos") 59419625d8cSopenharmony_ci .trailing_var_arg(true) 59519625d8cSopenharmony_ci .allow_hyphen_values(true), 59619625d8cSopenharmony_ci ); 59719625d8cSopenharmony_ci let m = cmd.try_get_matches_from(input); 59819625d8cSopenharmony_ci assert!( 59919625d8cSopenharmony_ci m.is_ok(), 60019625d8cSopenharmony_ci "failed with args {:?}: {}", 60119625d8cSopenharmony_ci input, 60219625d8cSopenharmony_ci m.unwrap_err() 60319625d8cSopenharmony_ci ); 60419625d8cSopenharmony_ci let m = m.unwrap(); 60519625d8cSopenharmony_ci 60619625d8cSopenharmony_ci let actual_var_args = m 60719625d8cSopenharmony_ci .get_many::<String>("opt") 60819625d8cSopenharmony_ci .map(|v| v.map(|s| s.as_str()).collect::<Vec<_>>()); 60919625d8cSopenharmony_ci assert_eq!(actual_var_args.as_deref(), expected_var_arg); 61019625d8cSopenharmony_ci assert_eq!(m.get_flag("prog"), expected_flag); 61119625d8cSopenharmony_ci} 61219625d8cSopenharmony_ci 61319625d8cSopenharmony_ci#[test] 61419625d8cSopenharmony_cifn disable_help_subcommand() { 61519625d8cSopenharmony_ci let result = Command::new("disablehelp") 61619625d8cSopenharmony_ci .disable_help_subcommand(true) 61719625d8cSopenharmony_ci .subcommand(Command::new("sub1")) 61819625d8cSopenharmony_ci .try_get_matches_from(vec!["", "help"]); 61919625d8cSopenharmony_ci assert!(result.is_err()); 62019625d8cSopenharmony_ci let err = result.err().unwrap(); 62119625d8cSopenharmony_ci assert_eq!(err.kind(), ErrorKind::InvalidSubcommand); 62219625d8cSopenharmony_ci} 62319625d8cSopenharmony_ci 62419625d8cSopenharmony_ci#[test] 62519625d8cSopenharmony_cifn dont_collapse_args() { 62619625d8cSopenharmony_ci let cmd = Command::new("clap-test").version("v1.4.8").args([ 62719625d8cSopenharmony_ci Arg::new("arg1").help("some"), 62819625d8cSopenharmony_ci Arg::new("arg2").help("some"), 62919625d8cSopenharmony_ci Arg::new("arg3").help("some"), 63019625d8cSopenharmony_ci ]); 63119625d8cSopenharmony_ci utils::assert_output(cmd, "clap-test --help", DONT_COLLAPSE_ARGS, false); 63219625d8cSopenharmony_ci} 63319625d8cSopenharmony_ci 63419625d8cSopenharmony_ci#[test] 63519625d8cSopenharmony_cifn require_eq() { 63619625d8cSopenharmony_ci static REQUIRE_EQUALS: &str = "\ 63719625d8cSopenharmony_ciUsage: clap-test --opt=<FILE> 63819625d8cSopenharmony_ci 63919625d8cSopenharmony_ciOptions: 64019625d8cSopenharmony_ci -o, --opt=<FILE> some 64119625d8cSopenharmony_ci -h, --help Print help 64219625d8cSopenharmony_ci -V, --version Print version 64319625d8cSopenharmony_ci"; 64419625d8cSopenharmony_ci 64519625d8cSopenharmony_ci let cmd = Command::new("clap-test").version("v1.4.8").arg( 64619625d8cSopenharmony_ci Arg::new("opt") 64719625d8cSopenharmony_ci .long("opt") 64819625d8cSopenharmony_ci .short('o') 64919625d8cSopenharmony_ci .required(true) 65019625d8cSopenharmony_ci .require_equals(true) 65119625d8cSopenharmony_ci .value_name("FILE") 65219625d8cSopenharmony_ci .help("some"), 65319625d8cSopenharmony_ci ); 65419625d8cSopenharmony_ci utils::assert_output(cmd, "clap-test --help", REQUIRE_EQUALS, false); 65519625d8cSopenharmony_ci} 65619625d8cSopenharmony_ci 65719625d8cSopenharmony_ci#[test] 65819625d8cSopenharmony_cifn propagate_vals_down() { 65919625d8cSopenharmony_ci let m = Command::new("myprog") 66019625d8cSopenharmony_ci .arg(arg!([cmd] "command to run").global(true)) 66119625d8cSopenharmony_ci .subcommand(Command::new("foo")) 66219625d8cSopenharmony_ci .try_get_matches_from(vec!["myprog", "set", "foo"]); 66319625d8cSopenharmony_ci assert!(m.is_ok(), "{:?}", m.unwrap_err().kind()); 66419625d8cSopenharmony_ci let m = m.unwrap(); 66519625d8cSopenharmony_ci assert_eq!(m.get_one::<String>("cmd").map(|v| v.as_str()), Some("set")); 66619625d8cSopenharmony_ci let sub_m = m.subcommand_matches("foo").unwrap(); 66719625d8cSopenharmony_ci assert_eq!( 66819625d8cSopenharmony_ci sub_m.get_one::<String>("cmd").map(|v| v.as_str()), 66919625d8cSopenharmony_ci Some("set") 67019625d8cSopenharmony_ci ); 67119625d8cSopenharmony_ci} 67219625d8cSopenharmony_ci 67319625d8cSopenharmony_ci#[test] 67419625d8cSopenharmony_cifn allow_missing_positional() { 67519625d8cSopenharmony_ci let m = Command::new("test") 67619625d8cSopenharmony_ci .allow_missing_positional(true) 67719625d8cSopenharmony_ci .arg(arg!([src] "some file").default_value("src")) 67819625d8cSopenharmony_ci .arg(arg!(<dest> "some file")) 67919625d8cSopenharmony_ci .try_get_matches_from(vec!["test", "file"]); 68019625d8cSopenharmony_ci assert!(m.is_ok(), "{:?}", m.unwrap_err().kind()); 68119625d8cSopenharmony_ci let m = m.unwrap(); 68219625d8cSopenharmony_ci assert_eq!(m.get_one::<String>("src").map(|v| v.as_str()), Some("src")); 68319625d8cSopenharmony_ci assert_eq!( 68419625d8cSopenharmony_ci m.get_one::<String>("dest").map(|v| v.as_str()), 68519625d8cSopenharmony_ci Some("file") 68619625d8cSopenharmony_ci ); 68719625d8cSopenharmony_ci} 68819625d8cSopenharmony_ci 68919625d8cSopenharmony_ci#[test] 69019625d8cSopenharmony_cifn allow_missing_positional_no_default() { 69119625d8cSopenharmony_ci let m = Command::new("test") 69219625d8cSopenharmony_ci .allow_missing_positional(true) 69319625d8cSopenharmony_ci .arg(arg!([src] "some file")) 69419625d8cSopenharmony_ci .arg(arg!(<dest> "some file")) 69519625d8cSopenharmony_ci .try_get_matches_from(vec!["test", "file"]); 69619625d8cSopenharmony_ci assert!(m.is_ok(), "{:?}", m.unwrap_err().kind()); 69719625d8cSopenharmony_ci let m = m.unwrap(); 69819625d8cSopenharmony_ci assert_eq!(m.get_one::<String>("src").map(|v| v.as_str()), None); 69919625d8cSopenharmony_ci assert_eq!( 70019625d8cSopenharmony_ci m.get_one::<String>("dest").map(|v| v.as_str()), 70119625d8cSopenharmony_ci Some("file") 70219625d8cSopenharmony_ci ); 70319625d8cSopenharmony_ci} 70419625d8cSopenharmony_ci 70519625d8cSopenharmony_ci#[test] 70619625d8cSopenharmony_cifn missing_positional_no_hyphen() { 70719625d8cSopenharmony_ci let r = Command::new("bench") 70819625d8cSopenharmony_ci .allow_missing_positional(true) 70919625d8cSopenharmony_ci .arg(arg!([BENCH] "some bench")) 71019625d8cSopenharmony_ci .arg(arg!([ARGS] ... "some args")) 71119625d8cSopenharmony_ci .try_get_matches_from(vec!["bench", "foo", "arg1", "arg2", "arg3"]); 71219625d8cSopenharmony_ci assert!(r.is_ok(), "{:?}", r.unwrap_err().kind()); 71319625d8cSopenharmony_ci 71419625d8cSopenharmony_ci let m = r.unwrap(); 71519625d8cSopenharmony_ci 71619625d8cSopenharmony_ci let expected_bench = Some("foo"); 71719625d8cSopenharmony_ci let expected_args = vec!["arg1", "arg2", "arg3"]; 71819625d8cSopenharmony_ci 71919625d8cSopenharmony_ci assert_eq!( 72019625d8cSopenharmony_ci m.get_one::<String>("BENCH").map(|v| v.as_str()), 72119625d8cSopenharmony_ci expected_bench 72219625d8cSopenharmony_ci ); 72319625d8cSopenharmony_ci assert_eq!( 72419625d8cSopenharmony_ci m.get_many::<String>("ARGS") 72519625d8cSopenharmony_ci .unwrap() 72619625d8cSopenharmony_ci .map(|v| v.as_str()) 72719625d8cSopenharmony_ci .collect::<Vec<_>>(), 72819625d8cSopenharmony_ci &*expected_args 72919625d8cSopenharmony_ci ); 73019625d8cSopenharmony_ci} 73119625d8cSopenharmony_ci 73219625d8cSopenharmony_ci#[test] 73319625d8cSopenharmony_cifn missing_positional_hyphen() { 73419625d8cSopenharmony_ci let r = Command::new("bench") 73519625d8cSopenharmony_ci .allow_missing_positional(true) 73619625d8cSopenharmony_ci .arg(arg!([BENCH] "some bench")) 73719625d8cSopenharmony_ci .arg(arg!([ARGS] ... "some args")) 73819625d8cSopenharmony_ci .try_get_matches_from(vec!["bench", "--", "arg1", "arg2", "arg3"]); 73919625d8cSopenharmony_ci assert!(r.is_ok(), "{:?}", r.unwrap_err().kind()); 74019625d8cSopenharmony_ci 74119625d8cSopenharmony_ci let m = r.unwrap(); 74219625d8cSopenharmony_ci 74319625d8cSopenharmony_ci let expected_bench = None; 74419625d8cSopenharmony_ci let expected_args = vec!["arg1", "arg2", "arg3"]; 74519625d8cSopenharmony_ci 74619625d8cSopenharmony_ci assert_eq!( 74719625d8cSopenharmony_ci m.get_one::<String>("BENCH").map(|v| v.as_str()), 74819625d8cSopenharmony_ci expected_bench 74919625d8cSopenharmony_ci ); 75019625d8cSopenharmony_ci assert_eq!( 75119625d8cSopenharmony_ci m.get_many::<String>("ARGS") 75219625d8cSopenharmony_ci .unwrap() 75319625d8cSopenharmony_ci .map(|v| v.as_str()) 75419625d8cSopenharmony_ci .collect::<Vec<_>>(), 75519625d8cSopenharmony_ci &*expected_args 75619625d8cSopenharmony_ci ); 75719625d8cSopenharmony_ci} 75819625d8cSopenharmony_ci 75919625d8cSopenharmony_ci#[test] 76019625d8cSopenharmony_cifn missing_positional_hyphen_far_back() { 76119625d8cSopenharmony_ci let r = Command::new("bench") 76219625d8cSopenharmony_ci .allow_missing_positional(true) 76319625d8cSopenharmony_ci .arg(arg!([BENCH1] "some bench")) 76419625d8cSopenharmony_ci .arg(arg!([BENCH2] "some bench")) 76519625d8cSopenharmony_ci .arg(arg!([BENCH3] "some bench")) 76619625d8cSopenharmony_ci .arg(arg!([ARGS] ... "some args")) 76719625d8cSopenharmony_ci .try_get_matches_from(vec!["bench", "foo", "--", "arg1", "arg2", "arg3"]); 76819625d8cSopenharmony_ci assert!(r.is_ok(), "{:?}", r.unwrap_err().kind()); 76919625d8cSopenharmony_ci 77019625d8cSopenharmony_ci let m = r.unwrap(); 77119625d8cSopenharmony_ci 77219625d8cSopenharmony_ci let expected_bench1 = Some("foo"); 77319625d8cSopenharmony_ci let expected_bench2 = None; 77419625d8cSopenharmony_ci let expected_bench3 = None; 77519625d8cSopenharmony_ci let expected_args = vec!["arg1", "arg2", "arg3"]; 77619625d8cSopenharmony_ci 77719625d8cSopenharmony_ci assert_eq!( 77819625d8cSopenharmony_ci m.get_one::<String>("BENCH1").map(|v| v.as_str()), 77919625d8cSopenharmony_ci expected_bench1 78019625d8cSopenharmony_ci ); 78119625d8cSopenharmony_ci assert_eq!( 78219625d8cSopenharmony_ci m.get_one::<String>("BENCH2").map(|v| v.as_str()), 78319625d8cSopenharmony_ci expected_bench2 78419625d8cSopenharmony_ci ); 78519625d8cSopenharmony_ci assert_eq!( 78619625d8cSopenharmony_ci m.get_one::<String>("BENCH3").map(|v| v.as_str()), 78719625d8cSopenharmony_ci expected_bench3 78819625d8cSopenharmony_ci ); 78919625d8cSopenharmony_ci assert_eq!( 79019625d8cSopenharmony_ci m.get_many::<String>("ARGS") 79119625d8cSopenharmony_ci .unwrap() 79219625d8cSopenharmony_ci .map(|v| v.as_str()) 79319625d8cSopenharmony_ci .collect::<Vec<_>>(), 79419625d8cSopenharmony_ci &*expected_args 79519625d8cSopenharmony_ci ); 79619625d8cSopenharmony_ci} 79719625d8cSopenharmony_ci 79819625d8cSopenharmony_ci#[test] 79919625d8cSopenharmony_cifn missing_positional_hyphen_req_error() { 80019625d8cSopenharmony_ci let r = Command::new("bench") 80119625d8cSopenharmony_ci .allow_missing_positional(true) 80219625d8cSopenharmony_ci .arg(arg!([BENCH1] "some bench")) 80319625d8cSopenharmony_ci .arg(arg!(<BENCH2> "some bench")) 80419625d8cSopenharmony_ci .arg(arg!([ARGS] ... "some args")) 80519625d8cSopenharmony_ci .try_get_matches_from(vec!["bench", "foo", "--", "arg1", "arg2", "arg3"]); 80619625d8cSopenharmony_ci assert!(r.is_err()); 80719625d8cSopenharmony_ci assert_eq!(r.unwrap_err().kind(), ErrorKind::MissingRequiredArgument); 80819625d8cSopenharmony_ci} 80919625d8cSopenharmony_ci 81019625d8cSopenharmony_ci#[test] 81119625d8cSopenharmony_cifn issue_1066_allow_leading_hyphen_and_unknown_args_option() { 81219625d8cSopenharmony_ci let res = Command::new("prog") 81319625d8cSopenharmony_ci .arg( 81419625d8cSopenharmony_ci arg!(--"some-argument" <val>) 81519625d8cSopenharmony_ci .required(true) 81619625d8cSopenharmony_ci .allow_hyphen_values(true), 81719625d8cSopenharmony_ci ) 81819625d8cSopenharmony_ci .try_get_matches_from(vec!["prog", "-fish"]); 81919625d8cSopenharmony_ci 82019625d8cSopenharmony_ci assert!(res.is_err()); 82119625d8cSopenharmony_ci assert_eq!(res.unwrap_err().kind(), ErrorKind::UnknownArgument); 82219625d8cSopenharmony_ci} 82319625d8cSopenharmony_ci 82419625d8cSopenharmony_ci#[test] 82519625d8cSopenharmony_cifn issue_1437_allow_hyphen_values_for_positional_arg() { 82619625d8cSopenharmony_ci let m = Command::new("tmp") 82719625d8cSopenharmony_ci .arg( 82819625d8cSopenharmony_ci Arg::new("pat") 82919625d8cSopenharmony_ci .allow_hyphen_values(true) 83019625d8cSopenharmony_ci .required(true) 83119625d8cSopenharmony_ci .action(ArgAction::Set), 83219625d8cSopenharmony_ci ) 83319625d8cSopenharmony_ci .try_get_matches_from(["tmp", "-file"]) 83419625d8cSopenharmony_ci .unwrap(); 83519625d8cSopenharmony_ci assert_eq!( 83619625d8cSopenharmony_ci m.get_one::<String>("pat").map(|v| v.as_str()), 83719625d8cSopenharmony_ci Some("-file") 83819625d8cSopenharmony_ci ); 83919625d8cSopenharmony_ci} 84019625d8cSopenharmony_ci 84119625d8cSopenharmony_ci#[test] 84219625d8cSopenharmony_cifn issue_3880_allow_long_flag_hyphen_value_for_positional_arg() { 84319625d8cSopenharmony_ci let m = Command::new("prog") 84419625d8cSopenharmony_ci .arg( 84519625d8cSopenharmony_ci Arg::new("pat") 84619625d8cSopenharmony_ci .allow_hyphen_values(true) 84719625d8cSopenharmony_ci .required(true) 84819625d8cSopenharmony_ci .action(ArgAction::Set), 84919625d8cSopenharmony_ci ) 85019625d8cSopenharmony_ci .try_get_matches_from(["", "--file"]) 85119625d8cSopenharmony_ci .unwrap(); 85219625d8cSopenharmony_ci 85319625d8cSopenharmony_ci assert_eq!( 85419625d8cSopenharmony_ci m.get_one::<String>("pat").map(|v| v.as_str()), 85519625d8cSopenharmony_ci Some("--file") 85619625d8cSopenharmony_ci ); 85719625d8cSopenharmony_ci} 85819625d8cSopenharmony_ci 85919625d8cSopenharmony_ci#[test] 86019625d8cSopenharmony_cifn issue_1093_allow_ext_sc() { 86119625d8cSopenharmony_ci let cmd = Command::new("clap-test") 86219625d8cSopenharmony_ci .version("v1.4.8") 86319625d8cSopenharmony_ci .allow_external_subcommands(true); 86419625d8cSopenharmony_ci utils::assert_output(cmd, "clap-test --help", ALLOW_EXT_SC, false); 86519625d8cSopenharmony_ci} 86619625d8cSopenharmony_ci 86719625d8cSopenharmony_ci#[test] 86819625d8cSopenharmony_cifn allow_ext_sc_empty_args() { 86919625d8cSopenharmony_ci let res = Command::new("clap-test") 87019625d8cSopenharmony_ci .version("v1.4.8") 87119625d8cSopenharmony_ci .allow_external_subcommands(true) 87219625d8cSopenharmony_ci .try_get_matches_from(vec!["clap-test", "external-cmd"]); 87319625d8cSopenharmony_ci 87419625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 87519625d8cSopenharmony_ci 87619625d8cSopenharmony_ci match res.unwrap().subcommand() { 87719625d8cSopenharmony_ci Some((name, args)) => { 87819625d8cSopenharmony_ci assert_eq!(name, "external-cmd"); 87919625d8cSopenharmony_ci assert_eq!( 88019625d8cSopenharmony_ci args.get_many::<OsString>("").unwrap().collect::<Vec<_>>(), 88119625d8cSopenharmony_ci Vec::<&OsString>::new(), 88219625d8cSopenharmony_ci ); 88319625d8cSopenharmony_ci } 88419625d8cSopenharmony_ci _ => unreachable!(), 88519625d8cSopenharmony_ci } 88619625d8cSopenharmony_ci} 88719625d8cSopenharmony_ci 88819625d8cSopenharmony_ci#[test] 88919625d8cSopenharmony_cifn allow_ext_sc_when_sc_required() { 89019625d8cSopenharmony_ci let res = Command::new("clap-test") 89119625d8cSopenharmony_ci .version("v1.4.8") 89219625d8cSopenharmony_ci .allow_external_subcommands(true) 89319625d8cSopenharmony_ci .subcommand_required(true) 89419625d8cSopenharmony_ci .try_get_matches_from(vec!["clap-test", "external-cmd", "foo"]); 89519625d8cSopenharmony_ci 89619625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 89719625d8cSopenharmony_ci 89819625d8cSopenharmony_ci match res.unwrap().subcommand() { 89919625d8cSopenharmony_ci Some((name, args)) => { 90019625d8cSopenharmony_ci assert_eq!(name, "external-cmd"); 90119625d8cSopenharmony_ci assert_eq!( 90219625d8cSopenharmony_ci args.get_many::<OsString>("") 90319625d8cSopenharmony_ci .unwrap() 90419625d8cSopenharmony_ci .cloned() 90519625d8cSopenharmony_ci .collect::<Vec<_>>(), 90619625d8cSopenharmony_ci vec![OsString::from("foo")] 90719625d8cSopenharmony_ci ); 90819625d8cSopenharmony_ci } 90919625d8cSopenharmony_ci _ => unreachable!(), 91019625d8cSopenharmony_ci } 91119625d8cSopenharmony_ci} 91219625d8cSopenharmony_ci 91319625d8cSopenharmony_ci#[test] 91419625d8cSopenharmony_cifn external_subcommand_looks_like_built_in() { 91519625d8cSopenharmony_ci let res = Command::new("cargo") 91619625d8cSopenharmony_ci .version("1.26.0") 91719625d8cSopenharmony_ci .allow_external_subcommands(true) 91819625d8cSopenharmony_ci .subcommand(Command::new("install")) 91919625d8cSopenharmony_ci .try_get_matches_from(vec!["cargo", "install-update", "foo"]); 92019625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 92119625d8cSopenharmony_ci let m = res.unwrap(); 92219625d8cSopenharmony_ci match m.subcommand() { 92319625d8cSopenharmony_ci Some((name, args)) => { 92419625d8cSopenharmony_ci assert_eq!(name, "install-update"); 92519625d8cSopenharmony_ci assert_eq!( 92619625d8cSopenharmony_ci args.get_many::<OsString>("") 92719625d8cSopenharmony_ci .unwrap() 92819625d8cSopenharmony_ci .cloned() 92919625d8cSopenharmony_ci .collect::<Vec<_>>(), 93019625d8cSopenharmony_ci vec![OsString::from("foo")] 93119625d8cSopenharmony_ci ); 93219625d8cSopenharmony_ci } 93319625d8cSopenharmony_ci _ => panic!("external_subcommand didn't work"), 93419625d8cSopenharmony_ci } 93519625d8cSopenharmony_ci} 93619625d8cSopenharmony_ci 93719625d8cSopenharmony_ci#[test] 93819625d8cSopenharmony_cifn built_in_subcommand_escaped() { 93919625d8cSopenharmony_ci let res = Command::new("cargo") 94019625d8cSopenharmony_ci .version("1.26.0") 94119625d8cSopenharmony_ci .allow_external_subcommands(true) 94219625d8cSopenharmony_ci .subcommand(Command::new("install")) 94319625d8cSopenharmony_ci .try_get_matches_from(vec!["cargo", "--", "install", "foo"]); 94419625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 94519625d8cSopenharmony_ci let m = res.unwrap(); 94619625d8cSopenharmony_ci match m.subcommand() { 94719625d8cSopenharmony_ci Some((name, args)) => { 94819625d8cSopenharmony_ci assert_eq!(name, "install"); 94919625d8cSopenharmony_ci assert_eq!( 95019625d8cSopenharmony_ci args.get_many::<OsString>("") 95119625d8cSopenharmony_ci .unwrap() 95219625d8cSopenharmony_ci .cloned() 95319625d8cSopenharmony_ci .collect::<Vec<_>>(), 95419625d8cSopenharmony_ci vec![OsString::from("foo")] 95519625d8cSopenharmony_ci ); 95619625d8cSopenharmony_ci } 95719625d8cSopenharmony_ci _ => panic!("external_subcommand didn't work"), 95819625d8cSopenharmony_ci } 95919625d8cSopenharmony_ci} 96019625d8cSopenharmony_ci 96119625d8cSopenharmony_ci#[test] 96219625d8cSopenharmony_cifn aaos_opts_w_other_overrides() { 96319625d8cSopenharmony_ci // opts with other overrides 96419625d8cSopenharmony_ci let res = Command::new("posix") 96519625d8cSopenharmony_ci .args_override_self(true) 96619625d8cSopenharmony_ci .arg(arg!(--opt <val> "some option").action(ArgAction::Set)) 96719625d8cSopenharmony_ci .arg( 96819625d8cSopenharmony_ci arg!(--other <val> "some other option") 96919625d8cSopenharmony_ci .overrides_with("opt") 97019625d8cSopenharmony_ci .action(ArgAction::Set), 97119625d8cSopenharmony_ci ) 97219625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--opt=some", "--other=test", "--opt=other"]); 97319625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 97419625d8cSopenharmony_ci let m = res.unwrap(); 97519625d8cSopenharmony_ci assert!(m.contains_id("opt")); 97619625d8cSopenharmony_ci assert!(!m.contains_id("other")); 97719625d8cSopenharmony_ci assert_eq!( 97819625d8cSopenharmony_ci m.get_one::<String>("opt").map(|v| v.as_str()), 97919625d8cSopenharmony_ci Some("other") 98019625d8cSopenharmony_ci ); 98119625d8cSopenharmony_ci} 98219625d8cSopenharmony_ci 98319625d8cSopenharmony_ci#[test] 98419625d8cSopenharmony_cifn aaos_opts_w_other_overrides_rev() { 98519625d8cSopenharmony_ci // opts with other overrides, rev 98619625d8cSopenharmony_ci let res = Command::new("posix") 98719625d8cSopenharmony_ci .args_override_self(true) 98819625d8cSopenharmony_ci .arg( 98919625d8cSopenharmony_ci arg!(--opt <val> "some option") 99019625d8cSopenharmony_ci .required(true) 99119625d8cSopenharmony_ci .action(ArgAction::Set), 99219625d8cSopenharmony_ci ) 99319625d8cSopenharmony_ci .arg( 99419625d8cSopenharmony_ci arg!(--other <val> "some other option") 99519625d8cSopenharmony_ci .required(true) 99619625d8cSopenharmony_ci .overrides_with("opt") 99719625d8cSopenharmony_ci .action(ArgAction::Set), 99819625d8cSopenharmony_ci ) 99919625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--opt=some", "--opt=other", "--other=val"]); 100019625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 100119625d8cSopenharmony_ci let m = res.unwrap(); 100219625d8cSopenharmony_ci assert!(!m.contains_id("opt")); 100319625d8cSopenharmony_ci assert!(m.contains_id("other")); 100419625d8cSopenharmony_ci assert_eq!( 100519625d8cSopenharmony_ci m.get_one::<String>("other").map(|v| v.as_str()), 100619625d8cSopenharmony_ci Some("val") 100719625d8cSopenharmony_ci ); 100819625d8cSopenharmony_ci} 100919625d8cSopenharmony_ci 101019625d8cSopenharmony_ci#[test] 101119625d8cSopenharmony_cifn aaos_opts_w_other_overrides_2() { 101219625d8cSopenharmony_ci // opts with other overrides 101319625d8cSopenharmony_ci let res = Command::new("posix") 101419625d8cSopenharmony_ci .args_override_self(true) 101519625d8cSopenharmony_ci .arg( 101619625d8cSopenharmony_ci arg!(--opt <val> "some option") 101719625d8cSopenharmony_ci .overrides_with("other") 101819625d8cSopenharmony_ci .action(ArgAction::Set), 101919625d8cSopenharmony_ci ) 102019625d8cSopenharmony_ci .arg(arg!(--other <val> "some other option").action(ArgAction::Set)) 102119625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--opt=some", "--other=test", "--opt=other"]); 102219625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 102319625d8cSopenharmony_ci let m = res.unwrap(); 102419625d8cSopenharmony_ci assert!(m.contains_id("opt")); 102519625d8cSopenharmony_ci assert!(!m.contains_id("other")); 102619625d8cSopenharmony_ci assert_eq!( 102719625d8cSopenharmony_ci m.get_one::<String>("opt").map(|v| v.as_str()), 102819625d8cSopenharmony_ci Some("other") 102919625d8cSopenharmony_ci ); 103019625d8cSopenharmony_ci} 103119625d8cSopenharmony_ci 103219625d8cSopenharmony_ci#[test] 103319625d8cSopenharmony_cifn aaos_opts_w_other_overrides_rev_2() { 103419625d8cSopenharmony_ci // opts with other overrides, rev 103519625d8cSopenharmony_ci let res = Command::new("posix") 103619625d8cSopenharmony_ci .args_override_self(true) 103719625d8cSopenharmony_ci .arg( 103819625d8cSopenharmony_ci arg!(--opt <val> "some option") 103919625d8cSopenharmony_ci .required(true) 104019625d8cSopenharmony_ci .overrides_with("other") 104119625d8cSopenharmony_ci .action(ArgAction::Set), 104219625d8cSopenharmony_ci ) 104319625d8cSopenharmony_ci .arg( 104419625d8cSopenharmony_ci arg!(--other <val> "some other option") 104519625d8cSopenharmony_ci .required(true) 104619625d8cSopenharmony_ci .action(ArgAction::Set), 104719625d8cSopenharmony_ci ) 104819625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--opt=some", "--opt=other", "--other=val"]); 104919625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 105019625d8cSopenharmony_ci let m = res.unwrap(); 105119625d8cSopenharmony_ci assert!(!m.contains_id("opt")); 105219625d8cSopenharmony_ci assert!(m.contains_id("other")); 105319625d8cSopenharmony_ci assert_eq!( 105419625d8cSopenharmony_ci m.get_one::<String>("other").map(|v| v.as_str()), 105519625d8cSopenharmony_ci Some("val") 105619625d8cSopenharmony_ci ); 105719625d8cSopenharmony_ci} 105819625d8cSopenharmony_ci 105919625d8cSopenharmony_ci#[test] 106019625d8cSopenharmony_cifn aaos_opts_w_override_as_conflict_1() { 106119625d8cSopenharmony_ci // opts with other overrides, rev 106219625d8cSopenharmony_ci let res = Command::new("posix") 106319625d8cSopenharmony_ci .arg( 106419625d8cSopenharmony_ci arg!(--opt <val> "some option") 106519625d8cSopenharmony_ci .required(true) 106619625d8cSopenharmony_ci .overrides_with("other") 106719625d8cSopenharmony_ci .action(ArgAction::Set), 106819625d8cSopenharmony_ci ) 106919625d8cSopenharmony_ci .arg( 107019625d8cSopenharmony_ci arg!(--other <val> "some other option") 107119625d8cSopenharmony_ci .required(true) 107219625d8cSopenharmony_ci .action(ArgAction::Set), 107319625d8cSopenharmony_ci ) 107419625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--opt=some"]); 107519625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 107619625d8cSopenharmony_ci let m = res.unwrap(); 107719625d8cSopenharmony_ci assert!(m.contains_id("opt")); 107819625d8cSopenharmony_ci assert!(!m.contains_id("other")); 107919625d8cSopenharmony_ci assert_eq!(m.get_one::<String>("opt").map(|v| v.as_str()), Some("some")); 108019625d8cSopenharmony_ci} 108119625d8cSopenharmony_ci 108219625d8cSopenharmony_ci#[test] 108319625d8cSopenharmony_cifn aaos_opts_w_override_as_conflict_2() { 108419625d8cSopenharmony_ci // opts with other overrides, rev 108519625d8cSopenharmony_ci let res = Command::new("posix") 108619625d8cSopenharmony_ci .arg( 108719625d8cSopenharmony_ci arg!(--opt <val> "some option") 108819625d8cSopenharmony_ci .required(true) 108919625d8cSopenharmony_ci .overrides_with("other") 109019625d8cSopenharmony_ci .action(ArgAction::Set), 109119625d8cSopenharmony_ci ) 109219625d8cSopenharmony_ci .arg( 109319625d8cSopenharmony_ci arg!(--other <val> "some other option") 109419625d8cSopenharmony_ci .required(true) 109519625d8cSopenharmony_ci .action(ArgAction::Set), 109619625d8cSopenharmony_ci ) 109719625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--other=some"]); 109819625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 109919625d8cSopenharmony_ci let m = res.unwrap(); 110019625d8cSopenharmony_ci assert!(!m.contains_id("opt")); 110119625d8cSopenharmony_ci assert!(m.contains_id("other")); 110219625d8cSopenharmony_ci assert_eq!( 110319625d8cSopenharmony_ci m.get_one::<String>("other").map(|v| v.as_str()), 110419625d8cSopenharmony_ci Some("some") 110519625d8cSopenharmony_ci ); 110619625d8cSopenharmony_ci} 110719625d8cSopenharmony_ci 110819625d8cSopenharmony_ci#[test] 110919625d8cSopenharmony_cifn aaos_opts_mult_req_delims() { 111019625d8cSopenharmony_ci // opts with multiple and require delims 111119625d8cSopenharmony_ci let res = Command::new("posix") 111219625d8cSopenharmony_ci .arg( 111319625d8cSopenharmony_ci arg!(--opt <val> ... "some option") 111419625d8cSopenharmony_ci .action(ArgAction::Set) 111519625d8cSopenharmony_ci .value_delimiter(',') 111619625d8cSopenharmony_ci .action(ArgAction::Append), 111719625d8cSopenharmony_ci ) 111819625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--opt=some", "--opt=other", "--opt=one,two"]); 111919625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 112019625d8cSopenharmony_ci let m = res.unwrap(); 112119625d8cSopenharmony_ci assert!(m.contains_id("opt")); 112219625d8cSopenharmony_ci assert_eq!( 112319625d8cSopenharmony_ci m.get_many::<String>("opt") 112419625d8cSopenharmony_ci .unwrap() 112519625d8cSopenharmony_ci .map(|v| v.as_str()) 112619625d8cSopenharmony_ci .collect::<Vec<_>>(), 112719625d8cSopenharmony_ci ["some", "other", "one", "two"] 112819625d8cSopenharmony_ci ); 112919625d8cSopenharmony_ci} 113019625d8cSopenharmony_ci 113119625d8cSopenharmony_ci#[test] 113219625d8cSopenharmony_cifn aaos_opts_mult() { 113319625d8cSopenharmony_ci // opts with multiple 113419625d8cSopenharmony_ci let res = Command::new("posix") 113519625d8cSopenharmony_ci .arg( 113619625d8cSopenharmony_ci arg!(--opt <val> ... "some option") 113719625d8cSopenharmony_ci .num_args(1..) 113819625d8cSopenharmony_ci .action(ArgAction::Append), 113919625d8cSopenharmony_ci ) 114019625d8cSopenharmony_ci .try_get_matches_from(vec![ 114119625d8cSopenharmony_ci "", 114219625d8cSopenharmony_ci "--opt", 114319625d8cSopenharmony_ci "first", 114419625d8cSopenharmony_ci "overrides", 114519625d8cSopenharmony_ci "--opt", 114619625d8cSopenharmony_ci "some", 114719625d8cSopenharmony_ci "other", 114819625d8cSopenharmony_ci "val", 114919625d8cSopenharmony_ci ]); 115019625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 115119625d8cSopenharmony_ci let m = res.unwrap(); 115219625d8cSopenharmony_ci assert!(m.contains_id("opt")); 115319625d8cSopenharmony_ci assert_eq!( 115419625d8cSopenharmony_ci m.get_many::<String>("opt") 115519625d8cSopenharmony_ci .unwrap() 115619625d8cSopenharmony_ci .map(|v| v.as_str()) 115719625d8cSopenharmony_ci .collect::<Vec<_>>(), 115819625d8cSopenharmony_ci ["first", "overrides", "some", "other", "val"] 115919625d8cSopenharmony_ci ); 116019625d8cSopenharmony_ci} 116119625d8cSopenharmony_ci 116219625d8cSopenharmony_ci#[test] 116319625d8cSopenharmony_cifn aaos_pos_mult() { 116419625d8cSopenharmony_ci // opts with multiple 116519625d8cSopenharmony_ci let res = Command::new("posix") 116619625d8cSopenharmony_ci .arg(arg!([val] ... "some pos")) 116719625d8cSopenharmony_ci .try_get_matches_from(vec!["", "some", "other", "value"]); 116819625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 116919625d8cSopenharmony_ci let m = res.unwrap(); 117019625d8cSopenharmony_ci assert!(m.contains_id("val")); 117119625d8cSopenharmony_ci assert_eq!( 117219625d8cSopenharmony_ci m.get_many::<String>("val") 117319625d8cSopenharmony_ci .unwrap() 117419625d8cSopenharmony_ci .map(|v| v.as_str()) 117519625d8cSopenharmony_ci .collect::<Vec<_>>(), 117619625d8cSopenharmony_ci ["some", "other", "value"] 117719625d8cSopenharmony_ci ); 117819625d8cSopenharmony_ci} 117919625d8cSopenharmony_ci 118019625d8cSopenharmony_ci#[test] 118119625d8cSopenharmony_cifn aaos_option_use_delim_false() { 118219625d8cSopenharmony_ci let m = Command::new("posix") 118319625d8cSopenharmony_ci .args_override_self(true) 118419625d8cSopenharmony_ci .arg( 118519625d8cSopenharmony_ci arg!(--opt <val> "some option") 118619625d8cSopenharmony_ci .required(true) 118719625d8cSopenharmony_ci .action(ArgAction::Set), 118819625d8cSopenharmony_ci ) 118919625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--opt=some,other", "--opt=one,two"]) 119019625d8cSopenharmony_ci .unwrap(); 119119625d8cSopenharmony_ci assert!(m.contains_id("opt")); 119219625d8cSopenharmony_ci assert_eq!( 119319625d8cSopenharmony_ci m.get_many::<String>("opt") 119419625d8cSopenharmony_ci .unwrap() 119519625d8cSopenharmony_ci .map(|v| v.as_str()) 119619625d8cSopenharmony_ci .collect::<Vec<_>>(), 119719625d8cSopenharmony_ci ["one,two"] 119819625d8cSopenharmony_ci ); 119919625d8cSopenharmony_ci} 120019625d8cSopenharmony_ci 120119625d8cSopenharmony_ci#[test] 120219625d8cSopenharmony_ci#[cfg(feature = "color")] 120319625d8cSopenharmony_cifn color_is_global() { 120419625d8cSopenharmony_ci let mut cmd = Command::new("myprog") 120519625d8cSopenharmony_ci .color(clap::ColorChoice::Never) 120619625d8cSopenharmony_ci .subcommand(Command::new("foo")); 120719625d8cSopenharmony_ci cmd.build(); 120819625d8cSopenharmony_ci assert_eq!(cmd.get_color(), clap::ColorChoice::Never); 120919625d8cSopenharmony_ci 121019625d8cSopenharmony_ci let sub = cmd.get_subcommands().collect::<Vec<_>>()[0]; 121119625d8cSopenharmony_ci assert_eq!(sub.get_color(), clap::ColorChoice::Never); 121219625d8cSopenharmony_ci} 1213