119625d8cSopenharmony_ciuse clap::{arg, Arg, ArgAction, Command}; 219625d8cSopenharmony_ci 319625d8cSopenharmony_ci#[cfg(feature = "error-context")] 419625d8cSopenharmony_ciuse super::utils; 519625d8cSopenharmony_ci 619625d8cSopenharmony_ci#[test] 719625d8cSopenharmony_cifn flag_using_short() { 819625d8cSopenharmony_ci let m = Command::new("flag") 919625d8cSopenharmony_ci .args([ 1019625d8cSopenharmony_ci arg!(-f --flag "some flag").action(ArgAction::SetTrue), 1119625d8cSopenharmony_ci arg!(-c --color "some other flag").action(ArgAction::SetTrue), 1219625d8cSopenharmony_ci ]) 1319625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-f", "-c"]) 1419625d8cSopenharmony_ci .unwrap(); 1519625d8cSopenharmony_ci assert!(*m.get_one::<bool>("flag").expect("defaulted by clap")); 1619625d8cSopenharmony_ci assert!(*m.get_one::<bool>("color").expect("defaulted by clap")); 1719625d8cSopenharmony_ci} 1819625d8cSopenharmony_ci 1919625d8cSopenharmony_ci#[test] 2019625d8cSopenharmony_cifn lots_o_flags_sep() { 2119625d8cSopenharmony_ci let r = Command::new("opts") 2219625d8cSopenharmony_ci .args_override_self(true) 2319625d8cSopenharmony_ci .arg(arg!(o: -o ... "some flag").action(ArgAction::SetTrue)) 2419625d8cSopenharmony_ci .try_get_matches_from(vec![ 2519625d8cSopenharmony_ci "", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", 2619625d8cSopenharmony_ci "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", 2719625d8cSopenharmony_ci "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", 2819625d8cSopenharmony_ci "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", 2919625d8cSopenharmony_ci "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", 3019625d8cSopenharmony_ci "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", 3119625d8cSopenharmony_ci "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", 3219625d8cSopenharmony_ci "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", 3319625d8cSopenharmony_ci "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", 3419625d8cSopenharmony_ci "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", 3519625d8cSopenharmony_ci "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", 3619625d8cSopenharmony_ci "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", 3719625d8cSopenharmony_ci "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", 3819625d8cSopenharmony_ci "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", 3919625d8cSopenharmony_ci "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", 4019625d8cSopenharmony_ci "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", 4119625d8cSopenharmony_ci "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", 4219625d8cSopenharmony_ci "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", 4319625d8cSopenharmony_ci "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", 4419625d8cSopenharmony_ci "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", 4519625d8cSopenharmony_ci "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", 4619625d8cSopenharmony_ci "-o", "-o", "-o", 4719625d8cSopenharmony_ci ]); 4819625d8cSopenharmony_ci assert!(r.is_ok(), "{:?}", r.unwrap_err().kind()); 4919625d8cSopenharmony_ci let m = r.unwrap(); 5019625d8cSopenharmony_ci assert!(m.contains_id("o")); 5119625d8cSopenharmony_ci assert!(*m.get_one::<bool>("o").expect("defaulted by clap")); 5219625d8cSopenharmony_ci} 5319625d8cSopenharmony_ci 5419625d8cSopenharmony_ci#[test] 5519625d8cSopenharmony_cifn lots_o_flags_combined() { 5619625d8cSopenharmony_ci let r = Command::new("opts") 5719625d8cSopenharmony_ci .args_override_self(true) 5819625d8cSopenharmony_ci .arg(arg!(o: -o ... "some flag").action(ArgAction::SetTrue)) 5919625d8cSopenharmony_ci .try_get_matches_from(vec![ 6019625d8cSopenharmony_ci "", 6119625d8cSopenharmony_ci "-oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 6219625d8cSopenharmony_ci "-oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 6319625d8cSopenharmony_ci "-oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 6419625d8cSopenharmony_ci "-oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 6519625d8cSopenharmony_ci "-ooooooooooooooooooooooooooooooooooooooooo", 6619625d8cSopenharmony_ci ]); 6719625d8cSopenharmony_ci assert!(r.is_ok(), "{:?}", r.unwrap_err().kind()); 6819625d8cSopenharmony_ci let m = r.unwrap(); 6919625d8cSopenharmony_ci assert!(m.contains_id("o")); 7019625d8cSopenharmony_ci assert!(*m.get_one::<bool>("o").expect("defaulted by clap")); 7119625d8cSopenharmony_ci} 7219625d8cSopenharmony_ci 7319625d8cSopenharmony_ci#[test] 7419625d8cSopenharmony_cifn flag_using_long() { 7519625d8cSopenharmony_ci let m = Command::new("flag") 7619625d8cSopenharmony_ci .args([ 7719625d8cSopenharmony_ci arg!(--flag "some flag").action(ArgAction::SetTrue), 7819625d8cSopenharmony_ci arg!(--color "some other flag").action(ArgAction::SetTrue), 7919625d8cSopenharmony_ci ]) 8019625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--flag", "--color"]) 8119625d8cSopenharmony_ci .unwrap(); 8219625d8cSopenharmony_ci assert!(*m.get_one::<bool>("flag").expect("defaulted by clap")); 8319625d8cSopenharmony_ci assert!(*m.get_one::<bool>("color").expect("defaulted by clap")); 8419625d8cSopenharmony_ci} 8519625d8cSopenharmony_ci 8619625d8cSopenharmony_ci#[test] 8719625d8cSopenharmony_cifn flag_using_long_with_literals() { 8819625d8cSopenharmony_ci use clap::error::ErrorKind; 8919625d8cSopenharmony_ci 9019625d8cSopenharmony_ci let m = Command::new("flag") 9119625d8cSopenharmony_ci .arg( 9219625d8cSopenharmony_ci Arg::new("rainbow") 9319625d8cSopenharmony_ci .long("rainbow") 9419625d8cSopenharmony_ci .action(ArgAction::SetTrue), 9519625d8cSopenharmony_ci ) 9619625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--rainbow=false"]); 9719625d8cSopenharmony_ci assert!(m.is_err(), "{:#?}", m.unwrap()); 9819625d8cSopenharmony_ci assert_eq!(m.unwrap_err().kind(), ErrorKind::TooManyValues); 9919625d8cSopenharmony_ci} 10019625d8cSopenharmony_ci 10119625d8cSopenharmony_ci#[test] 10219625d8cSopenharmony_cifn flag_using_mixed() { 10319625d8cSopenharmony_ci let m = Command::new("flag") 10419625d8cSopenharmony_ci .args([ 10519625d8cSopenharmony_ci arg!(-f --flag "some flag").action(ArgAction::SetTrue), 10619625d8cSopenharmony_ci arg!(-c --color "some other flag").action(ArgAction::SetTrue), 10719625d8cSopenharmony_ci ]) 10819625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-f", "--color"]) 10919625d8cSopenharmony_ci .unwrap(); 11019625d8cSopenharmony_ci assert!(*m.get_one::<bool>("flag").expect("defaulted by clap")); 11119625d8cSopenharmony_ci assert!(*m.get_one::<bool>("color").expect("defaulted by clap")); 11219625d8cSopenharmony_ci 11319625d8cSopenharmony_ci let m = Command::new("flag") 11419625d8cSopenharmony_ci .args([ 11519625d8cSopenharmony_ci arg!(-f --flag "some flag").action(ArgAction::SetTrue), 11619625d8cSopenharmony_ci arg!(-c --color "some other flag").action(ArgAction::SetTrue), 11719625d8cSopenharmony_ci ]) 11819625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--flag", "-c"]) 11919625d8cSopenharmony_ci .unwrap(); 12019625d8cSopenharmony_ci assert!(*m.get_one::<bool>("flag").expect("defaulted by clap")); 12119625d8cSopenharmony_ci assert!(*m.get_one::<bool>("color").expect("defaulted by clap")); 12219625d8cSopenharmony_ci} 12319625d8cSopenharmony_ci 12419625d8cSopenharmony_ci#[test] 12519625d8cSopenharmony_cifn multiple_flags_in_single() { 12619625d8cSopenharmony_ci let m = Command::new("multe_flags") 12719625d8cSopenharmony_ci .args([ 12819625d8cSopenharmony_ci arg!(-f --flag "some flag").action(ArgAction::SetTrue), 12919625d8cSopenharmony_ci arg!(-c --color "some other flag").action(ArgAction::SetTrue), 13019625d8cSopenharmony_ci arg!(-d --debug "another other flag").action(ArgAction::SetTrue), 13119625d8cSopenharmony_ci ]) 13219625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-fcd"]) 13319625d8cSopenharmony_ci .unwrap(); 13419625d8cSopenharmony_ci assert!(*m.get_one::<bool>("flag").expect("defaulted by clap")); 13519625d8cSopenharmony_ci assert!(*m.get_one::<bool>("color").expect("defaulted by clap")); 13619625d8cSopenharmony_ci assert!(*m.get_one::<bool>("debug").expect("defaulted by clap")); 13719625d8cSopenharmony_ci} 13819625d8cSopenharmony_ci 13919625d8cSopenharmony_ci#[test] 14019625d8cSopenharmony_ci#[cfg(feature = "error-context")] 14119625d8cSopenharmony_cifn unexpected_value_error() { 14219625d8cSopenharmony_ci const USE_FLAG_AS_ARGUMENT: &str = "\ 14319625d8cSopenharmony_cierror: unexpected value 'foo' for '--a-flag' found; no more were expected 14419625d8cSopenharmony_ci 14519625d8cSopenharmony_ciUsage: mycat --a-flag [filename] 14619625d8cSopenharmony_ci 14719625d8cSopenharmony_ciFor more information, try '--help'. 14819625d8cSopenharmony_ci"; 14919625d8cSopenharmony_ci 15019625d8cSopenharmony_ci let cmd = Command::new("mycat") 15119625d8cSopenharmony_ci .arg(Arg::new("filename")) 15219625d8cSopenharmony_ci .arg(Arg::new("a-flag").long("a-flag").action(ArgAction::SetTrue)); 15319625d8cSopenharmony_ci 15419625d8cSopenharmony_ci utils::assert_output(cmd, "mycat --a-flag=foo", USE_FLAG_AS_ARGUMENT, true); 15519625d8cSopenharmony_ci} 15619625d8cSopenharmony_ci 15719625d8cSopenharmony_ci#[test] 15819625d8cSopenharmony_ci#[cfg(feature = "error-context")] 15919625d8cSopenharmony_cifn issue_1284_argument_in_flag_style() { 16019625d8cSopenharmony_ci const USE_FLAG_AS_ARGUMENT: &str = "\ 16119625d8cSopenharmony_cierror: unexpected argument '--another-flag' found 16219625d8cSopenharmony_ci 16319625d8cSopenharmony_ci note: to pass '--another-flag' as a value, use '-- --another-flag' 16419625d8cSopenharmony_ci 16519625d8cSopenharmony_ciUsage: mycat [OPTIONS] [filename] 16619625d8cSopenharmony_ci 16719625d8cSopenharmony_ciFor more information, try '--help'. 16819625d8cSopenharmony_ci"; 16919625d8cSopenharmony_ci 17019625d8cSopenharmony_ci let cmd = Command::new("mycat") 17119625d8cSopenharmony_ci .arg(Arg::new("filename")) 17219625d8cSopenharmony_ci .arg(Arg::new("a-flag").long("a-flag").action(ArgAction::SetTrue)); 17319625d8cSopenharmony_ci 17419625d8cSopenharmony_ci let m = cmd 17519625d8cSopenharmony_ci .clone() 17619625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--", "--another-flag"]) 17719625d8cSopenharmony_ci .unwrap(); 17819625d8cSopenharmony_ci assert_eq!( 17919625d8cSopenharmony_ci m.get_one::<String>("filename").map(|v| v.as_str()), 18019625d8cSopenharmony_ci Some("--another-flag") 18119625d8cSopenharmony_ci ); 18219625d8cSopenharmony_ci 18319625d8cSopenharmony_ci let m = cmd 18419625d8cSopenharmony_ci .clone() 18519625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--a-flag"]) 18619625d8cSopenharmony_ci .unwrap(); 18719625d8cSopenharmony_ci assert!(*m.get_one::<bool>("a-flag").expect("defaulted by clap")); 18819625d8cSopenharmony_ci 18919625d8cSopenharmony_ci let m = cmd 19019625d8cSopenharmony_ci .clone() 19119625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--", "--a-flag"]) 19219625d8cSopenharmony_ci .unwrap(); 19319625d8cSopenharmony_ci assert_eq!( 19419625d8cSopenharmony_ci m.get_one::<String>("filename").map(|v| v.as_str()), 19519625d8cSopenharmony_ci Some("--a-flag") 19619625d8cSopenharmony_ci ); 19719625d8cSopenharmony_ci 19819625d8cSopenharmony_ci utils::assert_output(cmd, "mycat --another-flag", USE_FLAG_AS_ARGUMENT, true); 19919625d8cSopenharmony_ci} 20019625d8cSopenharmony_ci 20119625d8cSopenharmony_ci#[test] 20219625d8cSopenharmony_ci#[cfg(feature = "error-context")] 20319625d8cSopenharmony_cifn issue_2308_multiple_dashes() { 20419625d8cSopenharmony_ci static MULTIPLE_DASHES: &str = "\ 20519625d8cSopenharmony_cierror: unexpected argument '-----' found 20619625d8cSopenharmony_ci 20719625d8cSopenharmony_ci note: to pass '-----' as a value, use '-- -----' 20819625d8cSopenharmony_ci 20919625d8cSopenharmony_ciUsage: test <arg> 21019625d8cSopenharmony_ci 21119625d8cSopenharmony_ciFor more information, try '--help'. 21219625d8cSopenharmony_ci"; 21319625d8cSopenharmony_ci let cmd = Command::new("test").arg(Arg::new("arg").action(ArgAction::Set).required(true)); 21419625d8cSopenharmony_ci 21519625d8cSopenharmony_ci utils::assert_output(cmd, "test -----", MULTIPLE_DASHES, true); 21619625d8cSopenharmony_ci} 21719625d8cSopenharmony_ci 21819625d8cSopenharmony_ci#[test] 21919625d8cSopenharmony_ci#[cfg(debug_assertions)] 22019625d8cSopenharmony_ci#[should_panic = "Argument filename: long \"--filename\" must not start with a `-`, that will be handled by the parser"] 22119625d8cSopenharmony_cifn leading_dash_stripped() { 22219625d8cSopenharmony_ci let cmd = Command::new("mycat").arg(Arg::new("filename").long("--filename")); 22319625d8cSopenharmony_ci cmd.debug_assert(); 22419625d8cSopenharmony_ci} 225