119625d8cSopenharmony_ciuse std::ffi::OsStr; 219625d8cSopenharmony_ciuse std::ffi::OsString; 319625d8cSopenharmony_ci 419625d8cSopenharmony_ciuse clap::builder::ArgPredicate; 519625d8cSopenharmony_ci#[cfg(feature = "error-context")] 619625d8cSopenharmony_ciuse clap::error::ErrorKind; 719625d8cSopenharmony_ciuse clap::{arg, value_parser, Arg, ArgAction, Command}; 819625d8cSopenharmony_ci 919625d8cSopenharmony_ci#[cfg(feature = "error-context")] 1019625d8cSopenharmony_ciuse super::utils; 1119625d8cSopenharmony_ci 1219625d8cSopenharmony_ci#[test] 1319625d8cSopenharmony_cifn opts() { 1419625d8cSopenharmony_ci let r = Command::new("df") 1519625d8cSopenharmony_ci .arg(arg!(o: -o <opt> "some opt").default_value("default")) 1619625d8cSopenharmony_ci .try_get_matches_from(vec![""]); 1719625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 1819625d8cSopenharmony_ci let m = r.unwrap(); 1919625d8cSopenharmony_ci assert!(m.contains_id("o")); 2019625d8cSopenharmony_ci assert_eq!( 2119625d8cSopenharmony_ci m.value_source("o").unwrap(), 2219625d8cSopenharmony_ci clap::parser::ValueSource::DefaultValue 2319625d8cSopenharmony_ci ); 2419625d8cSopenharmony_ci assert_eq!( 2519625d8cSopenharmony_ci m.get_one::<String>("o").map(|v| v.as_str()).unwrap(), 2619625d8cSopenharmony_ci "default" 2719625d8cSopenharmony_ci ); 2819625d8cSopenharmony_ci} 2919625d8cSopenharmony_ci 3019625d8cSopenharmony_ci#[test] 3119625d8cSopenharmony_cifn default_has_index() { 3219625d8cSopenharmony_ci let r = Command::new("df") 3319625d8cSopenharmony_ci .arg(arg!(o: -o <opt> "some opt").default_value("default")) 3419625d8cSopenharmony_ci .try_get_matches_from(vec![""]); 3519625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 3619625d8cSopenharmony_ci let m = r.unwrap(); 3719625d8cSopenharmony_ci assert_eq!(m.index_of("o"), Some(1)); 3819625d8cSopenharmony_ci} 3919625d8cSopenharmony_ci 4019625d8cSopenharmony_ci#[test] 4119625d8cSopenharmony_ci#[cfg(feature = "error-context")] 4219625d8cSopenharmony_cifn opt_without_value_fail() { 4319625d8cSopenharmony_ci let r = Command::new("df") 4419625d8cSopenharmony_ci .arg( 4519625d8cSopenharmony_ci arg!(o: -o <opt> "some opt") 4619625d8cSopenharmony_ci .default_value("default") 4719625d8cSopenharmony_ci .value_parser(clap::builder::NonEmptyStringValueParser::new()), 4819625d8cSopenharmony_ci ) 4919625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-o"]); 5019625d8cSopenharmony_ci assert!(r.is_err()); 5119625d8cSopenharmony_ci let err = r.unwrap_err(); 5219625d8cSopenharmony_ci assert_eq!(err.kind(), ErrorKind::InvalidValue); 5319625d8cSopenharmony_ci assert!(err 5419625d8cSopenharmony_ci .to_string() 5519625d8cSopenharmony_ci .contains("a value is required for '-o <opt>' but none was supplied")); 5619625d8cSopenharmony_ci} 5719625d8cSopenharmony_ci 5819625d8cSopenharmony_ci#[test] 5919625d8cSopenharmony_cifn opt_user_override() { 6019625d8cSopenharmony_ci let r = Command::new("df") 6119625d8cSopenharmony_ci .arg(arg!(--opt <FILE> "some arg").default_value("default")) 6219625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--opt", "value"]); 6319625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 6419625d8cSopenharmony_ci let m = r.unwrap(); 6519625d8cSopenharmony_ci assert!(m.contains_id("opt")); 6619625d8cSopenharmony_ci assert_eq!( 6719625d8cSopenharmony_ci m.value_source("opt").unwrap(), 6819625d8cSopenharmony_ci clap::parser::ValueSource::CommandLine 6919625d8cSopenharmony_ci ); 7019625d8cSopenharmony_ci assert_eq!( 7119625d8cSopenharmony_ci m.get_one::<String>("opt").map(|v| v.as_str()).unwrap(), 7219625d8cSopenharmony_ci "value" 7319625d8cSopenharmony_ci ); 7419625d8cSopenharmony_ci} 7519625d8cSopenharmony_ci 7619625d8cSopenharmony_ci#[test] 7719625d8cSopenharmony_cifn positionals() { 7819625d8cSopenharmony_ci let r = Command::new("df") 7919625d8cSopenharmony_ci .arg(arg!([arg] "some opt").default_value("default")) 8019625d8cSopenharmony_ci .try_get_matches_from(vec![""]); 8119625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 8219625d8cSopenharmony_ci let m = r.unwrap(); 8319625d8cSopenharmony_ci assert!(m.contains_id("arg")); 8419625d8cSopenharmony_ci assert_eq!( 8519625d8cSopenharmony_ci m.value_source("arg").unwrap(), 8619625d8cSopenharmony_ci clap::parser::ValueSource::DefaultValue 8719625d8cSopenharmony_ci ); 8819625d8cSopenharmony_ci assert_eq!( 8919625d8cSopenharmony_ci m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(), 9019625d8cSopenharmony_ci "default" 9119625d8cSopenharmony_ci ); 9219625d8cSopenharmony_ci} 9319625d8cSopenharmony_ci 9419625d8cSopenharmony_ci#[test] 9519625d8cSopenharmony_cifn positional_user_override() { 9619625d8cSopenharmony_ci let r = Command::new("df") 9719625d8cSopenharmony_ci .arg(arg!([arg] "some arg").default_value("default")) 9819625d8cSopenharmony_ci .try_get_matches_from(vec!["", "value"]); 9919625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 10019625d8cSopenharmony_ci let m = r.unwrap(); 10119625d8cSopenharmony_ci assert!(m.contains_id("arg")); 10219625d8cSopenharmony_ci assert_eq!( 10319625d8cSopenharmony_ci m.value_source("arg").unwrap(), 10419625d8cSopenharmony_ci clap::parser::ValueSource::CommandLine 10519625d8cSopenharmony_ci ); 10619625d8cSopenharmony_ci assert_eq!( 10719625d8cSopenharmony_ci m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(), 10819625d8cSopenharmony_ci "value" 10919625d8cSopenharmony_ci ); 11019625d8cSopenharmony_ci} 11119625d8cSopenharmony_ci 11219625d8cSopenharmony_ci// OsStr Default Values 11319625d8cSopenharmony_ci 11419625d8cSopenharmony_ci#[test] 11519625d8cSopenharmony_cifn osstr_opts() { 11619625d8cSopenharmony_ci use std::ffi::OsStr; 11719625d8cSopenharmony_ci let expected = OsStr::new("default"); 11819625d8cSopenharmony_ci 11919625d8cSopenharmony_ci let r = Command::new("df") 12019625d8cSopenharmony_ci .arg(arg!(o: -o <opt> "some opt").default_value(expected)) 12119625d8cSopenharmony_ci .try_get_matches_from(vec![""]); 12219625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 12319625d8cSopenharmony_ci let m = r.unwrap(); 12419625d8cSopenharmony_ci assert!(m.contains_id("o")); 12519625d8cSopenharmony_ci assert_eq!( 12619625d8cSopenharmony_ci m.get_one::<String>("o").map(|v| v.as_str()).unwrap(), 12719625d8cSopenharmony_ci expected 12819625d8cSopenharmony_ci ); 12919625d8cSopenharmony_ci} 13019625d8cSopenharmony_ci 13119625d8cSopenharmony_ci#[test] 13219625d8cSopenharmony_cifn osstr_opt_user_override() { 13319625d8cSopenharmony_ci use std::ffi::OsStr; 13419625d8cSopenharmony_ci let default = OsStr::new("default"); 13519625d8cSopenharmony_ci 13619625d8cSopenharmony_ci let r = Command::new("df") 13719625d8cSopenharmony_ci .arg(arg!(--opt <FILE> "some arg").default_value(default)) 13819625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--opt", "value"]); 13919625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 14019625d8cSopenharmony_ci let m = r.unwrap(); 14119625d8cSopenharmony_ci assert!(m.contains_id("opt")); 14219625d8cSopenharmony_ci assert_eq!( 14319625d8cSopenharmony_ci m.get_one::<String>("opt").map(|v| v.as_str()).unwrap(), 14419625d8cSopenharmony_ci "value" 14519625d8cSopenharmony_ci ); 14619625d8cSopenharmony_ci} 14719625d8cSopenharmony_ci 14819625d8cSopenharmony_ci#[test] 14919625d8cSopenharmony_cifn osstr_positionals() { 15019625d8cSopenharmony_ci use std::ffi::OsStr; 15119625d8cSopenharmony_ci let expected = OsStr::new("default"); 15219625d8cSopenharmony_ci 15319625d8cSopenharmony_ci let r = Command::new("df") 15419625d8cSopenharmony_ci .arg(arg!([arg] "some opt").default_value(expected)) 15519625d8cSopenharmony_ci .try_get_matches_from(vec![""]); 15619625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 15719625d8cSopenharmony_ci let m = r.unwrap(); 15819625d8cSopenharmony_ci assert!(m.contains_id("arg")); 15919625d8cSopenharmony_ci assert_eq!( 16019625d8cSopenharmony_ci m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(), 16119625d8cSopenharmony_ci expected 16219625d8cSopenharmony_ci ); 16319625d8cSopenharmony_ci} 16419625d8cSopenharmony_ci 16519625d8cSopenharmony_ci#[test] 16619625d8cSopenharmony_cifn osstr_positional_user_override() { 16719625d8cSopenharmony_ci use std::ffi::OsStr; 16819625d8cSopenharmony_ci let default = OsStr::new("default"); 16919625d8cSopenharmony_ci 17019625d8cSopenharmony_ci let r = Command::new("df") 17119625d8cSopenharmony_ci .arg(arg!([arg] "some arg").default_value(default)) 17219625d8cSopenharmony_ci .try_get_matches_from(vec!["", "value"]); 17319625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 17419625d8cSopenharmony_ci let m = r.unwrap(); 17519625d8cSopenharmony_ci assert!(m.contains_id("arg")); 17619625d8cSopenharmony_ci assert_eq!( 17719625d8cSopenharmony_ci m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(), 17819625d8cSopenharmony_ci "value" 17919625d8cSopenharmony_ci ); 18019625d8cSopenharmony_ci} 18119625d8cSopenharmony_ci 18219625d8cSopenharmony_ci// --- Default if arg is present 18319625d8cSopenharmony_ci 18419625d8cSopenharmony_ci#[test] 18519625d8cSopenharmony_cifn default_if_arg_present_no_default() { 18619625d8cSopenharmony_ci let r = Command::new("df") 18719625d8cSopenharmony_ci .arg(arg!(--opt <FILE> "some arg").required(true)) 18819625d8cSopenharmony_ci .arg(arg!([arg] "some arg").default_value_if( 18919625d8cSopenharmony_ci "opt", 19019625d8cSopenharmony_ci ArgPredicate::IsPresent, 19119625d8cSopenharmony_ci Some("default"), 19219625d8cSopenharmony_ci )) 19319625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--opt", "some"]); 19419625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 19519625d8cSopenharmony_ci let m = r.unwrap(); 19619625d8cSopenharmony_ci assert!(m.contains_id("arg")); 19719625d8cSopenharmony_ci assert_eq!( 19819625d8cSopenharmony_ci m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(), 19919625d8cSopenharmony_ci "default" 20019625d8cSopenharmony_ci ); 20119625d8cSopenharmony_ci} 20219625d8cSopenharmony_ci 20319625d8cSopenharmony_ci#[test] 20419625d8cSopenharmony_cifn default_if_arg_present_no_default_user_override() { 20519625d8cSopenharmony_ci let r = Command::new("df") 20619625d8cSopenharmony_ci .arg(arg!(--opt <FILE> "some arg")) 20719625d8cSopenharmony_ci .arg(arg!([arg] "some arg").default_value_if( 20819625d8cSopenharmony_ci "opt", 20919625d8cSopenharmony_ci ArgPredicate::IsPresent, 21019625d8cSopenharmony_ci Some("default"), 21119625d8cSopenharmony_ci )) 21219625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--opt", "some", "other"]); 21319625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 21419625d8cSopenharmony_ci let m = r.unwrap(); 21519625d8cSopenharmony_ci assert!(m.contains_id("arg")); 21619625d8cSopenharmony_ci assert_eq!( 21719625d8cSopenharmony_ci m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(), 21819625d8cSopenharmony_ci "other" 21919625d8cSopenharmony_ci ); 22019625d8cSopenharmony_ci} 22119625d8cSopenharmony_ci 22219625d8cSopenharmony_ci#[test] 22319625d8cSopenharmony_cifn default_if_arg_present_no_arg_with_default() { 22419625d8cSopenharmony_ci let r = Command::new("df") 22519625d8cSopenharmony_ci .arg(arg!(--opt <FILE> "some arg")) 22619625d8cSopenharmony_ci .arg( 22719625d8cSopenharmony_ci arg!([arg] "some arg") 22819625d8cSopenharmony_ci .default_value("first") 22919625d8cSopenharmony_ci .default_value_if("opt", ArgPredicate::IsPresent, Some("default")), 23019625d8cSopenharmony_ci ) 23119625d8cSopenharmony_ci .try_get_matches_from(vec![""]); 23219625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 23319625d8cSopenharmony_ci let m = r.unwrap(); 23419625d8cSopenharmony_ci assert!(m.contains_id("arg")); 23519625d8cSopenharmony_ci assert_eq!( 23619625d8cSopenharmony_ci m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(), 23719625d8cSopenharmony_ci "first" 23819625d8cSopenharmony_ci ); 23919625d8cSopenharmony_ci} 24019625d8cSopenharmony_ci 24119625d8cSopenharmony_ci#[test] 24219625d8cSopenharmony_cifn default_if_arg_present_with_default() { 24319625d8cSopenharmony_ci let r = Command::new("df") 24419625d8cSopenharmony_ci .arg(arg!(--opt <FILE> "some arg")) 24519625d8cSopenharmony_ci .arg( 24619625d8cSopenharmony_ci arg!([arg] "some arg") 24719625d8cSopenharmony_ci .default_value("first") 24819625d8cSopenharmony_ci .default_value_if("opt", ArgPredicate::IsPresent, Some("default")), 24919625d8cSopenharmony_ci ) 25019625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--opt", "some"]); 25119625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 25219625d8cSopenharmony_ci let m = r.unwrap(); 25319625d8cSopenharmony_ci assert!(m.contains_id("arg")); 25419625d8cSopenharmony_ci assert_eq!( 25519625d8cSopenharmony_ci m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(), 25619625d8cSopenharmony_ci "default" 25719625d8cSopenharmony_ci ); 25819625d8cSopenharmony_ci} 25919625d8cSopenharmony_ci 26019625d8cSopenharmony_ci#[test] 26119625d8cSopenharmony_cifn default_if_arg_present_with_default_user_override() { 26219625d8cSopenharmony_ci let r = Command::new("df") 26319625d8cSopenharmony_ci .arg(arg!(--opt <FILE> "some arg")) 26419625d8cSopenharmony_ci .arg( 26519625d8cSopenharmony_ci arg!([arg] "some arg") 26619625d8cSopenharmony_ci .default_value("first") 26719625d8cSopenharmony_ci .default_value_if("opt", ArgPredicate::IsPresent, Some("default")), 26819625d8cSopenharmony_ci ) 26919625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--opt", "some", "other"]); 27019625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 27119625d8cSopenharmony_ci let m = r.unwrap(); 27219625d8cSopenharmony_ci assert!(m.contains_id("arg")); 27319625d8cSopenharmony_ci assert_eq!( 27419625d8cSopenharmony_ci m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(), 27519625d8cSopenharmony_ci "other" 27619625d8cSopenharmony_ci ); 27719625d8cSopenharmony_ci} 27819625d8cSopenharmony_ci 27919625d8cSopenharmony_ci#[test] 28019625d8cSopenharmony_cifn default_if_arg_present_no_arg_with_default_user_override() { 28119625d8cSopenharmony_ci let r = Command::new("df") 28219625d8cSopenharmony_ci .arg(arg!(--opt <FILE> "some arg")) 28319625d8cSopenharmony_ci .arg( 28419625d8cSopenharmony_ci arg!([arg] "some arg") 28519625d8cSopenharmony_ci .default_value("first") 28619625d8cSopenharmony_ci .default_value_if("opt", ArgPredicate::IsPresent, Some("default")), 28719625d8cSopenharmony_ci ) 28819625d8cSopenharmony_ci .try_get_matches_from(vec!["", "other"]); 28919625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 29019625d8cSopenharmony_ci let m = r.unwrap(); 29119625d8cSopenharmony_ci assert!(m.contains_id("arg")); 29219625d8cSopenharmony_ci assert_eq!( 29319625d8cSopenharmony_ci m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(), 29419625d8cSopenharmony_ci "other" 29519625d8cSopenharmony_ci ); 29619625d8cSopenharmony_ci} 29719625d8cSopenharmony_ci 29819625d8cSopenharmony_ci// Conditional Default Values 29919625d8cSopenharmony_ci 30019625d8cSopenharmony_ci#[test] 30119625d8cSopenharmony_cifn default_if_arg_present_with_value_no_default() { 30219625d8cSopenharmony_ci let r = Command::new("df") 30319625d8cSopenharmony_ci .arg(arg!(--opt <FILE> "some arg")) 30419625d8cSopenharmony_ci .arg(arg!([arg] "some arg").default_value_if("opt", "value", Some("default"))) 30519625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--opt", "value"]); 30619625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 30719625d8cSopenharmony_ci let m = r.unwrap(); 30819625d8cSopenharmony_ci assert!(m.contains_id("arg")); 30919625d8cSopenharmony_ci assert_eq!( 31019625d8cSopenharmony_ci m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(), 31119625d8cSopenharmony_ci "default" 31219625d8cSopenharmony_ci ); 31319625d8cSopenharmony_ci} 31419625d8cSopenharmony_ci 31519625d8cSopenharmony_ci#[test] 31619625d8cSopenharmony_cifn default_if_arg_present_with_value_no_default_fail() { 31719625d8cSopenharmony_ci let r = Command::new("df") 31819625d8cSopenharmony_ci .arg(arg!(--opt <FILE> "some arg")) 31919625d8cSopenharmony_ci .arg(arg!([arg] "some arg").default_value_if("opt", "value", Some("default"))) 32019625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--opt", "other"]); 32119625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 32219625d8cSopenharmony_ci let m = r.unwrap(); 32319625d8cSopenharmony_ci assert!(!m.contains_id("arg")); 32419625d8cSopenharmony_ci assert!(m.get_one::<String>("arg").map(|v| v.as_str()).is_none()); 32519625d8cSopenharmony_ci} 32619625d8cSopenharmony_ci 32719625d8cSopenharmony_ci#[test] 32819625d8cSopenharmony_cifn default_if_arg_present_with_value_no_default_user_override() { 32919625d8cSopenharmony_ci let r = Command::new("df") 33019625d8cSopenharmony_ci .arg(arg!(--opt <FILE> "some arg")) 33119625d8cSopenharmony_ci .arg(arg!([arg] "some arg").default_value_if("opt", "some", Some("default"))) 33219625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--opt", "some", "other"]); 33319625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 33419625d8cSopenharmony_ci let m = r.unwrap(); 33519625d8cSopenharmony_ci assert!(m.contains_id("arg")); 33619625d8cSopenharmony_ci assert_eq!( 33719625d8cSopenharmony_ci m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(), 33819625d8cSopenharmony_ci "other" 33919625d8cSopenharmony_ci ); 34019625d8cSopenharmony_ci} 34119625d8cSopenharmony_ci 34219625d8cSopenharmony_ci#[test] 34319625d8cSopenharmony_cifn default_if_arg_present_with_value_no_arg_with_default() { 34419625d8cSopenharmony_ci let r = Command::new("df") 34519625d8cSopenharmony_ci .arg(arg!(--opt <FILE> "some arg")) 34619625d8cSopenharmony_ci .arg( 34719625d8cSopenharmony_ci arg!([arg] "some arg") 34819625d8cSopenharmony_ci .default_value("first") 34919625d8cSopenharmony_ci .default_value_if("opt", "some", Some("default")), 35019625d8cSopenharmony_ci ) 35119625d8cSopenharmony_ci .try_get_matches_from(vec![""]); 35219625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 35319625d8cSopenharmony_ci let m = r.unwrap(); 35419625d8cSopenharmony_ci assert!(m.contains_id("arg")); 35519625d8cSopenharmony_ci assert_eq!( 35619625d8cSopenharmony_ci m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(), 35719625d8cSopenharmony_ci "first" 35819625d8cSopenharmony_ci ); 35919625d8cSopenharmony_ci} 36019625d8cSopenharmony_ci 36119625d8cSopenharmony_ci#[test] 36219625d8cSopenharmony_cifn default_if_arg_present_with_value_no_arg_with_default_fail() { 36319625d8cSopenharmony_ci let r = Command::new("df") 36419625d8cSopenharmony_ci .arg(arg!(--opt <FILE> "some arg")) 36519625d8cSopenharmony_ci .arg( 36619625d8cSopenharmony_ci arg!([arg] "some arg") 36719625d8cSopenharmony_ci .default_value("first") 36819625d8cSopenharmony_ci .default_value_if("opt", "some", Some("default")), 36919625d8cSopenharmony_ci ) 37019625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--opt", "other"]); 37119625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 37219625d8cSopenharmony_ci let m = r.unwrap(); 37319625d8cSopenharmony_ci assert!(m.contains_id("arg")); 37419625d8cSopenharmony_ci assert_eq!( 37519625d8cSopenharmony_ci m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(), 37619625d8cSopenharmony_ci "first" 37719625d8cSopenharmony_ci ); 37819625d8cSopenharmony_ci} 37919625d8cSopenharmony_ci 38019625d8cSopenharmony_ci#[test] 38119625d8cSopenharmony_cifn default_if_arg_present_with_value_with_default() { 38219625d8cSopenharmony_ci let r = Command::new("df") 38319625d8cSopenharmony_ci .arg(arg!(--opt <FILE> "some arg")) 38419625d8cSopenharmony_ci .arg( 38519625d8cSopenharmony_ci arg!([arg] "some arg") 38619625d8cSopenharmony_ci .default_value("first") 38719625d8cSopenharmony_ci .default_value_if("opt", "some", Some("default")), 38819625d8cSopenharmony_ci ) 38919625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--opt", "some"]); 39019625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 39119625d8cSopenharmony_ci let m = r.unwrap(); 39219625d8cSopenharmony_ci assert!(m.contains_id("arg")); 39319625d8cSopenharmony_ci assert_eq!( 39419625d8cSopenharmony_ci m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(), 39519625d8cSopenharmony_ci "default" 39619625d8cSopenharmony_ci ); 39719625d8cSopenharmony_ci} 39819625d8cSopenharmony_ci 39919625d8cSopenharmony_ci#[test] 40019625d8cSopenharmony_cifn default_if_arg_present_with_value_with_default_user_override() { 40119625d8cSopenharmony_ci let r = Command::new("df") 40219625d8cSopenharmony_ci .arg(arg!(--opt <FILE> "some arg")) 40319625d8cSopenharmony_ci .arg( 40419625d8cSopenharmony_ci arg!([arg] "some arg") 40519625d8cSopenharmony_ci .default_value("first") 40619625d8cSopenharmony_ci .default_value_if("opt", "some", Some("default")), 40719625d8cSopenharmony_ci ) 40819625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--opt", "some", "other"]); 40919625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 41019625d8cSopenharmony_ci let m = r.unwrap(); 41119625d8cSopenharmony_ci assert!(m.contains_id("arg")); 41219625d8cSopenharmony_ci assert_eq!( 41319625d8cSopenharmony_ci m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(), 41419625d8cSopenharmony_ci "other" 41519625d8cSopenharmony_ci ); 41619625d8cSopenharmony_ci} 41719625d8cSopenharmony_ci 41819625d8cSopenharmony_ci#[test] 41919625d8cSopenharmony_cifn default_if_arg_present_no_arg_with_value_with_default_user_override() { 42019625d8cSopenharmony_ci let r = Command::new("df") 42119625d8cSopenharmony_ci .arg(arg!(--opt <FILE> "some arg")) 42219625d8cSopenharmony_ci .arg( 42319625d8cSopenharmony_ci arg!([arg] "some arg") 42419625d8cSopenharmony_ci .default_value("first") 42519625d8cSopenharmony_ci .default_value_if("opt", "some", Some("default")), 42619625d8cSopenharmony_ci ) 42719625d8cSopenharmony_ci .try_get_matches_from(vec!["", "other"]); 42819625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 42919625d8cSopenharmony_ci let m = r.unwrap(); 43019625d8cSopenharmony_ci assert!(m.contains_id("arg")); 43119625d8cSopenharmony_ci assert_eq!( 43219625d8cSopenharmony_ci m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(), 43319625d8cSopenharmony_ci "other" 43419625d8cSopenharmony_ci ); 43519625d8cSopenharmony_ci} 43619625d8cSopenharmony_ci 43719625d8cSopenharmony_ci#[test] 43819625d8cSopenharmony_cifn default_if_arg_present_no_arg_with_value_with_default_user_override_fail() { 43919625d8cSopenharmony_ci let r = Command::new("df") 44019625d8cSopenharmony_ci .arg(arg!(--opt <FILE> "some arg")) 44119625d8cSopenharmony_ci .arg( 44219625d8cSopenharmony_ci arg!([arg] "some arg") 44319625d8cSopenharmony_ci .default_value("first") 44419625d8cSopenharmony_ci .default_value_if("opt", "some", Some("default")), 44519625d8cSopenharmony_ci ) 44619625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--opt", "value", "other"]); 44719625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 44819625d8cSopenharmony_ci let m = r.unwrap(); 44919625d8cSopenharmony_ci assert!(m.contains_id("arg")); 45019625d8cSopenharmony_ci assert_eq!( 45119625d8cSopenharmony_ci m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(), 45219625d8cSopenharmony_ci "other" 45319625d8cSopenharmony_ci ); 45419625d8cSopenharmony_ci} 45519625d8cSopenharmony_ci 45619625d8cSopenharmony_ci// Unsetting the default 45719625d8cSopenharmony_ci 45819625d8cSopenharmony_ci#[test] 45919625d8cSopenharmony_cifn no_default_if_arg_present_with_value_no_default() { 46019625d8cSopenharmony_ci let r = Command::new("df") 46119625d8cSopenharmony_ci .arg(arg!(--opt <FILE> "some arg")) 46219625d8cSopenharmony_ci .arg(arg!([arg] "some arg").default_value_if("opt", "value", None)) 46319625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--opt", "value"]); 46419625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 46519625d8cSopenharmony_ci let m = r.unwrap(); 46619625d8cSopenharmony_ci assert!(!m.contains_id("arg")); 46719625d8cSopenharmony_ci} 46819625d8cSopenharmony_ci 46919625d8cSopenharmony_ci#[test] 47019625d8cSopenharmony_cifn no_default_if_arg_present_with_value_with_default() { 47119625d8cSopenharmony_ci let r = Command::new("df") 47219625d8cSopenharmony_ci .arg(arg!(--opt <FILE> "some arg")) 47319625d8cSopenharmony_ci .arg( 47419625d8cSopenharmony_ci arg!([arg] "some arg") 47519625d8cSopenharmony_ci .default_value("default") 47619625d8cSopenharmony_ci .default_value_if("opt", "value", None), 47719625d8cSopenharmony_ci ) 47819625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--opt", "value"]); 47919625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 48019625d8cSopenharmony_ci let m = r.unwrap(); 48119625d8cSopenharmony_ci assert!(!m.contains_id("arg")); 48219625d8cSopenharmony_ci assert!(m.get_one::<String>("arg").map(|v| v.as_str()).is_none()); 48319625d8cSopenharmony_ci} 48419625d8cSopenharmony_ci 48519625d8cSopenharmony_ci#[test] 48619625d8cSopenharmony_cifn no_default_if_arg_present_with_value_with_default_user_override() { 48719625d8cSopenharmony_ci let r = Command::new("df") 48819625d8cSopenharmony_ci .arg(arg!(--opt <FILE> "some arg")) 48919625d8cSopenharmony_ci .arg( 49019625d8cSopenharmony_ci arg!([arg] "some arg") 49119625d8cSopenharmony_ci .default_value("default") 49219625d8cSopenharmony_ci .default_value_if("opt", "value", None), 49319625d8cSopenharmony_ci ) 49419625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--opt", "value", "other"]); 49519625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 49619625d8cSopenharmony_ci let m = r.unwrap(); 49719625d8cSopenharmony_ci assert!(m.contains_id("arg")); 49819625d8cSopenharmony_ci assert_eq!( 49919625d8cSopenharmony_ci m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(), 50019625d8cSopenharmony_ci "other" 50119625d8cSopenharmony_ci ); 50219625d8cSopenharmony_ci} 50319625d8cSopenharmony_ci 50419625d8cSopenharmony_ci#[test] 50519625d8cSopenharmony_cifn no_default_if_arg_present_no_arg_with_value_with_default() { 50619625d8cSopenharmony_ci let r = Command::new("df") 50719625d8cSopenharmony_ci .arg(arg!(--opt <FILE> "some arg")) 50819625d8cSopenharmony_ci .arg( 50919625d8cSopenharmony_ci arg!([arg] "some arg") 51019625d8cSopenharmony_ci .default_value("default") 51119625d8cSopenharmony_ci .default_value_if("opt", "value", None), 51219625d8cSopenharmony_ci ) 51319625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--opt", "other"]); 51419625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 51519625d8cSopenharmony_ci let m = r.unwrap(); 51619625d8cSopenharmony_ci assert!(m.contains_id("arg")); 51719625d8cSopenharmony_ci assert_eq!( 51819625d8cSopenharmony_ci m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(), 51919625d8cSopenharmony_ci "default" 52019625d8cSopenharmony_ci ); 52119625d8cSopenharmony_ci} 52219625d8cSopenharmony_ci 52319625d8cSopenharmony_ci// Multiple conditions 52419625d8cSopenharmony_ci 52519625d8cSopenharmony_ci#[test] 52619625d8cSopenharmony_cifn default_ifs_arg_present() { 52719625d8cSopenharmony_ci let r = Command::new("df") 52819625d8cSopenharmony_ci .arg(arg!(--opt <FILE> "some arg")) 52919625d8cSopenharmony_ci .arg(arg!(--flag "some arg")) 53019625d8cSopenharmony_ci .arg( 53119625d8cSopenharmony_ci arg!([arg] "some arg") 53219625d8cSopenharmony_ci .default_value("first") 53319625d8cSopenharmony_ci .default_value_ifs([ 53419625d8cSopenharmony_ci ("opt", ArgPredicate::from("some"), Some("default")), 53519625d8cSopenharmony_ci ("flag", ArgPredicate::IsPresent, Some("flg")), 53619625d8cSopenharmony_ci ]), 53719625d8cSopenharmony_ci ) 53819625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--flag"]); 53919625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 54019625d8cSopenharmony_ci let m = r.unwrap(); 54119625d8cSopenharmony_ci assert!(m.contains_id("arg")); 54219625d8cSopenharmony_ci assert_eq!( 54319625d8cSopenharmony_ci m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(), 54419625d8cSopenharmony_ci "flg" 54519625d8cSopenharmony_ci ); 54619625d8cSopenharmony_ci} 54719625d8cSopenharmony_ci 54819625d8cSopenharmony_ci#[test] 54919625d8cSopenharmony_cifn no_default_ifs_arg_present() { 55019625d8cSopenharmony_ci let r = Command::new("df") 55119625d8cSopenharmony_ci .arg(arg!(--opt <FILE> "some arg")) 55219625d8cSopenharmony_ci .arg(arg!(--flag "some arg")) 55319625d8cSopenharmony_ci .arg( 55419625d8cSopenharmony_ci arg!([arg] "some arg") 55519625d8cSopenharmony_ci .default_value("first") 55619625d8cSopenharmony_ci .default_value_ifs([ 55719625d8cSopenharmony_ci ("opt", ArgPredicate::from("some"), Some("default")), 55819625d8cSopenharmony_ci ("flag", ArgPredicate::IsPresent, None), 55919625d8cSopenharmony_ci ]), 56019625d8cSopenharmony_ci ) 56119625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--flag"]); 56219625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 56319625d8cSopenharmony_ci let m = r.unwrap(); 56419625d8cSopenharmony_ci assert!(!m.contains_id("arg")); 56519625d8cSopenharmony_ci assert!(m.get_one::<String>("arg").map(|v| v.as_str()).is_none()); 56619625d8cSopenharmony_ci} 56719625d8cSopenharmony_ci 56819625d8cSopenharmony_ci#[test] 56919625d8cSopenharmony_cifn default_ifs_arg_present_user_override() { 57019625d8cSopenharmony_ci let r = Command::new("df") 57119625d8cSopenharmony_ci .arg(arg!(--opt <FILE> "some arg")) 57219625d8cSopenharmony_ci .arg(arg!(--flag "some arg")) 57319625d8cSopenharmony_ci .arg( 57419625d8cSopenharmony_ci arg!([arg] "some arg") 57519625d8cSopenharmony_ci .default_value("first") 57619625d8cSopenharmony_ci .default_value_ifs([ 57719625d8cSopenharmony_ci ("opt", ArgPredicate::from("some"), Some("default")), 57819625d8cSopenharmony_ci ("flag", ArgPredicate::IsPresent, Some("flg")), 57919625d8cSopenharmony_ci ]), 58019625d8cSopenharmony_ci ) 58119625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--flag", "value"]); 58219625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 58319625d8cSopenharmony_ci let m = r.unwrap(); 58419625d8cSopenharmony_ci assert!(m.contains_id("arg")); 58519625d8cSopenharmony_ci assert_eq!( 58619625d8cSopenharmony_ci m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(), 58719625d8cSopenharmony_ci "value" 58819625d8cSopenharmony_ci ); 58919625d8cSopenharmony_ci} 59019625d8cSopenharmony_ci 59119625d8cSopenharmony_ci#[test] 59219625d8cSopenharmony_cifn default_ifs_arg_present_order() { 59319625d8cSopenharmony_ci let r = Command::new("df") 59419625d8cSopenharmony_ci .arg(arg!(--opt <FILE> "some arg")) 59519625d8cSopenharmony_ci .arg(arg!(--flag "some arg")) 59619625d8cSopenharmony_ci .arg( 59719625d8cSopenharmony_ci arg!([arg] "some arg") 59819625d8cSopenharmony_ci .default_value("first") 59919625d8cSopenharmony_ci .default_value_ifs([ 60019625d8cSopenharmony_ci ("opt", ArgPredicate::from("some"), Some("default")), 60119625d8cSopenharmony_ci ("flag", ArgPredicate::IsPresent, Some("flg")), 60219625d8cSopenharmony_ci ]), 60319625d8cSopenharmony_ci ) 60419625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--opt=some", "--flag"]); 60519625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 60619625d8cSopenharmony_ci let m = r.unwrap(); 60719625d8cSopenharmony_ci assert!(m.contains_id("arg")); 60819625d8cSopenharmony_ci assert_eq!( 60919625d8cSopenharmony_ci m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(), 61019625d8cSopenharmony_ci "default" 61119625d8cSopenharmony_ci ); 61219625d8cSopenharmony_ci} 61319625d8cSopenharmony_ci 61419625d8cSopenharmony_ci#[test] 61519625d8cSopenharmony_cifn default_value_ifs_os() { 61619625d8cSopenharmony_ci let cmd = Command::new("my_cargo") 61719625d8cSopenharmony_ci .arg( 61819625d8cSopenharmony_ci Arg::new("flag") 61919625d8cSopenharmony_ci .long("flag") 62019625d8cSopenharmony_ci .value_parser(value_parser!(OsString)) 62119625d8cSopenharmony_ci .action(ArgAction::Set), 62219625d8cSopenharmony_ci ) 62319625d8cSopenharmony_ci .arg( 62419625d8cSopenharmony_ci Arg::new("other") 62519625d8cSopenharmony_ci .long("other") 62619625d8cSopenharmony_ci .value_parser(value_parser!(OsString)) 62719625d8cSopenharmony_ci .default_value_ifs([("flag", "标记2", OsStr::new("flag=标记2"))]), 62819625d8cSopenharmony_ci ); 62919625d8cSopenharmony_ci let result = cmd.try_get_matches_from(["my_cargo", "--flag", "标记2"]); 63019625d8cSopenharmony_ci assert!(result.is_ok(), "{}", result.unwrap_err()); 63119625d8cSopenharmony_ci let m = result.unwrap(); 63219625d8cSopenharmony_ci assert_eq!( 63319625d8cSopenharmony_ci m.get_one::<OsString>("flag").map(OsString::as_os_str), 63419625d8cSopenharmony_ci Some(OsStr::new("标记2")) 63519625d8cSopenharmony_ci ); 63619625d8cSopenharmony_ci assert_eq!( 63719625d8cSopenharmony_ci m.get_one::<OsString>("other").map(OsString::as_os_str), 63819625d8cSopenharmony_ci Some(OsStr::new("flag=标记2")), 63919625d8cSopenharmony_ci ); 64019625d8cSopenharmony_ci} 64119625d8cSopenharmony_ci 64219625d8cSopenharmony_ci// Interaction with requires 64319625d8cSopenharmony_ci 64419625d8cSopenharmony_ci#[test] 64519625d8cSopenharmony_cifn conditional_reqs_pass() { 64619625d8cSopenharmony_ci let m = Command::new("Test cmd") 64719625d8cSopenharmony_ci .arg( 64819625d8cSopenharmony_ci Arg::new("target") 64919625d8cSopenharmony_ci .action(ArgAction::Set) 65019625d8cSopenharmony_ci .default_value("file") 65119625d8cSopenharmony_ci .long("target"), 65219625d8cSopenharmony_ci ) 65319625d8cSopenharmony_ci .arg( 65419625d8cSopenharmony_ci Arg::new("input") 65519625d8cSopenharmony_ci .action(ArgAction::Set) 65619625d8cSopenharmony_ci .required(true) 65719625d8cSopenharmony_ci .long("input"), 65819625d8cSopenharmony_ci ) 65919625d8cSopenharmony_ci .arg( 66019625d8cSopenharmony_ci Arg::new("output") 66119625d8cSopenharmony_ci .action(ArgAction::Set) 66219625d8cSopenharmony_ci .required_if_eq("target", "file") 66319625d8cSopenharmony_ci .long("output"), 66419625d8cSopenharmony_ci ) 66519625d8cSopenharmony_ci .try_get_matches_from(vec!["test", "--input", "some", "--output", "other"]); 66619625d8cSopenharmony_ci 66719625d8cSopenharmony_ci assert!(m.is_ok(), "{}", m.unwrap_err()); 66819625d8cSopenharmony_ci let m = m.unwrap(); 66919625d8cSopenharmony_ci assert_eq!( 67019625d8cSopenharmony_ci m.get_one::<String>("output").map(|v| v.as_str()), 67119625d8cSopenharmony_ci Some("other") 67219625d8cSopenharmony_ci ); 67319625d8cSopenharmony_ci assert_eq!( 67419625d8cSopenharmony_ci m.get_one::<String>("input").map(|v| v.as_str()), 67519625d8cSopenharmony_ci Some("some") 67619625d8cSopenharmony_ci ); 67719625d8cSopenharmony_ci} 67819625d8cSopenharmony_ci 67919625d8cSopenharmony_ci#[test] 68019625d8cSopenharmony_cifn multiple_defaults() { 68119625d8cSopenharmony_ci let r = Command::new("diff") 68219625d8cSopenharmony_ci .arg( 68319625d8cSopenharmony_ci Arg::new("files") 68419625d8cSopenharmony_ci .long("files") 68519625d8cSopenharmony_ci .num_args(2) 68619625d8cSopenharmony_ci .default_values(["old", "new"]), 68719625d8cSopenharmony_ci ) 68819625d8cSopenharmony_ci .try_get_matches_from(vec![""]); 68919625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 69019625d8cSopenharmony_ci let m = r.unwrap(); 69119625d8cSopenharmony_ci assert!(m.contains_id("files")); 69219625d8cSopenharmony_ci assert_eq!( 69319625d8cSopenharmony_ci m.get_many::<String>("files").unwrap().collect::<Vec<_>>(), 69419625d8cSopenharmony_ci vec!["old", "new"] 69519625d8cSopenharmony_ci ); 69619625d8cSopenharmony_ci} 69719625d8cSopenharmony_ci 69819625d8cSopenharmony_ci#[test] 69919625d8cSopenharmony_cifn multiple_defaults_override() { 70019625d8cSopenharmony_ci let r = Command::new("diff") 70119625d8cSopenharmony_ci .arg( 70219625d8cSopenharmony_ci Arg::new("files") 70319625d8cSopenharmony_ci .long("files") 70419625d8cSopenharmony_ci .num_args(2) 70519625d8cSopenharmony_ci .default_values(["old", "new"]), 70619625d8cSopenharmony_ci ) 70719625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--files", "other", "mine"]); 70819625d8cSopenharmony_ci assert!(r.is_ok(), "{}", r.unwrap_err()); 70919625d8cSopenharmony_ci let m = r.unwrap(); 71019625d8cSopenharmony_ci assert!(m.contains_id("files")); 71119625d8cSopenharmony_ci assert_eq!( 71219625d8cSopenharmony_ci m.get_many::<String>("files").unwrap().collect::<Vec<_>>(), 71319625d8cSopenharmony_ci vec!["other", "mine"] 71419625d8cSopenharmony_ci ); 71519625d8cSopenharmony_ci} 71619625d8cSopenharmony_ci 71719625d8cSopenharmony_ci#[test] 71819625d8cSopenharmony_ci#[cfg(feature = "error-context")] 71919625d8cSopenharmony_cifn default_vals_donnot_show_in_smart_usage() { 72019625d8cSopenharmony_ci let cmd = Command::new("bug") 72119625d8cSopenharmony_ci .arg( 72219625d8cSopenharmony_ci Arg::new("foo") 72319625d8cSopenharmony_ci .long("config") 72419625d8cSopenharmony_ci .action(ArgAction::Set) 72519625d8cSopenharmony_ci .default_value("bar"), 72619625d8cSopenharmony_ci ) 72719625d8cSopenharmony_ci .arg(Arg::new("input").required(true)); 72819625d8cSopenharmony_ci 72919625d8cSopenharmony_ci utils::assert_output( 73019625d8cSopenharmony_ci cmd, 73119625d8cSopenharmony_ci "bug", 73219625d8cSopenharmony_ci "\ 73319625d8cSopenharmony_cierror: the following required arguments were not provided: 73419625d8cSopenharmony_ci <input> 73519625d8cSopenharmony_ci 73619625d8cSopenharmony_ciUsage: bug <input> 73719625d8cSopenharmony_ci 73819625d8cSopenharmony_ciFor more information, try '--help'. 73919625d8cSopenharmony_ci", 74019625d8cSopenharmony_ci true, 74119625d8cSopenharmony_ci ); 74219625d8cSopenharmony_ci} 74319625d8cSopenharmony_ci 74419625d8cSopenharmony_ci#[test] 74519625d8cSopenharmony_cifn issue_1050_num_vals_and_defaults() { 74619625d8cSopenharmony_ci let res = Command::new("hello") 74719625d8cSopenharmony_ci .arg( 74819625d8cSopenharmony_ci Arg::new("exit-code") 74919625d8cSopenharmony_ci .long("exit-code") 75019625d8cSopenharmony_ci .action(ArgAction::Set) 75119625d8cSopenharmony_ci .num_args(1) 75219625d8cSopenharmony_ci .default_value("0"), 75319625d8cSopenharmony_ci ) 75419625d8cSopenharmony_ci .try_get_matches_from(vec!["hello", "--exit-code=1"]); 75519625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 75619625d8cSopenharmony_ci let m = res.unwrap(); 75719625d8cSopenharmony_ci assert_eq!( 75819625d8cSopenharmony_ci m.get_one::<String>("exit-code").map(|v| v.as_str()), 75919625d8cSopenharmony_ci Some("1") 76019625d8cSopenharmony_ci ); 76119625d8cSopenharmony_ci} 76219625d8cSopenharmony_ci 76319625d8cSopenharmony_ci#[test] 76419625d8cSopenharmony_cifn required_groups_with_default_values() { 76519625d8cSopenharmony_ci use clap::{Arg, ArgGroup, Command}; 76619625d8cSopenharmony_ci 76719625d8cSopenharmony_ci let cmd = Command::new("test") 76819625d8cSopenharmony_ci .arg(Arg::new("arg").default_value("value")) 76919625d8cSopenharmony_ci .group(ArgGroup::new("group").args(["arg"]).required(true)); 77019625d8cSopenharmony_ci 77119625d8cSopenharmony_ci let result = cmd.clone().try_get_matches_from(["test"]); 77219625d8cSopenharmony_ci assert!(result.is_err()); 77319625d8cSopenharmony_ci 77419625d8cSopenharmony_ci let result = cmd.clone().try_get_matches_from(["test", "value"]); 77519625d8cSopenharmony_ci assert!(result.is_ok(), "{}", result.unwrap_err()); 77619625d8cSopenharmony_ci let m = result.unwrap(); 77719625d8cSopenharmony_ci assert!(m.contains_id("arg")); 77819625d8cSopenharmony_ci assert!(m.contains_id("group")); 77919625d8cSopenharmony_ci} 78019625d8cSopenharmony_ci 78119625d8cSopenharmony_ci#[test] 78219625d8cSopenharmony_cifn required_args_with_default_values() { 78319625d8cSopenharmony_ci use clap::{Arg, Command}; 78419625d8cSopenharmony_ci 78519625d8cSopenharmony_ci let cmd = Command::new("test").arg(Arg::new("arg").required(true).default_value("value")); 78619625d8cSopenharmony_ci 78719625d8cSopenharmony_ci let result = cmd.clone().try_get_matches_from(["test"]); 78819625d8cSopenharmony_ci assert!(result.is_err()); 78919625d8cSopenharmony_ci 79019625d8cSopenharmony_ci let result = cmd.clone().try_get_matches_from(["test", "value"]); 79119625d8cSopenharmony_ci assert!(result.is_ok(), "{}", result.unwrap_err()); 79219625d8cSopenharmony_ci let m = result.unwrap(); 79319625d8cSopenharmony_ci assert!(m.contains_id("arg")); 79419625d8cSopenharmony_ci} 79519625d8cSopenharmony_ci 79619625d8cSopenharmony_ci#[cfg(debug_assertions)] 79719625d8cSopenharmony_ci#[test] 79819625d8cSopenharmony_ci#[cfg(feature = "error-context")] 79919625d8cSopenharmony_ci#[should_panic = "Argument `arg`'s default_value=\"value\" failed validation: error: invalid value 'value' for '[arg]'"] 80019625d8cSopenharmony_cifn default_values_are_possible_values() { 80119625d8cSopenharmony_ci use clap::{Arg, Command}; 80219625d8cSopenharmony_ci 80319625d8cSopenharmony_ci let _ = Command::new("test") 80419625d8cSopenharmony_ci .arg( 80519625d8cSopenharmony_ci Arg::new("arg") 80619625d8cSopenharmony_ci .value_parser(["one", "two"]) 80719625d8cSopenharmony_ci .default_value("value"), 80819625d8cSopenharmony_ci ) 80919625d8cSopenharmony_ci .try_get_matches(); 81019625d8cSopenharmony_ci} 81119625d8cSopenharmony_ci 81219625d8cSopenharmony_ci#[cfg(debug_assertions)] 81319625d8cSopenharmony_ci#[test] 81419625d8cSopenharmony_ci#[cfg(feature = "error-context")] 81519625d8cSopenharmony_ci#[should_panic = "Argument `arg`'s default_value=\"one\" failed validation: error: invalid value 'one' for '[arg]"] 81619625d8cSopenharmony_cifn invalid_default_values() { 81719625d8cSopenharmony_ci use clap::{Arg, Command}; 81819625d8cSopenharmony_ci 81919625d8cSopenharmony_ci let _ = Command::new("test") 82019625d8cSopenharmony_ci .arg( 82119625d8cSopenharmony_ci Arg::new("arg") 82219625d8cSopenharmony_ci .value_parser(clap::value_parser!(u32)) 82319625d8cSopenharmony_ci .default_value("one"), 82419625d8cSopenharmony_ci ) 82519625d8cSopenharmony_ci .try_get_matches(); 82619625d8cSopenharmony_ci} 82719625d8cSopenharmony_ci 82819625d8cSopenharmony_ci#[test] 82919625d8cSopenharmony_cifn valid_delimited_default_values() { 83019625d8cSopenharmony_ci use clap::{Arg, Command}; 83119625d8cSopenharmony_ci 83219625d8cSopenharmony_ci Command::new("test") 83319625d8cSopenharmony_ci .arg( 83419625d8cSopenharmony_ci Arg::new("arg") 83519625d8cSopenharmony_ci .value_parser(clap::value_parser!(u32)) 83619625d8cSopenharmony_ci .value_delimiter(',') 83719625d8cSopenharmony_ci .default_value("1,2,3"), 83819625d8cSopenharmony_ci ) 83919625d8cSopenharmony_ci .debug_assert(); 84019625d8cSopenharmony_ci} 84119625d8cSopenharmony_ci 84219625d8cSopenharmony_ci#[cfg(debug_assertions)] 84319625d8cSopenharmony_ci#[test] 84419625d8cSopenharmony_ci#[cfg(feature = "error-context")] 84519625d8cSopenharmony_ci#[should_panic = "Argument `arg`'s default_value=\"one\" failed validation: error: invalid value 'one' for '[arg]"] 84619625d8cSopenharmony_cifn invalid_delimited_default_values() { 84719625d8cSopenharmony_ci use clap::{Arg, Command}; 84819625d8cSopenharmony_ci 84919625d8cSopenharmony_ci Command::new("test") 85019625d8cSopenharmony_ci .arg( 85119625d8cSopenharmony_ci Arg::new("arg") 85219625d8cSopenharmony_ci .value_parser(clap::value_parser!(u32)) 85319625d8cSopenharmony_ci .value_delimiter(',') 85419625d8cSopenharmony_ci .default_value("one,two"), 85519625d8cSopenharmony_ci ) 85619625d8cSopenharmony_ci .debug_assert(); 85719625d8cSopenharmony_ci} 85819625d8cSopenharmony_ci 85919625d8cSopenharmony_ci#[test] 86019625d8cSopenharmony_cifn with_value_delimiter() { 86119625d8cSopenharmony_ci let cmd = Command::new("multiple_values").arg( 86219625d8cSopenharmony_ci Arg::new("option") 86319625d8cSopenharmony_ci .long("option") 86419625d8cSopenharmony_ci .help("multiple options") 86519625d8cSopenharmony_ci .value_delimiter(';') 86619625d8cSopenharmony_ci .default_value("first;second"), 86719625d8cSopenharmony_ci ); 86819625d8cSopenharmony_ci 86919625d8cSopenharmony_ci let matches = cmd.try_get_matches_from(vec![""]).unwrap(); 87019625d8cSopenharmony_ci 87119625d8cSopenharmony_ci assert_eq!( 87219625d8cSopenharmony_ci matches 87319625d8cSopenharmony_ci .get_many::<String>("option") 87419625d8cSopenharmony_ci .unwrap() 87519625d8cSopenharmony_ci .map(|v| v.as_str()) 87619625d8cSopenharmony_ci .collect::<Vec<_>>(), 87719625d8cSopenharmony_ci ["first", "second"] 87819625d8cSopenharmony_ci ); 87919625d8cSopenharmony_ci} 88019625d8cSopenharmony_ci 88119625d8cSopenharmony_ci#[test] 88219625d8cSopenharmony_cifn missing_with_value_delimiter() { 88319625d8cSopenharmony_ci let cmd = Command::new("program").arg( 88419625d8cSopenharmony_ci Arg::new("option") 88519625d8cSopenharmony_ci .long("option") 88619625d8cSopenharmony_ci .value_delimiter(';') 88719625d8cSopenharmony_ci .num_args(0..=1) 88819625d8cSopenharmony_ci .default_missing_values(["value1;value2;value3", "value4;value5"]), 88919625d8cSopenharmony_ci ); 89019625d8cSopenharmony_ci 89119625d8cSopenharmony_ci let matches = cmd 89219625d8cSopenharmony_ci .try_get_matches_from(vec!["program", "--option"]) 89319625d8cSopenharmony_ci .unwrap(); 89419625d8cSopenharmony_ci 89519625d8cSopenharmony_ci assert_eq!( 89619625d8cSopenharmony_ci matches 89719625d8cSopenharmony_ci .get_many::<String>("option") 89819625d8cSopenharmony_ci .unwrap() 89919625d8cSopenharmony_ci .map(|v| v.as_str()) 90019625d8cSopenharmony_ci .collect::<Vec<_>>(), 90119625d8cSopenharmony_ci ["value1", "value2", "value3", "value4", "value5"] 90219625d8cSopenharmony_ci ); 90319625d8cSopenharmony_ci} 90419625d8cSopenharmony_ci 90519625d8cSopenharmony_ci#[test] 90619625d8cSopenharmony_cifn default_independent_of_trailing() { 90719625d8cSopenharmony_ci let cmd = Command::new("test") 90819625d8cSopenharmony_ci .dont_delimit_trailing_values(true) 90919625d8cSopenharmony_ci .arg(Arg::new("pos").required(true)) 91019625d8cSopenharmony_ci .arg( 91119625d8cSopenharmony_ci Arg::new("flag") 91219625d8cSopenharmony_ci .long("flag") 91319625d8cSopenharmony_ci .default_value("one,two") 91419625d8cSopenharmony_ci .value_delimiter(','), 91519625d8cSopenharmony_ci ); 91619625d8cSopenharmony_ci 91719625d8cSopenharmony_ci // Baseline behavior 91819625d8cSopenharmony_ci let m = cmd 91919625d8cSopenharmony_ci .clone() 92019625d8cSopenharmony_ci .try_get_matches_from(vec!["program", "here"]) 92119625d8cSopenharmony_ci .unwrap(); 92219625d8cSopenharmony_ci assert_eq!( 92319625d8cSopenharmony_ci m.get_one::<String>("pos").map(|v| v.as_str()).unwrap(), 92419625d8cSopenharmony_ci "here" 92519625d8cSopenharmony_ci ); 92619625d8cSopenharmony_ci assert_eq!( 92719625d8cSopenharmony_ci m.get_many::<String>("flag") 92819625d8cSopenharmony_ci .unwrap() 92919625d8cSopenharmony_ci .map(|v| v.as_str()) 93019625d8cSopenharmony_ci .collect::<Vec<_>>(), 93119625d8cSopenharmony_ci ["one", "two"] 93219625d8cSopenharmony_ci ); 93319625d8cSopenharmony_ci 93419625d8cSopenharmony_ci // Trailing-values behavior should match the baseline 93519625d8cSopenharmony_ci let m = cmd 93619625d8cSopenharmony_ci .try_get_matches_from(vec!["program", "--", "here"]) 93719625d8cSopenharmony_ci .unwrap(); 93819625d8cSopenharmony_ci assert_eq!( 93919625d8cSopenharmony_ci m.get_one::<String>("pos").map(|v| v.as_str()).unwrap(), 94019625d8cSopenharmony_ci "here" 94119625d8cSopenharmony_ci ); 94219625d8cSopenharmony_ci assert_eq!( 94319625d8cSopenharmony_ci m.get_many::<String>("flag") 94419625d8cSopenharmony_ci .unwrap() 94519625d8cSopenharmony_ci .map(|v| v.as_str()) 94619625d8cSopenharmony_ci .collect::<Vec<_>>(), 94719625d8cSopenharmony_ci ["one", "two"] 94819625d8cSopenharmony_ci ); 94919625d8cSopenharmony_ci} 950