119625d8cSopenharmony_ciuse clap::{arg, error::ErrorKind, Arg, ArgAction, Command};
219625d8cSopenharmony_ci
319625d8cSopenharmony_ci#[test]
419625d8cSopenharmony_cifn only_pos_follow() {
519625d8cSopenharmony_ci    let r = Command::new("onlypos")
619625d8cSopenharmony_ci        .args([arg!(f: -f [flag] "some opt"), arg!([arg] "some arg")])
719625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--", "-f"]);
819625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
919625d8cSopenharmony_ci    let m = r.unwrap();
1019625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
1119625d8cSopenharmony_ci    assert!(!m.contains_id("f"));
1219625d8cSopenharmony_ci    assert_eq!(
1319625d8cSopenharmony_ci        m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
1419625d8cSopenharmony_ci        "-f"
1519625d8cSopenharmony_ci    );
1619625d8cSopenharmony_ci}
1719625d8cSopenharmony_ci
1819625d8cSopenharmony_ci#[test]
1919625d8cSopenharmony_cifn issue_946() {
2019625d8cSopenharmony_ci    let r = Command::new("compiletest")
2119625d8cSopenharmony_ci        .arg(arg!(--exact    "filters match exactly").action(ArgAction::SetTrue))
2219625d8cSopenharmony_ci        .arg(
2319625d8cSopenharmony_ci            clap::Arg::new("filter")
2419625d8cSopenharmony_ci                .index(1)
2519625d8cSopenharmony_ci                .action(ArgAction::Set)
2619625d8cSopenharmony_ci                .allow_hyphen_values(true)
2719625d8cSopenharmony_ci                .help("filters to apply to output"),
2819625d8cSopenharmony_ci        )
2919625d8cSopenharmony_ci        .try_get_matches_from(vec!["compiletest", "--exact"]);
3019625d8cSopenharmony_ci    assert!(r.is_ok(), "{:#?}", r);
3119625d8cSopenharmony_ci    let matches = r.unwrap();
3219625d8cSopenharmony_ci
3319625d8cSopenharmony_ci    assert!(*matches.get_one::<bool>("exact").expect("defaulted by clap"));
3419625d8cSopenharmony_ci    assert!(matches
3519625d8cSopenharmony_ci        .get_one::<String>("filter")
3619625d8cSopenharmony_ci        .map(|v| v.as_str())
3719625d8cSopenharmony_ci        .is_none());
3819625d8cSopenharmony_ci}
3919625d8cSopenharmony_ci
4019625d8cSopenharmony_ci#[test]
4119625d8cSopenharmony_cifn positional() {
4219625d8cSopenharmony_ci    let r = Command::new("positional")
4319625d8cSopenharmony_ci        .args([
4419625d8cSopenharmony_ci            arg!(-f --flag "some flag").action(ArgAction::SetTrue),
4519625d8cSopenharmony_ci            Arg::new("positional").index(1),
4619625d8cSopenharmony_ci        ])
4719625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-f", "test"]);
4819625d8cSopenharmony_ci    assert!(r.is_ok(), "{:#?}", r);
4919625d8cSopenharmony_ci    let m = r.unwrap();
5019625d8cSopenharmony_ci    assert!(m.contains_id("positional"));
5119625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("flag").expect("defaulted by clap"));
5219625d8cSopenharmony_ci    assert_eq!(
5319625d8cSopenharmony_ci        m.get_one::<String>("positional")
5419625d8cSopenharmony_ci            .map(|v| v.as_str())
5519625d8cSopenharmony_ci            .unwrap(),
5619625d8cSopenharmony_ci        "test"
5719625d8cSopenharmony_ci    );
5819625d8cSopenharmony_ci
5919625d8cSopenharmony_ci    let m = Command::new("positional")
6019625d8cSopenharmony_ci        .args([
6119625d8cSopenharmony_ci            arg!(-f --flag "some flag").action(ArgAction::SetTrue),
6219625d8cSopenharmony_ci            Arg::new("positional").index(1),
6319625d8cSopenharmony_ci        ])
6419625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "test", "--flag"])
6519625d8cSopenharmony_ci        .unwrap();
6619625d8cSopenharmony_ci    assert!(m.contains_id("positional"));
6719625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("flag").expect("defaulted by clap"));
6819625d8cSopenharmony_ci    assert_eq!(
6919625d8cSopenharmony_ci        m.get_one::<String>("positional")
7019625d8cSopenharmony_ci            .map(|v| v.as_str())
7119625d8cSopenharmony_ci            .unwrap(),
7219625d8cSopenharmony_ci        "test"
7319625d8cSopenharmony_ci    );
7419625d8cSopenharmony_ci}
7519625d8cSopenharmony_ci
7619625d8cSopenharmony_ci#[test]
7719625d8cSopenharmony_cifn lots_o_vals() {
7819625d8cSopenharmony_ci    let r = Command::new("opts")
7919625d8cSopenharmony_ci        .arg(arg!(<opt>... "some pos"))
8019625d8cSopenharmony_ci        .try_get_matches_from(vec![
8119625d8cSopenharmony_ci            "", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some",
8219625d8cSopenharmony_ci            "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some",
8319625d8cSopenharmony_ci            "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some",
8419625d8cSopenharmony_ci            "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some",
8519625d8cSopenharmony_ci            "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some",
8619625d8cSopenharmony_ci            "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some",
8719625d8cSopenharmony_ci            "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some",
8819625d8cSopenharmony_ci            "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some",
8919625d8cSopenharmony_ci            "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some",
9019625d8cSopenharmony_ci            "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some",
9119625d8cSopenharmony_ci            "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some",
9219625d8cSopenharmony_ci            "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some",
9319625d8cSopenharmony_ci            "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some",
9419625d8cSopenharmony_ci            "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some",
9519625d8cSopenharmony_ci            "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some",
9619625d8cSopenharmony_ci            "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some",
9719625d8cSopenharmony_ci            "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some",
9819625d8cSopenharmony_ci            "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some",
9919625d8cSopenharmony_ci            "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some",
10019625d8cSopenharmony_ci            "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some",
10119625d8cSopenharmony_ci            "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some",
10219625d8cSopenharmony_ci            "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some",
10319625d8cSopenharmony_ci            "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some",
10419625d8cSopenharmony_ci            "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some",
10519625d8cSopenharmony_ci            "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some",
10619625d8cSopenharmony_ci            "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some",
10719625d8cSopenharmony_ci            "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some",
10819625d8cSopenharmony_ci            "some",
10919625d8cSopenharmony_ci        ]);
11019625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
11119625d8cSopenharmony_ci    let m = r.unwrap();
11219625d8cSopenharmony_ci    assert!(m.contains_id("opt"));
11319625d8cSopenharmony_ci    assert_eq!(m.get_many::<String>("opt").unwrap().count(), 297); // i.e. more than u8
11419625d8cSopenharmony_ci}
11519625d8cSopenharmony_ci
11619625d8cSopenharmony_ci#[test]
11719625d8cSopenharmony_cifn positional_multiple() {
11819625d8cSopenharmony_ci    let r = Command::new("positional_multiple")
11919625d8cSopenharmony_ci        .args([
12019625d8cSopenharmony_ci            arg!(-f --flag "some flag").action(ArgAction::SetTrue),
12119625d8cSopenharmony_ci            Arg::new("positional")
12219625d8cSopenharmony_ci                .index(1)
12319625d8cSopenharmony_ci                .action(ArgAction::Set)
12419625d8cSopenharmony_ci                .num_args(1..),
12519625d8cSopenharmony_ci        ])
12619625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-f", "test1", "test2", "test3"]);
12719625d8cSopenharmony_ci    assert!(r.is_ok(), "{:#?}", r);
12819625d8cSopenharmony_ci    let m = r.unwrap();
12919625d8cSopenharmony_ci    assert!(m.contains_id("positional"));
13019625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("flag").expect("defaulted by clap"));
13119625d8cSopenharmony_ci    assert_eq!(
13219625d8cSopenharmony_ci        &*m.get_many::<String>("positional")
13319625d8cSopenharmony_ci            .unwrap()
13419625d8cSopenharmony_ci            .map(|v| v.as_str())
13519625d8cSopenharmony_ci            .collect::<Vec<_>>(),
13619625d8cSopenharmony_ci        ["test1", "test2", "test3"]
13719625d8cSopenharmony_ci    );
13819625d8cSopenharmony_ci}
13919625d8cSopenharmony_ci
14019625d8cSopenharmony_ci#[test]
14119625d8cSopenharmony_cifn positional_multiple_3() {
14219625d8cSopenharmony_ci    let r = Command::new("positional_multiple")
14319625d8cSopenharmony_ci        .args([
14419625d8cSopenharmony_ci            arg!(-f  --flag "some flag").action(ArgAction::SetTrue),
14519625d8cSopenharmony_ci            Arg::new("positional")
14619625d8cSopenharmony_ci                .index(1)
14719625d8cSopenharmony_ci                .action(ArgAction::Set)
14819625d8cSopenharmony_ci                .num_args(1..),
14919625d8cSopenharmony_ci        ])
15019625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "test1", "test2", "test3", "--flag"]);
15119625d8cSopenharmony_ci    assert!(r.is_ok(), "{:#?}", r);
15219625d8cSopenharmony_ci    let m = r.unwrap();
15319625d8cSopenharmony_ci    assert!(m.contains_id("positional"));
15419625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("flag").expect("defaulted by clap"));
15519625d8cSopenharmony_ci    assert_eq!(
15619625d8cSopenharmony_ci        &*m.get_many::<String>("positional")
15719625d8cSopenharmony_ci            .unwrap()
15819625d8cSopenharmony_ci            .map(|v| v.as_str())
15919625d8cSopenharmony_ci            .collect::<Vec<_>>(),
16019625d8cSopenharmony_ci        ["test1", "test2", "test3"]
16119625d8cSopenharmony_ci    );
16219625d8cSopenharmony_ci}
16319625d8cSopenharmony_ci
16419625d8cSopenharmony_ci#[test]
16519625d8cSopenharmony_cifn positional_multiple_2() {
16619625d8cSopenharmony_ci    let result = Command::new("positional_multiple")
16719625d8cSopenharmony_ci        .args([arg!(-f --flag "some flag"), Arg::new("positional").index(1)])
16819625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-f", "test1", "test2", "test3"]);
16919625d8cSopenharmony_ci    assert!(result.is_err());
17019625d8cSopenharmony_ci    let err = result.err().unwrap();
17119625d8cSopenharmony_ci    assert_eq!(err.kind(), ErrorKind::UnknownArgument);
17219625d8cSopenharmony_ci}
17319625d8cSopenharmony_ci
17419625d8cSopenharmony_ci#[test]
17519625d8cSopenharmony_cifn positional_possible_values() {
17619625d8cSopenharmony_ci    let r = Command::new("positional_possible_values")
17719625d8cSopenharmony_ci        .args([
17819625d8cSopenharmony_ci            arg!(-f --flag "some flag").action(ArgAction::SetTrue),
17919625d8cSopenharmony_ci            Arg::new("positional").index(1).value_parser(["test123"]),
18019625d8cSopenharmony_ci        ])
18119625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-f", "test123"]);
18219625d8cSopenharmony_ci    assert!(r.is_ok(), "{r:#?}");
18319625d8cSopenharmony_ci    let m = r.unwrap();
18419625d8cSopenharmony_ci    assert!(m.contains_id("positional"));
18519625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("flag").expect("defaulted by clap"));
18619625d8cSopenharmony_ci    assert_eq!(
18719625d8cSopenharmony_ci        &*m.get_many::<String>("positional")
18819625d8cSopenharmony_ci            .unwrap()
18919625d8cSopenharmony_ci            .map(|v| v.as_str())
19019625d8cSopenharmony_ci            .collect::<Vec<_>>(),
19119625d8cSopenharmony_ci        ["test123"]
19219625d8cSopenharmony_ci    );
19319625d8cSopenharmony_ci}
19419625d8cSopenharmony_ci
19519625d8cSopenharmony_ci#[test]
19619625d8cSopenharmony_cifn create_positional() {
19719625d8cSopenharmony_ci    let _ = Command::new("test")
19819625d8cSopenharmony_ci        .arg(Arg::new("test").index(1).help("testing testing"))
19919625d8cSopenharmony_ci        .try_get_matches_from(vec![""])
20019625d8cSopenharmony_ci        .unwrap();
20119625d8cSopenharmony_ci}
20219625d8cSopenharmony_ci
20319625d8cSopenharmony_ci#[test]
20419625d8cSopenharmony_cifn positional_hyphen_does_not_panic() {
20519625d8cSopenharmony_ci    let _ = Command::new("test")
20619625d8cSopenharmony_ci        .arg(Arg::new("dummy"))
20719625d8cSopenharmony_ci        .try_get_matches_from(vec!["test", "-"])
20819625d8cSopenharmony_ci        .unwrap();
20919625d8cSopenharmony_ci}
21019625d8cSopenharmony_ci
21119625d8cSopenharmony_ci#[test]
21219625d8cSopenharmony_cifn single_positional_usage_string() {
21319625d8cSopenharmony_ci    let mut cmd = Command::new("test").arg(arg!([FILE] "some file"));
21419625d8cSopenharmony_ci    crate::utils::assert_eq(cmd.render_usage().to_string(), "Usage: test [FILE]");
21519625d8cSopenharmony_ci}
21619625d8cSopenharmony_ci
21719625d8cSopenharmony_ci#[test]
21819625d8cSopenharmony_cifn single_positional_multiple_usage_string() {
21919625d8cSopenharmony_ci    let mut cmd = Command::new("test").arg(arg!([FILE]... "some file"));
22019625d8cSopenharmony_ci    crate::utils::assert_eq(cmd.render_usage().to_string(), "Usage: test [FILE]...");
22119625d8cSopenharmony_ci}
22219625d8cSopenharmony_ci
22319625d8cSopenharmony_ci#[test]
22419625d8cSopenharmony_cifn multiple_positional_usage_string() {
22519625d8cSopenharmony_ci    let mut cmd = Command::new("test")
22619625d8cSopenharmony_ci        .arg(arg!([FILE] "some file"))
22719625d8cSopenharmony_ci        .arg(arg!([FILES]... "some file"));
22819625d8cSopenharmony_ci    crate::utils::assert_eq(
22919625d8cSopenharmony_ci        cmd.render_usage().to_string(),
23019625d8cSopenharmony_ci        "\
23119625d8cSopenharmony_ciUsage: test [FILE] [FILES]...",
23219625d8cSopenharmony_ci    );
23319625d8cSopenharmony_ci}
23419625d8cSopenharmony_ci
23519625d8cSopenharmony_ci#[test]
23619625d8cSopenharmony_cifn multiple_positional_one_required_usage_string() {
23719625d8cSopenharmony_ci    let mut cmd = Command::new("test")
23819625d8cSopenharmony_ci        .arg(arg!(<FILE> "some file"))
23919625d8cSopenharmony_ci        .arg(arg!([FILES]... "some file"));
24019625d8cSopenharmony_ci    crate::utils::assert_eq(
24119625d8cSopenharmony_ci        cmd.render_usage().to_string(),
24219625d8cSopenharmony_ci        "Usage: test <FILE> [FILES]...",
24319625d8cSopenharmony_ci    );
24419625d8cSopenharmony_ci}
24519625d8cSopenharmony_ci
24619625d8cSopenharmony_ci#[test]
24719625d8cSopenharmony_cifn single_positional_required_usage_string() {
24819625d8cSopenharmony_ci    let mut cmd = Command::new("test").arg(arg!(<FILE> "some file"));
24919625d8cSopenharmony_ci    crate::utils::assert_eq(cmd.render_usage().to_string(), "Usage: test <FILE>");
25019625d8cSopenharmony_ci}
25119625d8cSopenharmony_ci
25219625d8cSopenharmony_ci// This tests a programmer error and will only succeed with debug_assertions
25319625d8cSopenharmony_ci#[cfg(debug_assertions)]
25419625d8cSopenharmony_ci#[test]
25519625d8cSopenharmony_ci#[should_panic = "Found non-required positional argument \
25619625d8cSopenharmony_ciwith a lower index than a required positional argument"]
25719625d8cSopenharmony_cifn missing_required() {
25819625d8cSopenharmony_ci    let _ = Command::new("test")
25919625d8cSopenharmony_ci        .arg(arg!([FILE1] "some file"))
26019625d8cSopenharmony_ci        .arg(arg!(<FILE2> "some file"))
26119625d8cSopenharmony_ci        .try_get_matches_from(vec![""]);
26219625d8cSopenharmony_ci}
26319625d8cSopenharmony_ci
26419625d8cSopenharmony_ci#[test]
26519625d8cSopenharmony_cifn missing_required_2() {
26619625d8cSopenharmony_ci    let r = Command::new("test")
26719625d8cSopenharmony_ci        .arg(arg!(<FILE1> "some file"))
26819625d8cSopenharmony_ci        .arg(arg!(<FILE2> "some file"))
26919625d8cSopenharmony_ci        .try_get_matches_from(vec!["test", "file"]);
27019625d8cSopenharmony_ci    assert!(r.is_err());
27119625d8cSopenharmony_ci    assert_eq!(r.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);
27219625d8cSopenharmony_ci}
27319625d8cSopenharmony_ci
27419625d8cSopenharmony_ci#[test]
27519625d8cSopenharmony_cifn last_positional() {
27619625d8cSopenharmony_ci    let r = Command::new("test")
27719625d8cSopenharmony_ci        .arg(arg!(<TARGET> "some target"))
27819625d8cSopenharmony_ci        .arg(arg!([CORPUS] "some corpus"))
27919625d8cSopenharmony_ci        .arg(arg!([ARGS]... "some file").last(true))
28019625d8cSopenharmony_ci        .try_get_matches_from(vec!["test", "tgt", "--", "arg"]);
28119625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
28219625d8cSopenharmony_ci    let m = r.unwrap();
28319625d8cSopenharmony_ci    assert_eq!(
28419625d8cSopenharmony_ci        m.get_many::<String>("ARGS")
28519625d8cSopenharmony_ci            .unwrap()
28619625d8cSopenharmony_ci            .map(|v| v.as_str())
28719625d8cSopenharmony_ci            .collect::<Vec<_>>(),
28819625d8cSopenharmony_ci        ["arg"]
28919625d8cSopenharmony_ci    );
29019625d8cSopenharmony_ci}
29119625d8cSopenharmony_ci
29219625d8cSopenharmony_ci#[test]
29319625d8cSopenharmony_cifn last_positional_no_double_dash() {
29419625d8cSopenharmony_ci    let r = Command::new("test")
29519625d8cSopenharmony_ci        .arg(arg!(<TARGET> "some target"))
29619625d8cSopenharmony_ci        .arg(arg!([CORPUS] "some corpus"))
29719625d8cSopenharmony_ci        .arg(arg!([ARGS]... "some file").last(true))
29819625d8cSopenharmony_ci        .try_get_matches_from(vec!["test", "tgt", "crp", "arg"]);
29919625d8cSopenharmony_ci    assert!(r.is_err());
30019625d8cSopenharmony_ci    assert_eq!(r.unwrap_err().kind(), ErrorKind::UnknownArgument);
30119625d8cSopenharmony_ci}
30219625d8cSopenharmony_ci
30319625d8cSopenharmony_ci#[test]
30419625d8cSopenharmony_cifn last_positional_second_to_last_mult() {
30519625d8cSopenharmony_ci    let r = Command::new("test")
30619625d8cSopenharmony_ci        .arg(arg!(<TARGET> "some target"))
30719625d8cSopenharmony_ci        .arg(arg!([CORPUS]... "some corpus"))
30819625d8cSopenharmony_ci        .arg(arg!([ARGS]... "some file").last(true))
30919625d8cSopenharmony_ci        .try_get_matches_from(vec!["test", "tgt", "crp1", "crp2", "--", "arg"]);
31019625d8cSopenharmony_ci    assert!(r.is_ok(), "{:?}", r.unwrap_err().kind());
31119625d8cSopenharmony_ci}
31219625d8cSopenharmony_ci
31319625d8cSopenharmony_ci#[cfg(debug_assertions)]
31419625d8cSopenharmony_ci#[test]
31519625d8cSopenharmony_ci#[should_panic = "Argument 'arg' is a positional argument and can't have short or long name versions"]
31619625d8cSopenharmony_cifn positional_arg_with_long() {
31719625d8cSopenharmony_ci    use clap::{Arg, Command};
31819625d8cSopenharmony_ci
31919625d8cSopenharmony_ci    let _ = Command::new("test")
32019625d8cSopenharmony_ci        .arg(Arg::new("arg").index(1).long("arg"))
32119625d8cSopenharmony_ci        .try_get_matches();
32219625d8cSopenharmony_ci}
32319625d8cSopenharmony_ci
32419625d8cSopenharmony_ci#[cfg(debug_assertions)]
32519625d8cSopenharmony_ci#[test]
32619625d8cSopenharmony_ci#[should_panic = "Argument 'arg' is a positional argument and can't have short or long name versions"]
32719625d8cSopenharmony_cifn positional_arg_with_short() {
32819625d8cSopenharmony_ci    use clap::{Arg, Command};
32919625d8cSopenharmony_ci
33019625d8cSopenharmony_ci    let _ = Command::new("test")
33119625d8cSopenharmony_ci        .arg(Arg::new("arg").index(1).short('a'))
33219625d8cSopenharmony_ci        .try_get_matches();
33319625d8cSopenharmony_ci}
33419625d8cSopenharmony_ci
33519625d8cSopenharmony_ci#[test]
33619625d8cSopenharmony_cifn ignore_hyphen_values_on_last() {
33719625d8cSopenharmony_ci    let cmd = clap::Command::new("foo")
33819625d8cSopenharmony_ci        .arg(
33919625d8cSopenharmony_ci            clap::Arg::new("cmd")
34019625d8cSopenharmony_ci                .num_args(1..)
34119625d8cSopenharmony_ci                .last(true)
34219625d8cSopenharmony_ci                .allow_hyphen_values(true),
34319625d8cSopenharmony_ci        )
34419625d8cSopenharmony_ci        .arg(
34519625d8cSopenharmony_ci            clap::Arg::new("name")
34619625d8cSopenharmony_ci                .long("name")
34719625d8cSopenharmony_ci                .short('n')
34819625d8cSopenharmony_ci                .action(ArgAction::Set)
34919625d8cSopenharmony_ci                .required(false),
35019625d8cSopenharmony_ci        );
35119625d8cSopenharmony_ci
35219625d8cSopenharmony_ci    let matches = cmd.try_get_matches_from(["test", "-n", "foo"]).unwrap();
35319625d8cSopenharmony_ci    assert_eq!(
35419625d8cSopenharmony_ci        matches.get_one::<String>("name").map(|v| v.as_str()),
35519625d8cSopenharmony_ci        Some("foo")
35619625d8cSopenharmony_ci    );
35719625d8cSopenharmony_ci}
358