119625d8cSopenharmony_ciuse clap::{error::ErrorKind, Arg, ArgAction, Command};
219625d8cSopenharmony_ci
319625d8cSopenharmony_ci#[test]
419625d8cSopenharmony_cifn option_long() {
519625d8cSopenharmony_ci    let m = Command::new("multiple_values")
619625d8cSopenharmony_ci        .arg(
719625d8cSopenharmony_ci            Arg::new("option")
819625d8cSopenharmony_ci                .long("option")
919625d8cSopenharmony_ci                .help("multiple options")
1019625d8cSopenharmony_ci                .action(ArgAction::Set)
1119625d8cSopenharmony_ci                .num_args(1..)
1219625d8cSopenharmony_ci                .action(ArgAction::Append),
1319625d8cSopenharmony_ci        )
1419625d8cSopenharmony_ci        .try_get_matches_from(vec![
1519625d8cSopenharmony_ci            "", "--option", "val1", "--option", "val2", "--option", "val3",
1619625d8cSopenharmony_ci        ]);
1719625d8cSopenharmony_ci
1819625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
1919625d8cSopenharmony_ci    let m = m.unwrap();
2019625d8cSopenharmony_ci
2119625d8cSopenharmony_ci    assert!(m.contains_id("option"));
2219625d8cSopenharmony_ci    assert_eq!(
2319625d8cSopenharmony_ci        m.get_many::<String>("option")
2419625d8cSopenharmony_ci            .unwrap()
2519625d8cSopenharmony_ci            .map(|v| v.as_str())
2619625d8cSopenharmony_ci            .collect::<Vec<_>>(),
2719625d8cSopenharmony_ci        ["val1", "val2", "val3"]
2819625d8cSopenharmony_ci    );
2919625d8cSopenharmony_ci}
3019625d8cSopenharmony_ci
3119625d8cSopenharmony_ci#[test]
3219625d8cSopenharmony_cifn option_short() {
3319625d8cSopenharmony_ci    let m = Command::new("multiple_values")
3419625d8cSopenharmony_ci        .arg(
3519625d8cSopenharmony_ci            Arg::new("option")
3619625d8cSopenharmony_ci                .short('o')
3719625d8cSopenharmony_ci                .help("multiple options")
3819625d8cSopenharmony_ci                .action(ArgAction::Set)
3919625d8cSopenharmony_ci                .num_args(1..)
4019625d8cSopenharmony_ci                .action(ArgAction::Append),
4119625d8cSopenharmony_ci        )
4219625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-o", "val1", "-o", "val2", "-o", "val3"]);
4319625d8cSopenharmony_ci
4419625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
4519625d8cSopenharmony_ci    let m = m.unwrap();
4619625d8cSopenharmony_ci
4719625d8cSopenharmony_ci    assert!(m.contains_id("option"));
4819625d8cSopenharmony_ci    assert_eq!(
4919625d8cSopenharmony_ci        m.get_many::<String>("option")
5019625d8cSopenharmony_ci            .unwrap()
5119625d8cSopenharmony_ci            .map(|v| v.as_str())
5219625d8cSopenharmony_ci            .collect::<Vec<_>>(),
5319625d8cSopenharmony_ci        ["val1", "val2", "val3"]
5419625d8cSopenharmony_ci    );
5519625d8cSopenharmony_ci}
5619625d8cSopenharmony_ci
5719625d8cSopenharmony_ci#[test]
5819625d8cSopenharmony_cifn option_mixed() {
5919625d8cSopenharmony_ci    let m = Command::new("multiple_values")
6019625d8cSopenharmony_ci        .arg(
6119625d8cSopenharmony_ci            Arg::new("option")
6219625d8cSopenharmony_ci                .long("option")
6319625d8cSopenharmony_ci                .short('o')
6419625d8cSopenharmony_ci                .help("multiple options")
6519625d8cSopenharmony_ci                .action(ArgAction::Set)
6619625d8cSopenharmony_ci                .num_args(1..)
6719625d8cSopenharmony_ci                .action(ArgAction::Append),
6819625d8cSopenharmony_ci        )
6919625d8cSopenharmony_ci        .try_get_matches_from(vec![
7019625d8cSopenharmony_ci            "", "-o", "val1", "--option", "val2", "--option", "val3", "-o", "val4",
7119625d8cSopenharmony_ci        ]);
7219625d8cSopenharmony_ci
7319625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
7419625d8cSopenharmony_ci    let m = m.unwrap();
7519625d8cSopenharmony_ci
7619625d8cSopenharmony_ci    assert!(m.contains_id("option"));
7719625d8cSopenharmony_ci    assert_eq!(
7819625d8cSopenharmony_ci        m.get_many::<String>("option")
7919625d8cSopenharmony_ci            .unwrap()
8019625d8cSopenharmony_ci            .map(|v| v.as_str())
8119625d8cSopenharmony_ci            .collect::<Vec<_>>(),
8219625d8cSopenharmony_ci        ["val1", "val2", "val3", "val4"]
8319625d8cSopenharmony_ci    );
8419625d8cSopenharmony_ci}
8519625d8cSopenharmony_ci
8619625d8cSopenharmony_ci#[test]
8719625d8cSopenharmony_cifn option_exact_exact() {
8819625d8cSopenharmony_ci    let m = Command::new("multiple_values")
8919625d8cSopenharmony_ci        .arg(
9019625d8cSopenharmony_ci            Arg::new("option")
9119625d8cSopenharmony_ci                .short('o')
9219625d8cSopenharmony_ci                .help("multiple options")
9319625d8cSopenharmony_ci                .num_args(3)
9419625d8cSopenharmony_ci                .action(ArgAction::Append),
9519625d8cSopenharmony_ci        )
9619625d8cSopenharmony_ci        .try_get_matches_from(vec![
9719625d8cSopenharmony_ci            "", "-o", "val1", "val2", "val3", "-o", "val4", "val5", "val6",
9819625d8cSopenharmony_ci        ]);
9919625d8cSopenharmony_ci
10019625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
10119625d8cSopenharmony_ci    let m = m.unwrap();
10219625d8cSopenharmony_ci
10319625d8cSopenharmony_ci    assert!(m.contains_id("option"));
10419625d8cSopenharmony_ci    assert_eq!(
10519625d8cSopenharmony_ci        m.get_many::<String>("option")
10619625d8cSopenharmony_ci            .unwrap()
10719625d8cSopenharmony_ci            .map(|v| v.as_str())
10819625d8cSopenharmony_ci            .collect::<Vec<_>>(),
10919625d8cSopenharmony_ci        ["val1", "val2", "val3", "val4", "val5", "val6"]
11019625d8cSopenharmony_ci    );
11119625d8cSopenharmony_ci}
11219625d8cSopenharmony_ci
11319625d8cSopenharmony_ci#[test]
11419625d8cSopenharmony_cifn option_exact_exact_not_mult() {
11519625d8cSopenharmony_ci    let m = Command::new("multiple_values")
11619625d8cSopenharmony_ci        .arg(
11719625d8cSopenharmony_ci            Arg::new("option")
11819625d8cSopenharmony_ci                .short('o')
11919625d8cSopenharmony_ci                .help("multiple options")
12019625d8cSopenharmony_ci                .num_args(3),
12119625d8cSopenharmony_ci        )
12219625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-o", "val1", "val2", "val3"]);
12319625d8cSopenharmony_ci
12419625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
12519625d8cSopenharmony_ci    let m = m.unwrap();
12619625d8cSopenharmony_ci
12719625d8cSopenharmony_ci    assert!(m.contains_id("option"));
12819625d8cSopenharmony_ci    assert_eq!(
12919625d8cSopenharmony_ci        m.get_many::<String>("option")
13019625d8cSopenharmony_ci            .unwrap()
13119625d8cSopenharmony_ci            .map(|v| v.as_str())
13219625d8cSopenharmony_ci            .collect::<Vec<_>>(),
13319625d8cSopenharmony_ci        ["val1", "val2", "val3"]
13419625d8cSopenharmony_ci    );
13519625d8cSopenharmony_ci}
13619625d8cSopenharmony_ci
13719625d8cSopenharmony_ci#[test]
13819625d8cSopenharmony_cifn option_exact_exact_mult() {
13919625d8cSopenharmony_ci    let m = Command::new("multiple_values")
14019625d8cSopenharmony_ci        .arg(
14119625d8cSopenharmony_ci            Arg::new("option")
14219625d8cSopenharmony_ci                .short('o')
14319625d8cSopenharmony_ci                .help("multiple options")
14419625d8cSopenharmony_ci                .num_args(3)
14519625d8cSopenharmony_ci                .action(ArgAction::Append),
14619625d8cSopenharmony_ci        )
14719625d8cSopenharmony_ci        .try_get_matches_from(vec![
14819625d8cSopenharmony_ci            "", "-o", "val1", "val2", "val3", "-o", "val4", "val5", "val6",
14919625d8cSopenharmony_ci        ]);
15019625d8cSopenharmony_ci
15119625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
15219625d8cSopenharmony_ci    let m = m.unwrap();
15319625d8cSopenharmony_ci
15419625d8cSopenharmony_ci    assert!(m.contains_id("option"));
15519625d8cSopenharmony_ci    assert_eq!(
15619625d8cSopenharmony_ci        m.get_many::<String>("option")
15719625d8cSopenharmony_ci            .unwrap()
15819625d8cSopenharmony_ci            .map(|v| v.as_str())
15919625d8cSopenharmony_ci            .collect::<Vec<_>>(),
16019625d8cSopenharmony_ci        ["val1", "val2", "val3", "val4", "val5", "val6"]
16119625d8cSopenharmony_ci    );
16219625d8cSopenharmony_ci}
16319625d8cSopenharmony_ci
16419625d8cSopenharmony_ci#[test]
16519625d8cSopenharmony_cifn option_exact_less() {
16619625d8cSopenharmony_ci    let m = Command::new("multiple_values")
16719625d8cSopenharmony_ci        .arg(
16819625d8cSopenharmony_ci            Arg::new("option")
16919625d8cSopenharmony_ci                .short('o')
17019625d8cSopenharmony_ci                .help("multiple options")
17119625d8cSopenharmony_ci                .num_args(3)
17219625d8cSopenharmony_ci                .action(ArgAction::Append),
17319625d8cSopenharmony_ci        )
17419625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-o", "val1", "-o", "val2"]);
17519625d8cSopenharmony_ci
17619625d8cSopenharmony_ci    assert!(m.is_err());
17719625d8cSopenharmony_ci    assert_eq!(m.unwrap_err().kind(), ErrorKind::WrongNumberOfValues);
17819625d8cSopenharmony_ci}
17919625d8cSopenharmony_ci
18019625d8cSopenharmony_ci#[test]
18119625d8cSopenharmony_cifn option_exact_more() {
18219625d8cSopenharmony_ci    let m = Command::new("multiple_values")
18319625d8cSopenharmony_ci        .arg(
18419625d8cSopenharmony_ci            Arg::new("option")
18519625d8cSopenharmony_ci                .short('o')
18619625d8cSopenharmony_ci                .help("multiple options")
18719625d8cSopenharmony_ci                .num_args(3)
18819625d8cSopenharmony_ci                .action(ArgAction::Append),
18919625d8cSopenharmony_ci        )
19019625d8cSopenharmony_ci        .try_get_matches_from(vec![
19119625d8cSopenharmony_ci            "", "-o", "val1", "-o", "val2", "-o", "val3", "-o", "val4",
19219625d8cSopenharmony_ci        ]);
19319625d8cSopenharmony_ci
19419625d8cSopenharmony_ci    assert!(m.is_err());
19519625d8cSopenharmony_ci    assert_eq!(m.unwrap_err().kind(), ErrorKind::WrongNumberOfValues);
19619625d8cSopenharmony_ci}
19719625d8cSopenharmony_ci
19819625d8cSopenharmony_ci#[test]
19919625d8cSopenharmony_cifn option_min_exact() {
20019625d8cSopenharmony_ci    let m = Command::new("multiple_values")
20119625d8cSopenharmony_ci        .arg(
20219625d8cSopenharmony_ci            Arg::new("option")
20319625d8cSopenharmony_ci                .short('o')
20419625d8cSopenharmony_ci                .help("multiple options")
20519625d8cSopenharmony_ci                .num_args(3..)
20619625d8cSopenharmony_ci                .action(ArgAction::Set),
20719625d8cSopenharmony_ci        )
20819625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-o", "val1", "val2", "val3"]);
20919625d8cSopenharmony_ci
21019625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
21119625d8cSopenharmony_ci    let m = m.unwrap();
21219625d8cSopenharmony_ci
21319625d8cSopenharmony_ci    assert!(m.contains_id("option"));
21419625d8cSopenharmony_ci    assert_eq!(
21519625d8cSopenharmony_ci        m.get_many::<String>("option")
21619625d8cSopenharmony_ci            .unwrap()
21719625d8cSopenharmony_ci            .map(|v| v.as_str())
21819625d8cSopenharmony_ci            .collect::<Vec<_>>(),
21919625d8cSopenharmony_ci        ["val1", "val2", "val3"]
22019625d8cSopenharmony_ci    );
22119625d8cSopenharmony_ci}
22219625d8cSopenharmony_ci
22319625d8cSopenharmony_ci#[test]
22419625d8cSopenharmony_cifn option_min_less() {
22519625d8cSopenharmony_ci    let m = Command::new("multiple_values")
22619625d8cSopenharmony_ci        .arg(
22719625d8cSopenharmony_ci            Arg::new("option")
22819625d8cSopenharmony_ci                .short('o')
22919625d8cSopenharmony_ci                .help("multiple options")
23019625d8cSopenharmony_ci                .num_args(3..)
23119625d8cSopenharmony_ci                .action(ArgAction::Set),
23219625d8cSopenharmony_ci        )
23319625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-o", "val1", "val2"]);
23419625d8cSopenharmony_ci
23519625d8cSopenharmony_ci    assert!(m.is_err());
23619625d8cSopenharmony_ci    assert_eq!(m.unwrap_err().kind(), ErrorKind::TooFewValues);
23719625d8cSopenharmony_ci}
23819625d8cSopenharmony_ci
23919625d8cSopenharmony_ci#[test]
24019625d8cSopenharmony_cifn option_short_min_more_mult_occurs() {
24119625d8cSopenharmony_ci    let m = Command::new("multiple_values")
24219625d8cSopenharmony_ci        .arg(Arg::new("arg").required(true))
24319625d8cSopenharmony_ci        .arg(
24419625d8cSopenharmony_ci            Arg::new("option")
24519625d8cSopenharmony_ci                .short('o')
24619625d8cSopenharmony_ci                .help("multiple options")
24719625d8cSopenharmony_ci                .num_args(3..)
24819625d8cSopenharmony_ci                .action(ArgAction::Set),
24919625d8cSopenharmony_ci        )
25019625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "pos", "-o", "val1", "val2", "val3", "val4"]);
25119625d8cSopenharmony_ci
25219625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
25319625d8cSopenharmony_ci    let m = m.unwrap();
25419625d8cSopenharmony_ci
25519625d8cSopenharmony_ci    assert!(m.contains_id("option"));
25619625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
25719625d8cSopenharmony_ci    assert_eq!(
25819625d8cSopenharmony_ci        m.get_many::<String>("option")
25919625d8cSopenharmony_ci            .unwrap()
26019625d8cSopenharmony_ci            .map(|v| v.as_str())
26119625d8cSopenharmony_ci            .collect::<Vec<_>>(),
26219625d8cSopenharmony_ci        ["val1", "val2", "val3", "val4"]
26319625d8cSopenharmony_ci    );
26419625d8cSopenharmony_ci    assert_eq!(m.get_one::<String>("arg").map(|v| v.as_str()), Some("pos"));
26519625d8cSopenharmony_ci}
26619625d8cSopenharmony_ci
26719625d8cSopenharmony_ci#[test]
26819625d8cSopenharmony_cifn option_short_min_more_single_occur() {
26919625d8cSopenharmony_ci    let m = Command::new("multiple_values")
27019625d8cSopenharmony_ci        .arg(Arg::new("arg").required(true))
27119625d8cSopenharmony_ci        .arg(
27219625d8cSopenharmony_ci            Arg::new("option")
27319625d8cSopenharmony_ci                .short('o')
27419625d8cSopenharmony_ci                .help("multiple options")
27519625d8cSopenharmony_ci                .num_args(3..),
27619625d8cSopenharmony_ci        )
27719625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "pos", "-o", "val1", "val2", "val3", "val4"]);
27819625d8cSopenharmony_ci
27919625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
28019625d8cSopenharmony_ci    let m = m.unwrap();
28119625d8cSopenharmony_ci
28219625d8cSopenharmony_ci    assert!(m.contains_id("option"));
28319625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
28419625d8cSopenharmony_ci    assert_eq!(
28519625d8cSopenharmony_ci        m.get_many::<String>("option")
28619625d8cSopenharmony_ci            .unwrap()
28719625d8cSopenharmony_ci            .map(|v| v.as_str())
28819625d8cSopenharmony_ci            .collect::<Vec<_>>(),
28919625d8cSopenharmony_ci        ["val1", "val2", "val3", "val4"]
29019625d8cSopenharmony_ci    );
29119625d8cSopenharmony_ci    assert_eq!(m.get_one::<String>("arg").map(|v| v.as_str()), Some("pos"));
29219625d8cSopenharmony_ci}
29319625d8cSopenharmony_ci
29419625d8cSopenharmony_ci#[test]
29519625d8cSopenharmony_cifn option_max_exact() {
29619625d8cSopenharmony_ci    let m = Command::new("multiple_values")
29719625d8cSopenharmony_ci        .arg(
29819625d8cSopenharmony_ci            Arg::new("option")
29919625d8cSopenharmony_ci                .short('o')
30019625d8cSopenharmony_ci                .help("multiple options")
30119625d8cSopenharmony_ci                .num_args(1..=3)
30219625d8cSopenharmony_ci                .action(ArgAction::Set),
30319625d8cSopenharmony_ci        )
30419625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-o", "val1", "val2", "val3"]);
30519625d8cSopenharmony_ci
30619625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
30719625d8cSopenharmony_ci    let m = m.unwrap();
30819625d8cSopenharmony_ci
30919625d8cSopenharmony_ci    assert!(m.contains_id("option"));
31019625d8cSopenharmony_ci    assert_eq!(
31119625d8cSopenharmony_ci        m.get_many::<String>("option")
31219625d8cSopenharmony_ci            .unwrap()
31319625d8cSopenharmony_ci            .map(|v| v.as_str())
31419625d8cSopenharmony_ci            .collect::<Vec<_>>(),
31519625d8cSopenharmony_ci        ["val1", "val2", "val3"]
31619625d8cSopenharmony_ci    );
31719625d8cSopenharmony_ci}
31819625d8cSopenharmony_ci
31919625d8cSopenharmony_ci#[test]
32019625d8cSopenharmony_cifn option_max_less() {
32119625d8cSopenharmony_ci    let m = Command::new("multiple_values")
32219625d8cSopenharmony_ci        .arg(
32319625d8cSopenharmony_ci            Arg::new("option")
32419625d8cSopenharmony_ci                .short('o')
32519625d8cSopenharmony_ci                .help("multiple options")
32619625d8cSopenharmony_ci                .num_args(1..=3)
32719625d8cSopenharmony_ci                .action(ArgAction::Set),
32819625d8cSopenharmony_ci        )
32919625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-o", "val1", "val2"]);
33019625d8cSopenharmony_ci
33119625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
33219625d8cSopenharmony_ci    let m = m.unwrap();
33319625d8cSopenharmony_ci
33419625d8cSopenharmony_ci    assert!(m.contains_id("option"));
33519625d8cSopenharmony_ci    assert_eq!(
33619625d8cSopenharmony_ci        m.get_many::<String>("option")
33719625d8cSopenharmony_ci            .unwrap()
33819625d8cSopenharmony_ci            .map(|v| v.as_str())
33919625d8cSopenharmony_ci            .collect::<Vec<_>>(),
34019625d8cSopenharmony_ci        ["val1", "val2"]
34119625d8cSopenharmony_ci    );
34219625d8cSopenharmony_ci}
34319625d8cSopenharmony_ci
34419625d8cSopenharmony_ci#[test]
34519625d8cSopenharmony_cifn option_max_zero() {
34619625d8cSopenharmony_ci    let m = Command::new("multiple_values")
34719625d8cSopenharmony_ci        .arg(
34819625d8cSopenharmony_ci            Arg::new("option")
34919625d8cSopenharmony_ci                .short('o')
35019625d8cSopenharmony_ci                .help("multiple options")
35119625d8cSopenharmony_ci                .num_args(1..=3)
35219625d8cSopenharmony_ci                .action(ArgAction::Set),
35319625d8cSopenharmony_ci        )
35419625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-o"]);
35519625d8cSopenharmony_ci
35619625d8cSopenharmony_ci    assert!(m.is_err());
35719625d8cSopenharmony_ci    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidValue);
35819625d8cSopenharmony_ci}
35919625d8cSopenharmony_ci
36019625d8cSopenharmony_ci#[test]
36119625d8cSopenharmony_cifn option_max_zero_eq() {
36219625d8cSopenharmony_ci    let m = Command::new("multiple_values")
36319625d8cSopenharmony_ci        .arg(
36419625d8cSopenharmony_ci            Arg::new("option")
36519625d8cSopenharmony_ci                .short('o')
36619625d8cSopenharmony_ci                .help("multiple options")
36719625d8cSopenharmony_ci                .num_args(1..=3)
36819625d8cSopenharmony_ci                .action(ArgAction::Set),
36919625d8cSopenharmony_ci        )
37019625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-o="]);
37119625d8cSopenharmony_ci
37219625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
37319625d8cSopenharmony_ci    let m = m.unwrap();
37419625d8cSopenharmony_ci
37519625d8cSopenharmony_ci    assert!(m.contains_id("option"));
37619625d8cSopenharmony_ci    assert_eq!(
37719625d8cSopenharmony_ci        m.get_many::<String>("option")
37819625d8cSopenharmony_ci            .unwrap()
37919625d8cSopenharmony_ci            .map(|v| v.as_str())
38019625d8cSopenharmony_ci            .collect::<Vec<_>>(),
38119625d8cSopenharmony_ci        [""]
38219625d8cSopenharmony_ci    );
38319625d8cSopenharmony_ci}
38419625d8cSopenharmony_ci
38519625d8cSopenharmony_ci#[test]
38619625d8cSopenharmony_cifn option_max_more() {
38719625d8cSopenharmony_ci    let m = Command::new("multiple_values")
38819625d8cSopenharmony_ci        .arg(
38919625d8cSopenharmony_ci            Arg::new("option")
39019625d8cSopenharmony_ci                .short('o')
39119625d8cSopenharmony_ci                .help("multiple options")
39219625d8cSopenharmony_ci                .num_args(1..=3)
39319625d8cSopenharmony_ci                .action(ArgAction::Set),
39419625d8cSopenharmony_ci        )
39519625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-o", "val1", "val2", "val3", "val4"]);
39619625d8cSopenharmony_ci
39719625d8cSopenharmony_ci    assert!(m.is_err());
39819625d8cSopenharmony_ci    // Can end up being TooManyValues or UnknownArgument
39919625d8cSopenharmony_ci    assert_eq!(m.unwrap_err().kind(), ErrorKind::UnknownArgument);
40019625d8cSopenharmony_ci}
40119625d8cSopenharmony_ci
40219625d8cSopenharmony_ci#[test]
40319625d8cSopenharmony_cifn optional_value() {
40419625d8cSopenharmony_ci    let mut cmd = Command::new("test").args_override_self(true).arg(
40519625d8cSopenharmony_ci        Arg::new("port")
40619625d8cSopenharmony_ci            .short('p')
40719625d8cSopenharmony_ci            .value_name("NUM")
40819625d8cSopenharmony_ci            .num_args(0..=1),
40919625d8cSopenharmony_ci    );
41019625d8cSopenharmony_ci
41119625d8cSopenharmony_ci    let r = cmd.try_get_matches_from_mut(["test", "-p42"]);
41219625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
41319625d8cSopenharmony_ci    let m = r.unwrap();
41419625d8cSopenharmony_ci    assert!(m.contains_id("port"));
41519625d8cSopenharmony_ci    assert_eq!(m.get_one::<String>("port").unwrap(), "42");
41619625d8cSopenharmony_ci
41719625d8cSopenharmony_ci    let r = cmd.try_get_matches_from_mut(["test", "-p"]);
41819625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
41919625d8cSopenharmony_ci    let m = r.unwrap();
42019625d8cSopenharmony_ci    assert!(m.contains_id("port"));
42119625d8cSopenharmony_ci    assert!(m.get_one::<String>("port").is_none());
42219625d8cSopenharmony_ci
42319625d8cSopenharmony_ci    let r = cmd.try_get_matches_from_mut(["test", "-p", "24", "-p", "42"]);
42419625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
42519625d8cSopenharmony_ci    let m = r.unwrap();
42619625d8cSopenharmony_ci    assert!(m.contains_id("port"));
42719625d8cSopenharmony_ci    assert_eq!(m.get_one::<String>("port").unwrap(), "42");
42819625d8cSopenharmony_ci
42919625d8cSopenharmony_ci    let help = cmd.render_help().to_string();
43019625d8cSopenharmony_ci    const HELP: &str = "\
43119625d8cSopenharmony_ciUsage: test [OPTIONS]
43219625d8cSopenharmony_ci
43319625d8cSopenharmony_ciOptions:
43419625d8cSopenharmony_ci  -p [<NUM>]
43519625d8cSopenharmony_ci  -h, --help      Print help
43619625d8cSopenharmony_ci";
43719625d8cSopenharmony_ci    snapbox::assert_eq(HELP, help);
43819625d8cSopenharmony_ci}
43919625d8cSopenharmony_ci
44019625d8cSopenharmony_ci#[test]
44119625d8cSopenharmony_cifn positional() {
44219625d8cSopenharmony_ci    let m = Command::new("multiple_values")
44319625d8cSopenharmony_ci        .arg(
44419625d8cSopenharmony_ci            Arg::new("pos")
44519625d8cSopenharmony_ci                .help("multiple positionals")
44619625d8cSopenharmony_ci                .action(ArgAction::Set)
44719625d8cSopenharmony_ci                .num_args(1..),
44819625d8cSopenharmony_ci        )
44919625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog", "val1", "val2", "val3"]);
45019625d8cSopenharmony_ci
45119625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
45219625d8cSopenharmony_ci    let m = m.unwrap();
45319625d8cSopenharmony_ci
45419625d8cSopenharmony_ci    assert!(m.contains_id("pos"));
45519625d8cSopenharmony_ci    assert_eq!(
45619625d8cSopenharmony_ci        m.get_many::<String>("pos")
45719625d8cSopenharmony_ci            .unwrap()
45819625d8cSopenharmony_ci            .map(|v| v.as_str())
45919625d8cSopenharmony_ci            .collect::<Vec<_>>(),
46019625d8cSopenharmony_ci        ["val1", "val2", "val3"]
46119625d8cSopenharmony_ci    );
46219625d8cSopenharmony_ci}
46319625d8cSopenharmony_ci
46419625d8cSopenharmony_ci#[test]
46519625d8cSopenharmony_cifn positional_exact_exact() {
46619625d8cSopenharmony_ci    let m = Command::new("multiple_values")
46719625d8cSopenharmony_ci        .arg(Arg::new("pos").help("multiple positionals").num_args(3))
46819625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog", "val1", "val2", "val3"]);
46919625d8cSopenharmony_ci
47019625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
47119625d8cSopenharmony_ci    let m = m.unwrap();
47219625d8cSopenharmony_ci
47319625d8cSopenharmony_ci    assert!(m.contains_id("pos"));
47419625d8cSopenharmony_ci    assert_eq!(
47519625d8cSopenharmony_ci        m.get_many::<String>("pos")
47619625d8cSopenharmony_ci            .unwrap()
47719625d8cSopenharmony_ci            .map(|v| v.as_str())
47819625d8cSopenharmony_ci            .collect::<Vec<_>>(),
47919625d8cSopenharmony_ci        ["val1", "val2", "val3"]
48019625d8cSopenharmony_ci    );
48119625d8cSopenharmony_ci}
48219625d8cSopenharmony_ci
48319625d8cSopenharmony_ci#[test]
48419625d8cSopenharmony_cifn positional_exact_less() {
48519625d8cSopenharmony_ci    let m = Command::new("multiple_values")
48619625d8cSopenharmony_ci        .arg(Arg::new("pos").help("multiple positionals").num_args(3))
48719625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog", "val1", "val2"]);
48819625d8cSopenharmony_ci
48919625d8cSopenharmony_ci    assert!(m.is_err());
49019625d8cSopenharmony_ci    assert_eq!(m.unwrap_err().kind(), ErrorKind::WrongNumberOfValues);
49119625d8cSopenharmony_ci}
49219625d8cSopenharmony_ci
49319625d8cSopenharmony_ci#[test]
49419625d8cSopenharmony_cifn positional_exact_more() {
49519625d8cSopenharmony_ci    let m = Command::new("multiple_values")
49619625d8cSopenharmony_ci        .arg(Arg::new("pos").help("multiple positionals").num_args(3))
49719625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog", "val1", "val2", "val3", "val4"]);
49819625d8cSopenharmony_ci
49919625d8cSopenharmony_ci    assert!(m.is_err());
50019625d8cSopenharmony_ci    assert_eq!(m.unwrap_err().kind(), ErrorKind::WrongNumberOfValues);
50119625d8cSopenharmony_ci}
50219625d8cSopenharmony_ci
50319625d8cSopenharmony_ci#[test]
50419625d8cSopenharmony_cifn positional_min_exact() {
50519625d8cSopenharmony_ci    let m = Command::new("multiple_values")
50619625d8cSopenharmony_ci        .arg(Arg::new("pos").help("multiple positionals").num_args(3..))
50719625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog", "val1", "val2", "val3"]);
50819625d8cSopenharmony_ci
50919625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
51019625d8cSopenharmony_ci    let m = m.unwrap();
51119625d8cSopenharmony_ci
51219625d8cSopenharmony_ci    assert!(m.contains_id("pos"));
51319625d8cSopenharmony_ci    assert_eq!(
51419625d8cSopenharmony_ci        m.get_many::<String>("pos")
51519625d8cSopenharmony_ci            .unwrap()
51619625d8cSopenharmony_ci            .map(|v| v.as_str())
51719625d8cSopenharmony_ci            .collect::<Vec<_>>(),
51819625d8cSopenharmony_ci        ["val1", "val2", "val3"]
51919625d8cSopenharmony_ci    );
52019625d8cSopenharmony_ci}
52119625d8cSopenharmony_ci
52219625d8cSopenharmony_ci#[test]
52319625d8cSopenharmony_cifn positional_min_less() {
52419625d8cSopenharmony_ci    let m = Command::new("multiple_values")
52519625d8cSopenharmony_ci        .arg(Arg::new("pos").help("multiple positionals").num_args(3..))
52619625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog", "val1", "val2"]);
52719625d8cSopenharmony_ci
52819625d8cSopenharmony_ci    assert!(m.is_err());
52919625d8cSopenharmony_ci    assert_eq!(m.unwrap_err().kind(), ErrorKind::TooFewValues);
53019625d8cSopenharmony_ci}
53119625d8cSopenharmony_ci
53219625d8cSopenharmony_ci#[test]
53319625d8cSopenharmony_cifn positional_min_more() {
53419625d8cSopenharmony_ci    let m = Command::new("multiple_values")
53519625d8cSopenharmony_ci        .arg(Arg::new("pos").help("multiple positionals").num_args(3..))
53619625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog", "val1", "val2", "val3", "val4"]);
53719625d8cSopenharmony_ci
53819625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
53919625d8cSopenharmony_ci    let m = m.unwrap();
54019625d8cSopenharmony_ci
54119625d8cSopenharmony_ci    assert!(m.contains_id("pos"));
54219625d8cSopenharmony_ci    assert_eq!(
54319625d8cSopenharmony_ci        m.get_many::<String>("pos")
54419625d8cSopenharmony_ci            .unwrap()
54519625d8cSopenharmony_ci            .map(|v| v.as_str())
54619625d8cSopenharmony_ci            .collect::<Vec<_>>(),
54719625d8cSopenharmony_ci        ["val1", "val2", "val3", "val4"]
54819625d8cSopenharmony_ci    );
54919625d8cSopenharmony_ci}
55019625d8cSopenharmony_ci
55119625d8cSopenharmony_ci#[test]
55219625d8cSopenharmony_cifn positional_max_exact() {
55319625d8cSopenharmony_ci    let m = Command::new("multiple_values")
55419625d8cSopenharmony_ci        .arg(Arg::new("pos").help("multiple positionals").num_args(1..=3))
55519625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog", "val1", "val2", "val3"]);
55619625d8cSopenharmony_ci
55719625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
55819625d8cSopenharmony_ci    let m = m.unwrap();
55919625d8cSopenharmony_ci
56019625d8cSopenharmony_ci    assert!(m.contains_id("pos"));
56119625d8cSopenharmony_ci    assert_eq!(
56219625d8cSopenharmony_ci        m.get_many::<String>("pos")
56319625d8cSopenharmony_ci            .unwrap()
56419625d8cSopenharmony_ci            .map(|v| v.as_str())
56519625d8cSopenharmony_ci            .collect::<Vec<_>>(),
56619625d8cSopenharmony_ci        ["val1", "val2", "val3"]
56719625d8cSopenharmony_ci    );
56819625d8cSopenharmony_ci}
56919625d8cSopenharmony_ci
57019625d8cSopenharmony_ci#[test]
57119625d8cSopenharmony_cifn positional_max_less() {
57219625d8cSopenharmony_ci    let m = Command::new("multiple_values")
57319625d8cSopenharmony_ci        .arg(Arg::new("pos").help("multiple positionals").num_args(1..=3))
57419625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog", "val1", "val2"]);
57519625d8cSopenharmony_ci
57619625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
57719625d8cSopenharmony_ci    let m = m.unwrap();
57819625d8cSopenharmony_ci
57919625d8cSopenharmony_ci    assert!(m.contains_id("pos"));
58019625d8cSopenharmony_ci    assert_eq!(
58119625d8cSopenharmony_ci        m.get_many::<String>("pos")
58219625d8cSopenharmony_ci            .unwrap()
58319625d8cSopenharmony_ci            .map(|v| v.as_str())
58419625d8cSopenharmony_ci            .collect::<Vec<_>>(),
58519625d8cSopenharmony_ci        ["val1", "val2"]
58619625d8cSopenharmony_ci    );
58719625d8cSopenharmony_ci}
58819625d8cSopenharmony_ci
58919625d8cSopenharmony_ci#[test]
59019625d8cSopenharmony_cifn positional_max_more() {
59119625d8cSopenharmony_ci    let m = Command::new("multiple_values")
59219625d8cSopenharmony_ci        .arg(Arg::new("pos").help("multiple positionals").num_args(1..=3))
59319625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog", "val1", "val2", "val3", "val4"]);
59419625d8cSopenharmony_ci
59519625d8cSopenharmony_ci    assert!(m.is_err());
59619625d8cSopenharmony_ci    assert_eq!(m.unwrap_err().kind(), ErrorKind::TooManyValues);
59719625d8cSopenharmony_ci}
59819625d8cSopenharmony_ci
59919625d8cSopenharmony_ci#[test]
60019625d8cSopenharmony_cifn sep_long_equals() {
60119625d8cSopenharmony_ci    let m = Command::new("multiple_values")
60219625d8cSopenharmony_ci        .arg(
60319625d8cSopenharmony_ci            Arg::new("option")
60419625d8cSopenharmony_ci                .long("option")
60519625d8cSopenharmony_ci                .help("multiple options")
60619625d8cSopenharmony_ci                .value_delimiter(','),
60719625d8cSopenharmony_ci        )
60819625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--option=val1,val2,val3"]);
60919625d8cSopenharmony_ci
61019625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
61119625d8cSopenharmony_ci    let m = m.unwrap();
61219625d8cSopenharmony_ci
61319625d8cSopenharmony_ci    assert!(m.contains_id("option"));
61419625d8cSopenharmony_ci    assert_eq!(
61519625d8cSopenharmony_ci        m.get_many::<String>("option")
61619625d8cSopenharmony_ci            .unwrap()
61719625d8cSopenharmony_ci            .map(|v| v.as_str())
61819625d8cSopenharmony_ci            .collect::<Vec<_>>(),
61919625d8cSopenharmony_ci        ["val1", "val2", "val3"]
62019625d8cSopenharmony_ci    );
62119625d8cSopenharmony_ci}
62219625d8cSopenharmony_ci
62319625d8cSopenharmony_ci#[test]
62419625d8cSopenharmony_cifn sep_long_space() {
62519625d8cSopenharmony_ci    let m = Command::new("multiple_values")
62619625d8cSopenharmony_ci        .arg(
62719625d8cSopenharmony_ci            Arg::new("option")
62819625d8cSopenharmony_ci                .long("option")
62919625d8cSopenharmony_ci                .help("multiple options")
63019625d8cSopenharmony_ci                .value_delimiter(','),
63119625d8cSopenharmony_ci        )
63219625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--option", "val1,val2,val3"]);
63319625d8cSopenharmony_ci
63419625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
63519625d8cSopenharmony_ci    let m = m.unwrap();
63619625d8cSopenharmony_ci
63719625d8cSopenharmony_ci    assert!(m.contains_id("option"));
63819625d8cSopenharmony_ci    assert_eq!(
63919625d8cSopenharmony_ci        m.get_many::<String>("option")
64019625d8cSopenharmony_ci            .unwrap()
64119625d8cSopenharmony_ci            .map(|v| v.as_str())
64219625d8cSopenharmony_ci            .collect::<Vec<_>>(),
64319625d8cSopenharmony_ci        ["val1", "val2", "val3"]
64419625d8cSopenharmony_ci    );
64519625d8cSopenharmony_ci}
64619625d8cSopenharmony_ci
64719625d8cSopenharmony_ci#[test]
64819625d8cSopenharmony_cifn sep_short_equals() {
64919625d8cSopenharmony_ci    let m = Command::new("multiple_values")
65019625d8cSopenharmony_ci        .arg(
65119625d8cSopenharmony_ci            Arg::new("option")
65219625d8cSopenharmony_ci                .short('o')
65319625d8cSopenharmony_ci                .help("multiple options")
65419625d8cSopenharmony_ci                .value_delimiter(','),
65519625d8cSopenharmony_ci        )
65619625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-o=val1,val2,val3"]);
65719625d8cSopenharmony_ci
65819625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
65919625d8cSopenharmony_ci    let m = m.unwrap();
66019625d8cSopenharmony_ci
66119625d8cSopenharmony_ci    assert!(m.contains_id("option"));
66219625d8cSopenharmony_ci    assert_eq!(
66319625d8cSopenharmony_ci        m.get_many::<String>("option")
66419625d8cSopenharmony_ci            .unwrap()
66519625d8cSopenharmony_ci            .map(|v| v.as_str())
66619625d8cSopenharmony_ci            .collect::<Vec<_>>(),
66719625d8cSopenharmony_ci        ["val1", "val2", "val3"]
66819625d8cSopenharmony_ci    );
66919625d8cSopenharmony_ci}
67019625d8cSopenharmony_ci
67119625d8cSopenharmony_ci#[test]
67219625d8cSopenharmony_cifn sep_short_space() {
67319625d8cSopenharmony_ci    let m = Command::new("multiple_values")
67419625d8cSopenharmony_ci        .arg(
67519625d8cSopenharmony_ci            Arg::new("option")
67619625d8cSopenharmony_ci                .short('o')
67719625d8cSopenharmony_ci                .help("multiple options")
67819625d8cSopenharmony_ci                .value_delimiter(','),
67919625d8cSopenharmony_ci        )
68019625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-o", "val1,val2,val3"]);
68119625d8cSopenharmony_ci
68219625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
68319625d8cSopenharmony_ci    let m = m.unwrap();
68419625d8cSopenharmony_ci
68519625d8cSopenharmony_ci    assert!(m.contains_id("option"));
68619625d8cSopenharmony_ci    assert_eq!(
68719625d8cSopenharmony_ci        m.get_many::<String>("option")
68819625d8cSopenharmony_ci            .unwrap()
68919625d8cSopenharmony_ci            .map(|v| v.as_str())
69019625d8cSopenharmony_ci            .collect::<Vec<_>>(),
69119625d8cSopenharmony_ci        ["val1", "val2", "val3"]
69219625d8cSopenharmony_ci    );
69319625d8cSopenharmony_ci}
69419625d8cSopenharmony_ci
69519625d8cSopenharmony_ci#[test]
69619625d8cSopenharmony_cifn sep_short_no_space() {
69719625d8cSopenharmony_ci    let m = Command::new("multiple_values")
69819625d8cSopenharmony_ci        .arg(
69919625d8cSopenharmony_ci            Arg::new("option")
70019625d8cSopenharmony_ci                .short('o')
70119625d8cSopenharmony_ci                .help("multiple options")
70219625d8cSopenharmony_ci                .value_delimiter(','),
70319625d8cSopenharmony_ci        )
70419625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-oval1,val2,val3"]);
70519625d8cSopenharmony_ci
70619625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
70719625d8cSopenharmony_ci    let m = m.unwrap();
70819625d8cSopenharmony_ci
70919625d8cSopenharmony_ci    assert!(m.contains_id("option"));
71019625d8cSopenharmony_ci    assert_eq!(
71119625d8cSopenharmony_ci        m.get_many::<String>("option")
71219625d8cSopenharmony_ci            .unwrap()
71319625d8cSopenharmony_ci            .map(|v| v.as_str())
71419625d8cSopenharmony_ci            .collect::<Vec<_>>(),
71519625d8cSopenharmony_ci        ["val1", "val2", "val3"]
71619625d8cSopenharmony_ci    );
71719625d8cSopenharmony_ci}
71819625d8cSopenharmony_ci
71919625d8cSopenharmony_ci#[test]
72019625d8cSopenharmony_cifn sep_positional() {
72119625d8cSopenharmony_ci    let m = Command::new("multiple_values")
72219625d8cSopenharmony_ci        .arg(
72319625d8cSopenharmony_ci            Arg::new("option")
72419625d8cSopenharmony_ci                .help("multiple options")
72519625d8cSopenharmony_ci                .value_delimiter(','),
72619625d8cSopenharmony_ci        )
72719625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "val1,val2,val3"]);
72819625d8cSopenharmony_ci
72919625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
73019625d8cSopenharmony_ci    let m = m.unwrap();
73119625d8cSopenharmony_ci
73219625d8cSopenharmony_ci    assert!(m.contains_id("option"));
73319625d8cSopenharmony_ci    assert_eq!(
73419625d8cSopenharmony_ci        m.get_many::<String>("option")
73519625d8cSopenharmony_ci            .unwrap()
73619625d8cSopenharmony_ci            .map(|v| v.as_str())
73719625d8cSopenharmony_ci            .collect::<Vec<_>>(),
73819625d8cSopenharmony_ci        ["val1", "val2", "val3"]
73919625d8cSopenharmony_ci    );
74019625d8cSopenharmony_ci}
74119625d8cSopenharmony_ci
74219625d8cSopenharmony_ci#[test]
74319625d8cSopenharmony_cifn different_sep() {
74419625d8cSopenharmony_ci    let m = Command::new("multiple_values")
74519625d8cSopenharmony_ci        .arg(
74619625d8cSopenharmony_ci            Arg::new("option")
74719625d8cSopenharmony_ci                .long("option")
74819625d8cSopenharmony_ci                .help("multiple options")
74919625d8cSopenharmony_ci                .value_delimiter(';'),
75019625d8cSopenharmony_ci        )
75119625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--option=val1;val2;val3"]);
75219625d8cSopenharmony_ci
75319625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
75419625d8cSopenharmony_ci    let m = m.unwrap();
75519625d8cSopenharmony_ci
75619625d8cSopenharmony_ci    assert!(m.contains_id("option"));
75719625d8cSopenharmony_ci    assert_eq!(
75819625d8cSopenharmony_ci        m.get_many::<String>("option")
75919625d8cSopenharmony_ci            .unwrap()
76019625d8cSopenharmony_ci            .map(|v| v.as_str())
76119625d8cSopenharmony_ci            .collect::<Vec<_>>(),
76219625d8cSopenharmony_ci        ["val1", "val2", "val3"]
76319625d8cSopenharmony_ci    );
76419625d8cSopenharmony_ci}
76519625d8cSopenharmony_ci
76619625d8cSopenharmony_ci#[test]
76719625d8cSopenharmony_cifn different_sep_positional() {
76819625d8cSopenharmony_ci    let m = Command::new("multiple_values")
76919625d8cSopenharmony_ci        .arg(
77019625d8cSopenharmony_ci            Arg::new("option")
77119625d8cSopenharmony_ci                .help("multiple options")
77219625d8cSopenharmony_ci                .value_delimiter(';'),
77319625d8cSopenharmony_ci        )
77419625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "val1;val2;val3"]);
77519625d8cSopenharmony_ci
77619625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
77719625d8cSopenharmony_ci    let m = m.unwrap();
77819625d8cSopenharmony_ci
77919625d8cSopenharmony_ci    assert!(m.contains_id("option"));
78019625d8cSopenharmony_ci    assert_eq!(
78119625d8cSopenharmony_ci        m.get_many::<String>("option")
78219625d8cSopenharmony_ci            .unwrap()
78319625d8cSopenharmony_ci            .map(|v| v.as_str())
78419625d8cSopenharmony_ci            .collect::<Vec<_>>(),
78519625d8cSopenharmony_ci        ["val1", "val2", "val3"]
78619625d8cSopenharmony_ci    );
78719625d8cSopenharmony_ci}
78819625d8cSopenharmony_ci
78919625d8cSopenharmony_ci#[test]
79019625d8cSopenharmony_cifn no_sep() {
79119625d8cSopenharmony_ci    let m = Command::new("multiple_values")
79219625d8cSopenharmony_ci        .arg(
79319625d8cSopenharmony_ci            Arg::new("option")
79419625d8cSopenharmony_ci                .long("option")
79519625d8cSopenharmony_ci                .help("multiple options")
79619625d8cSopenharmony_ci                .action(ArgAction::Set),
79719625d8cSopenharmony_ci        )
79819625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--option=val1,val2,val3"]);
79919625d8cSopenharmony_ci
80019625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
80119625d8cSopenharmony_ci    let m = m.unwrap();
80219625d8cSopenharmony_ci
80319625d8cSopenharmony_ci    assert!(m.contains_id("option"));
80419625d8cSopenharmony_ci    assert_eq!(
80519625d8cSopenharmony_ci        m.get_one::<String>("option").map(|v| v.as_str()).unwrap(),
80619625d8cSopenharmony_ci        "val1,val2,val3"
80719625d8cSopenharmony_ci    );
80819625d8cSopenharmony_ci}
80919625d8cSopenharmony_ci
81019625d8cSopenharmony_ci#[test]
81119625d8cSopenharmony_cifn no_sep_positional() {
81219625d8cSopenharmony_ci    let m = Command::new("multiple_values")
81319625d8cSopenharmony_ci        .arg(
81419625d8cSopenharmony_ci            Arg::new("option")
81519625d8cSopenharmony_ci                .help("multiple options")
81619625d8cSopenharmony_ci                .action(ArgAction::Set),
81719625d8cSopenharmony_ci        )
81819625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "val1,val2,val3"]);
81919625d8cSopenharmony_ci
82019625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
82119625d8cSopenharmony_ci    let m = m.unwrap();
82219625d8cSopenharmony_ci
82319625d8cSopenharmony_ci    assert!(m.contains_id("option"));
82419625d8cSopenharmony_ci    assert_eq!(
82519625d8cSopenharmony_ci        m.get_one::<String>("option").map(|v| v.as_str()).unwrap(),
82619625d8cSopenharmony_ci        "val1,val2,val3"
82719625d8cSopenharmony_ci    );
82819625d8cSopenharmony_ci}
82919625d8cSopenharmony_ci
83019625d8cSopenharmony_ci#[test]
83119625d8cSopenharmony_cifn req_delimiter_long() {
83219625d8cSopenharmony_ci    let m = Command::new("multiple_values")
83319625d8cSopenharmony_ci        .arg(
83419625d8cSopenharmony_ci            Arg::new("option")
83519625d8cSopenharmony_ci                .long("option")
83619625d8cSopenharmony_ci                .num_args(1)
83719625d8cSopenharmony_ci                .value_delimiter(','),
83819625d8cSopenharmony_ci        )
83919625d8cSopenharmony_ci        .arg(
84019625d8cSopenharmony_ci            Arg::new("args")
84119625d8cSopenharmony_ci                .action(ArgAction::Set)
84219625d8cSopenharmony_ci                .num_args(1..)
84319625d8cSopenharmony_ci                .index(1),
84419625d8cSopenharmony_ci        )
84519625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--option", "val1", "val2", "val3"]);
84619625d8cSopenharmony_ci
84719625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
84819625d8cSopenharmony_ci    let m = m.unwrap();
84919625d8cSopenharmony_ci
85019625d8cSopenharmony_ci    assert!(m.contains_id("option"));
85119625d8cSopenharmony_ci    assert_eq!(
85219625d8cSopenharmony_ci        m.get_many::<String>("option")
85319625d8cSopenharmony_ci            .unwrap()
85419625d8cSopenharmony_ci            .map(|v| v.as_str())
85519625d8cSopenharmony_ci            .collect::<Vec<_>>(),
85619625d8cSopenharmony_ci        ["val1"]
85719625d8cSopenharmony_ci    );
85819625d8cSopenharmony_ci    assert_eq!(
85919625d8cSopenharmony_ci        m.get_many::<String>("args")
86019625d8cSopenharmony_ci            .unwrap()
86119625d8cSopenharmony_ci            .map(|v| v.as_str())
86219625d8cSopenharmony_ci            .collect::<Vec<_>>(),
86319625d8cSopenharmony_ci        ["val2", "val3"]
86419625d8cSopenharmony_ci    );
86519625d8cSopenharmony_ci}
86619625d8cSopenharmony_ci
86719625d8cSopenharmony_ci#[test]
86819625d8cSopenharmony_cifn req_delimiter_long_with_equal() {
86919625d8cSopenharmony_ci    let m = Command::new("multiple_values")
87019625d8cSopenharmony_ci        .arg(
87119625d8cSopenharmony_ci            Arg::new("option")
87219625d8cSopenharmony_ci                .long("option")
87319625d8cSopenharmony_ci                .num_args(1)
87419625d8cSopenharmony_ci                .value_delimiter(','),
87519625d8cSopenharmony_ci        )
87619625d8cSopenharmony_ci        .arg(
87719625d8cSopenharmony_ci            Arg::new("args")
87819625d8cSopenharmony_ci                .action(ArgAction::Set)
87919625d8cSopenharmony_ci                .num_args(1..)
88019625d8cSopenharmony_ci                .index(1),
88119625d8cSopenharmony_ci        )
88219625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--option=val1", "val2", "val3"]);
88319625d8cSopenharmony_ci
88419625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
88519625d8cSopenharmony_ci    let m = m.unwrap();
88619625d8cSopenharmony_ci
88719625d8cSopenharmony_ci    assert!(m.contains_id("option"));
88819625d8cSopenharmony_ci    assert_eq!(
88919625d8cSopenharmony_ci        m.get_many::<String>("option")
89019625d8cSopenharmony_ci            .unwrap()
89119625d8cSopenharmony_ci            .map(|v| v.as_str())
89219625d8cSopenharmony_ci            .collect::<Vec<_>>(),
89319625d8cSopenharmony_ci        ["val1"]
89419625d8cSopenharmony_ci    );
89519625d8cSopenharmony_ci    assert_eq!(
89619625d8cSopenharmony_ci        m.get_many::<String>("args")
89719625d8cSopenharmony_ci            .unwrap()
89819625d8cSopenharmony_ci            .map(|v| v.as_str())
89919625d8cSopenharmony_ci            .collect::<Vec<_>>(),
90019625d8cSopenharmony_ci        ["val2", "val3"]
90119625d8cSopenharmony_ci    );
90219625d8cSopenharmony_ci}
90319625d8cSopenharmony_ci
90419625d8cSopenharmony_ci#[test]
90519625d8cSopenharmony_cifn req_delimiter_short_with_space() {
90619625d8cSopenharmony_ci    let m = Command::new("multiple_values")
90719625d8cSopenharmony_ci        .arg(
90819625d8cSopenharmony_ci            Arg::new("option")
90919625d8cSopenharmony_ci                .short('o')
91019625d8cSopenharmony_ci                .num_args(1)
91119625d8cSopenharmony_ci                .value_delimiter(','),
91219625d8cSopenharmony_ci        )
91319625d8cSopenharmony_ci        .arg(
91419625d8cSopenharmony_ci            Arg::new("args")
91519625d8cSopenharmony_ci                .action(ArgAction::Set)
91619625d8cSopenharmony_ci                .num_args(1..)
91719625d8cSopenharmony_ci                .index(1),
91819625d8cSopenharmony_ci        )
91919625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-o", "val1", "val2", "val3"]);
92019625d8cSopenharmony_ci
92119625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
92219625d8cSopenharmony_ci    let m = m.unwrap();
92319625d8cSopenharmony_ci
92419625d8cSopenharmony_ci    assert!(m.contains_id("option"));
92519625d8cSopenharmony_ci    assert_eq!(
92619625d8cSopenharmony_ci        m.get_many::<String>("option")
92719625d8cSopenharmony_ci            .unwrap()
92819625d8cSopenharmony_ci            .map(|v| v.as_str())
92919625d8cSopenharmony_ci            .collect::<Vec<_>>(),
93019625d8cSopenharmony_ci        ["val1"]
93119625d8cSopenharmony_ci    );
93219625d8cSopenharmony_ci    assert_eq!(
93319625d8cSopenharmony_ci        m.get_many::<String>("args")
93419625d8cSopenharmony_ci            .unwrap()
93519625d8cSopenharmony_ci            .map(|v| v.as_str())
93619625d8cSopenharmony_ci            .collect::<Vec<_>>(),
93719625d8cSopenharmony_ci        ["val2", "val3"]
93819625d8cSopenharmony_ci    );
93919625d8cSopenharmony_ci}
94019625d8cSopenharmony_ci
94119625d8cSopenharmony_ci#[test]
94219625d8cSopenharmony_cifn req_delimiter_short_with_no_space() {
94319625d8cSopenharmony_ci    let m = Command::new("multiple_values")
94419625d8cSopenharmony_ci        .arg(
94519625d8cSopenharmony_ci            Arg::new("option")
94619625d8cSopenharmony_ci                .short('o')
94719625d8cSopenharmony_ci                .num_args(1)
94819625d8cSopenharmony_ci                .value_delimiter(','),
94919625d8cSopenharmony_ci        )
95019625d8cSopenharmony_ci        .arg(
95119625d8cSopenharmony_ci            Arg::new("args")
95219625d8cSopenharmony_ci                .action(ArgAction::Set)
95319625d8cSopenharmony_ci                .num_args(1..)
95419625d8cSopenharmony_ci                .index(1),
95519625d8cSopenharmony_ci        )
95619625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-oval1", "val2", "val3"]);
95719625d8cSopenharmony_ci
95819625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
95919625d8cSopenharmony_ci    let m = m.unwrap();
96019625d8cSopenharmony_ci
96119625d8cSopenharmony_ci    assert!(m.contains_id("option"));
96219625d8cSopenharmony_ci    assert_eq!(
96319625d8cSopenharmony_ci        m.get_many::<String>("option")
96419625d8cSopenharmony_ci            .unwrap()
96519625d8cSopenharmony_ci            .map(|v| v.as_str())
96619625d8cSopenharmony_ci            .collect::<Vec<_>>(),
96719625d8cSopenharmony_ci        ["val1"]
96819625d8cSopenharmony_ci    );
96919625d8cSopenharmony_ci    assert_eq!(
97019625d8cSopenharmony_ci        m.get_many::<String>("args")
97119625d8cSopenharmony_ci            .unwrap()
97219625d8cSopenharmony_ci            .map(|v| v.as_str())
97319625d8cSopenharmony_ci            .collect::<Vec<_>>(),
97419625d8cSopenharmony_ci        ["val2", "val3"]
97519625d8cSopenharmony_ci    );
97619625d8cSopenharmony_ci}
97719625d8cSopenharmony_ci
97819625d8cSopenharmony_ci#[test]
97919625d8cSopenharmony_cifn req_delimiter_short_with_equal() {
98019625d8cSopenharmony_ci    let m = Command::new("multiple_values")
98119625d8cSopenharmony_ci        .arg(
98219625d8cSopenharmony_ci            Arg::new("option")
98319625d8cSopenharmony_ci                .short('o')
98419625d8cSopenharmony_ci                .num_args(1)
98519625d8cSopenharmony_ci                .value_delimiter(','),
98619625d8cSopenharmony_ci        )
98719625d8cSopenharmony_ci        .arg(
98819625d8cSopenharmony_ci            Arg::new("args")
98919625d8cSopenharmony_ci                .action(ArgAction::Set)
99019625d8cSopenharmony_ci                .num_args(1..)
99119625d8cSopenharmony_ci                .index(1),
99219625d8cSopenharmony_ci        )
99319625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-o=val1", "val2", "val3"]);
99419625d8cSopenharmony_ci
99519625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
99619625d8cSopenharmony_ci    let m = m.unwrap();
99719625d8cSopenharmony_ci
99819625d8cSopenharmony_ci    assert!(m.contains_id("option"));
99919625d8cSopenharmony_ci    assert_eq!(
100019625d8cSopenharmony_ci        m.get_many::<String>("option")
100119625d8cSopenharmony_ci            .unwrap()
100219625d8cSopenharmony_ci            .map(|v| v.as_str())
100319625d8cSopenharmony_ci            .collect::<Vec<_>>(),
100419625d8cSopenharmony_ci        ["val1"]
100519625d8cSopenharmony_ci    );
100619625d8cSopenharmony_ci    assert_eq!(
100719625d8cSopenharmony_ci        m.get_many::<String>("args")
100819625d8cSopenharmony_ci            .unwrap()
100919625d8cSopenharmony_ci            .map(|v| v.as_str())
101019625d8cSopenharmony_ci            .collect::<Vec<_>>(),
101119625d8cSopenharmony_ci        ["val2", "val3"]
101219625d8cSopenharmony_ci    );
101319625d8cSopenharmony_ci}
101419625d8cSopenharmony_ci
101519625d8cSopenharmony_ci#[test]
101619625d8cSopenharmony_cifn req_delimiter_complex() {
101719625d8cSopenharmony_ci    let m = Command::new("multiple_values")
101819625d8cSopenharmony_ci        .arg(
101919625d8cSopenharmony_ci            Arg::new("option")
102019625d8cSopenharmony_ci                .long("option")
102119625d8cSopenharmony_ci                .short('o')
102219625d8cSopenharmony_ci                .num_args(1)
102319625d8cSopenharmony_ci                .action(ArgAction::Append)
102419625d8cSopenharmony_ci                .value_delimiter(','),
102519625d8cSopenharmony_ci        )
102619625d8cSopenharmony_ci        .arg(Arg::new("args").num_args(1..).index(1))
102719625d8cSopenharmony_ci        .try_get_matches_from(vec![
102819625d8cSopenharmony_ci            "",
102919625d8cSopenharmony_ci            "val1",
103019625d8cSopenharmony_ci            "-oval2",
103119625d8cSopenharmony_ci            "val3",
103219625d8cSopenharmony_ci            "-o",
103319625d8cSopenharmony_ci            "val4",
103419625d8cSopenharmony_ci            "val5",
103519625d8cSopenharmony_ci            "-o=val6",
103619625d8cSopenharmony_ci            "val7",
103719625d8cSopenharmony_ci            "--option=val8",
103819625d8cSopenharmony_ci            "val9",
103919625d8cSopenharmony_ci            "--option",
104019625d8cSopenharmony_ci            "val10",
104119625d8cSopenharmony_ci            "val11",
104219625d8cSopenharmony_ci            "-oval12,val13",
104319625d8cSopenharmony_ci            "val14",
104419625d8cSopenharmony_ci            "-o",
104519625d8cSopenharmony_ci            "val15,val16",
104619625d8cSopenharmony_ci            "val17",
104719625d8cSopenharmony_ci            "-o=val18,val19",
104819625d8cSopenharmony_ci            "val20",
104919625d8cSopenharmony_ci            "--option=val21,val22",
105019625d8cSopenharmony_ci            "val23",
105119625d8cSopenharmony_ci            "--option",
105219625d8cSopenharmony_ci            "val24,val25",
105319625d8cSopenharmony_ci            "val26",
105419625d8cSopenharmony_ci        ]);
105519625d8cSopenharmony_ci
105619625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
105719625d8cSopenharmony_ci    let m = m.unwrap();
105819625d8cSopenharmony_ci
105919625d8cSopenharmony_ci    assert!(m.contains_id("option"));
106019625d8cSopenharmony_ci    assert_eq!(
106119625d8cSopenharmony_ci        m.get_many::<String>("option")
106219625d8cSopenharmony_ci            .unwrap()
106319625d8cSopenharmony_ci            .map(|v| v.as_str())
106419625d8cSopenharmony_ci            .collect::<Vec<_>>(),
106519625d8cSopenharmony_ci        [
106619625d8cSopenharmony_ci            "val2", "val4", "val6", "val8", "val10", "val12", "val13", "val15", "val16", "val18",
106719625d8cSopenharmony_ci            "val19", "val21", "val22", "val24", "val25",
106819625d8cSopenharmony_ci        ]
106919625d8cSopenharmony_ci    );
107019625d8cSopenharmony_ci    assert_eq!(
107119625d8cSopenharmony_ci        m.get_many::<String>("args")
107219625d8cSopenharmony_ci            .unwrap()
107319625d8cSopenharmony_ci            .map(|v| v.as_str())
107419625d8cSopenharmony_ci            .collect::<Vec<_>>(),
107519625d8cSopenharmony_ci        [
107619625d8cSopenharmony_ci            "val1", "val3", "val5", "val7", "val9", "val11", "val14", "val17", "val20", "val23",
107719625d8cSopenharmony_ci            "val26",
107819625d8cSopenharmony_ci        ]
107919625d8cSopenharmony_ci    );
108019625d8cSopenharmony_ci}
108119625d8cSopenharmony_ci
108219625d8cSopenharmony_ci// This tests a programmer error and will only succeed with debug_assertions
108319625d8cSopenharmony_ci#[cfg(debug_assertions)]
108419625d8cSopenharmony_ci#[test]
108519625d8cSopenharmony_ci#[should_panic = "When using a positional argument with \
108619625d8cSopenharmony_ci`.num_args(1..)` that is *not the last* positional argument, the last \
108719625d8cSopenharmony_cipositional argument (i.e. the one with the highest index) *must* have \
108819625d8cSopenharmony_ci.required(true) or .last(true) set."]
108919625d8cSopenharmony_cifn low_index_positional_not_required() {
109019625d8cSopenharmony_ci    let _ = Command::new("lip")
109119625d8cSopenharmony_ci        .arg(
109219625d8cSopenharmony_ci            Arg::new("files")
109319625d8cSopenharmony_ci                .index(1)
109419625d8cSopenharmony_ci                .action(ArgAction::Set)
109519625d8cSopenharmony_ci                .required(true)
109619625d8cSopenharmony_ci                .num_args(1..),
109719625d8cSopenharmony_ci        )
109819625d8cSopenharmony_ci        .arg(Arg::new("target").index(2))
109919625d8cSopenharmony_ci        .try_get_matches_from(vec![""]);
110019625d8cSopenharmony_ci}
110119625d8cSopenharmony_ci
110219625d8cSopenharmony_ci// This tests a programmer error and will only succeed with debug_assertions
110319625d8cSopenharmony_ci#[cfg(debug_assertions)]
110419625d8cSopenharmony_ci#[test]
110519625d8cSopenharmony_ci#[should_panic = "Only one positional argument with `.num_args(1..)` \
110619625d8cSopenharmony_ciset is allowed per command, unless the second one also has .last(true) set"]
110719625d8cSopenharmony_cifn low_index_positional_last_multiple_too() {
110819625d8cSopenharmony_ci    let _ = Command::new("lip")
110919625d8cSopenharmony_ci        .arg(
111019625d8cSopenharmony_ci            Arg::new("files")
111119625d8cSopenharmony_ci                .index(1)
111219625d8cSopenharmony_ci                .action(ArgAction::Set)
111319625d8cSopenharmony_ci                .required(true)
111419625d8cSopenharmony_ci                .num_args(1..),
111519625d8cSopenharmony_ci        )
111619625d8cSopenharmony_ci        .arg(
111719625d8cSopenharmony_ci            Arg::new("target")
111819625d8cSopenharmony_ci                .index(2)
111919625d8cSopenharmony_ci                .action(ArgAction::Set)
112019625d8cSopenharmony_ci                .required(true)
112119625d8cSopenharmony_ci                .num_args(1..),
112219625d8cSopenharmony_ci        )
112319625d8cSopenharmony_ci        .try_get_matches_from(vec![""]);
112419625d8cSopenharmony_ci}
112519625d8cSopenharmony_ci
112619625d8cSopenharmony_ci// This tests a programmer error and will only succeed with debug_assertions
112719625d8cSopenharmony_ci#[cfg(debug_assertions)]
112819625d8cSopenharmony_ci#[test]
112919625d8cSopenharmony_ci#[should_panic = "Only the last positional argument, or second to \
113019625d8cSopenharmony_cilast positional argument may be set to `.num_args(1..)`"]
113119625d8cSopenharmony_cifn low_index_positional_too_far_back() {
113219625d8cSopenharmony_ci    let _ = Command::new("lip")
113319625d8cSopenharmony_ci        .arg(
113419625d8cSopenharmony_ci            Arg::new("files")
113519625d8cSopenharmony_ci                .index(1)
113619625d8cSopenharmony_ci                .action(ArgAction::Set)
113719625d8cSopenharmony_ci                .required(true)
113819625d8cSopenharmony_ci                .num_args(1..),
113919625d8cSopenharmony_ci        )
114019625d8cSopenharmony_ci        .arg(Arg::new("target").required(true).index(2))
114119625d8cSopenharmony_ci        .arg(Arg::new("target2").required(true).index(3))
114219625d8cSopenharmony_ci        .try_get_matches_from(vec![""]);
114319625d8cSopenharmony_ci}
114419625d8cSopenharmony_ci
114519625d8cSopenharmony_ci#[test]
114619625d8cSopenharmony_cifn low_index_positional() {
114719625d8cSopenharmony_ci    let m = Command::new("lip")
114819625d8cSopenharmony_ci        .arg(
114919625d8cSopenharmony_ci            Arg::new("files")
115019625d8cSopenharmony_ci                .index(1)
115119625d8cSopenharmony_ci                .action(ArgAction::Set)
115219625d8cSopenharmony_ci                .required(true)
115319625d8cSopenharmony_ci                .num_args(1..),
115419625d8cSopenharmony_ci        )
115519625d8cSopenharmony_ci        .arg(Arg::new("target").index(2).required(true))
115619625d8cSopenharmony_ci        .try_get_matches_from(vec!["lip", "file1", "file2", "file3", "target"]);
115719625d8cSopenharmony_ci
115819625d8cSopenharmony_ci    assert!(m.is_ok(), "{:?}", m.unwrap_err().kind());
115919625d8cSopenharmony_ci    let m = m.unwrap();
116019625d8cSopenharmony_ci
116119625d8cSopenharmony_ci    assert!(m.contains_id("files"));
116219625d8cSopenharmony_ci    assert_eq!(
116319625d8cSopenharmony_ci        m.get_many::<String>("files")
116419625d8cSopenharmony_ci            .unwrap()
116519625d8cSopenharmony_ci            .map(|v| v.as_str())
116619625d8cSopenharmony_ci            .collect::<Vec<_>>(),
116719625d8cSopenharmony_ci        ["file1", "file2", "file3"]
116819625d8cSopenharmony_ci    );
116919625d8cSopenharmony_ci    assert!(m.contains_id("target"));
117019625d8cSopenharmony_ci    assert_eq!(
117119625d8cSopenharmony_ci        m.get_one::<String>("target").map(|v| v.as_str()).unwrap(),
117219625d8cSopenharmony_ci        "target"
117319625d8cSopenharmony_ci    );
117419625d8cSopenharmony_ci}
117519625d8cSopenharmony_ci
117619625d8cSopenharmony_ci#[test]
117719625d8cSopenharmony_cifn low_index_positional_in_subcmd() {
117819625d8cSopenharmony_ci    let m = Command::new("lip")
117919625d8cSopenharmony_ci        .subcommand(
118019625d8cSopenharmony_ci            Command::new("test")
118119625d8cSopenharmony_ci                .arg(
118219625d8cSopenharmony_ci                    Arg::new("files")
118319625d8cSopenharmony_ci                        .index(1)
118419625d8cSopenharmony_ci                        .action(ArgAction::Set)
118519625d8cSopenharmony_ci                        .required(true)
118619625d8cSopenharmony_ci                        .num_args(1..),
118719625d8cSopenharmony_ci                )
118819625d8cSopenharmony_ci                .arg(Arg::new("target").index(2).required(true)),
118919625d8cSopenharmony_ci        )
119019625d8cSopenharmony_ci        .try_get_matches_from(vec!["lip", "test", "file1", "file2", "file3", "target"]);
119119625d8cSopenharmony_ci
119219625d8cSopenharmony_ci    assert!(m.is_ok(), "{:?}", m.unwrap_err().kind());
119319625d8cSopenharmony_ci    let m = m.unwrap();
119419625d8cSopenharmony_ci    let sm = m.subcommand_matches("test").unwrap();
119519625d8cSopenharmony_ci
119619625d8cSopenharmony_ci    assert!(sm.contains_id("files"));
119719625d8cSopenharmony_ci    assert_eq!(
119819625d8cSopenharmony_ci        sm.get_many::<String>("files")
119919625d8cSopenharmony_ci            .unwrap()
120019625d8cSopenharmony_ci            .map(|v| v.as_str())
120119625d8cSopenharmony_ci            .collect::<Vec<_>>(),
120219625d8cSopenharmony_ci        ["file1", "file2", "file3"]
120319625d8cSopenharmony_ci    );
120419625d8cSopenharmony_ci    assert!(sm.contains_id("target"));
120519625d8cSopenharmony_ci    assert_eq!(
120619625d8cSopenharmony_ci        sm.get_one::<String>("target").map(|v| v.as_str()).unwrap(),
120719625d8cSopenharmony_ci        "target"
120819625d8cSopenharmony_ci    );
120919625d8cSopenharmony_ci}
121019625d8cSopenharmony_ci
121119625d8cSopenharmony_ci#[test]
121219625d8cSopenharmony_cifn low_index_positional_with_option() {
121319625d8cSopenharmony_ci    let m = Command::new("lip")
121419625d8cSopenharmony_ci        .arg(
121519625d8cSopenharmony_ci            Arg::new("files")
121619625d8cSopenharmony_ci                .required(true)
121719625d8cSopenharmony_ci                .index(1)
121819625d8cSopenharmony_ci                .action(ArgAction::Set)
121919625d8cSopenharmony_ci                .num_args(1..),
122019625d8cSopenharmony_ci        )
122119625d8cSopenharmony_ci        .arg(Arg::new("target").index(2).required(true))
122219625d8cSopenharmony_ci        .arg(Arg::new("opt").long("option").action(ArgAction::Set))
122319625d8cSopenharmony_ci        .try_get_matches_from(vec![
122419625d8cSopenharmony_ci            "lip", "file1", "file2", "file3", "target", "--option", "test",
122519625d8cSopenharmony_ci        ]);
122619625d8cSopenharmony_ci
122719625d8cSopenharmony_ci    assert!(m.is_ok(), "{:?}", m.unwrap_err().kind());
122819625d8cSopenharmony_ci    let m = m.unwrap();
122919625d8cSopenharmony_ci
123019625d8cSopenharmony_ci    assert!(m.contains_id("files"));
123119625d8cSopenharmony_ci    assert_eq!(
123219625d8cSopenharmony_ci        m.get_many::<String>("files")
123319625d8cSopenharmony_ci            .unwrap()
123419625d8cSopenharmony_ci            .map(|v| v.as_str())
123519625d8cSopenharmony_ci            .collect::<Vec<_>>(),
123619625d8cSopenharmony_ci        ["file1", "file2", "file3"]
123719625d8cSopenharmony_ci    );
123819625d8cSopenharmony_ci    assert!(m.contains_id("target"));
123919625d8cSopenharmony_ci    assert_eq!(
124019625d8cSopenharmony_ci        m.get_one::<String>("target").map(|v| v.as_str()).unwrap(),
124119625d8cSopenharmony_ci        "target"
124219625d8cSopenharmony_ci    );
124319625d8cSopenharmony_ci    assert_eq!(
124419625d8cSopenharmony_ci        m.get_one::<String>("opt").map(|v| v.as_str()).unwrap(),
124519625d8cSopenharmony_ci        "test"
124619625d8cSopenharmony_ci    );
124719625d8cSopenharmony_ci}
124819625d8cSopenharmony_ci
124919625d8cSopenharmony_ci#[test]
125019625d8cSopenharmony_cifn low_index_positional_with_flag() {
125119625d8cSopenharmony_ci    let m = Command::new("lip")
125219625d8cSopenharmony_ci        .arg(
125319625d8cSopenharmony_ci            Arg::new("files")
125419625d8cSopenharmony_ci                .index(1)
125519625d8cSopenharmony_ci                .action(ArgAction::Set)
125619625d8cSopenharmony_ci                .required(true)
125719625d8cSopenharmony_ci                .num_args(1..),
125819625d8cSopenharmony_ci        )
125919625d8cSopenharmony_ci        .arg(Arg::new("target").index(2).required(true))
126019625d8cSopenharmony_ci        .arg(Arg::new("flg").long("flag").action(ArgAction::SetTrue))
126119625d8cSopenharmony_ci        .try_get_matches_from(vec!["lip", "file1", "file2", "file3", "target", "--flag"]);
126219625d8cSopenharmony_ci
126319625d8cSopenharmony_ci    assert!(m.is_ok(), "{:?}", m.unwrap_err().kind());
126419625d8cSopenharmony_ci    let m = m.unwrap();
126519625d8cSopenharmony_ci
126619625d8cSopenharmony_ci    assert!(m.contains_id("files"));
126719625d8cSopenharmony_ci    assert_eq!(
126819625d8cSopenharmony_ci        m.get_many::<String>("files")
126919625d8cSopenharmony_ci            .unwrap()
127019625d8cSopenharmony_ci            .map(|v| v.as_str())
127119625d8cSopenharmony_ci            .collect::<Vec<_>>(),
127219625d8cSopenharmony_ci        ["file1", "file2", "file3"]
127319625d8cSopenharmony_ci    );
127419625d8cSopenharmony_ci    assert!(m.contains_id("target"));
127519625d8cSopenharmony_ci    assert_eq!(
127619625d8cSopenharmony_ci        m.get_one::<String>("target").map(|v| v.as_str()).unwrap(),
127719625d8cSopenharmony_ci        "target"
127819625d8cSopenharmony_ci    );
127919625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("flg").expect("defaulted by clap"));
128019625d8cSopenharmony_ci}
128119625d8cSopenharmony_ci
128219625d8cSopenharmony_ci#[test]
128319625d8cSopenharmony_cifn low_index_positional_with_extra_flags() {
128419625d8cSopenharmony_ci    let cmd = Command::new("test")
128519625d8cSopenharmony_ci        .arg(Arg::new("yes").long("yes").action(ArgAction::SetTrue))
128619625d8cSopenharmony_ci        .arg(Arg::new("one").long("one").action(ArgAction::Set))
128719625d8cSopenharmony_ci        .arg(Arg::new("two").long("two").action(ArgAction::Set))
128819625d8cSopenharmony_ci        .arg(Arg::new("input").num_args(1..).required(true))
128919625d8cSopenharmony_ci        .arg(Arg::new("output").required(true));
129019625d8cSopenharmony_ci    let m = cmd.try_get_matches_from([
129119625d8cSopenharmony_ci        "test", "--one", "1", "--two", "2", "3", "4", "5", "6", "7", "8",
129219625d8cSopenharmony_ci    ]);
129319625d8cSopenharmony_ci
129419625d8cSopenharmony_ci    assert!(m.is_ok(), "{:?}", m.unwrap_err().kind());
129519625d8cSopenharmony_ci    let m = m.unwrap();
129619625d8cSopenharmony_ci
129719625d8cSopenharmony_ci    assert_eq!(
129819625d8cSopenharmony_ci        m.get_many::<String>("input")
129919625d8cSopenharmony_ci            .unwrap()
130019625d8cSopenharmony_ci            .into_iter()
130119625d8cSopenharmony_ci            .map(String::from)
130219625d8cSopenharmony_ci            .collect::<Vec<_>>(),
130319625d8cSopenharmony_ci        vec![
130419625d8cSopenharmony_ci            "3".to_owned(),
130519625d8cSopenharmony_ci            "4".to_owned(),
130619625d8cSopenharmony_ci            "5".to_owned(),
130719625d8cSopenharmony_ci            "6".to_owned(),
130819625d8cSopenharmony_ci            "7".to_owned()
130919625d8cSopenharmony_ci        ],
131019625d8cSopenharmony_ci    );
131119625d8cSopenharmony_ci    assert_eq!(m.get_one::<String>("output").unwrap(), "8");
131219625d8cSopenharmony_ci    assert_eq!(m.get_one::<String>("one").unwrap(), "1");
131319625d8cSopenharmony_ci    assert_eq!(m.get_one::<String>("two").unwrap(), "2");
131419625d8cSopenharmony_ci    assert!(!m.get_flag("yes"));
131519625d8cSopenharmony_ci}
131619625d8cSopenharmony_ci
131719625d8cSopenharmony_ci#[test]
131819625d8cSopenharmony_cifn multiple_value_terminator_option() {
131919625d8cSopenharmony_ci    let m = Command::new("lip")
132019625d8cSopenharmony_ci        .arg(
132119625d8cSopenharmony_ci            Arg::new("files")
132219625d8cSopenharmony_ci                .short('f')
132319625d8cSopenharmony_ci                .value_terminator(";")
132419625d8cSopenharmony_ci                .action(ArgAction::Set)
132519625d8cSopenharmony_ci                .num_args(1..),
132619625d8cSopenharmony_ci        )
132719625d8cSopenharmony_ci        .arg(Arg::new("other"))
132819625d8cSopenharmony_ci        .try_get_matches_from(vec!["lip", "-f", "val1", "val2", ";", "otherval"]);
132919625d8cSopenharmony_ci
133019625d8cSopenharmony_ci    assert!(m.is_ok(), "{:?}", m.unwrap_err().kind());
133119625d8cSopenharmony_ci    let m = m.unwrap();
133219625d8cSopenharmony_ci
133319625d8cSopenharmony_ci    assert!(m.contains_id("other"));
133419625d8cSopenharmony_ci    assert!(m.contains_id("files"));
133519625d8cSopenharmony_ci    assert_eq!(
133619625d8cSopenharmony_ci        m.get_many::<String>("files")
133719625d8cSopenharmony_ci            .unwrap()
133819625d8cSopenharmony_ci            .map(|v| v.as_str())
133919625d8cSopenharmony_ci            .collect::<Vec<_>>(),
134019625d8cSopenharmony_ci        ["val1", "val2"]
134119625d8cSopenharmony_ci    );
134219625d8cSopenharmony_ci    assert_eq!(
134319625d8cSopenharmony_ci        m.get_one::<String>("other").map(|v| v.as_str()),
134419625d8cSopenharmony_ci        Some("otherval")
134519625d8cSopenharmony_ci    );
134619625d8cSopenharmony_ci}
134719625d8cSopenharmony_ci
134819625d8cSopenharmony_ci#[test]
134919625d8cSopenharmony_cifn multiple_value_terminator_option_other_arg() {
135019625d8cSopenharmony_ci    let m = Command::new("lip")
135119625d8cSopenharmony_ci        .arg(
135219625d8cSopenharmony_ci            Arg::new("files")
135319625d8cSopenharmony_ci                .short('f')
135419625d8cSopenharmony_ci                .value_terminator(";")
135519625d8cSopenharmony_ci                .action(ArgAction::Set)
135619625d8cSopenharmony_ci                .num_args(1..),
135719625d8cSopenharmony_ci        )
135819625d8cSopenharmony_ci        .arg(Arg::new("other"))
135919625d8cSopenharmony_ci        .arg(Arg::new("flag").short('F').action(ArgAction::SetTrue))
136019625d8cSopenharmony_ci        .try_get_matches_from(vec!["lip", "-f", "val1", "val2", "-F", "otherval"]);
136119625d8cSopenharmony_ci
136219625d8cSopenharmony_ci    assert!(m.is_ok(), "{:?}", m.unwrap_err().kind());
136319625d8cSopenharmony_ci    let m = m.unwrap();
136419625d8cSopenharmony_ci
136519625d8cSopenharmony_ci    assert!(m.contains_id("other"));
136619625d8cSopenharmony_ci    assert!(m.contains_id("files"));
136719625d8cSopenharmony_ci    assert_eq!(
136819625d8cSopenharmony_ci        m.get_many::<String>("files")
136919625d8cSopenharmony_ci            .unwrap()
137019625d8cSopenharmony_ci            .map(|v| v.as_str())
137119625d8cSopenharmony_ci            .collect::<Vec<_>>(),
137219625d8cSopenharmony_ci        ["val1", "val2"]
137319625d8cSopenharmony_ci    );
137419625d8cSopenharmony_ci    assert_eq!(
137519625d8cSopenharmony_ci        m.get_one::<String>("other").map(|v| v.as_str()),
137619625d8cSopenharmony_ci        Some("otherval")
137719625d8cSopenharmony_ci    );
137819625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("flag").expect("defaulted by clap"));
137919625d8cSopenharmony_ci}
138019625d8cSopenharmony_ci
138119625d8cSopenharmony_ci#[test]
138219625d8cSopenharmony_cifn multiple_vals_with_hyphen() {
138319625d8cSopenharmony_ci    let res = Command::new("do")
138419625d8cSopenharmony_ci        .arg(
138519625d8cSopenharmony_ci            Arg::new("cmds")
138619625d8cSopenharmony_ci                .action(ArgAction::Set)
138719625d8cSopenharmony_ci                .num_args(1..)
138819625d8cSopenharmony_ci                .allow_hyphen_values(true)
138919625d8cSopenharmony_ci                .value_terminator(";"),
139019625d8cSopenharmony_ci        )
139119625d8cSopenharmony_ci        .arg(Arg::new("location"))
139219625d8cSopenharmony_ci        .try_get_matches_from(vec![
139319625d8cSopenharmony_ci            "do",
139419625d8cSopenharmony_ci            "find",
139519625d8cSopenharmony_ci            "-type",
139619625d8cSopenharmony_ci            "f",
139719625d8cSopenharmony_ci            "-name",
139819625d8cSopenharmony_ci            "special",
139919625d8cSopenharmony_ci            ";",
140019625d8cSopenharmony_ci            "/home/clap",
140119625d8cSopenharmony_ci        ]);
140219625d8cSopenharmony_ci    assert!(res.is_ok(), "{:?}", res.unwrap_err().kind());
140319625d8cSopenharmony_ci
140419625d8cSopenharmony_ci    let m = res.unwrap();
140519625d8cSopenharmony_ci    let cmds: Vec<_> = m
140619625d8cSopenharmony_ci        .get_many::<String>("cmds")
140719625d8cSopenharmony_ci        .unwrap()
140819625d8cSopenharmony_ci        .map(|v| v.as_str())
140919625d8cSopenharmony_ci        .collect();
141019625d8cSopenharmony_ci    assert_eq!(&cmds, &["find", "-type", "f", "-name", "special"]);
141119625d8cSopenharmony_ci    assert_eq!(
141219625d8cSopenharmony_ci        m.get_one::<String>("location").map(|v| v.as_str()),
141319625d8cSopenharmony_ci        Some("/home/clap")
141419625d8cSopenharmony_ci    );
141519625d8cSopenharmony_ci}
141619625d8cSopenharmony_ci
141719625d8cSopenharmony_ci#[test]
141819625d8cSopenharmony_cifn issue_1480_max_values_consumes_extra_arg_1() {
141919625d8cSopenharmony_ci    let res = Command::new("prog")
142019625d8cSopenharmony_ci        .arg(Arg::new("field").num_args(..=1).long("field"))
142119625d8cSopenharmony_ci        .arg(Arg::new("positional").required(true).index(1))
142219625d8cSopenharmony_ci        .try_get_matches_from(vec!["prog", "--field", "1", "file"]);
142319625d8cSopenharmony_ci
142419625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
142519625d8cSopenharmony_ci}
142619625d8cSopenharmony_ci
142719625d8cSopenharmony_ci#[test]
142819625d8cSopenharmony_cifn issue_1480_max_values_consumes_extra_arg_2() {
142919625d8cSopenharmony_ci    let res = Command::new("prog")
143019625d8cSopenharmony_ci        .arg(Arg::new("field").num_args(..=1).long("field"))
143119625d8cSopenharmony_ci        .try_get_matches_from(vec!["prog", "--field", "1", "2"]);
143219625d8cSopenharmony_ci
143319625d8cSopenharmony_ci    assert!(res.is_err());
143419625d8cSopenharmony_ci    assert_eq!(res.unwrap_err().kind(), ErrorKind::UnknownArgument);
143519625d8cSopenharmony_ci}
143619625d8cSopenharmony_ci
143719625d8cSopenharmony_ci#[test]
143819625d8cSopenharmony_cifn issue_1480_max_values_consumes_extra_arg_3() {
143919625d8cSopenharmony_ci    let res = Command::new("prog")
144019625d8cSopenharmony_ci        .arg(Arg::new("field").num_args(..=1).long("field"))
144119625d8cSopenharmony_ci        .try_get_matches_from(vec!["prog", "--field", "1", "2", "3"]);
144219625d8cSopenharmony_ci
144319625d8cSopenharmony_ci    assert!(res.is_err());
144419625d8cSopenharmony_ci    assert_eq!(res.unwrap_err().kind(), ErrorKind::UnknownArgument);
144519625d8cSopenharmony_ci}
144619625d8cSopenharmony_ci
144719625d8cSopenharmony_ci#[test]
144819625d8cSopenharmony_cifn value_names_building_num_vals() {
144919625d8cSopenharmony_ci    let m = Command::new("test")
145019625d8cSopenharmony_ci        .arg(
145119625d8cSopenharmony_ci            Arg::new("pos")
145219625d8cSopenharmony_ci                .long("pos")
145319625d8cSopenharmony_ci                .value_names(["who", "what", "why"]),
145419625d8cSopenharmony_ci        )
145519625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog", "--pos", "val1", "val2", "val3"]);
145619625d8cSopenharmony_ci
145719625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
145819625d8cSopenharmony_ci    let m = m.unwrap();
145919625d8cSopenharmony_ci
146019625d8cSopenharmony_ci    assert_eq!(
146119625d8cSopenharmony_ci        m.get_many::<String>("pos")
146219625d8cSopenharmony_ci            .unwrap()
146319625d8cSopenharmony_ci            .map(|v| v.as_str())
146419625d8cSopenharmony_ci            .collect::<Vec<_>>(),
146519625d8cSopenharmony_ci        ["val1", "val2", "val3"]
146619625d8cSopenharmony_ci    );
146719625d8cSopenharmony_ci}
146819625d8cSopenharmony_ci
146919625d8cSopenharmony_ci#[test]
147019625d8cSopenharmony_cifn value_names_building_num_vals_for_positional() {
147119625d8cSopenharmony_ci    let m = Command::new("test")
147219625d8cSopenharmony_ci        .arg(Arg::new("pos").value_names(["who", "what", "why"]))
147319625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog", "val1", "val2", "val3"]);
147419625d8cSopenharmony_ci
147519625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
147619625d8cSopenharmony_ci    let m = m.unwrap();
147719625d8cSopenharmony_ci
147819625d8cSopenharmony_ci    assert_eq!(
147919625d8cSopenharmony_ci        m.get_many::<String>("pos")
148019625d8cSopenharmony_ci            .unwrap()
148119625d8cSopenharmony_ci            .map(|v| v.as_str())
148219625d8cSopenharmony_ci            .collect::<Vec<_>>(),
148319625d8cSopenharmony_ci        ["val1", "val2", "val3"]
148419625d8cSopenharmony_ci    );
148519625d8cSopenharmony_ci}
148619625d8cSopenharmony_ci
148719625d8cSopenharmony_ci#[test]
148819625d8cSopenharmony_cifn num_args_preferred_over_value_names() {
148919625d8cSopenharmony_ci    let m = Command::new("test")
149019625d8cSopenharmony_ci        .arg(
149119625d8cSopenharmony_ci            Arg::new("pos")
149219625d8cSopenharmony_ci                .long("pos")
149319625d8cSopenharmony_ci                .num_args(4)
149419625d8cSopenharmony_ci                .value_names(["who", "what", "why"]),
149519625d8cSopenharmony_ci        )
149619625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog", "--pos", "val1", "val2", "val3", "val4"]);
149719625d8cSopenharmony_ci
149819625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
149919625d8cSopenharmony_ci    let m = m.unwrap();
150019625d8cSopenharmony_ci
150119625d8cSopenharmony_ci    assert_eq!(
150219625d8cSopenharmony_ci        m.get_many::<String>("pos")
150319625d8cSopenharmony_ci            .unwrap()
150419625d8cSopenharmony_ci            .map(|v| v.as_str())
150519625d8cSopenharmony_ci            .collect::<Vec<_>>(),
150619625d8cSopenharmony_ci        ["val1", "val2", "val3", "val4"]
150719625d8cSopenharmony_ci    );
150819625d8cSopenharmony_ci}
150919625d8cSopenharmony_ci
151019625d8cSopenharmony_ci#[test]
151119625d8cSopenharmony_cifn values_per_occurrence_named() {
151219625d8cSopenharmony_ci    let mut a = Command::new("test").arg(
151319625d8cSopenharmony_ci        Arg::new("pos")
151419625d8cSopenharmony_ci            .long("pos")
151519625d8cSopenharmony_ci            .num_args(2)
151619625d8cSopenharmony_ci            .action(ArgAction::Append),
151719625d8cSopenharmony_ci    );
151819625d8cSopenharmony_ci
151919625d8cSopenharmony_ci    let m = a.try_get_matches_from_mut(vec!["myprog", "--pos", "val1", "val2"]);
152019625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
152119625d8cSopenharmony_ci    let m = m.unwrap();
152219625d8cSopenharmony_ci    assert_eq!(
152319625d8cSopenharmony_ci        m.get_many::<String>("pos")
152419625d8cSopenharmony_ci            .unwrap()
152519625d8cSopenharmony_ci            .map(|v| v.as_str())
152619625d8cSopenharmony_ci            .collect::<Vec<_>>(),
152719625d8cSopenharmony_ci        ["val1", "val2"]
152819625d8cSopenharmony_ci    );
152919625d8cSopenharmony_ci
153019625d8cSopenharmony_ci    let m = a.try_get_matches_from_mut(vec![
153119625d8cSopenharmony_ci        "myprog", "--pos", "val1", "val2", "--pos", "val3", "val4",
153219625d8cSopenharmony_ci    ]);
153319625d8cSopenharmony_ci    let m = match m {
153419625d8cSopenharmony_ci        Ok(m) => m,
153519625d8cSopenharmony_ci        Err(err) => panic!("{}", err),
153619625d8cSopenharmony_ci    };
153719625d8cSopenharmony_ci    assert_eq!(
153819625d8cSopenharmony_ci        m.get_many::<String>("pos")
153919625d8cSopenharmony_ci            .unwrap()
154019625d8cSopenharmony_ci            .map(|v| v.as_str())
154119625d8cSopenharmony_ci            .collect::<Vec<_>>(),
154219625d8cSopenharmony_ci        ["val1", "val2", "val3", "val4"]
154319625d8cSopenharmony_ci    );
154419625d8cSopenharmony_ci}
154519625d8cSopenharmony_ci
154619625d8cSopenharmony_ci#[test]
154719625d8cSopenharmony_cifn values_per_occurrence_positional() {
154819625d8cSopenharmony_ci    let mut a = Command::new("test").arg(Arg::new("pos").num_args(2).action(ArgAction::Append));
154919625d8cSopenharmony_ci
155019625d8cSopenharmony_ci    let m = a.try_get_matches_from_mut(vec!["myprog", "val1", "val2"]);
155119625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
155219625d8cSopenharmony_ci    let m = m.unwrap();
155319625d8cSopenharmony_ci    assert_eq!(
155419625d8cSopenharmony_ci        m.get_many::<String>("pos")
155519625d8cSopenharmony_ci            .unwrap()
155619625d8cSopenharmony_ci            .map(|v| v.as_str())
155719625d8cSopenharmony_ci            .collect::<Vec<_>>(),
155819625d8cSopenharmony_ci        ["val1", "val2"]
155919625d8cSopenharmony_ci    );
156019625d8cSopenharmony_ci}
156119625d8cSopenharmony_ci
156219625d8cSopenharmony_ci#[test]
156319625d8cSopenharmony_cifn issue_2229() {
156419625d8cSopenharmony_ci    let m = Command::new("multiple_values")
156519625d8cSopenharmony_ci        .arg(Arg::new("pos").help("multiple positionals").num_args(3))
156619625d8cSopenharmony_ci        .try_get_matches_from(vec![
156719625d8cSopenharmony_ci            "myprog", "val1", "val2", "val3", "val4", "val5", "val6",
156819625d8cSopenharmony_ci        ]);
156919625d8cSopenharmony_ci
157019625d8cSopenharmony_ci    assert!(m.is_err());
157119625d8cSopenharmony_ci    assert_eq!(m.unwrap_err().kind(), ErrorKind::WrongNumberOfValues);
157219625d8cSopenharmony_ci}
157319625d8cSopenharmony_ci
157419625d8cSopenharmony_ci#[test]
157519625d8cSopenharmony_ci#[should_panic = "Argument 'pos` is positional, it must take a value"]
157619625d8cSopenharmony_cifn disallow_positionals_without_values() {
157719625d8cSopenharmony_ci    let cmd = Command::new("test").arg(Arg::new("pos").num_args(0));
157819625d8cSopenharmony_ci    cmd.debug_assert();
157919625d8cSopenharmony_ci}
1580