119625d8cSopenharmony_ciuse clap::{arg, Arg, ArgAction, Command}; 219625d8cSopenharmony_ci 319625d8cSopenharmony_ci#[test] 419625d8cSopenharmony_cifn multiple_occurrences_of_flags_long() { 519625d8cSopenharmony_ci let m = Command::new("mo_flags_long") 619625d8cSopenharmony_ci .args_override_self(true) 719625d8cSopenharmony_ci .arg(arg!(--multflag "allowed multiple flag").action(ArgAction::SetTrue)) 819625d8cSopenharmony_ci .arg(arg!(--flag "disallowed multiple flag").action(ArgAction::SetTrue)) 919625d8cSopenharmony_ci .try_get_matches_from(vec!["", "--multflag", "--flag", "--multflag"]) 1019625d8cSopenharmony_ci .unwrap(); 1119625d8cSopenharmony_ci assert!(m.contains_id("multflag")); 1219625d8cSopenharmony_ci assert_eq!(m.get_one::<bool>("multflag").copied(), Some(true)); 1319625d8cSopenharmony_ci assert!(m.contains_id("flag")); 1419625d8cSopenharmony_ci assert_eq!(m.get_one::<bool>("flag").copied(), Some(true)); 1519625d8cSopenharmony_ci} 1619625d8cSopenharmony_ci 1719625d8cSopenharmony_ci#[test] 1819625d8cSopenharmony_cifn multiple_occurrences_of_flags_short() { 1919625d8cSopenharmony_ci let m = Command::new("mo_flags_short") 2019625d8cSopenharmony_ci .args_override_self(true) 2119625d8cSopenharmony_ci .arg(arg!(-m --multflag "allowed multiple flag").action(ArgAction::SetTrue)) 2219625d8cSopenharmony_ci .arg(arg!(-f --flag "disallowed multiple flag").action(ArgAction::SetTrue)) 2319625d8cSopenharmony_ci .try_get_matches_from(vec!["", "-m", "-f", "-m"]) 2419625d8cSopenharmony_ci .unwrap(); 2519625d8cSopenharmony_ci assert!(m.contains_id("multflag")); 2619625d8cSopenharmony_ci assert_eq!(m.get_one::<bool>("multflag").copied(), Some(true)); 2719625d8cSopenharmony_ci assert!(m.contains_id("flag")); 2819625d8cSopenharmony_ci assert_eq!(m.get_one::<bool>("flag").copied(), Some(true)); 2919625d8cSopenharmony_ci} 3019625d8cSopenharmony_ci 3119625d8cSopenharmony_ci#[test] 3219625d8cSopenharmony_cifn multiple_occurrences_of_positional() { 3319625d8cSopenharmony_ci let cmd = Command::new("test").arg(Arg::new("multi").num_args(1..).action(ArgAction::Append)); 3419625d8cSopenharmony_ci 3519625d8cSopenharmony_ci let m = cmd 3619625d8cSopenharmony_ci .clone() 3719625d8cSopenharmony_ci .try_get_matches_from(["test"]) 3819625d8cSopenharmony_ci .expect("zero occurrences work"); 3919625d8cSopenharmony_ci assert!(!m.contains_id("multi")); 4019625d8cSopenharmony_ci assert!(m.get_many::<String>("multi").is_none()); 4119625d8cSopenharmony_ci 4219625d8cSopenharmony_ci let m = cmd 4319625d8cSopenharmony_ci .clone() 4419625d8cSopenharmony_ci .try_get_matches_from(["test", "one"]) 4519625d8cSopenharmony_ci .expect("single occurrence work"); 4619625d8cSopenharmony_ci assert!(m.contains_id("multi")); 4719625d8cSopenharmony_ci assert_eq!( 4819625d8cSopenharmony_ci m.get_many::<String>("multi") 4919625d8cSopenharmony_ci .unwrap() 5019625d8cSopenharmony_ci .map(|v| v.as_str()) 5119625d8cSopenharmony_ci .collect::<Vec<_>>(), 5219625d8cSopenharmony_ci ["one"] 5319625d8cSopenharmony_ci ); 5419625d8cSopenharmony_ci 5519625d8cSopenharmony_ci let m = cmd 5619625d8cSopenharmony_ci .clone() 5719625d8cSopenharmony_ci .try_get_matches_from(["test", "one", "two", "three", "four"]) 5819625d8cSopenharmony_ci .expect("many occurrences work"); 5919625d8cSopenharmony_ci assert!(m.contains_id("multi")); 6019625d8cSopenharmony_ci assert_eq!( 6119625d8cSopenharmony_ci m.get_many::<String>("multi") 6219625d8cSopenharmony_ci .unwrap() 6319625d8cSopenharmony_ci .map(|v| v.as_str()) 6419625d8cSopenharmony_ci .collect::<Vec<_>>(), 6519625d8cSopenharmony_ci ["one", "two", "three", "four"] 6619625d8cSopenharmony_ci ); 6719625d8cSopenharmony_ci} 6819625d8cSopenharmony_ci 6919625d8cSopenharmony_ci#[test] 7019625d8cSopenharmony_cifn multiple_occurrences_of_flags_large_quantity() { 7119625d8cSopenharmony_ci let cmd = Command::new("mo_flags_large_qty") 7219625d8cSopenharmony_ci .arg(arg!(-m --multflag "allowed multiple flag").action(ArgAction::Count)); 7319625d8cSopenharmony_ci 7419625d8cSopenharmony_ci let args: Vec<&str> = vec![""] 7519625d8cSopenharmony_ci .into_iter() 7619625d8cSopenharmony_ci .chain(vec!["-m"; 200].into_iter()) 7719625d8cSopenharmony_ci .collect(); 7819625d8cSopenharmony_ci let m = cmd.clone().try_get_matches_from(args).unwrap(); 7919625d8cSopenharmony_ci assert!(m.contains_id("multflag")); 8019625d8cSopenharmony_ci assert_eq!(m.get_one::<u8>("multflag").copied(), Some(200)); 8119625d8cSopenharmony_ci 8219625d8cSopenharmony_ci let args: Vec<&str> = vec![""] 8319625d8cSopenharmony_ci .into_iter() 8419625d8cSopenharmony_ci .chain(vec!["-m"; 500].into_iter()) 8519625d8cSopenharmony_ci .collect(); 8619625d8cSopenharmony_ci let m = cmd.try_get_matches_from(args).unwrap(); 8719625d8cSopenharmony_ci assert!(m.contains_id("multflag")); 8819625d8cSopenharmony_ci assert_eq!(m.get_one::<u8>("multflag").copied(), Some(u8::MAX)); 8919625d8cSopenharmony_ci} 9019625d8cSopenharmony_ci 9119625d8cSopenharmony_ci#[cfg(feature = "env")] 9219625d8cSopenharmony_ci#[test] 9319625d8cSopenharmony_cifn multiple_occurrences_of_before_env() { 9419625d8cSopenharmony_ci let cmd = Command::new("mo_before_env").arg( 9519625d8cSopenharmony_ci Arg::new("verbose") 9619625d8cSopenharmony_ci .env("VERBOSE") 9719625d8cSopenharmony_ci .short('v') 9819625d8cSopenharmony_ci .long("verbose") 9919625d8cSopenharmony_ci .action(ArgAction::Count), 10019625d8cSopenharmony_ci ); 10119625d8cSopenharmony_ci 10219625d8cSopenharmony_ci let m = cmd.clone().try_get_matches_from(vec![""]); 10319625d8cSopenharmony_ci assert!(m.is_ok(), "{}", m.unwrap_err()); 10419625d8cSopenharmony_ci let m = m.unwrap(); 10519625d8cSopenharmony_ci assert_eq!(m.get_one::<u8>("verbose").copied(), Some(0)); 10619625d8cSopenharmony_ci 10719625d8cSopenharmony_ci let m = cmd.clone().try_get_matches_from(vec!["", "-v"]); 10819625d8cSopenharmony_ci assert!(m.is_ok(), "{}", m.unwrap_err()); 10919625d8cSopenharmony_ci let m = m.unwrap(); 11019625d8cSopenharmony_ci assert_eq!(m.get_one::<u8>("verbose").copied(), Some(1)); 11119625d8cSopenharmony_ci 11219625d8cSopenharmony_ci let m = cmd.clone().try_get_matches_from(vec!["", "-vv"]); 11319625d8cSopenharmony_ci assert!(m.is_ok(), "{}", m.unwrap_err()); 11419625d8cSopenharmony_ci let m = m.unwrap(); 11519625d8cSopenharmony_ci assert_eq!(m.get_one::<u8>("verbose").copied(), Some(2)); 11619625d8cSopenharmony_ci 11719625d8cSopenharmony_ci let m = cmd.clone().try_get_matches_from(vec!["", "-vvv"]); 11819625d8cSopenharmony_ci assert!(m.is_ok(), "{}", m.unwrap_err()); 11919625d8cSopenharmony_ci let m = m.unwrap(); 12019625d8cSopenharmony_ci assert_eq!(m.get_one::<u8>("verbose").copied(), Some(3)); 12119625d8cSopenharmony_ci} 12219625d8cSopenharmony_ci 12319625d8cSopenharmony_ci#[cfg(feature = "env")] 12419625d8cSopenharmony_ci#[test] 12519625d8cSopenharmony_cifn multiple_occurrences_of_after_env() { 12619625d8cSopenharmony_ci let cmd = Command::new("mo_after_env").arg( 12719625d8cSopenharmony_ci Arg::new("verbose") 12819625d8cSopenharmony_ci .short('v') 12919625d8cSopenharmony_ci .long("verbose") 13019625d8cSopenharmony_ci .action(ArgAction::Count) 13119625d8cSopenharmony_ci .env("VERBOSE"), 13219625d8cSopenharmony_ci ); 13319625d8cSopenharmony_ci 13419625d8cSopenharmony_ci let m = cmd.clone().try_get_matches_from(vec![""]); 13519625d8cSopenharmony_ci assert!(m.is_ok(), "{}", m.unwrap_err()); 13619625d8cSopenharmony_ci let m = m.unwrap(); 13719625d8cSopenharmony_ci assert_eq!(m.get_one::<u8>("verbose").copied(), Some(0)); 13819625d8cSopenharmony_ci 13919625d8cSopenharmony_ci let m = cmd.clone().try_get_matches_from(vec!["", "-v"]); 14019625d8cSopenharmony_ci assert!(m.is_ok(), "{}", m.unwrap_err()); 14119625d8cSopenharmony_ci let m = m.unwrap(); 14219625d8cSopenharmony_ci assert_eq!(m.get_one::<u8>("verbose").copied(), Some(1)); 14319625d8cSopenharmony_ci 14419625d8cSopenharmony_ci let m = cmd.clone().try_get_matches_from(vec!["", "-vv"]); 14519625d8cSopenharmony_ci assert!(m.is_ok(), "{}", m.unwrap_err()); 14619625d8cSopenharmony_ci let m = m.unwrap(); 14719625d8cSopenharmony_ci assert_eq!(m.get_one::<u8>("verbose").copied(), Some(2)); 14819625d8cSopenharmony_ci 14919625d8cSopenharmony_ci let m = cmd.clone().try_get_matches_from(vec!["", "-vvv"]); 15019625d8cSopenharmony_ci assert!(m.is_ok(), "{}", m.unwrap_err()); 15119625d8cSopenharmony_ci let m = m.unwrap(); 15219625d8cSopenharmony_ci assert_eq!(m.get_one::<u8>("verbose").copied(), Some(3)); 15319625d8cSopenharmony_ci} 154