119625d8cSopenharmony_ciuse clap::{arg, error::ErrorKind, Arg, ArgAction, ArgMatches, Command}; 219625d8cSopenharmony_ci 319625d8cSopenharmony_ci#[cfg(feature = "error-context")] 419625d8cSopenharmony_ciuse super::utils; 519625d8cSopenharmony_ci 619625d8cSopenharmony_ci#[test] 719625d8cSopenharmony_cifn require_equals_fail() { 819625d8cSopenharmony_ci let res = Command::new("prog") 919625d8cSopenharmony_ci .arg( 1019625d8cSopenharmony_ci Arg::new("cfg") 1119625d8cSopenharmony_ci .require_equals(true) 1219625d8cSopenharmony_ci .value_parser(clap::builder::NonEmptyStringValueParser::new()) 1319625d8cSopenharmony_ci .action(ArgAction::Set) 1419625d8cSopenharmony_ci .long("config"), 1519625d8cSopenharmony_ci ) 1619625d8cSopenharmony_ci .try_get_matches_from(vec!["prog", "--config", "file.conf"]); 1719625d8cSopenharmony_ci assert!(res.is_err()); 1819625d8cSopenharmony_ci assert_eq!(res.unwrap_err().kind(), ErrorKind::NoEquals); 1919625d8cSopenharmony_ci} 2019625d8cSopenharmony_ci 2119625d8cSopenharmony_ci#[test] 2219625d8cSopenharmony_ci#[cfg(feature = "error-context")] 2319625d8cSopenharmony_cifn require_equals_fail_message() { 2419625d8cSopenharmony_ci static NO_EQUALS: &str = "error: equal sign is needed when assigning values to '--config=<cfg>' 2519625d8cSopenharmony_ci 2619625d8cSopenharmony_ciUsage: prog [OPTIONS] 2719625d8cSopenharmony_ci 2819625d8cSopenharmony_ciFor more information, try '--help'. 2919625d8cSopenharmony_ci"; 3019625d8cSopenharmony_ci let cmd = Command::new("prog").arg( 3119625d8cSopenharmony_ci Arg::new("cfg") 3219625d8cSopenharmony_ci .require_equals(true) 3319625d8cSopenharmony_ci .action(ArgAction::Set) 3419625d8cSopenharmony_ci .long("config"), 3519625d8cSopenharmony_ci ); 3619625d8cSopenharmony_ci utils::assert_output(cmd, "prog --config file.conf", NO_EQUALS, true); 3719625d8cSopenharmony_ci} 3819625d8cSopenharmony_ci 3919625d8cSopenharmony_ci#[test] 4019625d8cSopenharmony_cifn require_equals_min_values_zero() { 4119625d8cSopenharmony_ci let res = Command::new("prog") 4219625d8cSopenharmony_ci .arg( 4319625d8cSopenharmony_ci Arg::new("cfg") 4419625d8cSopenharmony_ci .action(ArgAction::Set) 4519625d8cSopenharmony_ci .require_equals(true) 4619625d8cSopenharmony_ci .num_args(0..) 4719625d8cSopenharmony_ci .long("config"), 4819625d8cSopenharmony_ci ) 4919625d8cSopenharmony_ci .arg(Arg::new("cmd")) 5019625d8cSopenharmony_ci .try_get_matches_from(vec!["prog", "--config", "cmd"]); 5119625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 5219625d8cSopenharmony_ci let m = res.unwrap(); 5319625d8cSopenharmony_ci assert!(m.contains_id("cfg")); 5419625d8cSopenharmony_ci assert_eq!(m.get_one::<String>("cmd").map(|v| v.as_str()), Some("cmd")); 5519625d8cSopenharmony_ci} 5619625d8cSopenharmony_ci 5719625d8cSopenharmony_ci#[test] 5819625d8cSopenharmony_cifn double_hyphen_as_value() { 5919625d8cSopenharmony_ci let res = Command::new("prog") 6019625d8cSopenharmony_ci .arg( 6119625d8cSopenharmony_ci Arg::new("cfg") 6219625d8cSopenharmony_ci .action(ArgAction::Set) 6319625d8cSopenharmony_ci .allow_hyphen_values(true) 6419625d8cSopenharmony_ci .long("config"), 6519625d8cSopenharmony_ci ) 6619625d8cSopenharmony_ci .try_get_matches_from(vec!["prog", "--config", "--"]); 6719625d8cSopenharmony_ci assert!(res.is_ok(), "{:?}", res); 6819625d8cSopenharmony_ci assert_eq!( 6919625d8cSopenharmony_ci res.unwrap().get_one::<String>("cfg").map(|v| v.as_str()), 7019625d8cSopenharmony_ci Some("--") 7119625d8cSopenharmony_ci ); 7219625d8cSopenharmony_ci} 7319625d8cSopenharmony_ci 7419625d8cSopenharmony_ci#[test] 7519625d8cSopenharmony_cifn require_equals_no_empty_values_fail() { 7619625d8cSopenharmony_ci let res = Command::new("prog") 7719625d8cSopenharmony_ci .arg( 7819625d8cSopenharmony_ci Arg::new("cfg") 7919625d8cSopenharmony_ci .action(ArgAction::Set) 8019625d8cSopenharmony_ci .require_equals(true) 8119625d8cSopenharmony_ci .value_parser(clap::builder::NonEmptyStringValueParser::new()) 8219625d8cSopenharmony_ci .long("config"), 8319625d8cSopenharmony_ci ) 8419625d8cSopenharmony_ci .arg(Arg::new("some")) 8519625d8cSopenharmony_ci .try_get_matches_from(vec!["prog", "--config=", "file.conf"]); 8619625d8cSopenharmony_ci assert!(res.is_err()); 8719625d8cSopenharmony_ci assert_eq!(res.unwrap_err().kind(), ErrorKind::InvalidValue); 8819625d8cSopenharmony_ci} 8919625d8cSopenharmony_ci 9019625d8cSopenharmony_ci#[test] 9119625d8cSopenharmony_cifn require_equals_empty_vals_pass() { 9219625d8cSopenharmony_ci let res = Command::new("prog") 9319625d8cSopenharmony_ci .arg( 9419625d8cSopenharmony_ci Arg::new("cfg") 9519625d8cSopenharmony_ci .action(ArgAction::Set) 9619625d8cSopenharmony_ci .require_equals(true) 9719625d8cSopenharmony_ci .long("config"), 9819625d8cSopenharmony_ci ) 9919625d8cSopenharmony_ci .try_get_matches_from(vec!["prog", "--config="]); 10019625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 10119625d8cSopenharmony_ci} 10219625d8cSopenharmony_ci 10319625d8cSopenharmony_ci#[test] 10419625d8cSopenharmony_cifn require_equals_pass() { 10519625d8cSopenharmony_ci let res = Command::new("prog") 10619625d8cSopenharmony_ci .arg( 10719625d8cSopenharmony_ci Arg::new("cfg") 10819625d8cSopenharmony_ci .action(ArgAction::Set) 10919625d8cSopenharmony_ci .require_equals(true) 11019625d8cSopenharmony_ci .long("config"), 11119625d8cSopenharmony_ci ) 11219625d8cSopenharmony_ci .try_get_matches_from(vec!["prog", "--config=file.conf"]); 11319625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 11419625d8cSopenharmony_ci} 11519625d8cSopenharmony_ci 11619625d8cSopenharmony_ci#[test] 11719625d8cSopenharmony_cifn stdin_char() { 11819625d8cSopenharmony_ci let r = Command::new("opts") 11919625d8cSopenharmony_ci .arg(arg!(f: -f [flag] "some flag")) 12019625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-f", "-"]); 12119625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 12219625d8cSopenharmony_ci let m = r.unwrap(); 12319625d8cSopenharmony_ci assert!(m.contains_id("f")); 12419625d8cSopenharmony_ci assert_eq!(m.get_one::<String>("f").map(|v| v.as_str()).unwrap(), "-"); 12519625d8cSopenharmony_ci} 12619625d8cSopenharmony_ci 12719625d8cSopenharmony_ci#[test] 12819625d8cSopenharmony_cifn opts_using_short() { 12919625d8cSopenharmony_ci let r = Command::new("opts") 13019625d8cSopenharmony_ci .args([ 13119625d8cSopenharmony_ci arg!(f: -f [flag] "some flag"), 13219625d8cSopenharmony_ci arg!(c: -c [color] "some other flag"), 13319625d8cSopenharmony_ci ]) 13419625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-f", "some", "-c", "other"]); 13519625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 13619625d8cSopenharmony_ci let m = r.unwrap(); 13719625d8cSopenharmony_ci assert!(m.contains_id("f")); 13819625d8cSopenharmony_ci assert_eq!( 13919625d8cSopenharmony_ci m.get_one::<String>("f").map(|v| v.as_str()).unwrap(), 14019625d8cSopenharmony_ci "some" 14119625d8cSopenharmony_ci ); 14219625d8cSopenharmony_ci assert!(m.contains_id("c")); 14319625d8cSopenharmony_ci assert_eq!( 14419625d8cSopenharmony_ci m.get_one::<String>("c").map(|v| v.as_str()).unwrap(), 14519625d8cSopenharmony_ci "other" 14619625d8cSopenharmony_ci ); 14719625d8cSopenharmony_ci} 14819625d8cSopenharmony_ci 14919625d8cSopenharmony_ci#[test] 15019625d8cSopenharmony_cifn lots_o_vals() { 15119625d8cSopenharmony_ci let r = Command::new("opts") 15219625d8cSopenharmony_ci .arg(arg!(o: -o <opt> "some opt").num_args(1..).required(true)) 15319625d8cSopenharmony_ci .try_get_matches_from(vec![ 15419625d8cSopenharmony_ci "", "-o", "some", "some", "some", "some", "some", "some", "some", "some", "some", 15519625d8cSopenharmony_ci "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", 15619625d8cSopenharmony_ci "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", 15719625d8cSopenharmony_ci "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", 15819625d8cSopenharmony_ci "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", 15919625d8cSopenharmony_ci "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", 16019625d8cSopenharmony_ci "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", 16119625d8cSopenharmony_ci "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", 16219625d8cSopenharmony_ci "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", 16319625d8cSopenharmony_ci "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", 16419625d8cSopenharmony_ci "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", 16519625d8cSopenharmony_ci "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", 16619625d8cSopenharmony_ci "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", 16719625d8cSopenharmony_ci "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", 16819625d8cSopenharmony_ci "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", 16919625d8cSopenharmony_ci "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", 17019625d8cSopenharmony_ci "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", 17119625d8cSopenharmony_ci "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", 17219625d8cSopenharmony_ci "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", 17319625d8cSopenharmony_ci "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", 17419625d8cSopenharmony_ci "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", 17519625d8cSopenharmony_ci "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", 17619625d8cSopenharmony_ci "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", 17719625d8cSopenharmony_ci "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", 17819625d8cSopenharmony_ci "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", 17919625d8cSopenharmony_ci "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", 18019625d8cSopenharmony_ci "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", 18119625d8cSopenharmony_ci "some", "some", 18219625d8cSopenharmony_ci ]); 18319625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 18419625d8cSopenharmony_ci let m = r.unwrap(); 18519625d8cSopenharmony_ci assert!(m.contains_id("o")); 18619625d8cSopenharmony_ci assert_eq!(m.get_many::<String>("o").unwrap().count(), 297); // i.e. more than u8 18719625d8cSopenharmony_ci} 18819625d8cSopenharmony_ci 18919625d8cSopenharmony_ci#[test] 19019625d8cSopenharmony_cifn opts_using_long_space() { 19119625d8cSopenharmony_ci let r = Command::new("opts") 19219625d8cSopenharmony_ci .args([ 19319625d8cSopenharmony_ci arg!(--flag [flag] "some flag"), 19419625d8cSopenharmony_ci arg!(--color [color] "some other flag"), 19519625d8cSopenharmony_ci ]) 19619625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--flag", "some", "--color", "other"]); 19719625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 19819625d8cSopenharmony_ci let m = r.unwrap(); 19919625d8cSopenharmony_ci assert!(m.contains_id("flag")); 20019625d8cSopenharmony_ci assert_eq!( 20119625d8cSopenharmony_ci m.get_one::<String>("flag").map(|v| v.as_str()).unwrap(), 20219625d8cSopenharmony_ci "some" 20319625d8cSopenharmony_ci ); 20419625d8cSopenharmony_ci assert!(m.contains_id("color")); 20519625d8cSopenharmony_ci assert_eq!( 20619625d8cSopenharmony_ci m.get_one::<String>("color").map(|v| v.as_str()).unwrap(), 20719625d8cSopenharmony_ci "other" 20819625d8cSopenharmony_ci ); 20919625d8cSopenharmony_ci} 21019625d8cSopenharmony_ci 21119625d8cSopenharmony_ci#[test] 21219625d8cSopenharmony_cifn opts_using_long_equals() { 21319625d8cSopenharmony_ci let r = Command::new("opts") 21419625d8cSopenharmony_ci .args([ 21519625d8cSopenharmony_ci arg!(--flag [flag] "some flag"), 21619625d8cSopenharmony_ci arg!(--color [color] "some other flag"), 21719625d8cSopenharmony_ci ]) 21819625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--flag=some", "--color=other"]); 21919625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 22019625d8cSopenharmony_ci let m = r.unwrap(); 22119625d8cSopenharmony_ci assert!(m.contains_id("flag")); 22219625d8cSopenharmony_ci assert_eq!( 22319625d8cSopenharmony_ci m.get_one::<String>("flag").map(|v| v.as_str()).unwrap(), 22419625d8cSopenharmony_ci "some" 22519625d8cSopenharmony_ci ); 22619625d8cSopenharmony_ci assert!(m.contains_id("color")); 22719625d8cSopenharmony_ci assert_eq!( 22819625d8cSopenharmony_ci m.get_one::<String>("color").map(|v| v.as_str()).unwrap(), 22919625d8cSopenharmony_ci "other" 23019625d8cSopenharmony_ci ); 23119625d8cSopenharmony_ci} 23219625d8cSopenharmony_ci 23319625d8cSopenharmony_ci#[test] 23419625d8cSopenharmony_cifn opts_using_mixed() { 23519625d8cSopenharmony_ci let r = Command::new("opts") 23619625d8cSopenharmony_ci .args([ 23719625d8cSopenharmony_ci arg!(-f --flag [flag] "some flag"), 23819625d8cSopenharmony_ci arg!(-c --color [color] "some other flag"), 23919625d8cSopenharmony_ci ]) 24019625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-f", "some", "--color", "other"]); 24119625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 24219625d8cSopenharmony_ci let m = r.unwrap(); 24319625d8cSopenharmony_ci assert!(m.contains_id("flag")); 24419625d8cSopenharmony_ci assert_eq!( 24519625d8cSopenharmony_ci m.get_one::<String>("flag").map(|v| v.as_str()).unwrap(), 24619625d8cSopenharmony_ci "some" 24719625d8cSopenharmony_ci ); 24819625d8cSopenharmony_ci assert!(m.contains_id("color")); 24919625d8cSopenharmony_ci assert_eq!( 25019625d8cSopenharmony_ci m.get_one::<String>("color").map(|v| v.as_str()).unwrap(), 25119625d8cSopenharmony_ci "other" 25219625d8cSopenharmony_ci ); 25319625d8cSopenharmony_ci} 25419625d8cSopenharmony_ci 25519625d8cSopenharmony_ci#[test] 25619625d8cSopenharmony_cifn opts_using_mixed2() { 25719625d8cSopenharmony_ci let r = Command::new("opts") 25819625d8cSopenharmony_ci .args([ 25919625d8cSopenharmony_ci arg!(-f --flag [flag] "some flag"), 26019625d8cSopenharmony_ci arg!(-c --color [color] "some other flag"), 26119625d8cSopenharmony_ci ]) 26219625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--flag=some", "-c", "other"]); 26319625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 26419625d8cSopenharmony_ci let m = r.unwrap(); 26519625d8cSopenharmony_ci assert!(m.contains_id("flag")); 26619625d8cSopenharmony_ci assert_eq!( 26719625d8cSopenharmony_ci m.get_one::<String>("flag").map(|v| v.as_str()).unwrap(), 26819625d8cSopenharmony_ci "some" 26919625d8cSopenharmony_ci ); 27019625d8cSopenharmony_ci assert!(m.contains_id("color")); 27119625d8cSopenharmony_ci assert_eq!( 27219625d8cSopenharmony_ci m.get_one::<String>("color").map(|v| v.as_str()).unwrap(), 27319625d8cSopenharmony_ci "other" 27419625d8cSopenharmony_ci ); 27519625d8cSopenharmony_ci} 27619625d8cSopenharmony_ci 27719625d8cSopenharmony_ci#[test] 27819625d8cSopenharmony_cifn default_values_user_value() { 27919625d8cSopenharmony_ci let r = Command::new("df") 28019625d8cSopenharmony_ci .arg(arg!(o: -o [opt] "some opt").default_value("default")) 28119625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-o", "value"]); 28219625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 28319625d8cSopenharmony_ci let m = r.unwrap(); 28419625d8cSopenharmony_ci assert!(m.contains_id("o")); 28519625d8cSopenharmony_ci assert_eq!( 28619625d8cSopenharmony_ci m.get_one::<String>("o").map(|v| v.as_str()).unwrap(), 28719625d8cSopenharmony_ci "value" 28819625d8cSopenharmony_ci ); 28919625d8cSopenharmony_ci} 29019625d8cSopenharmony_ci 29119625d8cSopenharmony_ci#[test] 29219625d8cSopenharmony_cifn multiple_vals_pos_arg_equals() { 29319625d8cSopenharmony_ci let r = Command::new("mvae") 29419625d8cSopenharmony_ci .arg(arg!(o: -o [opt] ... "some opt")) 29519625d8cSopenharmony_ci .arg(arg!([file] "some file")) 29619625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-o=1", "some"]); 29719625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 29819625d8cSopenharmony_ci let m = r.unwrap(); 29919625d8cSopenharmony_ci assert!(m.contains_id("o")); 30019625d8cSopenharmony_ci assert_eq!(m.get_one::<String>("o").map(|v| v.as_str()).unwrap(), "1"); 30119625d8cSopenharmony_ci assert!(m.contains_id("file")); 30219625d8cSopenharmony_ci assert_eq!( 30319625d8cSopenharmony_ci m.get_one::<String>("file").map(|v| v.as_str()).unwrap(), 30419625d8cSopenharmony_ci "some" 30519625d8cSopenharmony_ci ); 30619625d8cSopenharmony_ci} 30719625d8cSopenharmony_ci 30819625d8cSopenharmony_ci#[test] 30919625d8cSopenharmony_cifn require_delims_no_delim() { 31019625d8cSopenharmony_ci let r = Command::new("mvae") 31119625d8cSopenharmony_ci .arg(arg!(o: -o [opt] ... "some opt").value_delimiter(',')) 31219625d8cSopenharmony_ci .arg(arg!([file] "some file")) 31319625d8cSopenharmony_ci .try_get_matches_from(vec!["mvae", "-o", "1", "2", "some"]); 31419625d8cSopenharmony_ci assert!(r.is_err()); 31519625d8cSopenharmony_ci let err = r.unwrap_err(); 31619625d8cSopenharmony_ci assert_eq!(err.kind(), ErrorKind::UnknownArgument); 31719625d8cSopenharmony_ci} 31819625d8cSopenharmony_ci 31919625d8cSopenharmony_ci#[test] 32019625d8cSopenharmony_cifn require_delims() { 32119625d8cSopenharmony_ci let r = Command::new("mvae") 32219625d8cSopenharmony_ci .arg( 32319625d8cSopenharmony_ci arg!(o: -o <opt> "some opt") 32419625d8cSopenharmony_ci .value_delimiter(',') 32519625d8cSopenharmony_ci .required(true), 32619625d8cSopenharmony_ci ) 32719625d8cSopenharmony_ci .arg(arg!([file] "some file")) 32819625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-o", "1,2", "some"]); 32919625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 33019625d8cSopenharmony_ci let m = r.unwrap(); 33119625d8cSopenharmony_ci assert!(m.contains_id("o")); 33219625d8cSopenharmony_ci assert_eq!( 33319625d8cSopenharmony_ci m.get_many::<String>("o") 33419625d8cSopenharmony_ci .unwrap() 33519625d8cSopenharmony_ci .map(|v| v.as_str()) 33619625d8cSopenharmony_ci .collect::<Vec<_>>(), 33719625d8cSopenharmony_ci ["1", "2"] 33819625d8cSopenharmony_ci ); 33919625d8cSopenharmony_ci assert!(m.contains_id("file")); 34019625d8cSopenharmony_ci assert_eq!( 34119625d8cSopenharmony_ci m.get_one::<String>("file").map(|v| v.as_str()).unwrap(), 34219625d8cSopenharmony_ci "some" 34319625d8cSopenharmony_ci ); 34419625d8cSopenharmony_ci} 34519625d8cSopenharmony_ci 34619625d8cSopenharmony_ci#[test] 34719625d8cSopenharmony_cifn leading_hyphen_pass() { 34819625d8cSopenharmony_ci let r = Command::new("mvae") 34919625d8cSopenharmony_ci .arg( 35019625d8cSopenharmony_ci arg!(o: -o <opt> "some opt") 35119625d8cSopenharmony_ci .required(true) 35219625d8cSopenharmony_ci .num_args(1..) 35319625d8cSopenharmony_ci .allow_hyphen_values(true), 35419625d8cSopenharmony_ci ) 35519625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-o", "-2", "3"]); 35619625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 35719625d8cSopenharmony_ci let m = r.unwrap(); 35819625d8cSopenharmony_ci assert!(m.contains_id("o")); 35919625d8cSopenharmony_ci assert_eq!( 36019625d8cSopenharmony_ci m.get_many::<String>("o") 36119625d8cSopenharmony_ci .unwrap() 36219625d8cSopenharmony_ci .map(|v| v.as_str()) 36319625d8cSopenharmony_ci .collect::<Vec<_>>(), 36419625d8cSopenharmony_ci ["-2", "3"] 36519625d8cSopenharmony_ci ); 36619625d8cSopenharmony_ci} 36719625d8cSopenharmony_ci 36819625d8cSopenharmony_ci#[test] 36919625d8cSopenharmony_cifn leading_hyphen_fail() { 37019625d8cSopenharmony_ci let r = Command::new("mvae") 37119625d8cSopenharmony_ci .arg(arg!(o: -o <opt> "some opt").required(true)) 37219625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-o", "-2"]); 37319625d8cSopenharmony_ci assert!(r.is_err()); 37419625d8cSopenharmony_ci let m = r.unwrap_err(); 37519625d8cSopenharmony_ci assert_eq!(m.kind(), ErrorKind::UnknownArgument); 37619625d8cSopenharmony_ci} 37719625d8cSopenharmony_ci 37819625d8cSopenharmony_ci#[test] 37919625d8cSopenharmony_cifn leading_hyphen_with_flag_after() { 38019625d8cSopenharmony_ci let r = Command::new("mvae") 38119625d8cSopenharmony_ci .arg( 38219625d8cSopenharmony_ci arg!(o: -o <opt> "some opt") 38319625d8cSopenharmony_ci .required(true) 38419625d8cSopenharmony_ci .num_args(1..) 38519625d8cSopenharmony_ci .allow_hyphen_values(true), 38619625d8cSopenharmony_ci ) 38719625d8cSopenharmony_ci .arg(arg!(f: -f "some flag").action(ArgAction::SetTrue)) 38819625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-o", "-2", "-f"]); 38919625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 39019625d8cSopenharmony_ci let m = r.unwrap(); 39119625d8cSopenharmony_ci assert!(m.contains_id("o")); 39219625d8cSopenharmony_ci assert_eq!( 39319625d8cSopenharmony_ci m.get_many::<String>("o") 39419625d8cSopenharmony_ci .unwrap() 39519625d8cSopenharmony_ci .map(|v| v.as_str()) 39619625d8cSopenharmony_ci .collect::<Vec<_>>(), 39719625d8cSopenharmony_ci ["-2", "-f"] 39819625d8cSopenharmony_ci ); 39919625d8cSopenharmony_ci assert!(!*m.get_one::<bool>("f").expect("defaulted by clap")); 40019625d8cSopenharmony_ci} 40119625d8cSopenharmony_ci 40219625d8cSopenharmony_ci#[test] 40319625d8cSopenharmony_cifn leading_hyphen_with_flag_before() { 40419625d8cSopenharmony_ci let r = Command::new("mvae") 40519625d8cSopenharmony_ci .arg(arg!(o: -o [opt] ... "some opt").allow_hyphen_values(true)) 40619625d8cSopenharmony_ci .arg(arg!(f: -f "some flag").action(ArgAction::SetTrue)) 40719625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-f", "-o", "-2"]); 40819625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 40919625d8cSopenharmony_ci let m = r.unwrap(); 41019625d8cSopenharmony_ci assert!(m.contains_id("o")); 41119625d8cSopenharmony_ci assert_eq!( 41219625d8cSopenharmony_ci m.get_many::<String>("o") 41319625d8cSopenharmony_ci .unwrap() 41419625d8cSopenharmony_ci .map(|v| v.as_str()) 41519625d8cSopenharmony_ci .collect::<Vec<_>>(), 41619625d8cSopenharmony_ci ["-2"] 41719625d8cSopenharmony_ci ); 41819625d8cSopenharmony_ci assert!(*m.get_one::<bool>("f").expect("defaulted by clap")); 41919625d8cSopenharmony_ci} 42019625d8cSopenharmony_ci 42119625d8cSopenharmony_ci#[test] 42219625d8cSopenharmony_cifn leading_hyphen_with_only_pos_follows() { 42319625d8cSopenharmony_ci let r = Command::new("mvae") 42419625d8cSopenharmony_ci .arg( 42519625d8cSopenharmony_ci arg!(o: -o [opt] ... "some opt") 42619625d8cSopenharmony_ci .action(ArgAction::Set) 42719625d8cSopenharmony_ci .allow_hyphen_values(true), 42819625d8cSopenharmony_ci ) 42919625d8cSopenharmony_ci .arg(arg!([arg] "some arg")) 43019625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-o", "-2", "--", "val"]); 43119625d8cSopenharmony_ci assert!(r.is_ok(), "{:?}", r); 43219625d8cSopenharmony_ci let m = r.unwrap(); 43319625d8cSopenharmony_ci assert!(m.contains_id("o")); 43419625d8cSopenharmony_ci assert_eq!( 43519625d8cSopenharmony_ci m.get_many::<String>("o") 43619625d8cSopenharmony_ci .unwrap() 43719625d8cSopenharmony_ci .map(|v| v.as_str()) 43819625d8cSopenharmony_ci .collect::<Vec<_>>(), 43919625d8cSopenharmony_ci ["-2"] 44019625d8cSopenharmony_ci ); 44119625d8cSopenharmony_ci assert_eq!(m.get_one::<String>("arg").map(|v| v.as_str()), Some("val")); 44219625d8cSopenharmony_ci} 44319625d8cSopenharmony_ci 44419625d8cSopenharmony_ci#[test] 44519625d8cSopenharmony_ci#[cfg(feature = "suggestions")] 44619625d8cSopenharmony_ci#[cfg(feature = "error-context")] 44719625d8cSopenharmony_cifn did_you_mean() { 44819625d8cSopenharmony_ci static DYM: &str = "\ 44919625d8cSopenharmony_cierror: unexpected argument '--optio' found 45019625d8cSopenharmony_ci 45119625d8cSopenharmony_ci note: argument '--option' exists 45219625d8cSopenharmony_ci 45319625d8cSopenharmony_ciUsage: clap-test --option <opt>... [positional] [positional2] [positional3]... 45419625d8cSopenharmony_ci 45519625d8cSopenharmony_ciFor more information, try '--help'. 45619625d8cSopenharmony_ci"; 45719625d8cSopenharmony_ci 45819625d8cSopenharmony_ci utils::assert_output(utils::complex_app(), "clap-test --optio=foo", DYM, true); 45919625d8cSopenharmony_ci} 46019625d8cSopenharmony_ci 46119625d8cSopenharmony_ci#[test] 46219625d8cSopenharmony_cifn issue_1047_min_zero_vals_default_val() { 46319625d8cSopenharmony_ci let m = Command::new("foo") 46419625d8cSopenharmony_ci .arg( 46519625d8cSopenharmony_ci Arg::new("del") 46619625d8cSopenharmony_ci .short('d') 46719625d8cSopenharmony_ci .long("del") 46819625d8cSopenharmony_ci .action(ArgAction::Set) 46919625d8cSopenharmony_ci .require_equals(true) 47019625d8cSopenharmony_ci .num_args(0..) 47119625d8cSopenharmony_ci .default_missing_value("default"), 47219625d8cSopenharmony_ci ) 47319625d8cSopenharmony_ci .try_get_matches_from(vec!["foo", "-d"]) 47419625d8cSopenharmony_ci .unwrap(); 47519625d8cSopenharmony_ci assert_eq!( 47619625d8cSopenharmony_ci m.get_one::<String>("del").map(|v| v.as_str()), 47719625d8cSopenharmony_ci Some("default") 47819625d8cSopenharmony_ci ); 47919625d8cSopenharmony_ci} 48019625d8cSopenharmony_ci 48119625d8cSopenharmony_cifn issue_1105_setup(argv: Vec<&'static str>) -> Result<ArgMatches, clap::Error> { 48219625d8cSopenharmony_ci Command::new("opts") 48319625d8cSopenharmony_ci .arg(arg!(-o --option <opt> "some option").required(true)) 48419625d8cSopenharmony_ci .arg(arg!(--flag "some flag")) 48519625d8cSopenharmony_ci .try_get_matches_from(argv) 48619625d8cSopenharmony_ci} 48719625d8cSopenharmony_ci 48819625d8cSopenharmony_ci#[test] 48919625d8cSopenharmony_cifn issue_1105_empty_value_long_fail() { 49019625d8cSopenharmony_ci let r = issue_1105_setup(vec!["cmd", "--option", "--flag"]); 49119625d8cSopenharmony_ci assert!(r.is_err()); 49219625d8cSopenharmony_ci assert_eq!(r.unwrap_err().kind(), ErrorKind::InvalidValue); 49319625d8cSopenharmony_ci} 49419625d8cSopenharmony_ci 49519625d8cSopenharmony_ci#[test] 49619625d8cSopenharmony_cifn issue_1105_empty_value_long_explicit() { 49719625d8cSopenharmony_ci let r = issue_1105_setup(vec!["cmd", "--option", ""]); 49819625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 49919625d8cSopenharmony_ci let m = r.unwrap(); 50019625d8cSopenharmony_ci assert_eq!(m.get_one::<String>("option").map(|v| v.as_str()), Some("")); 50119625d8cSopenharmony_ci} 50219625d8cSopenharmony_ci 50319625d8cSopenharmony_ci#[test] 50419625d8cSopenharmony_cifn issue_1105_empty_value_long_equals() { 50519625d8cSopenharmony_ci let r = issue_1105_setup(vec!["cmd", "--option="]); 50619625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 50719625d8cSopenharmony_ci let m = r.unwrap(); 50819625d8cSopenharmony_ci assert_eq!(m.get_one::<String>("option").map(|v| v.as_str()), Some("")); 50919625d8cSopenharmony_ci} 51019625d8cSopenharmony_ci 51119625d8cSopenharmony_ci#[test] 51219625d8cSopenharmony_cifn issue_1105_empty_value_short_fail() { 51319625d8cSopenharmony_ci let r = issue_1105_setup(vec!["cmd", "-o", "--flag"]); 51419625d8cSopenharmony_ci assert!(r.is_err()); 51519625d8cSopenharmony_ci assert_eq!(r.unwrap_err().kind(), ErrorKind::InvalidValue); 51619625d8cSopenharmony_ci} 51719625d8cSopenharmony_ci 51819625d8cSopenharmony_ci#[test] 51919625d8cSopenharmony_cifn issue_1105_empty_value_short_explicit() { 52019625d8cSopenharmony_ci let r = issue_1105_setup(vec!["cmd", "-o", ""]); 52119625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 52219625d8cSopenharmony_ci let m = r.unwrap(); 52319625d8cSopenharmony_ci assert_eq!(m.get_one::<String>("option").map(|v| v.as_str()), Some("")); 52419625d8cSopenharmony_ci} 52519625d8cSopenharmony_ci 52619625d8cSopenharmony_ci#[test] 52719625d8cSopenharmony_cifn issue_1105_empty_value_short_equals() { 52819625d8cSopenharmony_ci let r = issue_1105_setup(vec!["cmd", "-o="]); 52919625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 53019625d8cSopenharmony_ci let m = r.unwrap(); 53119625d8cSopenharmony_ci assert_eq!(m.get_one::<String>("option").map(|v| v.as_str()), Some("")); 53219625d8cSopenharmony_ci} 53319625d8cSopenharmony_ci 53419625d8cSopenharmony_ci#[test] 53519625d8cSopenharmony_cifn issue_1105_empty_value_short_explicit_no_space() { 53619625d8cSopenharmony_ci let r = issue_1105_setup(vec!["cmd", "-o", ""]); 53719625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 53819625d8cSopenharmony_ci let m = r.unwrap(); 53919625d8cSopenharmony_ci assert_eq!(m.get_one::<String>("option").map(|v| v.as_str()), Some("")); 54019625d8cSopenharmony_ci} 54119625d8cSopenharmony_ci 54219625d8cSopenharmony_ci#[test] 54319625d8cSopenharmony_ci#[cfg(feature = "suggestions")] 54419625d8cSopenharmony_ci#[cfg(feature = "error-context")] 54519625d8cSopenharmony_cifn issue_1073_suboptimal_flag_suggestion() { 54619625d8cSopenharmony_ci static DYM_ISSUE_1073: &str = "\ 54719625d8cSopenharmony_cierror: unexpected argument '--files-without-matches' found 54819625d8cSopenharmony_ci 54919625d8cSopenharmony_ci note: argument '--files-without-match' exists 55019625d8cSopenharmony_ci 55119625d8cSopenharmony_ciUsage: ripgrep-616 --files-without-match 55219625d8cSopenharmony_ci 55319625d8cSopenharmony_ciFor more information, try '--help'. 55419625d8cSopenharmony_ci"; 55519625d8cSopenharmony_ci 55619625d8cSopenharmony_ci let cmd = Command::new("ripgrep-616") 55719625d8cSopenharmony_ci .arg( 55819625d8cSopenharmony_ci Arg::new("files-with-matches") 55919625d8cSopenharmony_ci .long("files-with-matches") 56019625d8cSopenharmony_ci .action(ArgAction::SetTrue), 56119625d8cSopenharmony_ci ) 56219625d8cSopenharmony_ci .arg( 56319625d8cSopenharmony_ci Arg::new("files-without-match") 56419625d8cSopenharmony_ci .long("files-without-match") 56519625d8cSopenharmony_ci .action(ArgAction::SetTrue), 56619625d8cSopenharmony_ci ); 56719625d8cSopenharmony_ci utils::assert_output( 56819625d8cSopenharmony_ci cmd, 56919625d8cSopenharmony_ci "ripgrep-616 --files-without-matches", 57019625d8cSopenharmony_ci DYM_ISSUE_1073, 57119625d8cSopenharmony_ci true, 57219625d8cSopenharmony_ci ); 57319625d8cSopenharmony_ci} 57419625d8cSopenharmony_ci 57519625d8cSopenharmony_ci#[test] 57619625d8cSopenharmony_cifn short_non_ascii_no_space() { 57719625d8cSopenharmony_ci let matches = Command::new("cmd") 57819625d8cSopenharmony_ci .arg(arg!(opt: -'磨' <opt>).required(true)) 57919625d8cSopenharmony_ci .try_get_matches_from(["test", "-磨VALUE"]) 58019625d8cSopenharmony_ci .unwrap(); 58119625d8cSopenharmony_ci 58219625d8cSopenharmony_ci assert_eq!( 58319625d8cSopenharmony_ci "VALUE", 58419625d8cSopenharmony_ci matches 58519625d8cSopenharmony_ci .get_one::<String>("opt") 58619625d8cSopenharmony_ci .map(|v| v.as_str()) 58719625d8cSopenharmony_ci .unwrap() 58819625d8cSopenharmony_ci ); 58919625d8cSopenharmony_ci} 59019625d8cSopenharmony_ci 59119625d8cSopenharmony_ci#[test] 59219625d8cSopenharmony_cifn short_eq_val_starts_with_eq() { 59319625d8cSopenharmony_ci let matches = Command::new("cmd") 59419625d8cSopenharmony_ci .arg(arg!(opt: -f <opt>).required(true)) 59519625d8cSopenharmony_ci .try_get_matches_from(["test", "-f==value"]) 59619625d8cSopenharmony_ci .unwrap(); 59719625d8cSopenharmony_ci 59819625d8cSopenharmony_ci assert_eq!( 59919625d8cSopenharmony_ci "=value", 60019625d8cSopenharmony_ci matches 60119625d8cSopenharmony_ci .get_one::<String>("opt") 60219625d8cSopenharmony_ci .map(|v| v.as_str()) 60319625d8cSopenharmony_ci .unwrap() 60419625d8cSopenharmony_ci ); 60519625d8cSopenharmony_ci} 60619625d8cSopenharmony_ci 60719625d8cSopenharmony_ci#[test] 60819625d8cSopenharmony_cifn long_eq_val_starts_with_eq() { 60919625d8cSopenharmony_ci let matches = Command::new("cmd") 61019625d8cSopenharmony_ci .arg(arg!(opt: --foo <opt>).required(true)) 61119625d8cSopenharmony_ci .try_get_matches_from(["test", "--foo==value"]) 61219625d8cSopenharmony_ci .unwrap(); 61319625d8cSopenharmony_ci 61419625d8cSopenharmony_ci assert_eq!( 61519625d8cSopenharmony_ci "=value", 61619625d8cSopenharmony_ci matches 61719625d8cSopenharmony_ci .get_one::<String>("opt") 61819625d8cSopenharmony_ci .map(|v| v.as_str()) 61919625d8cSopenharmony_ci .unwrap() 62019625d8cSopenharmony_ci ); 62119625d8cSopenharmony_ci} 62219625d8cSopenharmony_ci 62319625d8cSopenharmony_ci#[test] 62419625d8cSopenharmony_cifn issue_2022_get_flags_misuse() { 62519625d8cSopenharmony_ci let cmd = Command::new("test") 62619625d8cSopenharmony_ci .next_help_heading(Some("test")) 62719625d8cSopenharmony_ci .arg(Arg::new("a").long("a").default_value("32")); 62819625d8cSopenharmony_ci let matches = cmd.try_get_matches_from([""]).unwrap(); 62919625d8cSopenharmony_ci assert!(matches.get_one::<String>("a").map(|v| v.as_str()).is_some()) 63019625d8cSopenharmony_ci} 63119625d8cSopenharmony_ci 63219625d8cSopenharmony_ci#[test] 63319625d8cSopenharmony_cifn issue_2279() { 63419625d8cSopenharmony_ci let before_help_heading = Command::new("cmd") 63519625d8cSopenharmony_ci .arg(Arg::new("foo").short('f').default_value("bar")) 63619625d8cSopenharmony_ci .next_help_heading(Some("This causes default_value to be ignored")) 63719625d8cSopenharmony_ci .try_get_matches_from([""]) 63819625d8cSopenharmony_ci .unwrap(); 63919625d8cSopenharmony_ci 64019625d8cSopenharmony_ci assert_eq!( 64119625d8cSopenharmony_ci before_help_heading 64219625d8cSopenharmony_ci .get_one::<String>("foo") 64319625d8cSopenharmony_ci .map(|v| v.as_str()), 64419625d8cSopenharmony_ci Some("bar") 64519625d8cSopenharmony_ci ); 64619625d8cSopenharmony_ci 64719625d8cSopenharmony_ci let after_help_heading = Command::new("cmd") 64819625d8cSopenharmony_ci .next_help_heading(Some("This causes default_value to be ignored")) 64919625d8cSopenharmony_ci .arg(Arg::new("foo").short('f').default_value("bar")) 65019625d8cSopenharmony_ci .try_get_matches_from([""]) 65119625d8cSopenharmony_ci .unwrap(); 65219625d8cSopenharmony_ci 65319625d8cSopenharmony_ci assert_eq!( 65419625d8cSopenharmony_ci after_help_heading 65519625d8cSopenharmony_ci .get_one::<String>("foo") 65619625d8cSopenharmony_ci .map(|v| v.as_str()), 65719625d8cSopenharmony_ci Some("bar") 65819625d8cSopenharmony_ci ); 65919625d8cSopenharmony_ci} 66019625d8cSopenharmony_ci 66119625d8cSopenharmony_ci#[test] 66219625d8cSopenharmony_cifn infer_long_arg() { 66319625d8cSopenharmony_ci let cmd = Command::new("test") 66419625d8cSopenharmony_ci .infer_long_args(true) 66519625d8cSopenharmony_ci .arg( 66619625d8cSopenharmony_ci Arg::new("racetrack") 66719625d8cSopenharmony_ci .long("racetrack") 66819625d8cSopenharmony_ci .alias("autobahn") 66919625d8cSopenharmony_ci .action(ArgAction::SetTrue), 67019625d8cSopenharmony_ci ) 67119625d8cSopenharmony_ci .arg(Arg::new("racecar").long("racecar").action(ArgAction::Set)); 67219625d8cSopenharmony_ci 67319625d8cSopenharmony_ci let matches = cmd 67419625d8cSopenharmony_ci .clone() 67519625d8cSopenharmony_ci .try_get_matches_from(["test", "--racec=hello"]) 67619625d8cSopenharmony_ci .unwrap(); 67719625d8cSopenharmony_ci assert!(!*matches 67819625d8cSopenharmony_ci .get_one::<bool>("racetrack") 67919625d8cSopenharmony_ci .expect("defaulted by clap")); 68019625d8cSopenharmony_ci assert_eq!( 68119625d8cSopenharmony_ci matches.get_one::<String>("racecar").map(|v| v.as_str()), 68219625d8cSopenharmony_ci Some("hello") 68319625d8cSopenharmony_ci ); 68419625d8cSopenharmony_ci 68519625d8cSopenharmony_ci let matches = cmd 68619625d8cSopenharmony_ci .clone() 68719625d8cSopenharmony_ci .try_get_matches_from(["test", "--racet"]) 68819625d8cSopenharmony_ci .unwrap(); 68919625d8cSopenharmony_ci assert!(*matches 69019625d8cSopenharmony_ci .get_one::<bool>("racetrack") 69119625d8cSopenharmony_ci .expect("defaulted by clap")); 69219625d8cSopenharmony_ci assert_eq!( 69319625d8cSopenharmony_ci matches.get_one::<String>("racecar").map(|v| v.as_str()), 69419625d8cSopenharmony_ci None 69519625d8cSopenharmony_ci ); 69619625d8cSopenharmony_ci 69719625d8cSopenharmony_ci let matches = cmd 69819625d8cSopenharmony_ci .clone() 69919625d8cSopenharmony_ci .try_get_matches_from(["test", "--auto"]) 70019625d8cSopenharmony_ci .unwrap(); 70119625d8cSopenharmony_ci assert!(*matches 70219625d8cSopenharmony_ci .get_one::<bool>("racetrack") 70319625d8cSopenharmony_ci .expect("defaulted by clap")); 70419625d8cSopenharmony_ci assert_eq!( 70519625d8cSopenharmony_ci matches.get_one::<String>("racecar").map(|v| v.as_str()), 70619625d8cSopenharmony_ci None 70719625d8cSopenharmony_ci ); 70819625d8cSopenharmony_ci 70919625d8cSopenharmony_ci let cmd = Command::new("test") 71019625d8cSopenharmony_ci .infer_long_args(true) 71119625d8cSopenharmony_ci .arg(Arg::new("arg").long("arg").action(ArgAction::SetTrue)); 71219625d8cSopenharmony_ci 71319625d8cSopenharmony_ci let matches = cmd.clone().try_get_matches_from(["test", "--"]).unwrap(); 71419625d8cSopenharmony_ci assert!(!*matches.get_one::<bool>("arg").expect("defaulted by clap")); 71519625d8cSopenharmony_ci 71619625d8cSopenharmony_ci let matches = cmd.clone().try_get_matches_from(["test", "--a"]).unwrap(); 71719625d8cSopenharmony_ci assert!(*matches.get_one::<bool>("arg").expect("defaulted by clap")); 71819625d8cSopenharmony_ci} 719