119625d8cSopenharmony_ciuse clap::{arg, error::ErrorKind, Arg, ArgAction, Command}; 219625d8cSopenharmony_ci 319625d8cSopenharmony_ci#[test] 419625d8cSopenharmony_cifn flag_overrides_itself() { 519625d8cSopenharmony_ci let res = Command::new("posix") 619625d8cSopenharmony_ci .arg( 719625d8cSopenharmony_ci arg!(--flag "some flag" 819625d8cSopenharmony_ci ) 919625d8cSopenharmony_ci .action(ArgAction::SetTrue) 1019625d8cSopenharmony_ci .overrides_with("flag"), 1119625d8cSopenharmony_ci ) 1219625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--flag", "--flag"]); 1319625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 1419625d8cSopenharmony_ci let m = res.unwrap(); 1519625d8cSopenharmony_ci assert!(*m.get_one::<bool>("flag").expect("defaulted by clap")); 1619625d8cSopenharmony_ci} 1719625d8cSopenharmony_ci 1819625d8cSopenharmony_ci#[test] 1919625d8cSopenharmony_cifn option_overrides_itself() { 2019625d8cSopenharmony_ci let res = Command::new("posix") 2119625d8cSopenharmony_ci .arg( 2219625d8cSopenharmony_ci arg!(--opt <val> "some option") 2319625d8cSopenharmony_ci .required(false) 2419625d8cSopenharmony_ci .overrides_with("opt"), 2519625d8cSopenharmony_ci ) 2619625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--opt=some", "--opt=other"]); 2719625d8cSopenharmony_ci assert!(res.is_ok(), "{}", res.unwrap_err()); 2819625d8cSopenharmony_ci let m = res.unwrap(); 2919625d8cSopenharmony_ci assert!(m.contains_id("opt")); 3019625d8cSopenharmony_ci assert_eq!( 3119625d8cSopenharmony_ci m.get_one::<String>("opt").map(|v| v.as_str()), 3219625d8cSopenharmony_ci Some("other") 3319625d8cSopenharmony_ci ); 3419625d8cSopenharmony_ci} 3519625d8cSopenharmony_ci 3619625d8cSopenharmony_ci#[test] 3719625d8cSopenharmony_cifn posix_compatible_flags_long() { 3819625d8cSopenharmony_ci let m = Command::new("posix") 3919625d8cSopenharmony_ci .arg( 4019625d8cSopenharmony_ci arg!(--flag "some flag") 4119625d8cSopenharmony_ci .overrides_with("color") 4219625d8cSopenharmony_ci .action(ArgAction::SetTrue), 4319625d8cSopenharmony_ci ) 4419625d8cSopenharmony_ci .arg(arg!(--color "some other flag").action(ArgAction::SetTrue)) 4519625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--flag", "--color"]) 4619625d8cSopenharmony_ci .unwrap(); 4719625d8cSopenharmony_ci assert!(*m.get_one::<bool>("color").expect("defaulted by clap")); 4819625d8cSopenharmony_ci assert!(!*m.get_one::<bool>("flag").expect("defaulted by clap")); 4919625d8cSopenharmony_ci} 5019625d8cSopenharmony_ci 5119625d8cSopenharmony_ci#[test] 5219625d8cSopenharmony_cifn posix_compatible_flags_long_rev() { 5319625d8cSopenharmony_ci let m = Command::new("posix") 5419625d8cSopenharmony_ci .arg( 5519625d8cSopenharmony_ci arg!(--flag "some flag") 5619625d8cSopenharmony_ci .overrides_with("color") 5719625d8cSopenharmony_ci .action(ArgAction::SetTrue), 5819625d8cSopenharmony_ci ) 5919625d8cSopenharmony_ci .arg(arg!(--color "some other flag").action(ArgAction::SetTrue)) 6019625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--color", "--flag"]) 6119625d8cSopenharmony_ci .unwrap(); 6219625d8cSopenharmony_ci assert!(!*m.get_one::<bool>("color").expect("defaulted by clap")); 6319625d8cSopenharmony_ci assert!(*m.get_one::<bool>("flag").expect("defaulted by clap")); 6419625d8cSopenharmony_ci} 6519625d8cSopenharmony_ci 6619625d8cSopenharmony_ci#[test] 6719625d8cSopenharmony_cifn posix_compatible_flags_short() { 6819625d8cSopenharmony_ci let m = Command::new("posix") 6919625d8cSopenharmony_ci .arg( 7019625d8cSopenharmony_ci arg!(-f --flag "some flag") 7119625d8cSopenharmony_ci .overrides_with("color") 7219625d8cSopenharmony_ci .action(ArgAction::SetTrue), 7319625d8cSopenharmony_ci ) 7419625d8cSopenharmony_ci .arg(arg!(-c --color "some other flag").action(ArgAction::SetTrue)) 7519625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-f", "-c"]) 7619625d8cSopenharmony_ci .unwrap(); 7719625d8cSopenharmony_ci assert!(*m.get_one::<bool>("color").expect("defaulted by clap")); 7819625d8cSopenharmony_ci assert!(!*m.get_one::<bool>("flag").expect("defaulted by clap")); 7919625d8cSopenharmony_ci} 8019625d8cSopenharmony_ci 8119625d8cSopenharmony_ci#[test] 8219625d8cSopenharmony_cifn posix_compatible_flags_short_rev() { 8319625d8cSopenharmony_ci let m = Command::new("posix") 8419625d8cSopenharmony_ci .arg( 8519625d8cSopenharmony_ci arg!(-f --flag "some flag") 8619625d8cSopenharmony_ci .overrides_with("color") 8719625d8cSopenharmony_ci .action(ArgAction::SetTrue), 8819625d8cSopenharmony_ci ) 8919625d8cSopenharmony_ci .arg(arg!(-c --color "some other flag").action(ArgAction::SetTrue)) 9019625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-c", "-f"]) 9119625d8cSopenharmony_ci .unwrap(); 9219625d8cSopenharmony_ci assert!(!*m.get_one::<bool>("color").expect("defaulted by clap")); 9319625d8cSopenharmony_ci assert!(*m.get_one::<bool>("flag").expect("defaulted by clap")); 9419625d8cSopenharmony_ci} 9519625d8cSopenharmony_ci 9619625d8cSopenharmony_ci#[test] 9719625d8cSopenharmony_cifn posix_compatible_opts_long() { 9819625d8cSopenharmony_ci let m = Command::new("posix") 9919625d8cSopenharmony_ci .arg(arg!(--flag <flag> "some flag").overrides_with("color")) 10019625d8cSopenharmony_ci .arg(arg!(--color <color> "some other flag")) 10119625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--flag", "some", "--color", "other"]) 10219625d8cSopenharmony_ci .unwrap(); 10319625d8cSopenharmony_ci assert!(m.contains_id("color")); 10419625d8cSopenharmony_ci assert_eq!( 10519625d8cSopenharmony_ci m.get_one::<String>("color").map(|v| v.as_str()).unwrap(), 10619625d8cSopenharmony_ci "other" 10719625d8cSopenharmony_ci ); 10819625d8cSopenharmony_ci assert!(!m.contains_id("flag")); 10919625d8cSopenharmony_ci} 11019625d8cSopenharmony_ci 11119625d8cSopenharmony_ci#[test] 11219625d8cSopenharmony_cifn posix_compatible_opts_long_rev() { 11319625d8cSopenharmony_ci let m = Command::new("posix") 11419625d8cSopenharmony_ci .arg(arg!(--flag <flag> "some flag").overrides_with("color")) 11519625d8cSopenharmony_ci .arg(arg!(--color <color> "some other flag")) 11619625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--color", "some", "--flag", "other"]) 11719625d8cSopenharmony_ci .unwrap(); 11819625d8cSopenharmony_ci assert!(!m.contains_id("color")); 11919625d8cSopenharmony_ci assert!(m.contains_id("flag")); 12019625d8cSopenharmony_ci assert_eq!( 12119625d8cSopenharmony_ci m.get_one::<String>("flag").map(|v| v.as_str()).unwrap(), 12219625d8cSopenharmony_ci "other" 12319625d8cSopenharmony_ci ); 12419625d8cSopenharmony_ci} 12519625d8cSopenharmony_ci 12619625d8cSopenharmony_ci#[test] 12719625d8cSopenharmony_cifn posix_compatible_opts_long_equals() { 12819625d8cSopenharmony_ci let m = Command::new("posix") 12919625d8cSopenharmony_ci .arg(arg!(--flag <flag> "some flag").overrides_with("color")) 13019625d8cSopenharmony_ci .arg(arg!(--color <color> "some other flag")) 13119625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--flag=some", "--color=other"]) 13219625d8cSopenharmony_ci .unwrap(); 13319625d8cSopenharmony_ci assert!(m.contains_id("color")); 13419625d8cSopenharmony_ci assert_eq!( 13519625d8cSopenharmony_ci m.get_one::<String>("color").map(|v| v.as_str()).unwrap(), 13619625d8cSopenharmony_ci "other" 13719625d8cSopenharmony_ci ); 13819625d8cSopenharmony_ci assert!(!m.contains_id("flag")); 13919625d8cSopenharmony_ci} 14019625d8cSopenharmony_ci 14119625d8cSopenharmony_ci#[test] 14219625d8cSopenharmony_cifn posix_compatible_opts_long_equals_rev() { 14319625d8cSopenharmony_ci let m = Command::new("posix") 14419625d8cSopenharmony_ci .arg(arg!(--flag <flag> "some flag").overrides_with("color")) 14519625d8cSopenharmony_ci .arg(arg!(--color <color> "some other flag")) 14619625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--color=some", "--flag=other"]) 14719625d8cSopenharmony_ci .unwrap(); 14819625d8cSopenharmony_ci assert!(!m.contains_id("color")); 14919625d8cSopenharmony_ci assert!(m.contains_id("flag")); 15019625d8cSopenharmony_ci assert_eq!( 15119625d8cSopenharmony_ci m.get_one::<String>("flag").map(|v| v.as_str()).unwrap(), 15219625d8cSopenharmony_ci "other" 15319625d8cSopenharmony_ci ); 15419625d8cSopenharmony_ci} 15519625d8cSopenharmony_ci 15619625d8cSopenharmony_ci#[test] 15719625d8cSopenharmony_cifn posix_compatible_opts_short() { 15819625d8cSopenharmony_ci let m = Command::new("posix") 15919625d8cSopenharmony_ci .arg(arg!(f: -f <flag> "some flag").overrides_with("c")) 16019625d8cSopenharmony_ci .arg(arg!(c: -c <color> "some other flag")) 16119625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-f", "some", "-c", "other"]) 16219625d8cSopenharmony_ci .unwrap(); 16319625d8cSopenharmony_ci assert!(m.contains_id("c")); 16419625d8cSopenharmony_ci assert_eq!( 16519625d8cSopenharmony_ci m.get_one::<String>("c").map(|v| v.as_str()).unwrap(), 16619625d8cSopenharmony_ci "other" 16719625d8cSopenharmony_ci ); 16819625d8cSopenharmony_ci assert!(!m.contains_id("f")); 16919625d8cSopenharmony_ci} 17019625d8cSopenharmony_ci 17119625d8cSopenharmony_ci#[test] 17219625d8cSopenharmony_cifn posix_compatible_opts_short_rev() { 17319625d8cSopenharmony_ci let m = Command::new("posix") 17419625d8cSopenharmony_ci .arg(arg!(f: -f <flag> "some flag").overrides_with("c")) 17519625d8cSopenharmony_ci .arg(arg!(c: -c <color> "some other flag")) 17619625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-c", "some", "-f", "other"]) 17719625d8cSopenharmony_ci .unwrap(); 17819625d8cSopenharmony_ci assert!(!m.contains_id("c")); 17919625d8cSopenharmony_ci assert!(m.contains_id("f")); 18019625d8cSopenharmony_ci assert_eq!( 18119625d8cSopenharmony_ci m.get_one::<String>("f").map(|v| v.as_str()).unwrap(), 18219625d8cSopenharmony_ci "other" 18319625d8cSopenharmony_ci ); 18419625d8cSopenharmony_ci} 18519625d8cSopenharmony_ci 18619625d8cSopenharmony_ci#[test] 18719625d8cSopenharmony_cifn conflict_overridden() { 18819625d8cSopenharmony_ci let m = Command::new("conflict_overridden") 18919625d8cSopenharmony_ci .arg( 19019625d8cSopenharmony_ci arg!(-f --flag "some flag") 19119625d8cSopenharmony_ci .conflicts_with("debug") 19219625d8cSopenharmony_ci .action(ArgAction::SetTrue), 19319625d8cSopenharmony_ci ) 19419625d8cSopenharmony_ci .arg(arg!(-d --debug "other flag").action(ArgAction::SetTrue)) 19519625d8cSopenharmony_ci .arg( 19619625d8cSopenharmony_ci arg!(-c --color "third flag") 19719625d8cSopenharmony_ci .overrides_with("flag") 19819625d8cSopenharmony_ci .action(ArgAction::SetTrue), 19919625d8cSopenharmony_ci ) 20019625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-f", "-c", "-d"]) 20119625d8cSopenharmony_ci .unwrap(); 20219625d8cSopenharmony_ci assert!(*m.get_one::<bool>("color").expect("defaulted by clap")); 20319625d8cSopenharmony_ci assert!(!*m.get_one::<bool>("flag").expect("defaulted by clap")); 20419625d8cSopenharmony_ci assert!(*m.get_one::<bool>("debug").expect("defaulted by clap")); 20519625d8cSopenharmony_ci} 20619625d8cSopenharmony_ci 20719625d8cSopenharmony_ci#[test] 20819625d8cSopenharmony_cifn conflict_overridden_2() { 20919625d8cSopenharmony_ci let result = Command::new("conflict_overridden") 21019625d8cSopenharmony_ci .arg( 21119625d8cSopenharmony_ci arg!(-f --flag "some flag") 21219625d8cSopenharmony_ci .conflicts_with("debug") 21319625d8cSopenharmony_ci .action(ArgAction::SetTrue), 21419625d8cSopenharmony_ci ) 21519625d8cSopenharmony_ci .arg(arg!(-d --debug "other flag").action(ArgAction::SetTrue)) 21619625d8cSopenharmony_ci .arg( 21719625d8cSopenharmony_ci arg!(-c --color "third flag") 21819625d8cSopenharmony_ci .overrides_with("flag") 21919625d8cSopenharmony_ci .action(ArgAction::SetTrue), 22019625d8cSopenharmony_ci ) 22119625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-f", "-d", "-c"]); 22219625d8cSopenharmony_ci assert!(result.is_ok(), "{}", result.unwrap_err()); 22319625d8cSopenharmony_ci let m = result.unwrap(); 22419625d8cSopenharmony_ci assert!(*m.get_one::<bool>("color").expect("defaulted by clap")); 22519625d8cSopenharmony_ci assert!(*m.get_one::<bool>("debug").expect("defaulted by clap")); 22619625d8cSopenharmony_ci assert!(!*m.get_one::<bool>("flag").expect("defaulted by clap")); 22719625d8cSopenharmony_ci} 22819625d8cSopenharmony_ci 22919625d8cSopenharmony_ci#[test] 23019625d8cSopenharmony_cifn conflict_overridden_3() { 23119625d8cSopenharmony_ci let result = Command::new("conflict_overridden") 23219625d8cSopenharmony_ci .arg(arg!(-f --flag "some flag").conflicts_with("debug")) 23319625d8cSopenharmony_ci .arg(arg!(-d --debug "other flag")) 23419625d8cSopenharmony_ci .arg(arg!(-c --color "third flag").overrides_with("flag")) 23519625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-d", "-c", "-f"]); 23619625d8cSopenharmony_ci assert!(result.is_err()); 23719625d8cSopenharmony_ci let err = result.err().unwrap(); 23819625d8cSopenharmony_ci assert_eq!(err.kind(), ErrorKind::ArgumentConflict); 23919625d8cSopenharmony_ci} 24019625d8cSopenharmony_ci 24119625d8cSopenharmony_ci#[test] 24219625d8cSopenharmony_cifn conflict_overridden_4() { 24319625d8cSopenharmony_ci let m = Command::new("conflict_overridden") 24419625d8cSopenharmony_ci .arg( 24519625d8cSopenharmony_ci arg!(-f --flag "some flag") 24619625d8cSopenharmony_ci .conflicts_with("debug") 24719625d8cSopenharmony_ci .action(ArgAction::SetTrue), 24819625d8cSopenharmony_ci ) 24919625d8cSopenharmony_ci .arg(arg!(-d --debug "other flag").action(ArgAction::SetTrue)) 25019625d8cSopenharmony_ci .arg( 25119625d8cSopenharmony_ci arg!(-c --color "third flag") 25219625d8cSopenharmony_ci .overrides_with("flag") 25319625d8cSopenharmony_ci .action(ArgAction::SetTrue), 25419625d8cSopenharmony_ci ) 25519625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-d", "-f", "-c"]) 25619625d8cSopenharmony_ci .unwrap(); 25719625d8cSopenharmony_ci assert!(*m.get_one::<bool>("color").expect("defaulted by clap")); 25819625d8cSopenharmony_ci assert!(!*m.get_one::<bool>("flag").expect("defaulted by clap")); 25919625d8cSopenharmony_ci assert!(*m.get_one::<bool>("debug").expect("defaulted by clap")); 26019625d8cSopenharmony_ci} 26119625d8cSopenharmony_ci 26219625d8cSopenharmony_ci#[test] 26319625d8cSopenharmony_cifn pos_required_overridden_by_flag() { 26419625d8cSopenharmony_ci let result = Command::new("require_overridden") 26519625d8cSopenharmony_ci .arg(Arg::new("pos").index(1).required(true)) 26619625d8cSopenharmony_ci .arg(arg!(-c --color "some flag").overrides_with("pos")) 26719625d8cSopenharmony_ci .try_get_matches_from(vec!["", "test", "-c"]); 26819625d8cSopenharmony_ci assert!(result.is_ok(), "{:?}", result.unwrap_err()); 26919625d8cSopenharmony_ci} 27019625d8cSopenharmony_ci 27119625d8cSopenharmony_ci#[test] 27219625d8cSopenharmony_cifn require_overridden_2() { 27319625d8cSopenharmony_ci let m = Command::new("require_overridden") 27419625d8cSopenharmony_ci .arg(Arg::new("req_pos").required(true)) 27519625d8cSopenharmony_ci .arg( 27619625d8cSopenharmony_ci arg!(-c --color "other flag") 27719625d8cSopenharmony_ci .overrides_with("req_pos") 27819625d8cSopenharmony_ci .action(ArgAction::SetTrue), 27919625d8cSopenharmony_ci ) 28019625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-c", "req_pos"]) 28119625d8cSopenharmony_ci .unwrap(); 28219625d8cSopenharmony_ci assert!(!*m.get_one::<bool>("color").expect("defaulted by clap")); 28319625d8cSopenharmony_ci assert!(m.contains_id("req_pos")); 28419625d8cSopenharmony_ci} 28519625d8cSopenharmony_ci 28619625d8cSopenharmony_ci#[test] 28719625d8cSopenharmony_cifn require_overridden_3() { 28819625d8cSopenharmony_ci let m = Command::new("require_overridden") 28919625d8cSopenharmony_ci .arg( 29019625d8cSopenharmony_ci arg!(-f --flag "some flag") 29119625d8cSopenharmony_ci .requires("debug") 29219625d8cSopenharmony_ci .action(ArgAction::SetTrue), 29319625d8cSopenharmony_ci ) 29419625d8cSopenharmony_ci .arg(arg!(-d --debug "other flag").action(ArgAction::SetTrue)) 29519625d8cSopenharmony_ci .arg( 29619625d8cSopenharmony_ci arg!(-c --color "third flag") 29719625d8cSopenharmony_ci .overrides_with("flag") 29819625d8cSopenharmony_ci .action(ArgAction::SetTrue), 29919625d8cSopenharmony_ci ) 30019625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-f", "-c"]) 30119625d8cSopenharmony_ci .unwrap(); 30219625d8cSopenharmony_ci assert!(*m.get_one::<bool>("color").expect("defaulted by clap")); 30319625d8cSopenharmony_ci assert!(!*m.get_one::<bool>("flag").expect("defaulted by clap")); 30419625d8cSopenharmony_ci assert!(!*m.get_one::<bool>("debug").expect("defaulted by clap")); 30519625d8cSopenharmony_ci} 30619625d8cSopenharmony_ci 30719625d8cSopenharmony_ci#[test] 30819625d8cSopenharmony_cifn require_overridden_4() { 30919625d8cSopenharmony_ci let result = Command::new("require_overridden") 31019625d8cSopenharmony_ci .arg(arg!(-f --flag "some flag").requires("debug")) 31119625d8cSopenharmony_ci .arg(arg!(-d --debug "other flag")) 31219625d8cSopenharmony_ci .arg(arg!(-c --color "third flag").overrides_with("flag")) 31319625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-c", "-f"]); 31419625d8cSopenharmony_ci assert!(result.is_err()); 31519625d8cSopenharmony_ci let err = result.err().unwrap(); 31619625d8cSopenharmony_ci assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument); 31719625d8cSopenharmony_ci} 31819625d8cSopenharmony_ci 31919625d8cSopenharmony_ci#[test] 32019625d8cSopenharmony_cifn incremental_override() { 32119625d8cSopenharmony_ci let mut cmd = Command::new("test") 32219625d8cSopenharmony_ci .arg(arg!(--name <NAME> ...).required(true)) 32319625d8cSopenharmony_ci .arg( 32419625d8cSopenharmony_ci arg!(--"no-name") 32519625d8cSopenharmony_ci .overrides_with("name") 32619625d8cSopenharmony_ci .action(ArgAction::SetTrue), 32719625d8cSopenharmony_ci ); 32819625d8cSopenharmony_ci let m = cmd 32919625d8cSopenharmony_ci .try_get_matches_from_mut(["test", "--name=ahmed", "--no-name", "--name=ali"]) 33019625d8cSopenharmony_ci .unwrap(); 33119625d8cSopenharmony_ci assert_eq!( 33219625d8cSopenharmony_ci m.get_many::<String>("name") 33319625d8cSopenharmony_ci .unwrap() 33419625d8cSopenharmony_ci .map(|v| v.as_str()) 33519625d8cSopenharmony_ci .collect::<Vec<_>>(), 33619625d8cSopenharmony_ci ["ali"] 33719625d8cSopenharmony_ci ); 33819625d8cSopenharmony_ci assert!(!*m.get_one::<bool>("no-name").expect("defaulted by clap")); 33919625d8cSopenharmony_ci} 34019625d8cSopenharmony_ci 34119625d8cSopenharmony_ci#[cfg(debug_assertions)] 34219625d8cSopenharmony_ci#[test] 34319625d8cSopenharmony_ci#[should_panic = "Argument or group 'extra' specified in 'overrides_with*' for 'config' does not exist"] 34419625d8cSopenharmony_cifn overrides_with_invalid_arg() { 34519625d8cSopenharmony_ci let _ = Command::new("prog") 34619625d8cSopenharmony_ci .arg(Arg::new("config").long("config").overrides_with("extra")) 34719625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--config"]); 34819625d8cSopenharmony_ci} 349