119625d8cSopenharmony_ciuse clap::builder::ArgPredicate; 219625d8cSopenharmony_ciuse clap::{arg, error::ErrorKind, Arg, ArgAction, ArgGroup, Command}; 319625d8cSopenharmony_ci 419625d8cSopenharmony_ci#[cfg(feature = "error-context")] 519625d8cSopenharmony_ciuse super::utils; 619625d8cSopenharmony_ci 719625d8cSopenharmony_ci#[test] 819625d8cSopenharmony_cifn flag_required() { 919625d8cSopenharmony_ci let result = Command::new("flag_required") 1019625d8cSopenharmony_ci .arg(arg!(-f --flag "some flag").requires("color")) 1119625d8cSopenharmony_ci .arg(arg!(-c --color "third flag")) 1219625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-f"]); 1319625d8cSopenharmony_ci assert!(result.is_err()); 1419625d8cSopenharmony_ci let err = result.err().unwrap(); 1519625d8cSopenharmony_ci assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument); 1619625d8cSopenharmony_ci} 1719625d8cSopenharmony_ci 1819625d8cSopenharmony_ci#[test] 1919625d8cSopenharmony_cifn flag_required_2() { 2019625d8cSopenharmony_ci let m = Command::new("flag_required") 2119625d8cSopenharmony_ci .arg( 2219625d8cSopenharmony_ci arg!(-f --flag "some flag") 2319625d8cSopenharmony_ci .requires("color") 2419625d8cSopenharmony_ci .action(ArgAction::SetTrue), 2519625d8cSopenharmony_ci ) 2619625d8cSopenharmony_ci .arg(arg!(-c --color "third flag").action(ArgAction::SetTrue)) 2719625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-f", "-c"]) 2819625d8cSopenharmony_ci .unwrap(); 2919625d8cSopenharmony_ci assert!(*m.get_one::<bool>("color").expect("defaulted by clap")); 3019625d8cSopenharmony_ci assert!(*m.get_one::<bool>("flag").expect("defaulted by clap")); 3119625d8cSopenharmony_ci} 3219625d8cSopenharmony_ci 3319625d8cSopenharmony_ci#[test] 3419625d8cSopenharmony_cifn option_required() { 3519625d8cSopenharmony_ci let result = Command::new("option_required") 3619625d8cSopenharmony_ci .arg(arg!(f: -f <flag> "some flag").requires("c")) 3719625d8cSopenharmony_ci .arg(arg!(c: -c <color> "third flag")) 3819625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-f", "val"]); 3919625d8cSopenharmony_ci assert!(result.is_err()); 4019625d8cSopenharmony_ci let err = result.err().unwrap(); 4119625d8cSopenharmony_ci assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument); 4219625d8cSopenharmony_ci} 4319625d8cSopenharmony_ci 4419625d8cSopenharmony_ci#[test] 4519625d8cSopenharmony_cifn option_required_2() { 4619625d8cSopenharmony_ci let m = Command::new("option_required") 4719625d8cSopenharmony_ci .arg(arg!(f: -f <flag> "some flag").requires("c")) 4819625d8cSopenharmony_ci .arg(arg!(c: -c <color> "third flag")) 4919625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-f", "val", "-c", "other_val"]) 5019625d8cSopenharmony_ci .unwrap(); 5119625d8cSopenharmony_ci assert!(m.contains_id("c")); 5219625d8cSopenharmony_ci assert_eq!( 5319625d8cSopenharmony_ci m.get_one::<String>("c").map(|v| v.as_str()).unwrap(), 5419625d8cSopenharmony_ci "other_val" 5519625d8cSopenharmony_ci ); 5619625d8cSopenharmony_ci assert!(m.contains_id("f")); 5719625d8cSopenharmony_ci assert_eq!(m.get_one::<String>("f").map(|v| v.as_str()).unwrap(), "val"); 5819625d8cSopenharmony_ci} 5919625d8cSopenharmony_ci 6019625d8cSopenharmony_ci#[test] 6119625d8cSopenharmony_cifn positional_required() { 6219625d8cSopenharmony_ci let result = Command::new("positional_required") 6319625d8cSopenharmony_ci .arg(Arg::new("flag").index(1).required(true)) 6419625d8cSopenharmony_ci .try_get_matches_from(vec![""]); 6519625d8cSopenharmony_ci assert!(result.is_err()); 6619625d8cSopenharmony_ci let err = result.err().unwrap(); 6719625d8cSopenharmony_ci assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument); 6819625d8cSopenharmony_ci} 6919625d8cSopenharmony_ci 7019625d8cSopenharmony_ci#[test] 7119625d8cSopenharmony_cifn positional_required_2() { 7219625d8cSopenharmony_ci let m = Command::new("positional_required") 7319625d8cSopenharmony_ci .arg(Arg::new("flag").index(1).required(true)) 7419625d8cSopenharmony_ci .try_get_matches_from(vec!["", "someval"]) 7519625d8cSopenharmony_ci .unwrap(); 7619625d8cSopenharmony_ci assert!(m.contains_id("flag")); 7719625d8cSopenharmony_ci assert_eq!( 7819625d8cSopenharmony_ci m.get_one::<String>("flag").map(|v| v.as_str()).unwrap(), 7919625d8cSopenharmony_ci "someval" 8019625d8cSopenharmony_ci ); 8119625d8cSopenharmony_ci} 8219625d8cSopenharmony_ci 8319625d8cSopenharmony_ci#[test] 8419625d8cSopenharmony_ci#[cfg(feature = "error-context")] 8519625d8cSopenharmony_cifn positional_required_with_requires() { 8619625d8cSopenharmony_ci static POSITIONAL_REQ: &str = "\ 8719625d8cSopenharmony_cierror: the following required arguments were not provided: 8819625d8cSopenharmony_ci <flag> 8919625d8cSopenharmony_ci <opt> 9019625d8cSopenharmony_ci 9119625d8cSopenharmony_ciUsage: clap-test <flag> <opt> [bar] 9219625d8cSopenharmony_ci 9319625d8cSopenharmony_ciFor more information, try '--help'. 9419625d8cSopenharmony_ci"; 9519625d8cSopenharmony_ci 9619625d8cSopenharmony_ci let cmd = Command::new("positional_required") 9719625d8cSopenharmony_ci .arg(Arg::new("flag").required(true).requires("opt")) 9819625d8cSopenharmony_ci .arg(Arg::new("opt")) 9919625d8cSopenharmony_ci .arg(Arg::new("bar")); 10019625d8cSopenharmony_ci 10119625d8cSopenharmony_ci utils::assert_output(cmd, "clap-test", POSITIONAL_REQ, true); 10219625d8cSopenharmony_ci} 10319625d8cSopenharmony_ci 10419625d8cSopenharmony_ci#[test] 10519625d8cSopenharmony_ci#[cfg(feature = "error-context")] 10619625d8cSopenharmony_cifn positional_required_with_requires_if_no_value() { 10719625d8cSopenharmony_ci static POSITIONAL_REQ_IF_NO_VAL: &str = "\ 10819625d8cSopenharmony_cierror: the following required arguments were not provided: 10919625d8cSopenharmony_ci <flag> 11019625d8cSopenharmony_ci 11119625d8cSopenharmony_ciUsage: clap-test <flag> [opt] [bar] 11219625d8cSopenharmony_ci 11319625d8cSopenharmony_ciFor more information, try '--help'. 11419625d8cSopenharmony_ci"; 11519625d8cSopenharmony_ci 11619625d8cSopenharmony_ci let cmd = Command::new("positional_required") 11719625d8cSopenharmony_ci .arg(Arg::new("flag").required(true).requires_if("val", "opt")) 11819625d8cSopenharmony_ci .arg(Arg::new("opt")) 11919625d8cSopenharmony_ci .arg(Arg::new("bar")); 12019625d8cSopenharmony_ci 12119625d8cSopenharmony_ci utils::assert_output(cmd, "clap-test", POSITIONAL_REQ_IF_NO_VAL, true); 12219625d8cSopenharmony_ci} 12319625d8cSopenharmony_ci 12419625d8cSopenharmony_ci#[test] 12519625d8cSopenharmony_ci#[cfg(feature = "error-context")] 12619625d8cSopenharmony_cifn positional_required_with_requires_if_value() { 12719625d8cSopenharmony_ci static POSITIONAL_REQ_IF_VAL: &str = "\ 12819625d8cSopenharmony_cierror: the following required arguments were not provided: 12919625d8cSopenharmony_ci <foo> 13019625d8cSopenharmony_ci <opt> 13119625d8cSopenharmony_ci 13219625d8cSopenharmony_ciUsage: clap-test <flag> <foo> <opt> [bar] 13319625d8cSopenharmony_ci 13419625d8cSopenharmony_ciFor more information, try '--help'. 13519625d8cSopenharmony_ci"; 13619625d8cSopenharmony_ci 13719625d8cSopenharmony_ci let cmd = Command::new("positional_required") 13819625d8cSopenharmony_ci .arg(Arg::new("flag").required(true).requires_if("val", "opt")) 13919625d8cSopenharmony_ci .arg(Arg::new("foo").required(true)) 14019625d8cSopenharmony_ci .arg(Arg::new("opt")) 14119625d8cSopenharmony_ci .arg(Arg::new("bar")); 14219625d8cSopenharmony_ci 14319625d8cSopenharmony_ci utils::assert_output(cmd, "clap-test val", POSITIONAL_REQ_IF_VAL, true); 14419625d8cSopenharmony_ci} 14519625d8cSopenharmony_ci 14619625d8cSopenharmony_ci#[test] 14719625d8cSopenharmony_cifn group_required() { 14819625d8cSopenharmony_ci let result = Command::new("group_required") 14919625d8cSopenharmony_ci .arg(arg!(-f --flag "some flag")) 15019625d8cSopenharmony_ci .group(ArgGroup::new("gr").required(true).arg("some").arg("other")) 15119625d8cSopenharmony_ci .arg(arg!(--some "some arg")) 15219625d8cSopenharmony_ci .arg(arg!(--other "other arg")) 15319625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-f"]); 15419625d8cSopenharmony_ci assert!(result.is_err()); 15519625d8cSopenharmony_ci let err = result.err().unwrap(); 15619625d8cSopenharmony_ci assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument); 15719625d8cSopenharmony_ci} 15819625d8cSopenharmony_ci 15919625d8cSopenharmony_ci#[test] 16019625d8cSopenharmony_cifn group_required_2() { 16119625d8cSopenharmony_ci let m = Command::new("group_required") 16219625d8cSopenharmony_ci .arg(arg!(-f --flag "some flag").action(ArgAction::SetTrue)) 16319625d8cSopenharmony_ci .group(ArgGroup::new("gr").required(true).arg("some").arg("other")) 16419625d8cSopenharmony_ci .arg(arg!(--some "some arg").action(ArgAction::SetTrue)) 16519625d8cSopenharmony_ci .arg(arg!(--other "other arg").action(ArgAction::SetTrue)) 16619625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-f", "--some"]) 16719625d8cSopenharmony_ci .unwrap(); 16819625d8cSopenharmony_ci assert!(*m.get_one::<bool>("some").expect("defaulted by clap")); 16919625d8cSopenharmony_ci assert!(!*m.get_one::<bool>("other").expect("defaulted by clap")); 17019625d8cSopenharmony_ci assert!(*m.get_one::<bool>("flag").expect("defaulted by clap")); 17119625d8cSopenharmony_ci} 17219625d8cSopenharmony_ci 17319625d8cSopenharmony_ci#[test] 17419625d8cSopenharmony_cifn group_required_3() { 17519625d8cSopenharmony_ci let m = Command::new("group_required") 17619625d8cSopenharmony_ci .arg(arg!(-f --flag "some flag").action(ArgAction::SetTrue)) 17719625d8cSopenharmony_ci .group(ArgGroup::new("gr").required(true).arg("some").arg("other")) 17819625d8cSopenharmony_ci .arg(arg!(--some "some arg").action(ArgAction::SetTrue)) 17919625d8cSopenharmony_ci .arg(arg!(--other "other arg").action(ArgAction::SetTrue)) 18019625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-f", "--other"]) 18119625d8cSopenharmony_ci .unwrap(); 18219625d8cSopenharmony_ci assert!(!*m.get_one::<bool>("some").expect("defaulted by clap")); 18319625d8cSopenharmony_ci assert!(*m.get_one::<bool>("other").expect("defaulted by clap")); 18419625d8cSopenharmony_ci assert!(*m.get_one::<bool>("flag").expect("defaulted by clap")); 18519625d8cSopenharmony_ci} 18619625d8cSopenharmony_ci 18719625d8cSopenharmony_ci#[test] 18819625d8cSopenharmony_cifn arg_require_group() { 18919625d8cSopenharmony_ci let result = Command::new("arg_require_group") 19019625d8cSopenharmony_ci .arg(arg!(-f --flag "some flag").requires("gr")) 19119625d8cSopenharmony_ci .group(ArgGroup::new("gr").arg("some").arg("other")) 19219625d8cSopenharmony_ci .arg(arg!(--some "some arg")) 19319625d8cSopenharmony_ci .arg(arg!(--other "other arg")) 19419625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-f"]); 19519625d8cSopenharmony_ci assert!(result.is_err()); 19619625d8cSopenharmony_ci let err = result.err().unwrap(); 19719625d8cSopenharmony_ci assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument); 19819625d8cSopenharmony_ci} 19919625d8cSopenharmony_ci 20019625d8cSopenharmony_ci#[test] 20119625d8cSopenharmony_cifn arg_require_group_2() { 20219625d8cSopenharmony_ci let res = Command::new("arg_require_group") 20319625d8cSopenharmony_ci .arg( 20419625d8cSopenharmony_ci arg!(-f --flag "some flag") 20519625d8cSopenharmony_ci .requires("gr") 20619625d8cSopenharmony_ci .action(ArgAction::SetTrue), 20719625d8cSopenharmony_ci ) 20819625d8cSopenharmony_ci .group(ArgGroup::new("gr").arg("some").arg("other")) 20919625d8cSopenharmony_ci .arg(arg!(--some "some arg").action(ArgAction::SetTrue)) 21019625d8cSopenharmony_ci .arg(arg!(--other "other arg").action(ArgAction::SetTrue)) 21119625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-f", "--some"]); 21219625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 21319625d8cSopenharmony_ci let m = res.unwrap(); 21419625d8cSopenharmony_ci assert!(*m.get_one::<bool>("some").expect("defaulted by clap")); 21519625d8cSopenharmony_ci assert!(!*m.get_one::<bool>("other").expect("defaulted by clap")); 21619625d8cSopenharmony_ci assert!(*m.get_one::<bool>("flag").expect("defaulted by clap")); 21719625d8cSopenharmony_ci} 21819625d8cSopenharmony_ci 21919625d8cSopenharmony_ci#[test] 22019625d8cSopenharmony_cifn arg_require_group_3() { 22119625d8cSopenharmony_ci let res = Command::new("arg_require_group") 22219625d8cSopenharmony_ci .arg( 22319625d8cSopenharmony_ci arg!(-f --flag "some flag") 22419625d8cSopenharmony_ci .requires("gr") 22519625d8cSopenharmony_ci .action(ArgAction::SetTrue), 22619625d8cSopenharmony_ci ) 22719625d8cSopenharmony_ci .group(ArgGroup::new("gr").arg("some").arg("other")) 22819625d8cSopenharmony_ci .arg(arg!(--some "some arg").action(ArgAction::SetTrue)) 22919625d8cSopenharmony_ci .arg(arg!(--other "other arg").action(ArgAction::SetTrue)) 23019625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-f", "--other"]); 23119625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 23219625d8cSopenharmony_ci let m = res.unwrap(); 23319625d8cSopenharmony_ci assert!(!*m.get_one::<bool>("some").expect("defaulted by clap")); 23419625d8cSopenharmony_ci assert!(*m.get_one::<bool>("other").expect("defaulted by clap")); 23519625d8cSopenharmony_ci assert!(*m.get_one::<bool>("flag").expect("defaulted by clap")); 23619625d8cSopenharmony_ci} 23719625d8cSopenharmony_ci 23819625d8cSopenharmony_ci// REQUIRED_UNLESS 23919625d8cSopenharmony_ci 24019625d8cSopenharmony_ci#[test] 24119625d8cSopenharmony_cifn issue_753() { 24219625d8cSopenharmony_ci let m = Command::new("test") 24319625d8cSopenharmony_ci .arg(arg!( 24419625d8cSopenharmony_ci -l --list "List available interfaces (and stop there)" 24519625d8cSopenharmony_ci )) 24619625d8cSopenharmony_ci .arg( 24719625d8cSopenharmony_ci arg!( 24819625d8cSopenharmony_ci -i --iface <INTERFACE> "Ethernet interface for fetching NTP packets" 24919625d8cSopenharmony_ci ) 25019625d8cSopenharmony_ci .required(false) 25119625d8cSopenharmony_ci .required_unless_present("list"), 25219625d8cSopenharmony_ci ) 25319625d8cSopenharmony_ci .arg( 25419625d8cSopenharmony_ci arg!(-f --file <TESTFILE> "Fetch NTP packets from pcap file") 25519625d8cSopenharmony_ci .conflicts_with("iface") 25619625d8cSopenharmony_ci .required_unless_present("list"), 25719625d8cSopenharmony_ci ) 25819625d8cSopenharmony_ci .arg(arg!(-s --server <SERVER_IP> "NTP server IP address").required_unless_present("list")) 25919625d8cSopenharmony_ci .try_get_matches_from(vec!["test", "--list"]); 26019625d8cSopenharmony_ci assert!(m.is_ok(), "{}", m.unwrap_err()); 26119625d8cSopenharmony_ci} 26219625d8cSopenharmony_ci 26319625d8cSopenharmony_ci#[test] 26419625d8cSopenharmony_cifn required_unless_present() { 26519625d8cSopenharmony_ci let res = Command::new("unlesstest") 26619625d8cSopenharmony_ci .arg( 26719625d8cSopenharmony_ci Arg::new("cfg") 26819625d8cSopenharmony_ci .required_unless_present("dbg") 26919625d8cSopenharmony_ci .action(ArgAction::Set) 27019625d8cSopenharmony_ci .long("config"), 27119625d8cSopenharmony_ci ) 27219625d8cSopenharmony_ci .arg(Arg::new("dbg").long("debug").action(ArgAction::SetTrue)) 27319625d8cSopenharmony_ci .try_get_matches_from(vec!["unlesstest", "--debug"]); 27419625d8cSopenharmony_ci 27519625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 27619625d8cSopenharmony_ci let m = res.unwrap(); 27719625d8cSopenharmony_ci assert!(*m.get_one::<bool>("dbg").expect("defaulted by clap")); 27819625d8cSopenharmony_ci assert!(!m.contains_id("cfg")); 27919625d8cSopenharmony_ci} 28019625d8cSopenharmony_ci 28119625d8cSopenharmony_ci#[test] 28219625d8cSopenharmony_cifn required_unless_present_err() { 28319625d8cSopenharmony_ci let res = Command::new("unlesstest") 28419625d8cSopenharmony_ci .arg( 28519625d8cSopenharmony_ci Arg::new("cfg") 28619625d8cSopenharmony_ci .required_unless_present("dbg") 28719625d8cSopenharmony_ci .action(ArgAction::Set) 28819625d8cSopenharmony_ci .long("config"), 28919625d8cSopenharmony_ci ) 29019625d8cSopenharmony_ci .arg(Arg::new("dbg").long("debug")) 29119625d8cSopenharmony_ci .try_get_matches_from(vec!["unlesstest"]); 29219625d8cSopenharmony_ci 29319625d8cSopenharmony_ci assert!(res.is_err()); 29419625d8cSopenharmony_ci assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument); 29519625d8cSopenharmony_ci} 29619625d8cSopenharmony_ci 29719625d8cSopenharmony_ci#[test] 29819625d8cSopenharmony_cifn required_unless_present_with_optional_value() { 29919625d8cSopenharmony_ci let res = Command::new("unlesstest") 30019625d8cSopenharmony_ci .arg(Arg::new("opt").long("opt").num_args(0..=1)) 30119625d8cSopenharmony_ci .arg( 30219625d8cSopenharmony_ci Arg::new("cfg") 30319625d8cSopenharmony_ci .required_unless_present("dbg") 30419625d8cSopenharmony_ci .action(ArgAction::Set) 30519625d8cSopenharmony_ci .long("config"), 30619625d8cSopenharmony_ci ) 30719625d8cSopenharmony_ci .arg(Arg::new("dbg").long("debug")) 30819625d8cSopenharmony_ci .try_get_matches_from(vec!["unlesstest", "--opt"]); 30919625d8cSopenharmony_ci 31019625d8cSopenharmony_ci assert!(res.is_err()); 31119625d8cSopenharmony_ci assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument); 31219625d8cSopenharmony_ci} 31319625d8cSopenharmony_ci 31419625d8cSopenharmony_ci// REQUIRED_UNLESS_ALL 31519625d8cSopenharmony_ci 31619625d8cSopenharmony_ci#[test] 31719625d8cSopenharmony_cifn required_unless_present_all() { 31819625d8cSopenharmony_ci let res = Command::new("unlessall") 31919625d8cSopenharmony_ci .arg( 32019625d8cSopenharmony_ci Arg::new("cfg") 32119625d8cSopenharmony_ci .required_unless_present_all(["dbg", "infile"]) 32219625d8cSopenharmony_ci .action(ArgAction::Set) 32319625d8cSopenharmony_ci .long("config"), 32419625d8cSopenharmony_ci ) 32519625d8cSopenharmony_ci .arg(Arg::new("dbg").long("debug").action(ArgAction::SetTrue)) 32619625d8cSopenharmony_ci .arg(Arg::new("infile").short('i').action(ArgAction::Set)) 32719625d8cSopenharmony_ci .try_get_matches_from(vec!["unlessall", "--debug", "-i", "file"]); 32819625d8cSopenharmony_ci 32919625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 33019625d8cSopenharmony_ci let m = res.unwrap(); 33119625d8cSopenharmony_ci assert!(*m.get_one::<bool>("dbg").expect("defaulted by clap")); 33219625d8cSopenharmony_ci assert!(m.contains_id("infile")); 33319625d8cSopenharmony_ci assert!(!m.contains_id("cfg")); 33419625d8cSopenharmony_ci} 33519625d8cSopenharmony_ci 33619625d8cSopenharmony_ci#[test] 33719625d8cSopenharmony_cifn required_unless_all_err() { 33819625d8cSopenharmony_ci let res = Command::new("unlessall") 33919625d8cSopenharmony_ci .arg( 34019625d8cSopenharmony_ci Arg::new("cfg") 34119625d8cSopenharmony_ci .required_unless_present_all(["dbg", "infile"]) 34219625d8cSopenharmony_ci .action(ArgAction::Set) 34319625d8cSopenharmony_ci .long("config"), 34419625d8cSopenharmony_ci ) 34519625d8cSopenharmony_ci .arg(Arg::new("dbg").long("debug").action(ArgAction::SetTrue)) 34619625d8cSopenharmony_ci .arg(Arg::new("infile").short('i').action(ArgAction::Set)) 34719625d8cSopenharmony_ci .try_get_matches_from(vec!["unlessall", "--debug"]); 34819625d8cSopenharmony_ci 34919625d8cSopenharmony_ci assert!(res.is_err()); 35019625d8cSopenharmony_ci assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument); 35119625d8cSopenharmony_ci} 35219625d8cSopenharmony_ci 35319625d8cSopenharmony_ci// REQUIRED_UNLESS_ONE 35419625d8cSopenharmony_ci 35519625d8cSopenharmony_ci#[test] 35619625d8cSopenharmony_cifn required_unless_present_any() { 35719625d8cSopenharmony_ci let res = Command::new("unlessone") 35819625d8cSopenharmony_ci .arg( 35919625d8cSopenharmony_ci Arg::new("cfg") 36019625d8cSopenharmony_ci .required_unless_present_any(["dbg", "infile"]) 36119625d8cSopenharmony_ci .action(ArgAction::Set) 36219625d8cSopenharmony_ci .long("config"), 36319625d8cSopenharmony_ci ) 36419625d8cSopenharmony_ci .arg(Arg::new("dbg").long("debug").action(ArgAction::SetTrue)) 36519625d8cSopenharmony_ci .arg(Arg::new("infile").short('i').action(ArgAction::Set)) 36619625d8cSopenharmony_ci .try_get_matches_from(vec!["unlessone", "--debug"]); 36719625d8cSopenharmony_ci 36819625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 36919625d8cSopenharmony_ci let m = res.unwrap(); 37019625d8cSopenharmony_ci assert!(*m.get_one::<bool>("dbg").expect("defaulted by clap")); 37119625d8cSopenharmony_ci assert!(!m.contains_id("cfg")); 37219625d8cSopenharmony_ci} 37319625d8cSopenharmony_ci 37419625d8cSopenharmony_ci#[test] 37519625d8cSopenharmony_cifn required_unless_any_2() { 37619625d8cSopenharmony_ci // This tests that the required_unless_present_any works when the second arg in the array is used 37719625d8cSopenharmony_ci // instead of the first. 37819625d8cSopenharmony_ci let res = Command::new("unlessone") 37919625d8cSopenharmony_ci .arg( 38019625d8cSopenharmony_ci Arg::new("cfg") 38119625d8cSopenharmony_ci .required_unless_present_any(["dbg", "infile"]) 38219625d8cSopenharmony_ci .action(ArgAction::Set) 38319625d8cSopenharmony_ci .long("config"), 38419625d8cSopenharmony_ci ) 38519625d8cSopenharmony_ci .arg(Arg::new("dbg").long("debug").action(ArgAction::SetTrue)) 38619625d8cSopenharmony_ci .arg(Arg::new("infile").short('i').action(ArgAction::Set)) 38719625d8cSopenharmony_ci .try_get_matches_from(vec!["unlessone", "-i", "file"]); 38819625d8cSopenharmony_ci 38919625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 39019625d8cSopenharmony_ci let m = res.unwrap(); 39119625d8cSopenharmony_ci assert!(m.contains_id("infile")); 39219625d8cSopenharmony_ci assert!(!m.contains_id("cfg")); 39319625d8cSopenharmony_ci} 39419625d8cSopenharmony_ci 39519625d8cSopenharmony_ci#[test] 39619625d8cSopenharmony_cifn required_unless_any_works_with_short() { 39719625d8cSopenharmony_ci // GitHub issue: https://github.com/clap-rs/clap/issues/1135 39819625d8cSopenharmony_ci let res = Command::new("unlessone") 39919625d8cSopenharmony_ci .arg( 40019625d8cSopenharmony_ci Arg::new("a") 40119625d8cSopenharmony_ci .conflicts_with("b") 40219625d8cSopenharmony_ci .short('a') 40319625d8cSopenharmony_ci .action(ArgAction::SetTrue), 40419625d8cSopenharmony_ci ) 40519625d8cSopenharmony_ci .arg(Arg::new("b").short('b').action(ArgAction::SetTrue)) 40619625d8cSopenharmony_ci .arg( 40719625d8cSopenharmony_ci Arg::new("x") 40819625d8cSopenharmony_ci .short('x') 40919625d8cSopenharmony_ci .action(ArgAction::SetTrue) 41019625d8cSopenharmony_ci .required_unless_present_any(["a", "b"]), 41119625d8cSopenharmony_ci ) 41219625d8cSopenharmony_ci .try_get_matches_from(vec!["unlessone", "-a"]); 41319625d8cSopenharmony_ci 41419625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 41519625d8cSopenharmony_ci} 41619625d8cSopenharmony_ci 41719625d8cSopenharmony_ci#[test] 41819625d8cSopenharmony_cifn required_unless_any_works_with_short_err() { 41919625d8cSopenharmony_ci let res = Command::new("unlessone") 42019625d8cSopenharmony_ci .arg( 42119625d8cSopenharmony_ci Arg::new("a") 42219625d8cSopenharmony_ci .conflicts_with("b") 42319625d8cSopenharmony_ci .short('a') 42419625d8cSopenharmony_ci .action(ArgAction::SetTrue), 42519625d8cSopenharmony_ci ) 42619625d8cSopenharmony_ci .arg(Arg::new("b").short('b').action(ArgAction::SetTrue)) 42719625d8cSopenharmony_ci .arg( 42819625d8cSopenharmony_ci Arg::new("x") 42919625d8cSopenharmony_ci .short('x') 43019625d8cSopenharmony_ci .action(ArgAction::SetTrue) 43119625d8cSopenharmony_ci .required_unless_present_any(["a", "b"]), 43219625d8cSopenharmony_ci ) 43319625d8cSopenharmony_ci .try_get_matches_from(vec!["unlessone"]); 43419625d8cSopenharmony_ci 43519625d8cSopenharmony_ci assert!(res.is_err()); 43619625d8cSopenharmony_ci} 43719625d8cSopenharmony_ci 43819625d8cSopenharmony_ci#[test] 43919625d8cSopenharmony_cifn required_unless_any_works_without() { 44019625d8cSopenharmony_ci let res = Command::new("unlessone") 44119625d8cSopenharmony_ci .arg( 44219625d8cSopenharmony_ci Arg::new("a") 44319625d8cSopenharmony_ci .conflicts_with("b") 44419625d8cSopenharmony_ci .short('a') 44519625d8cSopenharmony_ci .action(ArgAction::SetTrue), 44619625d8cSopenharmony_ci ) 44719625d8cSopenharmony_ci .arg(Arg::new("b").short('b').action(ArgAction::SetTrue)) 44819625d8cSopenharmony_ci .arg(Arg::new("x").required_unless_present_any(["a", "b"])) 44919625d8cSopenharmony_ci .try_get_matches_from(vec!["unlessone", "-a"]); 45019625d8cSopenharmony_ci 45119625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 45219625d8cSopenharmony_ci} 45319625d8cSopenharmony_ci 45419625d8cSopenharmony_ci#[test] 45519625d8cSopenharmony_cifn required_unless_any_works_with_long() { 45619625d8cSopenharmony_ci let res = Command::new("unlessone") 45719625d8cSopenharmony_ci .arg( 45819625d8cSopenharmony_ci Arg::new("a") 45919625d8cSopenharmony_ci .conflicts_with("b") 46019625d8cSopenharmony_ci .short('a') 46119625d8cSopenharmony_ci .action(ArgAction::SetTrue), 46219625d8cSopenharmony_ci ) 46319625d8cSopenharmony_ci .arg(Arg::new("b").short('b').action(ArgAction::SetTrue)) 46419625d8cSopenharmony_ci .arg( 46519625d8cSopenharmony_ci Arg::new("x") 46619625d8cSopenharmony_ci .long("x_is_the_option") 46719625d8cSopenharmony_ci .action(ArgAction::SetTrue) 46819625d8cSopenharmony_ci .required_unless_present_any(["a", "b"]), 46919625d8cSopenharmony_ci ) 47019625d8cSopenharmony_ci .try_get_matches_from(vec!["unlessone", "-a"]); 47119625d8cSopenharmony_ci 47219625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 47319625d8cSopenharmony_ci} 47419625d8cSopenharmony_ci 47519625d8cSopenharmony_ci#[test] 47619625d8cSopenharmony_cifn required_unless_any_1() { 47719625d8cSopenharmony_ci let res = Command::new("unlessone") 47819625d8cSopenharmony_ci .arg( 47919625d8cSopenharmony_ci Arg::new("cfg") 48019625d8cSopenharmony_ci .required_unless_present_any(["dbg", "infile"]) 48119625d8cSopenharmony_ci .action(ArgAction::Set) 48219625d8cSopenharmony_ci .long("config"), 48319625d8cSopenharmony_ci ) 48419625d8cSopenharmony_ci .arg(Arg::new("dbg").long("debug").action(ArgAction::SetTrue)) 48519625d8cSopenharmony_ci .arg(Arg::new("infile").short('i').action(ArgAction::Set)) 48619625d8cSopenharmony_ci .try_get_matches_from(vec!["unlessone", "--debug"]); 48719625d8cSopenharmony_ci 48819625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 48919625d8cSopenharmony_ci let m = res.unwrap(); 49019625d8cSopenharmony_ci assert!(!m.contains_id("infile")); 49119625d8cSopenharmony_ci assert!(!m.contains_id("cfg")); 49219625d8cSopenharmony_ci assert!(*m.get_one::<bool>("dbg").expect("defaulted by clap")); 49319625d8cSopenharmony_ci} 49419625d8cSopenharmony_ci 49519625d8cSopenharmony_ci#[test] 49619625d8cSopenharmony_cifn required_unless_any_err() { 49719625d8cSopenharmony_ci let res = Command::new("unlessone") 49819625d8cSopenharmony_ci .arg( 49919625d8cSopenharmony_ci Arg::new("cfg") 50019625d8cSopenharmony_ci .required_unless_present_any(["dbg", "infile"]) 50119625d8cSopenharmony_ci .action(ArgAction::Set) 50219625d8cSopenharmony_ci .long("config"), 50319625d8cSopenharmony_ci ) 50419625d8cSopenharmony_ci .arg(Arg::new("dbg").long("debug").action(ArgAction::SetTrue)) 50519625d8cSopenharmony_ci .arg(Arg::new("infile").short('i').action(ArgAction::Set)) 50619625d8cSopenharmony_ci .try_get_matches_from(vec!["unlessone"]); 50719625d8cSopenharmony_ci 50819625d8cSopenharmony_ci assert!(res.is_err()); 50919625d8cSopenharmony_ci assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument); 51019625d8cSopenharmony_ci} 51119625d8cSopenharmony_ci 51219625d8cSopenharmony_ci#[test] 51319625d8cSopenharmony_ci#[cfg(feature = "error-context")] 51419625d8cSopenharmony_cifn missing_required_output() { 51519625d8cSopenharmony_ci static MISSING_REQ: &str = "\ 51619625d8cSopenharmony_cierror: the following required arguments were not provided: 51719625d8cSopenharmony_ci --long-option-2 <option2> 51819625d8cSopenharmony_ci <positional> 51919625d8cSopenharmony_ci <positional2> 52019625d8cSopenharmony_ci 52119625d8cSopenharmony_ciUsage: clap-test --long-option-2 <option2> -F <positional> <positional2> [positional3]... 52219625d8cSopenharmony_ci 52319625d8cSopenharmony_ciFor more information, try '--help'. 52419625d8cSopenharmony_ci"; 52519625d8cSopenharmony_ci 52619625d8cSopenharmony_ci utils::assert_output(utils::complex_app(), "clap-test -F", MISSING_REQ, true); 52719625d8cSopenharmony_ci} 52819625d8cSopenharmony_ci 52919625d8cSopenharmony_ci// Conditional external requirements 53019625d8cSopenharmony_ci 53119625d8cSopenharmony_ci#[test] 53219625d8cSopenharmony_cifn requires_if_present_val() { 53319625d8cSopenharmony_ci let res = Command::new("unlessone") 53419625d8cSopenharmony_ci .arg( 53519625d8cSopenharmony_ci Arg::new("cfg") 53619625d8cSopenharmony_ci .requires_if("my.cfg", "extra") 53719625d8cSopenharmony_ci .action(ArgAction::Set) 53819625d8cSopenharmony_ci .long("config"), 53919625d8cSopenharmony_ci ) 54019625d8cSopenharmony_ci .arg(Arg::new("extra").long("extra").action(ArgAction::SetTrue)) 54119625d8cSopenharmony_ci .try_get_matches_from(vec!["unlessone", "--config=my.cfg"]); 54219625d8cSopenharmony_ci 54319625d8cSopenharmony_ci assert!(res.is_err()); 54419625d8cSopenharmony_ci assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument); 54519625d8cSopenharmony_ci} 54619625d8cSopenharmony_ci 54719625d8cSopenharmony_ci#[test] 54819625d8cSopenharmony_cifn requires_if_present_mult() { 54919625d8cSopenharmony_ci let res = Command::new("unlessone") 55019625d8cSopenharmony_ci .arg( 55119625d8cSopenharmony_ci Arg::new("cfg") 55219625d8cSopenharmony_ci .requires_ifs([("my.cfg", "extra"), ("other.cfg", "other")]) 55319625d8cSopenharmony_ci .action(ArgAction::Set) 55419625d8cSopenharmony_ci .long("config"), 55519625d8cSopenharmony_ci ) 55619625d8cSopenharmony_ci .arg(Arg::new("extra").long("extra").action(ArgAction::SetTrue)) 55719625d8cSopenharmony_ci .arg(Arg::new("other").long("other").action(ArgAction::SetTrue)) 55819625d8cSopenharmony_ci .try_get_matches_from(vec!["unlessone", "--config=other.cfg"]); 55919625d8cSopenharmony_ci 56019625d8cSopenharmony_ci assert!(res.is_err()); 56119625d8cSopenharmony_ci assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument); 56219625d8cSopenharmony_ci} 56319625d8cSopenharmony_ci 56419625d8cSopenharmony_ci#[test] 56519625d8cSopenharmony_cifn requires_if_present_mult_pass() { 56619625d8cSopenharmony_ci let res = Command::new("unlessone") 56719625d8cSopenharmony_ci .arg( 56819625d8cSopenharmony_ci Arg::new("cfg") 56919625d8cSopenharmony_ci .requires_ifs([("my.cfg", "extra"), ("other.cfg", "other")]) 57019625d8cSopenharmony_ci .action(ArgAction::Set) 57119625d8cSopenharmony_ci .long("config"), 57219625d8cSopenharmony_ci ) 57319625d8cSopenharmony_ci .arg(Arg::new("extra").long("extra").action(ArgAction::SetTrue)) 57419625d8cSopenharmony_ci .arg(Arg::new("other").long("other").action(ArgAction::SetTrue)) 57519625d8cSopenharmony_ci .try_get_matches_from(vec!["unlessone", "--config=some.cfg"]); 57619625d8cSopenharmony_ci 57719625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 57819625d8cSopenharmony_ci} 57919625d8cSopenharmony_ci 58019625d8cSopenharmony_ci#[test] 58119625d8cSopenharmony_cifn requires_if_present_val_no_present_pass() { 58219625d8cSopenharmony_ci let res = Command::new("unlessone") 58319625d8cSopenharmony_ci .arg( 58419625d8cSopenharmony_ci Arg::new("cfg") 58519625d8cSopenharmony_ci .requires_if("my.cfg", "extra") 58619625d8cSopenharmony_ci .action(ArgAction::Set) 58719625d8cSopenharmony_ci .long("config"), 58819625d8cSopenharmony_ci ) 58919625d8cSopenharmony_ci .arg(Arg::new("extra").long("extra").action(ArgAction::SetTrue)) 59019625d8cSopenharmony_ci .try_get_matches_from(vec!["unlessone"]); 59119625d8cSopenharmony_ci 59219625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 59319625d8cSopenharmony_ci} 59419625d8cSopenharmony_ci 59519625d8cSopenharmony_ci// Conditionally required 59619625d8cSopenharmony_ci 59719625d8cSopenharmony_ci#[test] 59819625d8cSopenharmony_cifn required_if_val_present_pass() { 59919625d8cSopenharmony_ci let res = Command::new("ri") 60019625d8cSopenharmony_ci .arg( 60119625d8cSopenharmony_ci Arg::new("cfg") 60219625d8cSopenharmony_ci .required_if_eq("extra", "val") 60319625d8cSopenharmony_ci .action(ArgAction::Set) 60419625d8cSopenharmony_ci .long("config"), 60519625d8cSopenharmony_ci ) 60619625d8cSopenharmony_ci .arg(Arg::new("extra").action(ArgAction::Set).long("extra")) 60719625d8cSopenharmony_ci .try_get_matches_from(vec!["ri", "--extra", "val", "--config", "my.cfg"]); 60819625d8cSopenharmony_ci 60919625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 61019625d8cSopenharmony_ci} 61119625d8cSopenharmony_ci 61219625d8cSopenharmony_ci#[test] 61319625d8cSopenharmony_cifn required_if_val_present_fail() { 61419625d8cSopenharmony_ci let res = Command::new("ri") 61519625d8cSopenharmony_ci .arg( 61619625d8cSopenharmony_ci Arg::new("cfg") 61719625d8cSopenharmony_ci .required_if_eq("extra", "val") 61819625d8cSopenharmony_ci .action(ArgAction::Set) 61919625d8cSopenharmony_ci .long("config"), 62019625d8cSopenharmony_ci ) 62119625d8cSopenharmony_ci .arg(Arg::new("extra").action(ArgAction::Set).long("extra")) 62219625d8cSopenharmony_ci .try_get_matches_from(vec!["ri", "--extra", "val"]); 62319625d8cSopenharmony_ci 62419625d8cSopenharmony_ci assert!(res.is_err()); 62519625d8cSopenharmony_ci assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument); 62619625d8cSopenharmony_ci} 62719625d8cSopenharmony_ci 62819625d8cSopenharmony_ci#[test] 62919625d8cSopenharmony_cifn required_if_val_present_ignore_case_pass() { 63019625d8cSopenharmony_ci let res = Command::new("ri") 63119625d8cSopenharmony_ci .arg( 63219625d8cSopenharmony_ci Arg::new("cfg") 63319625d8cSopenharmony_ci .required_if_eq("extra", "Val") 63419625d8cSopenharmony_ci .action(ArgAction::Set) 63519625d8cSopenharmony_ci .long("config"), 63619625d8cSopenharmony_ci ) 63719625d8cSopenharmony_ci .arg( 63819625d8cSopenharmony_ci Arg::new("extra") 63919625d8cSopenharmony_ci .action(ArgAction::Set) 64019625d8cSopenharmony_ci .long("extra") 64119625d8cSopenharmony_ci .ignore_case(true), 64219625d8cSopenharmony_ci ) 64319625d8cSopenharmony_ci .try_get_matches_from(vec!["ri", "--extra", "vaL", "--config", "my.cfg"]); 64419625d8cSopenharmony_ci 64519625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 64619625d8cSopenharmony_ci} 64719625d8cSopenharmony_ci 64819625d8cSopenharmony_ci#[test] 64919625d8cSopenharmony_cifn required_if_val_present_ignore_case_fail() { 65019625d8cSopenharmony_ci let res = Command::new("ri") 65119625d8cSopenharmony_ci .arg( 65219625d8cSopenharmony_ci Arg::new("cfg") 65319625d8cSopenharmony_ci .required_if_eq("extra", "Val") 65419625d8cSopenharmony_ci .action(ArgAction::Set) 65519625d8cSopenharmony_ci .long("config"), 65619625d8cSopenharmony_ci ) 65719625d8cSopenharmony_ci .arg( 65819625d8cSopenharmony_ci Arg::new("extra") 65919625d8cSopenharmony_ci .action(ArgAction::Set) 66019625d8cSopenharmony_ci .long("extra") 66119625d8cSopenharmony_ci .ignore_case(true), 66219625d8cSopenharmony_ci ) 66319625d8cSopenharmony_ci .try_get_matches_from(vec!["ri", "--extra", "vaL"]); 66419625d8cSopenharmony_ci 66519625d8cSopenharmony_ci assert!(res.is_err()); 66619625d8cSopenharmony_ci assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument); 66719625d8cSopenharmony_ci} 66819625d8cSopenharmony_ci 66919625d8cSopenharmony_ci#[test] 67019625d8cSopenharmony_cifn required_if_all_values_present_pass() { 67119625d8cSopenharmony_ci let res = Command::new("ri") 67219625d8cSopenharmony_ci .arg( 67319625d8cSopenharmony_ci Arg::new("cfg") 67419625d8cSopenharmony_ci .required_if_eq_all([("extra", "val"), ("option", "spec")]) 67519625d8cSopenharmony_ci .action(ArgAction::Set) 67619625d8cSopenharmony_ci .long("config"), 67719625d8cSopenharmony_ci ) 67819625d8cSopenharmony_ci .arg(Arg::new("extra").action(ArgAction::Set).long("extra")) 67919625d8cSopenharmony_ci .arg(Arg::new("option").action(ArgAction::Set).long("option")) 68019625d8cSopenharmony_ci .try_get_matches_from(vec![ 68119625d8cSopenharmony_ci "ri", "--extra", "val", "--option", "spec", "--config", "my.cfg", 68219625d8cSopenharmony_ci ]); 68319625d8cSopenharmony_ci 68419625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 68519625d8cSopenharmony_ci} 68619625d8cSopenharmony_ci 68719625d8cSopenharmony_ci#[test] 68819625d8cSopenharmony_cifn required_if_some_values_present_pass() { 68919625d8cSopenharmony_ci let res = Command::new("ri") 69019625d8cSopenharmony_ci .arg( 69119625d8cSopenharmony_ci Arg::new("cfg") 69219625d8cSopenharmony_ci .required_if_eq_all([("extra", "val"), ("option", "spec")]) 69319625d8cSopenharmony_ci .action(ArgAction::Set) 69419625d8cSopenharmony_ci .long("config"), 69519625d8cSopenharmony_ci ) 69619625d8cSopenharmony_ci .arg(Arg::new("extra").action(ArgAction::Set).long("extra")) 69719625d8cSopenharmony_ci .arg(Arg::new("option").action(ArgAction::Set).long("option")) 69819625d8cSopenharmony_ci .try_get_matches_from(vec!["ri", "--extra", "val"]); 69919625d8cSopenharmony_ci 70019625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 70119625d8cSopenharmony_ci} 70219625d8cSopenharmony_ci 70319625d8cSopenharmony_ci#[test] 70419625d8cSopenharmony_cifn required_if_all_values_present_fail() { 70519625d8cSopenharmony_ci let res = Command::new("ri") 70619625d8cSopenharmony_ci .arg( 70719625d8cSopenharmony_ci Arg::new("cfg") 70819625d8cSopenharmony_ci .required_if_eq_all([("extra", "val"), ("option", "spec")]) 70919625d8cSopenharmony_ci .action(ArgAction::Set) 71019625d8cSopenharmony_ci .long("config"), 71119625d8cSopenharmony_ci ) 71219625d8cSopenharmony_ci .arg(Arg::new("extra").action(ArgAction::Set).long("extra")) 71319625d8cSopenharmony_ci .arg(Arg::new("option").action(ArgAction::Set).long("option")) 71419625d8cSopenharmony_ci .try_get_matches_from(vec!["ri", "--extra", "val", "--option", "spec"]); 71519625d8cSopenharmony_ci 71619625d8cSopenharmony_ci assert!(res.is_err()); 71719625d8cSopenharmony_ci assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument); 71819625d8cSopenharmony_ci} 71919625d8cSopenharmony_ci 72019625d8cSopenharmony_ci#[test] 72119625d8cSopenharmony_cifn required_if_any_all_values_present_pass() { 72219625d8cSopenharmony_ci let res = Command::new("ri") 72319625d8cSopenharmony_ci .arg( 72419625d8cSopenharmony_ci Arg::new("cfg") 72519625d8cSopenharmony_ci .required_if_eq_all([("extra", "val"), ("option", "spec")]) 72619625d8cSopenharmony_ci .required_if_eq_any([("extra", "val2"), ("option", "spec2")]) 72719625d8cSopenharmony_ci .action(ArgAction::Set) 72819625d8cSopenharmony_ci .long("config"), 72919625d8cSopenharmony_ci ) 73019625d8cSopenharmony_ci .arg(Arg::new("extra").action(ArgAction::Set).long("extra")) 73119625d8cSopenharmony_ci .arg(Arg::new("option").action(ArgAction::Set).long("option")) 73219625d8cSopenharmony_ci .try_get_matches_from(vec![ 73319625d8cSopenharmony_ci "ri", "--extra", "val", "--option", "spec", "--config", "my.cfg", 73419625d8cSopenharmony_ci ]); 73519625d8cSopenharmony_ci 73619625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 73719625d8cSopenharmony_ci} 73819625d8cSopenharmony_ci 73919625d8cSopenharmony_ci#[test] 74019625d8cSopenharmony_cifn required_if_any_all_values_present_fail() { 74119625d8cSopenharmony_ci let res = Command::new("ri") 74219625d8cSopenharmony_ci .arg( 74319625d8cSopenharmony_ci Arg::new("cfg") 74419625d8cSopenharmony_ci .required_if_eq_all([("extra", "val"), ("option", "spec")]) 74519625d8cSopenharmony_ci .required_if_eq_any([("extra", "val2"), ("option", "spec2")]) 74619625d8cSopenharmony_ci .action(ArgAction::Set) 74719625d8cSopenharmony_ci .long("config"), 74819625d8cSopenharmony_ci ) 74919625d8cSopenharmony_ci .arg(Arg::new("extra").action(ArgAction::Set).long("extra")) 75019625d8cSopenharmony_ci .arg(Arg::new("option").action(ArgAction::Set).long("option")) 75119625d8cSopenharmony_ci .try_get_matches_from(vec!["ri", "--extra", "val", "--option", "spec"]); 75219625d8cSopenharmony_ci 75319625d8cSopenharmony_ci assert!(res.is_err()); 75419625d8cSopenharmony_ci assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument); 75519625d8cSopenharmony_ci} 75619625d8cSopenharmony_ci 75719625d8cSopenharmony_ci#[test] 75819625d8cSopenharmony_ci#[cfg(feature = "error-context")] 75919625d8cSopenharmony_cifn list_correct_required_args() { 76019625d8cSopenharmony_ci static COND_REQ_IN_USAGE: &str = "\ 76119625d8cSopenharmony_cierror: the following required arguments were not provided: 76219625d8cSopenharmony_ci --output <output> 76319625d8cSopenharmony_ci 76419625d8cSopenharmony_ciUsage: test --target <target> --input <input> --output <output> 76519625d8cSopenharmony_ci 76619625d8cSopenharmony_ciFor more information, try '--help'. 76719625d8cSopenharmony_ci"; 76819625d8cSopenharmony_ci 76919625d8cSopenharmony_ci let cmd = Command::new("Test cmd") 77019625d8cSopenharmony_ci .version("1.0") 77119625d8cSopenharmony_ci .author("F0x06") 77219625d8cSopenharmony_ci .about("Arg test") 77319625d8cSopenharmony_ci .arg( 77419625d8cSopenharmony_ci Arg::new("target") 77519625d8cSopenharmony_ci .action(ArgAction::Set) 77619625d8cSopenharmony_ci .required(true) 77719625d8cSopenharmony_ci .value_parser(["file", "stdout"]) 77819625d8cSopenharmony_ci .long("target"), 77919625d8cSopenharmony_ci ) 78019625d8cSopenharmony_ci .arg( 78119625d8cSopenharmony_ci Arg::new("input") 78219625d8cSopenharmony_ci .action(ArgAction::Set) 78319625d8cSopenharmony_ci .required(true) 78419625d8cSopenharmony_ci .long("input"), 78519625d8cSopenharmony_ci ) 78619625d8cSopenharmony_ci .arg( 78719625d8cSopenharmony_ci Arg::new("output") 78819625d8cSopenharmony_ci .action(ArgAction::Set) 78919625d8cSopenharmony_ci .required(true) 79019625d8cSopenharmony_ci .long("output"), 79119625d8cSopenharmony_ci ); 79219625d8cSopenharmony_ci 79319625d8cSopenharmony_ci utils::assert_output( 79419625d8cSopenharmony_ci cmd, 79519625d8cSopenharmony_ci "test --input somepath --target file", 79619625d8cSopenharmony_ci COND_REQ_IN_USAGE, 79719625d8cSopenharmony_ci true, 79819625d8cSopenharmony_ci ); 79919625d8cSopenharmony_ci} 80019625d8cSopenharmony_ci 80119625d8cSopenharmony_ci#[test] 80219625d8cSopenharmony_ci#[cfg(feature = "error-context")] 80319625d8cSopenharmony_cifn required_if_val_present_fail_error_output() { 80419625d8cSopenharmony_ci static COND_REQ_IN_USAGE: &str = "\ 80519625d8cSopenharmony_cierror: the following required arguments were not provided: 80619625d8cSopenharmony_ci --output <output> 80719625d8cSopenharmony_ci 80819625d8cSopenharmony_ciUsage: test --target <target> --input <input> --output <output> 80919625d8cSopenharmony_ci 81019625d8cSopenharmony_ciFor more information, try '--help'. 81119625d8cSopenharmony_ci"; 81219625d8cSopenharmony_ci 81319625d8cSopenharmony_ci let cmd = Command::new("Test cmd") 81419625d8cSopenharmony_ci .version("1.0") 81519625d8cSopenharmony_ci .author("F0x06") 81619625d8cSopenharmony_ci .about("Arg test") 81719625d8cSopenharmony_ci .arg( 81819625d8cSopenharmony_ci Arg::new("target") 81919625d8cSopenharmony_ci .action(ArgAction::Set) 82019625d8cSopenharmony_ci .required(true) 82119625d8cSopenharmony_ci .value_parser(["file", "stdout"]) 82219625d8cSopenharmony_ci .long("target"), 82319625d8cSopenharmony_ci ) 82419625d8cSopenharmony_ci .arg( 82519625d8cSopenharmony_ci Arg::new("input") 82619625d8cSopenharmony_ci .action(ArgAction::Set) 82719625d8cSopenharmony_ci .required(true) 82819625d8cSopenharmony_ci .long("input"), 82919625d8cSopenharmony_ci ) 83019625d8cSopenharmony_ci .arg( 83119625d8cSopenharmony_ci Arg::new("output") 83219625d8cSopenharmony_ci .action(ArgAction::Set) 83319625d8cSopenharmony_ci .required_if_eq("target", "file") 83419625d8cSopenharmony_ci .long("output"), 83519625d8cSopenharmony_ci ); 83619625d8cSopenharmony_ci 83719625d8cSopenharmony_ci utils::assert_output( 83819625d8cSopenharmony_ci cmd, 83919625d8cSopenharmony_ci "test --input somepath --target file", 84019625d8cSopenharmony_ci COND_REQ_IN_USAGE, 84119625d8cSopenharmony_ci true, 84219625d8cSopenharmony_ci ); 84319625d8cSopenharmony_ci} 84419625d8cSopenharmony_ci 84519625d8cSopenharmony_ci#[test] 84619625d8cSopenharmony_cifn required_if_wrong_val() { 84719625d8cSopenharmony_ci let res = Command::new("ri") 84819625d8cSopenharmony_ci .arg( 84919625d8cSopenharmony_ci Arg::new("cfg") 85019625d8cSopenharmony_ci .required_if_eq("extra", "val") 85119625d8cSopenharmony_ci .action(ArgAction::Set) 85219625d8cSopenharmony_ci .long("config"), 85319625d8cSopenharmony_ci ) 85419625d8cSopenharmony_ci .arg(Arg::new("extra").action(ArgAction::Set).long("extra")) 85519625d8cSopenharmony_ci .try_get_matches_from(vec!["ri", "--extra", "other"]); 85619625d8cSopenharmony_ci 85719625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 85819625d8cSopenharmony_ci} 85919625d8cSopenharmony_ci 86019625d8cSopenharmony_ci#[test] 86119625d8cSopenharmony_cifn required_ifs_val_present_pass() { 86219625d8cSopenharmony_ci let res = Command::new("ri") 86319625d8cSopenharmony_ci .arg( 86419625d8cSopenharmony_ci Arg::new("cfg") 86519625d8cSopenharmony_ci .required_if_eq_any([("extra", "val"), ("option", "spec")]) 86619625d8cSopenharmony_ci .action(ArgAction::Set) 86719625d8cSopenharmony_ci .long("config"), 86819625d8cSopenharmony_ci ) 86919625d8cSopenharmony_ci .arg(Arg::new("option").action(ArgAction::Set).long("option")) 87019625d8cSopenharmony_ci .arg(Arg::new("extra").action(ArgAction::Set).long("extra")) 87119625d8cSopenharmony_ci .try_get_matches_from(vec!["ri", "--option", "spec", "--config", "my.cfg"]); 87219625d8cSopenharmony_ci 87319625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 87419625d8cSopenharmony_ci} 87519625d8cSopenharmony_ci 87619625d8cSopenharmony_ci#[test] 87719625d8cSopenharmony_cifn required_ifs_val_present_fail() { 87819625d8cSopenharmony_ci let res = Command::new("ri") 87919625d8cSopenharmony_ci .arg( 88019625d8cSopenharmony_ci Arg::new("cfg") 88119625d8cSopenharmony_ci .required_if_eq_any([("extra", "val"), ("option", "spec")]) 88219625d8cSopenharmony_ci .action(ArgAction::Set) 88319625d8cSopenharmony_ci .long("config"), 88419625d8cSopenharmony_ci ) 88519625d8cSopenharmony_ci .arg(Arg::new("extra").action(ArgAction::Set).long("extra")) 88619625d8cSopenharmony_ci .arg(Arg::new("option").action(ArgAction::Set).long("option")) 88719625d8cSopenharmony_ci .try_get_matches_from(vec!["ri", "--option", "spec"]); 88819625d8cSopenharmony_ci 88919625d8cSopenharmony_ci assert!(res.is_err()); 89019625d8cSopenharmony_ci assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument); 89119625d8cSopenharmony_ci} 89219625d8cSopenharmony_ci 89319625d8cSopenharmony_ci#[test] 89419625d8cSopenharmony_cifn required_ifs_wrong_val() { 89519625d8cSopenharmony_ci let res = Command::new("ri") 89619625d8cSopenharmony_ci .arg( 89719625d8cSopenharmony_ci Arg::new("cfg") 89819625d8cSopenharmony_ci .required_if_eq_any([("extra", "val"), ("option", "spec")]) 89919625d8cSopenharmony_ci .action(ArgAction::Set) 90019625d8cSopenharmony_ci .long("config"), 90119625d8cSopenharmony_ci ) 90219625d8cSopenharmony_ci .arg(Arg::new("extra").action(ArgAction::Set).long("extra")) 90319625d8cSopenharmony_ci .arg(Arg::new("option").action(ArgAction::Set).long("option")) 90419625d8cSopenharmony_ci .try_get_matches_from(vec!["ri", "--option", "other"]); 90519625d8cSopenharmony_ci 90619625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 90719625d8cSopenharmony_ci} 90819625d8cSopenharmony_ci 90919625d8cSopenharmony_ci#[test] 91019625d8cSopenharmony_cifn required_ifs_wrong_val_mult_fail() { 91119625d8cSopenharmony_ci let res = Command::new("ri") 91219625d8cSopenharmony_ci .arg( 91319625d8cSopenharmony_ci Arg::new("cfg") 91419625d8cSopenharmony_ci .required_if_eq_any([("extra", "val"), ("option", "spec")]) 91519625d8cSopenharmony_ci .action(ArgAction::Set) 91619625d8cSopenharmony_ci .long("config"), 91719625d8cSopenharmony_ci ) 91819625d8cSopenharmony_ci .arg(Arg::new("extra").action(ArgAction::Set).long("extra")) 91919625d8cSopenharmony_ci .arg(Arg::new("option").action(ArgAction::Set).long("option")) 92019625d8cSopenharmony_ci .try_get_matches_from(vec!["ri", "--extra", "other", "--option", "spec"]); 92119625d8cSopenharmony_ci 92219625d8cSopenharmony_ci assert!(res.is_err()); 92319625d8cSopenharmony_ci assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument); 92419625d8cSopenharmony_ci} 92519625d8cSopenharmony_ci 92619625d8cSopenharmony_ci#[test] 92719625d8cSopenharmony_ci#[cfg(feature = "error-context")] 92819625d8cSopenharmony_cifn require_eq() { 92919625d8cSopenharmony_ci static REQUIRE_EQUALS: &str = "\ 93019625d8cSopenharmony_cierror: the following required arguments were not provided: 93119625d8cSopenharmony_ci --opt=<FILE> 93219625d8cSopenharmony_ci 93319625d8cSopenharmony_ciUsage: clap-test --opt=<FILE> 93419625d8cSopenharmony_ci 93519625d8cSopenharmony_ciFor more information, try '--help'. 93619625d8cSopenharmony_ci"; 93719625d8cSopenharmony_ci 93819625d8cSopenharmony_ci let cmd = Command::new("clap-test").version("v1.4.8").arg( 93919625d8cSopenharmony_ci Arg::new("opt") 94019625d8cSopenharmony_ci .long("opt") 94119625d8cSopenharmony_ci .short('o') 94219625d8cSopenharmony_ci .required(true) 94319625d8cSopenharmony_ci .require_equals(true) 94419625d8cSopenharmony_ci .value_name("FILE") 94519625d8cSopenharmony_ci .help("some"), 94619625d8cSopenharmony_ci ); 94719625d8cSopenharmony_ci utils::assert_output(cmd, "clap-test", REQUIRE_EQUALS, true); 94819625d8cSopenharmony_ci} 94919625d8cSopenharmony_ci 95019625d8cSopenharmony_ci#[test] 95119625d8cSopenharmony_ci#[cfg(feature = "error-context")] 95219625d8cSopenharmony_cifn require_eq_filtered() { 95319625d8cSopenharmony_ci static REQUIRE_EQUALS_FILTERED: &str = "\ 95419625d8cSopenharmony_cierror: the following required arguments were not provided: 95519625d8cSopenharmony_ci --opt=<FILE> 95619625d8cSopenharmony_ci 95719625d8cSopenharmony_ciUsage: clap-test --opt=<FILE> --foo=<FILE> 95819625d8cSopenharmony_ci 95919625d8cSopenharmony_ciFor more information, try '--help'. 96019625d8cSopenharmony_ci"; 96119625d8cSopenharmony_ci 96219625d8cSopenharmony_ci let cmd = Command::new("clap-test") 96319625d8cSopenharmony_ci .version("v1.4.8") 96419625d8cSopenharmony_ci .arg( 96519625d8cSopenharmony_ci Arg::new("opt") 96619625d8cSopenharmony_ci .long("opt") 96719625d8cSopenharmony_ci .short('o') 96819625d8cSopenharmony_ci .required(true) 96919625d8cSopenharmony_ci .require_equals(true) 97019625d8cSopenharmony_ci .value_name("FILE") 97119625d8cSopenharmony_ci .help("some"), 97219625d8cSopenharmony_ci ) 97319625d8cSopenharmony_ci .arg( 97419625d8cSopenharmony_ci Arg::new("foo") 97519625d8cSopenharmony_ci .long("foo") 97619625d8cSopenharmony_ci .short('f') 97719625d8cSopenharmony_ci .required(true) 97819625d8cSopenharmony_ci .require_equals(true) 97919625d8cSopenharmony_ci .value_name("FILE") 98019625d8cSopenharmony_ci .help("some other arg"), 98119625d8cSopenharmony_ci ); 98219625d8cSopenharmony_ci utils::assert_output(cmd, "clap-test -f=blah", REQUIRE_EQUALS_FILTERED, true); 98319625d8cSopenharmony_ci} 98419625d8cSopenharmony_ci 98519625d8cSopenharmony_ci#[test] 98619625d8cSopenharmony_ci#[cfg(feature = "error-context")] 98719625d8cSopenharmony_cifn require_eq_filtered_group() { 98819625d8cSopenharmony_ci static REQUIRE_EQUALS_FILTERED_GROUP: &str = "\ 98919625d8cSopenharmony_cierror: the following required arguments were not provided: 99019625d8cSopenharmony_ci --opt=<FILE> 99119625d8cSopenharmony_ci 99219625d8cSopenharmony_ciUsage: clap-test --opt=<FILE> --foo=<FILE> <--g1=<FILE>|--g2=<FILE>> 99319625d8cSopenharmony_ci 99419625d8cSopenharmony_ciFor more information, try '--help'. 99519625d8cSopenharmony_ci"; 99619625d8cSopenharmony_ci 99719625d8cSopenharmony_ci let cmd = Command::new("clap-test") 99819625d8cSopenharmony_ci .version("v1.4.8") 99919625d8cSopenharmony_ci .arg( 100019625d8cSopenharmony_ci Arg::new("opt") 100119625d8cSopenharmony_ci .long("opt") 100219625d8cSopenharmony_ci .short('o') 100319625d8cSopenharmony_ci .required(true) 100419625d8cSopenharmony_ci .require_equals(true) 100519625d8cSopenharmony_ci .value_name("FILE") 100619625d8cSopenharmony_ci .help("some"), 100719625d8cSopenharmony_ci ) 100819625d8cSopenharmony_ci .arg( 100919625d8cSopenharmony_ci Arg::new("foo") 101019625d8cSopenharmony_ci .long("foo") 101119625d8cSopenharmony_ci .short('f') 101219625d8cSopenharmony_ci .required(true) 101319625d8cSopenharmony_ci .require_equals(true) 101419625d8cSopenharmony_ci .value_name("FILE") 101519625d8cSopenharmony_ci .help("some other arg"), 101619625d8cSopenharmony_ci ) 101719625d8cSopenharmony_ci .arg( 101819625d8cSopenharmony_ci Arg::new("g1") 101919625d8cSopenharmony_ci .long("g1") 102019625d8cSopenharmony_ci .require_equals(true) 102119625d8cSopenharmony_ci .value_name("FILE"), 102219625d8cSopenharmony_ci ) 102319625d8cSopenharmony_ci .arg( 102419625d8cSopenharmony_ci Arg::new("g2") 102519625d8cSopenharmony_ci .long("g2") 102619625d8cSopenharmony_ci .require_equals(true) 102719625d8cSopenharmony_ci .value_name("FILE"), 102819625d8cSopenharmony_ci ) 102919625d8cSopenharmony_ci .group( 103019625d8cSopenharmony_ci ArgGroup::new("test_group") 103119625d8cSopenharmony_ci .args(["g1", "g2"]) 103219625d8cSopenharmony_ci .required(true), 103319625d8cSopenharmony_ci ); 103419625d8cSopenharmony_ci utils::assert_output( 103519625d8cSopenharmony_ci cmd, 103619625d8cSopenharmony_ci "clap-test -f=blah --g1=blah", 103719625d8cSopenharmony_ci REQUIRE_EQUALS_FILTERED_GROUP, 103819625d8cSopenharmony_ci true, 103919625d8cSopenharmony_ci ); 104019625d8cSopenharmony_ci} 104119625d8cSopenharmony_ci 104219625d8cSopenharmony_cifn issue_1158_app() -> Command { 104319625d8cSopenharmony_ci Command::new("example") 104419625d8cSopenharmony_ci .arg( 104519625d8cSopenharmony_ci arg!(-c --config <FILE> "Custom config file.") 104619625d8cSopenharmony_ci .required_unless_present("ID") 104719625d8cSopenharmony_ci .conflicts_with("ID"), 104819625d8cSopenharmony_ci ) 104919625d8cSopenharmony_ci .arg( 105019625d8cSopenharmony_ci arg!([ID] "ID") 105119625d8cSopenharmony_ci .required_unless_present("config") 105219625d8cSopenharmony_ci .conflicts_with("config") 105319625d8cSopenharmony_ci .requires_ifs([ 105419625d8cSopenharmony_ci (ArgPredicate::IsPresent, "x"), 105519625d8cSopenharmony_ci (ArgPredicate::IsPresent, "y"), 105619625d8cSopenharmony_ci (ArgPredicate::IsPresent, "z"), 105719625d8cSopenharmony_ci ]), 105819625d8cSopenharmony_ci ) 105919625d8cSopenharmony_ci .arg(arg!(x: -x <X> "X")) 106019625d8cSopenharmony_ci .arg(arg!(y: -y <Y> "Y")) 106119625d8cSopenharmony_ci .arg(arg!(z: -z <Z> "Z")) 106219625d8cSopenharmony_ci} 106319625d8cSopenharmony_ci 106419625d8cSopenharmony_ci#[test] 106519625d8cSopenharmony_ci#[cfg(feature = "error-context")] 106619625d8cSopenharmony_cifn multiple_required_unless_usage_printing() { 106719625d8cSopenharmony_ci static MULTIPLE_REQUIRED_UNLESS_USAGE: &str = "\ 106819625d8cSopenharmony_cierror: the following required arguments were not provided: 106919625d8cSopenharmony_ci --a <a> 107019625d8cSopenharmony_ci --b <b> 107119625d8cSopenharmony_ci 107219625d8cSopenharmony_ciUsage: test --c <c> --a <a> --b <b> 107319625d8cSopenharmony_ci 107419625d8cSopenharmony_ciFor more information, try '--help'. 107519625d8cSopenharmony_ci"; 107619625d8cSopenharmony_ci let cmd = Command::new("test") 107719625d8cSopenharmony_ci .arg( 107819625d8cSopenharmony_ci Arg::new("a") 107919625d8cSopenharmony_ci .long("a") 108019625d8cSopenharmony_ci .action(ArgAction::Set) 108119625d8cSopenharmony_ci .required_unless_present("b") 108219625d8cSopenharmony_ci .conflicts_with("b"), 108319625d8cSopenharmony_ci ) 108419625d8cSopenharmony_ci .arg( 108519625d8cSopenharmony_ci Arg::new("b") 108619625d8cSopenharmony_ci .long("b") 108719625d8cSopenharmony_ci .action(ArgAction::Set) 108819625d8cSopenharmony_ci .required_unless_present("a") 108919625d8cSopenharmony_ci .conflicts_with("a"), 109019625d8cSopenharmony_ci ) 109119625d8cSopenharmony_ci .arg( 109219625d8cSopenharmony_ci Arg::new("c") 109319625d8cSopenharmony_ci .long("c") 109419625d8cSopenharmony_ci .action(ArgAction::Set) 109519625d8cSopenharmony_ci .required_unless_present("d") 109619625d8cSopenharmony_ci .conflicts_with("d"), 109719625d8cSopenharmony_ci ) 109819625d8cSopenharmony_ci .arg( 109919625d8cSopenharmony_ci Arg::new("d") 110019625d8cSopenharmony_ci .long("d") 110119625d8cSopenharmony_ci .action(ArgAction::Set) 110219625d8cSopenharmony_ci .required_unless_present("c") 110319625d8cSopenharmony_ci .conflicts_with("c"), 110419625d8cSopenharmony_ci ); 110519625d8cSopenharmony_ci utils::assert_output(cmd, "test --c asd", MULTIPLE_REQUIRED_UNLESS_USAGE, true); 110619625d8cSopenharmony_ci} 110719625d8cSopenharmony_ci 110819625d8cSopenharmony_ci#[test] 110919625d8cSopenharmony_ci#[cfg(feature = "error-context")] 111019625d8cSopenharmony_cifn issue_1158_conflicting_requirements() { 111119625d8cSopenharmony_ci static ISSUE_1158: &str = "\ 111219625d8cSopenharmony_cierror: the following required arguments were not provided: 111319625d8cSopenharmony_ci -x <X> 111419625d8cSopenharmony_ci -y <Y> 111519625d8cSopenharmony_ci -z <Z> 111619625d8cSopenharmony_ci 111719625d8cSopenharmony_ciUsage: example -x <X> -y <Y> -z <Z> <ID> 111819625d8cSopenharmony_ci 111919625d8cSopenharmony_ciFor more information, try '--help'. 112019625d8cSopenharmony_ci"; 112119625d8cSopenharmony_ci 112219625d8cSopenharmony_ci let cmd = issue_1158_app(); 112319625d8cSopenharmony_ci 112419625d8cSopenharmony_ci utils::assert_output(cmd, "example id", ISSUE_1158, true); 112519625d8cSopenharmony_ci} 112619625d8cSopenharmony_ci 112719625d8cSopenharmony_ci#[test] 112819625d8cSopenharmony_cifn issue_1158_conflicting_requirements_rev() { 112919625d8cSopenharmony_ci let res = issue_1158_app().try_get_matches_from(["", "--config", "some.conf"]); 113019625d8cSopenharmony_ci 113119625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 113219625d8cSopenharmony_ci} 113319625d8cSopenharmony_ci 113419625d8cSopenharmony_ci#[test] 113519625d8cSopenharmony_cifn issue_1643_args_mutually_require_each_other() { 113619625d8cSopenharmony_ci use clap::*; 113719625d8cSopenharmony_ci 113819625d8cSopenharmony_ci let cmd = Command::new("test") 113919625d8cSopenharmony_ci .arg( 114019625d8cSopenharmony_ci Arg::new("relation_id") 114119625d8cSopenharmony_ci .help("The relation id to get the data from") 114219625d8cSopenharmony_ci .long("relation-id") 114319625d8cSopenharmony_ci .short('r') 114419625d8cSopenharmony_ci .action(ArgAction::Set) 114519625d8cSopenharmony_ci .requires("remote_unit_name"), 114619625d8cSopenharmony_ci ) 114719625d8cSopenharmony_ci .arg( 114819625d8cSopenharmony_ci Arg::new("remote_unit_name") 114919625d8cSopenharmony_ci .help("The name of the remote unit to get data from") 115019625d8cSopenharmony_ci .long("remote-unit") 115119625d8cSopenharmony_ci .short('u') 115219625d8cSopenharmony_ci .action(ArgAction::Set) 115319625d8cSopenharmony_ci .requires("relation_id"), 115419625d8cSopenharmony_ci ); 115519625d8cSopenharmony_ci 115619625d8cSopenharmony_ci cmd.try_get_matches_from(["test", "-u", "hello", "-r", "farewell"]) 115719625d8cSopenharmony_ci .unwrap(); 115819625d8cSopenharmony_ci} 115919625d8cSopenharmony_ci 116019625d8cSopenharmony_ci#[test] 116119625d8cSopenharmony_cifn short_flag_require_equals_with_minvals_zero() { 116219625d8cSopenharmony_ci let m = Command::new("foo") 116319625d8cSopenharmony_ci .arg( 116419625d8cSopenharmony_ci Arg::new("check") 116519625d8cSopenharmony_ci .short('c') 116619625d8cSopenharmony_ci .num_args(0..) 116719625d8cSopenharmony_ci .require_equals(true), 116819625d8cSopenharmony_ci ) 116919625d8cSopenharmony_ci .arg(Arg::new("unique").short('u').action(ArgAction::SetTrue)) 117019625d8cSopenharmony_ci .try_get_matches_from(["foo", "-cu"]) 117119625d8cSopenharmony_ci .unwrap(); 117219625d8cSopenharmony_ci assert!(m.contains_id("check")); 117319625d8cSopenharmony_ci assert!(*m.get_one::<bool>("unique").expect("defaulted by clap")); 117419625d8cSopenharmony_ci} 117519625d8cSopenharmony_ci 117619625d8cSopenharmony_ci#[test] 117719625d8cSopenharmony_cifn issue_2624() { 117819625d8cSopenharmony_ci let matches = Command::new("foo") 117919625d8cSopenharmony_ci .arg( 118019625d8cSopenharmony_ci Arg::new("check") 118119625d8cSopenharmony_ci .short('c') 118219625d8cSopenharmony_ci .long("check") 118319625d8cSopenharmony_ci .require_equals(true) 118419625d8cSopenharmony_ci .num_args(0..) 118519625d8cSopenharmony_ci .value_parser(["silent", "quiet", "diagnose-first"]), 118619625d8cSopenharmony_ci ) 118719625d8cSopenharmony_ci .arg( 118819625d8cSopenharmony_ci Arg::new("unique") 118919625d8cSopenharmony_ci .short('u') 119019625d8cSopenharmony_ci .long("unique") 119119625d8cSopenharmony_ci .action(ArgAction::SetTrue), 119219625d8cSopenharmony_ci ) 119319625d8cSopenharmony_ci .try_get_matches_from(["foo", "-cu"]) 119419625d8cSopenharmony_ci .unwrap(); 119519625d8cSopenharmony_ci assert!(matches.contains_id("check")); 119619625d8cSopenharmony_ci assert!(*matches 119719625d8cSopenharmony_ci .get_one::<bool>("unique") 119819625d8cSopenharmony_ci .expect("defaulted by clap")); 119919625d8cSopenharmony_ci} 120019625d8cSopenharmony_ci 120119625d8cSopenharmony_ci#[test] 120219625d8cSopenharmony_cifn required_unless_all_with_any() { 120319625d8cSopenharmony_ci let cmd = Command::new("prog") 120419625d8cSopenharmony_ci .arg(Arg::new("foo").long("foo").action(ArgAction::SetTrue)) 120519625d8cSopenharmony_ci .arg(Arg::new("bar").long("bar").action(ArgAction::SetTrue)) 120619625d8cSopenharmony_ci .arg(Arg::new("baz").long("baz").action(ArgAction::SetTrue)) 120719625d8cSopenharmony_ci .arg( 120819625d8cSopenharmony_ci Arg::new("flag") 120919625d8cSopenharmony_ci .long("flag") 121019625d8cSopenharmony_ci .action(ArgAction::SetTrue) 121119625d8cSopenharmony_ci .required_unless_present_any(["foo"]) 121219625d8cSopenharmony_ci .required_unless_present_all(["bar", "baz"]), 121319625d8cSopenharmony_ci ); 121419625d8cSopenharmony_ci 121519625d8cSopenharmony_ci let result = cmd.clone().try_get_matches_from(vec!["myprog"]); 121619625d8cSopenharmony_ci assert!(result.is_err(), "{:?}", result.unwrap()); 121719625d8cSopenharmony_ci 121819625d8cSopenharmony_ci let result = cmd.clone().try_get_matches_from(vec!["myprog", "--foo"]); 121919625d8cSopenharmony_ci assert!(result.is_ok(), "{:?}", result.unwrap_err()); 122019625d8cSopenharmony_ci let matches = result.unwrap(); 122119625d8cSopenharmony_ci assert!(!*matches.get_one::<bool>("flag").expect("defaulted by clap")); 122219625d8cSopenharmony_ci 122319625d8cSopenharmony_ci let result = cmd 122419625d8cSopenharmony_ci .clone() 122519625d8cSopenharmony_ci .try_get_matches_from(vec!["myprog", "--bar", "--baz"]); 122619625d8cSopenharmony_ci assert!(result.is_ok(), "{:?}", result.unwrap_err()); 122719625d8cSopenharmony_ci let matches = result.unwrap(); 122819625d8cSopenharmony_ci assert!(!*matches.get_one::<bool>("flag").expect("defaulted by clap")); 122919625d8cSopenharmony_ci 123019625d8cSopenharmony_ci let result = cmd.try_get_matches_from(vec!["myprog", "--bar"]); 123119625d8cSopenharmony_ci assert!(result.is_err(), "{:?}", result.unwrap()); 123219625d8cSopenharmony_ci} 123319625d8cSopenharmony_ci 123419625d8cSopenharmony_ci#[cfg(debug_assertions)] 123519625d8cSopenharmony_ci#[test] 123619625d8cSopenharmony_ci#[should_panic = "Command prog: Argument or group 'extra' specified in 'requires*' for 'config' does not exist"] 123719625d8cSopenharmony_cifn requires_invalid_arg() { 123819625d8cSopenharmony_ci let _ = Command::new("prog") 123919625d8cSopenharmony_ci .arg(Arg::new("config").requires("extra").long("config")) 124019625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--config"]); 124119625d8cSopenharmony_ci} 124219625d8cSopenharmony_ci 124319625d8cSopenharmony_ci#[cfg(debug_assertions)] 124419625d8cSopenharmony_ci#[test] 124519625d8cSopenharmony_ci#[should_panic = "Command prog: Argument or group 'extra' specified in 'requires*' for 'config' does not exist"] 124619625d8cSopenharmony_cifn requires_if_invalid_arg() { 124719625d8cSopenharmony_ci let _ = Command::new("prog") 124819625d8cSopenharmony_ci .arg( 124919625d8cSopenharmony_ci Arg::new("config") 125019625d8cSopenharmony_ci .requires_if("val", "extra") 125119625d8cSopenharmony_ci .long("config"), 125219625d8cSopenharmony_ci ) 125319625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--config"]); 125419625d8cSopenharmony_ci} 125519625d8cSopenharmony_ci 125619625d8cSopenharmony_ci#[cfg(debug_assertions)] 125719625d8cSopenharmony_ci#[test] 125819625d8cSopenharmony_ci#[should_panic = "Command prog: Argument or group 'extra' specified in 'required_if_eq*' for 'config' does not exist"] 125919625d8cSopenharmony_cifn required_if_invalid_arg() { 126019625d8cSopenharmony_ci let _ = Command::new("prog") 126119625d8cSopenharmony_ci .arg( 126219625d8cSopenharmony_ci Arg::new("config") 126319625d8cSopenharmony_ci .required_if_eq("extra", "val") 126419625d8cSopenharmony_ci .long("config"), 126519625d8cSopenharmony_ci ) 126619625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--config"]); 126719625d8cSopenharmony_ci} 126819625d8cSopenharmony_ci 126919625d8cSopenharmony_ci#[cfg(debug_assertions)] 127019625d8cSopenharmony_ci#[test] 127119625d8cSopenharmony_ci#[should_panic = "Command prog: Argument or group 'extra' specified in 'required_unless*' for 'config' does not exist"] 127219625d8cSopenharmony_cifn required_unless_invalid_arg() { 127319625d8cSopenharmony_ci let _ = Command::new("prog") 127419625d8cSopenharmony_ci .arg( 127519625d8cSopenharmony_ci Arg::new("config") 127619625d8cSopenharmony_ci .required_unless_present("extra") 127719625d8cSopenharmony_ci .long("config"), 127819625d8cSopenharmony_ci ) 127919625d8cSopenharmony_ci .try_get_matches_from(vec![""]); 128019625d8cSopenharmony_ci} 128119625d8cSopenharmony_ci 128219625d8cSopenharmony_ci#[test] 128319625d8cSopenharmony_cifn requires_with_default_value() { 128419625d8cSopenharmony_ci let result = Command::new("prog") 128519625d8cSopenharmony_ci .arg( 128619625d8cSopenharmony_ci Arg::new("opt") 128719625d8cSopenharmony_ci .long("opt") 128819625d8cSopenharmony_ci .default_value("default") 128919625d8cSopenharmony_ci .requires("flag"), 129019625d8cSopenharmony_ci ) 129119625d8cSopenharmony_ci .arg(Arg::new("flag").long("flag").action(ArgAction::SetTrue)) 129219625d8cSopenharmony_ci .try_get_matches_from(vec!["myprog"]); 129319625d8cSopenharmony_ci 129419625d8cSopenharmony_ci assert!( 129519625d8cSopenharmony_ci result.is_ok(), 129619625d8cSopenharmony_ci "requires should ignore default_value: {:?}", 129719625d8cSopenharmony_ci result.unwrap_err() 129819625d8cSopenharmony_ci ); 129919625d8cSopenharmony_ci let m = result.unwrap(); 130019625d8cSopenharmony_ci 130119625d8cSopenharmony_ci assert_eq!( 130219625d8cSopenharmony_ci m.get_one::<String>("opt").map(|v| v.as_str()), 130319625d8cSopenharmony_ci Some("default") 130419625d8cSopenharmony_ci ); 130519625d8cSopenharmony_ci assert!(!*m.get_one::<bool>("flag").expect("defaulted by clap")); 130619625d8cSopenharmony_ci} 130719625d8cSopenharmony_ci 130819625d8cSopenharmony_ci#[test] 130919625d8cSopenharmony_cifn requires_if_with_default_value() { 131019625d8cSopenharmony_ci let result = Command::new("prog") 131119625d8cSopenharmony_ci .arg( 131219625d8cSopenharmony_ci Arg::new("opt") 131319625d8cSopenharmony_ci .long("opt") 131419625d8cSopenharmony_ci .default_value("default") 131519625d8cSopenharmony_ci .requires_if("default", "flag"), 131619625d8cSopenharmony_ci ) 131719625d8cSopenharmony_ci .arg(Arg::new("flag").long("flag").action(ArgAction::SetTrue)) 131819625d8cSopenharmony_ci .try_get_matches_from(vec!["myprog"]); 131919625d8cSopenharmony_ci 132019625d8cSopenharmony_ci assert!( 132119625d8cSopenharmony_ci result.is_ok(), 132219625d8cSopenharmony_ci "requires_if should ignore default_value: {:?}", 132319625d8cSopenharmony_ci result.unwrap_err() 132419625d8cSopenharmony_ci ); 132519625d8cSopenharmony_ci let m = result.unwrap(); 132619625d8cSopenharmony_ci 132719625d8cSopenharmony_ci assert_eq!( 132819625d8cSopenharmony_ci m.get_one::<String>("opt").map(|v| v.as_str()), 132919625d8cSopenharmony_ci Some("default") 133019625d8cSopenharmony_ci ); 133119625d8cSopenharmony_ci assert!(!*m.get_one::<bool>("flag").expect("defaulted by clap")); 133219625d8cSopenharmony_ci} 133319625d8cSopenharmony_ci 133419625d8cSopenharmony_ci#[test] 133519625d8cSopenharmony_cifn group_requires_with_default_value() { 133619625d8cSopenharmony_ci let result = Command::new("prog") 133719625d8cSopenharmony_ci .arg(Arg::new("opt").long("opt").default_value("default")) 133819625d8cSopenharmony_ci .arg(Arg::new("flag").long("flag").action(ArgAction::SetTrue)) 133919625d8cSopenharmony_ci .group(ArgGroup::new("one").arg("opt").requires("flag")) 134019625d8cSopenharmony_ci .try_get_matches_from(vec!["myprog"]); 134119625d8cSopenharmony_ci 134219625d8cSopenharmony_ci assert!( 134319625d8cSopenharmony_ci result.is_ok(), 134419625d8cSopenharmony_ci "arg group requires should ignore default_value: {:?}", 134519625d8cSopenharmony_ci result.unwrap_err() 134619625d8cSopenharmony_ci ); 134719625d8cSopenharmony_ci let m = result.unwrap(); 134819625d8cSopenharmony_ci 134919625d8cSopenharmony_ci assert_eq!( 135019625d8cSopenharmony_ci m.get_one::<String>("opt").map(|v| v.as_str()), 135119625d8cSopenharmony_ci Some("default") 135219625d8cSopenharmony_ci ); 135319625d8cSopenharmony_ci assert!(!*m.get_one::<bool>("flag").expect("defaulted by clap")); 135419625d8cSopenharmony_ci} 135519625d8cSopenharmony_ci 135619625d8cSopenharmony_ci#[test] 135719625d8cSopenharmony_cifn required_if_eq_on_default_value() { 135819625d8cSopenharmony_ci let result = Command::new("prog") 135919625d8cSopenharmony_ci .arg(Arg::new("opt").long("opt").default_value("default")) 136019625d8cSopenharmony_ci .arg( 136119625d8cSopenharmony_ci Arg::new("flag") 136219625d8cSopenharmony_ci .long("flag") 136319625d8cSopenharmony_ci .action(ArgAction::SetTrue) 136419625d8cSopenharmony_ci .required_if_eq("opt", "default"), 136519625d8cSopenharmony_ci ) 136619625d8cSopenharmony_ci .try_get_matches_from(vec!["myprog"]); 136719625d8cSopenharmony_ci 136819625d8cSopenharmony_ci assert!( 136919625d8cSopenharmony_ci result.is_ok(), 137019625d8cSopenharmony_ci "required_if_eq should ignore default_value: {:?}", 137119625d8cSopenharmony_ci result.unwrap_err() 137219625d8cSopenharmony_ci ); 137319625d8cSopenharmony_ci let m = result.unwrap(); 137419625d8cSopenharmony_ci 137519625d8cSopenharmony_ci assert_eq!( 137619625d8cSopenharmony_ci m.get_one::<String>("opt").map(|v| v.as_str()), 137719625d8cSopenharmony_ci Some("default") 137819625d8cSopenharmony_ci ); 137919625d8cSopenharmony_ci assert!(!*m.get_one::<bool>("flag").expect("defaulted by clap")); 138019625d8cSopenharmony_ci} 138119625d8cSopenharmony_ci 138219625d8cSopenharmony_ci#[test] 138319625d8cSopenharmony_cifn required_if_eq_all_on_default_value() { 138419625d8cSopenharmony_ci let result = Command::new("prog") 138519625d8cSopenharmony_ci .arg(Arg::new("opt").long("opt").default_value("default")) 138619625d8cSopenharmony_ci .arg( 138719625d8cSopenharmony_ci Arg::new("flag") 138819625d8cSopenharmony_ci .long("flag") 138919625d8cSopenharmony_ci .action(ArgAction::SetTrue) 139019625d8cSopenharmony_ci .required_if_eq_all([("opt", "default")]), 139119625d8cSopenharmony_ci ) 139219625d8cSopenharmony_ci .try_get_matches_from(vec!["myprog"]); 139319625d8cSopenharmony_ci 139419625d8cSopenharmony_ci assert!( 139519625d8cSopenharmony_ci result.is_ok(), 139619625d8cSopenharmony_ci "required_if_eq_all should ignore default_value: {:?}", 139719625d8cSopenharmony_ci result.unwrap_err() 139819625d8cSopenharmony_ci ); 139919625d8cSopenharmony_ci let m = result.unwrap(); 140019625d8cSopenharmony_ci 140119625d8cSopenharmony_ci assert_eq!( 140219625d8cSopenharmony_ci m.get_one::<String>("opt").map(|v| v.as_str()), 140319625d8cSopenharmony_ci Some("default") 140419625d8cSopenharmony_ci ); 140519625d8cSopenharmony_ci assert!(!*m.get_one::<bool>("flag").expect("defaulted by clap")); 140619625d8cSopenharmony_ci} 140719625d8cSopenharmony_ci 140819625d8cSopenharmony_ci#[test] 140919625d8cSopenharmony_cifn required_unless_on_default_value() { 141019625d8cSopenharmony_ci let result = Command::new("prog") 141119625d8cSopenharmony_ci .arg(Arg::new("opt").long("opt").default_value("default")) 141219625d8cSopenharmony_ci .arg(Arg::new("flag").long("flag").required_unless_present("opt")) 141319625d8cSopenharmony_ci .try_get_matches_from(vec!["myprog"]); 141419625d8cSopenharmony_ci 141519625d8cSopenharmony_ci assert!(result.is_err(), "{:?}", result.unwrap()); 141619625d8cSopenharmony_ci} 141719625d8cSopenharmony_ci 141819625d8cSopenharmony_ci#[test] 141919625d8cSopenharmony_cifn required_unless_all_on_default_value() { 142019625d8cSopenharmony_ci let result = Command::new("prog") 142119625d8cSopenharmony_ci .arg(Arg::new("opt").long("opt").default_value("default")) 142219625d8cSopenharmony_ci .arg( 142319625d8cSopenharmony_ci Arg::new("flag") 142419625d8cSopenharmony_ci .long("flag") 142519625d8cSopenharmony_ci .required_unless_present_all(["opt"]), 142619625d8cSopenharmony_ci ) 142719625d8cSopenharmony_ci .try_get_matches_from(vec!["myprog"]); 142819625d8cSopenharmony_ci 142919625d8cSopenharmony_ci assert!(result.is_err(), "{:?}", result.unwrap()); 143019625d8cSopenharmony_ci} 143119625d8cSopenharmony_ci 143219625d8cSopenharmony_ci#[test] 143319625d8cSopenharmony_ci#[cfg(feature = "error-context")] 143419625d8cSopenharmony_cifn required_error_doesnt_duplicate() { 143519625d8cSopenharmony_ci let cmd = Command::new("Clap-created-USAGE-string-bug") 143619625d8cSopenharmony_ci .arg(Arg::new("a").required(true)) 143719625d8cSopenharmony_ci .arg( 143819625d8cSopenharmony_ci Arg::new("b") 143919625d8cSopenharmony_ci .short('b') 144019625d8cSopenharmony_ci .action(ArgAction::Set) 144119625d8cSopenharmony_ci .conflicts_with("c"), 144219625d8cSopenharmony_ci ) 144319625d8cSopenharmony_ci .arg( 144419625d8cSopenharmony_ci Arg::new("c") 144519625d8cSopenharmony_ci .short('c') 144619625d8cSopenharmony_ci .action(ArgAction::Set) 144719625d8cSopenharmony_ci .conflicts_with("b"), 144819625d8cSopenharmony_ci ); 144919625d8cSopenharmony_ci const EXPECTED: &str = "\ 145019625d8cSopenharmony_cierror: the argument '-b <b>' cannot be used with '-c <c>' 145119625d8cSopenharmony_ci 145219625d8cSopenharmony_ciUsage: clap-test -b <b> <a> 145319625d8cSopenharmony_ci 145419625d8cSopenharmony_ciFor more information, try '--help'. 145519625d8cSopenharmony_ci"; 145619625d8cSopenharmony_ci utils::assert_output(cmd, "clap-test aaa -b bbb -c ccc", EXPECTED, true); 145719625d8cSopenharmony_ci} 145819625d8cSopenharmony_ci 145919625d8cSopenharmony_ci#[test] 146019625d8cSopenharmony_ci#[cfg(feature = "error-context")] 146119625d8cSopenharmony_cifn required_require_with_group_shows_flag() { 146219625d8cSopenharmony_ci let cmd = Command::new("test") 146319625d8cSopenharmony_ci .arg(arg!(--"require-first").requires("first")) 146419625d8cSopenharmony_ci .arg(arg!(--first).group("either_or_both")) 146519625d8cSopenharmony_ci .arg(arg!(--second).group("either_or_both")) 146619625d8cSopenharmony_ci .group( 146719625d8cSopenharmony_ci ArgGroup::new("either_or_both") 146819625d8cSopenharmony_ci .multiple(true) 146919625d8cSopenharmony_ci .required(true), 147019625d8cSopenharmony_ci ); 147119625d8cSopenharmony_ci const EXPECTED: &str = "\ 147219625d8cSopenharmony_cierror: the following required arguments were not provided: 147319625d8cSopenharmony_ci --first 147419625d8cSopenharmony_ci 147519625d8cSopenharmony_ciUsage: test --require-first <--first|--second> 147619625d8cSopenharmony_ci 147719625d8cSopenharmony_ciFor more information, try '--help'. 147819625d8cSopenharmony_ci"; 147919625d8cSopenharmony_ci utils::assert_output(cmd, "test --require-first --second", EXPECTED, true); 148019625d8cSopenharmony_ci} 1481