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