119625d8cSopenharmony_ciuse std::ffi::OsString;
219625d8cSopenharmony_ci
319625d8cSopenharmony_ciuse super::utils;
419625d8cSopenharmony_ci
519625d8cSopenharmony_ciuse clap::{arg, error::ErrorKind, Arg, ArgAction, Command};
619625d8cSopenharmony_ci
719625d8cSopenharmony_cistatic ALLOW_EXT_SC: &str = "\
819625d8cSopenharmony_ciUsage: clap-test [COMMAND]
919625d8cSopenharmony_ci
1019625d8cSopenharmony_ciOptions:
1119625d8cSopenharmony_ci  -h, --help     Print help
1219625d8cSopenharmony_ci  -V, --version  Print version
1319625d8cSopenharmony_ci";
1419625d8cSopenharmony_ci
1519625d8cSopenharmony_cistatic DONT_COLLAPSE_ARGS: &str = "\
1619625d8cSopenharmony_ciUsage: clap-test [arg1] [arg2] [arg3]
1719625d8cSopenharmony_ci
1819625d8cSopenharmony_ciArguments:
1919625d8cSopenharmony_ci  [arg1]  some
2019625d8cSopenharmony_ci  [arg2]  some
2119625d8cSopenharmony_ci  [arg3]  some
2219625d8cSopenharmony_ci
2319625d8cSopenharmony_ciOptions:
2419625d8cSopenharmony_ci  -h, --help     Print help
2519625d8cSopenharmony_ci  -V, --version  Print version
2619625d8cSopenharmony_ci";
2719625d8cSopenharmony_ci
2819625d8cSopenharmony_ci#[test]
2919625d8cSopenharmony_cifn sub_command_negate_required() {
3019625d8cSopenharmony_ci    Command::new("sub_command_negate")
3119625d8cSopenharmony_ci        .subcommand_negates_reqs(true)
3219625d8cSopenharmony_ci        .arg(Arg::new("test").required(true).index(1))
3319625d8cSopenharmony_ci        .subcommand(Command::new("sub1"))
3419625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog", "sub1"])
3519625d8cSopenharmony_ci        .unwrap();
3619625d8cSopenharmony_ci}
3719625d8cSopenharmony_ci
3819625d8cSopenharmony_ci#[test]
3919625d8cSopenharmony_cifn sub_command_negate_required_2() {
4019625d8cSopenharmony_ci    let result = Command::new("sub_command_negate")
4119625d8cSopenharmony_ci        .subcommand_negates_reqs(true)
4219625d8cSopenharmony_ci        .arg(Arg::new("test").required(true).index(1))
4319625d8cSopenharmony_ci        .subcommand(Command::new("sub1"))
4419625d8cSopenharmony_ci        .try_get_matches_from(vec![""]);
4519625d8cSopenharmony_ci    assert!(result.is_err());
4619625d8cSopenharmony_ci    let err = result.err().unwrap();
4719625d8cSopenharmony_ci    assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument);
4819625d8cSopenharmony_ci}
4919625d8cSopenharmony_ci
5019625d8cSopenharmony_ci#[test]
5119625d8cSopenharmony_cifn sub_command_required() {
5219625d8cSopenharmony_ci    let result = Command::new("sc_required")
5319625d8cSopenharmony_ci        .subcommand_required(true)
5419625d8cSopenharmony_ci        .subcommand(Command::new("sub1"))
5519625d8cSopenharmony_ci        .try_get_matches_from(vec![""]);
5619625d8cSopenharmony_ci    assert!(result.is_err());
5719625d8cSopenharmony_ci    let err = result.err().unwrap();
5819625d8cSopenharmony_ci    assert_eq!(err.kind(), ErrorKind::MissingSubcommand);
5919625d8cSopenharmony_ci}
6019625d8cSopenharmony_ci
6119625d8cSopenharmony_ci#[test]
6219625d8cSopenharmony_ci#[cfg(feature = "error-context")]
6319625d8cSopenharmony_cifn sub_command_required_error() {
6419625d8cSopenharmony_ci    static ERROR: &str = "\
6519625d8cSopenharmony_cierror: 'sc_required' requires a subcommand but one was not provided
6619625d8cSopenharmony_ci  [subcommands: sub1, help]
6719625d8cSopenharmony_ci
6819625d8cSopenharmony_ciUsage: sc_required <COMMAND>
6919625d8cSopenharmony_ci
7019625d8cSopenharmony_ciFor more information, try '--help'.
7119625d8cSopenharmony_ci";
7219625d8cSopenharmony_ci
7319625d8cSopenharmony_ci    let cmd = Command::new("sc_required")
7419625d8cSopenharmony_ci        .subcommand_required(true)
7519625d8cSopenharmony_ci        .subcommand(Command::new("sub1"));
7619625d8cSopenharmony_ci    utils::assert_output(cmd, "sc_required", ERROR, true);
7719625d8cSopenharmony_ci}
7819625d8cSopenharmony_ci
7919625d8cSopenharmony_ci#[test]
8019625d8cSopenharmony_cifn arg_required_else_help() {
8119625d8cSopenharmony_ci    let result = Command::new("arg_required")
8219625d8cSopenharmony_ci        .arg_required_else_help(true)
8319625d8cSopenharmony_ci        .arg(Arg::new("test").index(1))
8419625d8cSopenharmony_ci        .try_get_matches_from(vec![""]);
8519625d8cSopenharmony_ci
8619625d8cSopenharmony_ci    assert!(result.is_err());
8719625d8cSopenharmony_ci    let err = result.err().unwrap();
8819625d8cSopenharmony_ci    assert_eq!(
8919625d8cSopenharmony_ci        err.kind(),
9019625d8cSopenharmony_ci        ErrorKind::DisplayHelpOnMissingArgumentOrSubcommand
9119625d8cSopenharmony_ci    );
9219625d8cSopenharmony_ci}
9319625d8cSopenharmony_ci
9419625d8cSopenharmony_ci#[test]
9519625d8cSopenharmony_cifn arg_required_else_help_over_req_arg() {
9619625d8cSopenharmony_ci    let result = Command::new("arg_required")
9719625d8cSopenharmony_ci        .arg_required_else_help(true)
9819625d8cSopenharmony_ci        .arg(Arg::new("test").index(1).required(true))
9919625d8cSopenharmony_ci        .try_get_matches_from(vec![""]);
10019625d8cSopenharmony_ci
10119625d8cSopenharmony_ci    assert!(result.is_err());
10219625d8cSopenharmony_ci    let err = result.err().unwrap();
10319625d8cSopenharmony_ci    assert_eq!(
10419625d8cSopenharmony_ci        err.kind(),
10519625d8cSopenharmony_ci        ErrorKind::DisplayHelpOnMissingArgumentOrSubcommand
10619625d8cSopenharmony_ci    );
10719625d8cSopenharmony_ci}
10819625d8cSopenharmony_ci
10919625d8cSopenharmony_ci#[test]
11019625d8cSopenharmony_cifn arg_required_else_help_over_req_subcommand() {
11119625d8cSopenharmony_ci    let result = Command::new("sub_required")
11219625d8cSopenharmony_ci        .arg_required_else_help(true)
11319625d8cSopenharmony_ci        .subcommand_required(true)
11419625d8cSopenharmony_ci        .subcommand(Command::new("sub1"))
11519625d8cSopenharmony_ci        .try_get_matches_from(vec![""]);
11619625d8cSopenharmony_ci
11719625d8cSopenharmony_ci    assert!(result.is_err());
11819625d8cSopenharmony_ci    let err = result.err().unwrap();
11919625d8cSopenharmony_ci    assert_eq!(
12019625d8cSopenharmony_ci        err.kind(),
12119625d8cSopenharmony_ci        ErrorKind::DisplayHelpOnMissingArgumentOrSubcommand
12219625d8cSopenharmony_ci    );
12319625d8cSopenharmony_ci}
12419625d8cSopenharmony_ci
12519625d8cSopenharmony_ci#[test]
12619625d8cSopenharmony_cifn arg_required_else_help_with_default() {
12719625d8cSopenharmony_ci    let result = Command::new("arg_required")
12819625d8cSopenharmony_ci        .arg_required_else_help(true)
12919625d8cSopenharmony_ci        .arg(arg!(--input <PATH>).default_value("-"))
13019625d8cSopenharmony_ci        .try_get_matches_from(vec![""]);
13119625d8cSopenharmony_ci
13219625d8cSopenharmony_ci    assert!(result.is_err());
13319625d8cSopenharmony_ci    let err = result.err().unwrap();
13419625d8cSopenharmony_ci    assert_eq!(
13519625d8cSopenharmony_ci        err.kind(),
13619625d8cSopenharmony_ci        ErrorKind::DisplayHelpOnMissingArgumentOrSubcommand
13719625d8cSopenharmony_ci    );
13819625d8cSopenharmony_ci}
13919625d8cSopenharmony_ci
14019625d8cSopenharmony_ci#[test]
14119625d8cSopenharmony_cifn arg_required_else_help_error_message() {
14219625d8cSopenharmony_ci    static ARG_REQUIRED_ELSE_HELP: &str = "\
14319625d8cSopenharmony_ciUsage: test [OPTIONS]
14419625d8cSopenharmony_ci
14519625d8cSopenharmony_ciOptions:
14619625d8cSopenharmony_ci  -i, --info     Provides more info
14719625d8cSopenharmony_ci  -h, --help     Print help
14819625d8cSopenharmony_ci  -V, --version  Print version
14919625d8cSopenharmony_ci";
15019625d8cSopenharmony_ci
15119625d8cSopenharmony_ci    let cmd = Command::new("test")
15219625d8cSopenharmony_ci        .arg_required_else_help(true)
15319625d8cSopenharmony_ci        .version("1.0")
15419625d8cSopenharmony_ci        .arg(
15519625d8cSopenharmony_ci            Arg::new("info")
15619625d8cSopenharmony_ci                .help("Provides more info")
15719625d8cSopenharmony_ci                .short('i')
15819625d8cSopenharmony_ci                .long("info")
15919625d8cSopenharmony_ci                .action(ArgAction::SetTrue),
16019625d8cSopenharmony_ci        );
16119625d8cSopenharmony_ci    utils::assert_output(
16219625d8cSopenharmony_ci        cmd,
16319625d8cSopenharmony_ci        "test",
16419625d8cSopenharmony_ci        ARG_REQUIRED_ELSE_HELP,
16519625d8cSopenharmony_ci        true, // Unlike normal displaying of help, we should provide a fatal exit code
16619625d8cSopenharmony_ci    );
16719625d8cSopenharmony_ci}
16819625d8cSopenharmony_ci
16919625d8cSopenharmony_ci#[cfg(not(feature = "suggestions"))]
17019625d8cSopenharmony_ci#[test]
17119625d8cSopenharmony_cifn infer_subcommands_fail_no_args() {
17219625d8cSopenharmony_ci    let m = Command::new("prog")
17319625d8cSopenharmony_ci        .infer_subcommands(true)
17419625d8cSopenharmony_ci        .subcommand(Command::new("test"))
17519625d8cSopenharmony_ci        .subcommand(Command::new("temp"))
17619625d8cSopenharmony_ci        .try_get_matches_from(vec!["prog", "te"]);
17719625d8cSopenharmony_ci    assert!(m.is_err(), "{:#?}", m.unwrap());
17819625d8cSopenharmony_ci    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidSubcommand);
17919625d8cSopenharmony_ci}
18019625d8cSopenharmony_ci
18119625d8cSopenharmony_ci#[cfg(feature = "suggestions")]
18219625d8cSopenharmony_ci#[test]
18319625d8cSopenharmony_cifn infer_subcommands_fail_no_args() {
18419625d8cSopenharmony_ci    let m = Command::new("prog")
18519625d8cSopenharmony_ci        .infer_subcommands(true)
18619625d8cSopenharmony_ci        .subcommand(Command::new("test"))
18719625d8cSopenharmony_ci        .subcommand(Command::new("temp"))
18819625d8cSopenharmony_ci        .try_get_matches_from(vec!["prog", "te"]);
18919625d8cSopenharmony_ci    assert!(m.is_err(), "{:#?}", m.unwrap());
19019625d8cSopenharmony_ci    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidSubcommand);
19119625d8cSopenharmony_ci}
19219625d8cSopenharmony_ci
19319625d8cSopenharmony_ci#[test]
19419625d8cSopenharmony_cifn infer_subcommands_fail_with_args() {
19519625d8cSopenharmony_ci    let m = Command::new("prog")
19619625d8cSopenharmony_ci        .infer_subcommands(true)
19719625d8cSopenharmony_ci        .arg(Arg::new("some"))
19819625d8cSopenharmony_ci        .subcommand(Command::new("test"))
19919625d8cSopenharmony_ci        .subcommand(Command::new("temp"))
20019625d8cSopenharmony_ci        .try_get_matches_from(vec!["prog", "t"]);
20119625d8cSopenharmony_ci    assert!(m.is_ok(), "{:?}", m.unwrap_err().kind());
20219625d8cSopenharmony_ci    assert_eq!(
20319625d8cSopenharmony_ci        m.unwrap().get_one::<String>("some").map(|v| v.as_str()),
20419625d8cSopenharmony_ci        Some("t")
20519625d8cSopenharmony_ci    );
20619625d8cSopenharmony_ci}
20719625d8cSopenharmony_ci
20819625d8cSopenharmony_ci#[test]
20919625d8cSopenharmony_cifn infer_subcommands_fail_with_args2() {
21019625d8cSopenharmony_ci    let m = Command::new("prog")
21119625d8cSopenharmony_ci        .infer_subcommands(true)
21219625d8cSopenharmony_ci        .arg(Arg::new("some"))
21319625d8cSopenharmony_ci        .subcommand(Command::new("test"))
21419625d8cSopenharmony_ci        .subcommand(Command::new("temp"))
21519625d8cSopenharmony_ci        .try_get_matches_from(vec!["prog", "te"]);
21619625d8cSopenharmony_ci    assert!(m.is_ok(), "{:?}", m.unwrap_err().kind());
21719625d8cSopenharmony_ci    assert_eq!(
21819625d8cSopenharmony_ci        m.unwrap().get_one::<String>("some").map(|v| v.as_str()),
21919625d8cSopenharmony_ci        Some("te")
22019625d8cSopenharmony_ci    );
22119625d8cSopenharmony_ci}
22219625d8cSopenharmony_ci
22319625d8cSopenharmony_ci#[test]
22419625d8cSopenharmony_cifn infer_subcommands_pass() {
22519625d8cSopenharmony_ci    let m = Command::new("prog")
22619625d8cSopenharmony_ci        .infer_subcommands(true)
22719625d8cSopenharmony_ci        .subcommand(Command::new("test"))
22819625d8cSopenharmony_ci        .try_get_matches_from(vec!["prog", "te"])
22919625d8cSopenharmony_ci        .unwrap();
23019625d8cSopenharmony_ci    assert_eq!(m.subcommand_name(), Some("test"));
23119625d8cSopenharmony_ci}
23219625d8cSopenharmony_ci
23319625d8cSopenharmony_ci#[test]
23419625d8cSopenharmony_cifn infer_subcommands_pass_close() {
23519625d8cSopenharmony_ci    let m = Command::new("prog")
23619625d8cSopenharmony_ci        .infer_subcommands(true)
23719625d8cSopenharmony_ci        .subcommand(Command::new("test"))
23819625d8cSopenharmony_ci        .subcommand(Command::new("temp"))
23919625d8cSopenharmony_ci        .try_get_matches_from(vec!["prog", "tes"])
24019625d8cSopenharmony_ci        .unwrap();
24119625d8cSopenharmony_ci    assert_eq!(m.subcommand_name(), Some("test"));
24219625d8cSopenharmony_ci}
24319625d8cSopenharmony_ci
24419625d8cSopenharmony_ci#[test]
24519625d8cSopenharmony_cifn infer_subcommands_pass_exact_match() {
24619625d8cSopenharmony_ci    let m = Command::new("prog")
24719625d8cSopenharmony_ci        .infer_subcommands(true)
24819625d8cSopenharmony_ci        .subcommand(Command::new("test"))
24919625d8cSopenharmony_ci        .subcommand(Command::new("testa"))
25019625d8cSopenharmony_ci        .subcommand(Command::new("testb"))
25119625d8cSopenharmony_ci        .try_get_matches_from(vec!["prog", "test"])
25219625d8cSopenharmony_ci        .unwrap();
25319625d8cSopenharmony_ci    assert_eq!(m.subcommand_name(), Some("test"));
25419625d8cSopenharmony_ci}
25519625d8cSopenharmony_ci
25619625d8cSopenharmony_ci#[cfg(feature = "suggestions")]
25719625d8cSopenharmony_ci#[test]
25819625d8cSopenharmony_cifn infer_subcommands_fail_suggestions() {
25919625d8cSopenharmony_ci    let m = Command::new("prog")
26019625d8cSopenharmony_ci        .infer_subcommands(true)
26119625d8cSopenharmony_ci        .subcommand(Command::new("test"))
26219625d8cSopenharmony_ci        .subcommand(Command::new("temp"))
26319625d8cSopenharmony_ci        .try_get_matches_from(vec!["prog", "temps"]);
26419625d8cSopenharmony_ci    assert!(m.is_err(), "{:#?}", m.unwrap());
26519625d8cSopenharmony_ci    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidSubcommand);
26619625d8cSopenharmony_ci}
26719625d8cSopenharmony_ci
26819625d8cSopenharmony_ci#[cfg(not(feature = "suggestions"))]
26919625d8cSopenharmony_ci#[test]
27019625d8cSopenharmony_cifn infer_subcommands_fail_suggestions() {
27119625d8cSopenharmony_ci    let m = Command::new("prog")
27219625d8cSopenharmony_ci        .infer_subcommands(true)
27319625d8cSopenharmony_ci        .subcommand(Command::new("test"))
27419625d8cSopenharmony_ci        .subcommand(Command::new("temp"))
27519625d8cSopenharmony_ci        .try_get_matches_from(vec!["prog", "temps"]);
27619625d8cSopenharmony_ci    assert!(m.is_err(), "{:#?}", m.unwrap());
27719625d8cSopenharmony_ci    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidSubcommand);
27819625d8cSopenharmony_ci}
27919625d8cSopenharmony_ci
28019625d8cSopenharmony_ci#[test]
28119625d8cSopenharmony_cifn no_bin_name() {
28219625d8cSopenharmony_ci    let result = Command::new("arg_required")
28319625d8cSopenharmony_ci        .no_binary_name(true)
28419625d8cSopenharmony_ci        .arg(Arg::new("test").required(true).index(1))
28519625d8cSopenharmony_ci        .try_get_matches_from(vec!["testing"]);
28619625d8cSopenharmony_ci    assert!(result.is_ok(), "{}", result.unwrap_err());
28719625d8cSopenharmony_ci    let matches = result.unwrap();
28819625d8cSopenharmony_ci    assert_eq!(
28919625d8cSopenharmony_ci        matches
29019625d8cSopenharmony_ci            .get_one::<String>("test")
29119625d8cSopenharmony_ci            .map(|v| v.as_str())
29219625d8cSopenharmony_ci            .unwrap(),
29319625d8cSopenharmony_ci        "testing"
29419625d8cSopenharmony_ci    );
29519625d8cSopenharmony_ci}
29619625d8cSopenharmony_ci
29719625d8cSopenharmony_ci#[test]
29819625d8cSopenharmony_cifn skip_possible_values() {
29919625d8cSopenharmony_ci    static SKIP_POS_VALS: &str = "\
30019625d8cSopenharmony_citests stuff
30119625d8cSopenharmony_ci
30219625d8cSopenharmony_ciUsage: test [OPTIONS] [arg1]
30319625d8cSopenharmony_ci
30419625d8cSopenharmony_ciArguments:
30519625d8cSopenharmony_ci  [arg1]  some pos arg
30619625d8cSopenharmony_ci
30719625d8cSopenharmony_ciOptions:
30819625d8cSopenharmony_ci  -o, --opt <opt>  some option
30919625d8cSopenharmony_ci  -h, --help       Print help
31019625d8cSopenharmony_ci  -V, --version    Print version
31119625d8cSopenharmony_ci";
31219625d8cSopenharmony_ci
31319625d8cSopenharmony_ci    let cmd = Command::new("test")
31419625d8cSopenharmony_ci        .author("Kevin K.")
31519625d8cSopenharmony_ci        .about("tests stuff")
31619625d8cSopenharmony_ci        .version("1.3")
31719625d8cSopenharmony_ci        .hide_possible_values(true)
31819625d8cSopenharmony_ci        .args([
31919625d8cSopenharmony_ci            arg!(-o --opt <opt> "some option").value_parser(["one", "two"]),
32019625d8cSopenharmony_ci            arg!([arg1] "some pos arg").value_parser(["three", "four"]),
32119625d8cSopenharmony_ci        ]);
32219625d8cSopenharmony_ci
32319625d8cSopenharmony_ci    utils::assert_output(cmd, "test --help", SKIP_POS_VALS, false);
32419625d8cSopenharmony_ci}
32519625d8cSopenharmony_ci
32619625d8cSopenharmony_ci#[test]
32719625d8cSopenharmony_cifn stop_delim_values_only_pos_follows() {
32819625d8cSopenharmony_ci    let r = Command::new("onlypos")
32919625d8cSopenharmony_ci        .dont_delimit_trailing_values(true)
33019625d8cSopenharmony_ci        .args([arg!(f: -f <flag> "some opt"), arg!([arg] ... "some arg")])
33119625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--", "-f", "-g,x"]);
33219625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
33319625d8cSopenharmony_ci    let m = r.unwrap();
33419625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
33519625d8cSopenharmony_ci    assert!(!m.contains_id("f"));
33619625d8cSopenharmony_ci    assert_eq!(
33719625d8cSopenharmony_ci        m.get_many::<String>("arg")
33819625d8cSopenharmony_ci            .unwrap()
33919625d8cSopenharmony_ci            .map(|v| v.as_str())
34019625d8cSopenharmony_ci            .collect::<Vec<_>>(),
34119625d8cSopenharmony_ci        ["-f", "-g,x"]
34219625d8cSopenharmony_ci    );
34319625d8cSopenharmony_ci}
34419625d8cSopenharmony_ci
34519625d8cSopenharmony_ci#[test]
34619625d8cSopenharmony_cifn dont_delim_values_trailingvararg() {
34719625d8cSopenharmony_ci    let m = Command::new("positional")
34819625d8cSopenharmony_ci        .dont_delimit_trailing_values(true)
34919625d8cSopenharmony_ci        .arg(arg!([opt] ... "some pos").trailing_var_arg(true))
35019625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "test", "--foo", "-Wl,-bar"])
35119625d8cSopenharmony_ci        .unwrap();
35219625d8cSopenharmony_ci    assert!(m.contains_id("opt"));
35319625d8cSopenharmony_ci    assert_eq!(
35419625d8cSopenharmony_ci        m.get_many::<String>("opt")
35519625d8cSopenharmony_ci            .unwrap()
35619625d8cSopenharmony_ci            .map(|v| v.as_str())
35719625d8cSopenharmony_ci            .collect::<Vec<_>>(),
35819625d8cSopenharmony_ci        ["test", "--foo", "-Wl,-bar"]
35919625d8cSopenharmony_ci    );
36019625d8cSopenharmony_ci}
36119625d8cSopenharmony_ci
36219625d8cSopenharmony_ci#[test]
36319625d8cSopenharmony_cifn delim_values_only_pos_follows() {
36419625d8cSopenharmony_ci    let r = Command::new("onlypos")
36519625d8cSopenharmony_ci        .args([arg!(f: -f [flag] "some opt"), arg!([arg] ... "some arg")])
36619625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--", "-f", "-g,x"]);
36719625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
36819625d8cSopenharmony_ci    let m = r.unwrap();
36919625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
37019625d8cSopenharmony_ci    assert!(!m.contains_id("f"));
37119625d8cSopenharmony_ci    assert_eq!(
37219625d8cSopenharmony_ci        m.get_many::<String>("arg")
37319625d8cSopenharmony_ci            .unwrap()
37419625d8cSopenharmony_ci            .map(|v| v.as_str())
37519625d8cSopenharmony_ci            .collect::<Vec<_>>(),
37619625d8cSopenharmony_ci        ["-f", "-g,x"]
37719625d8cSopenharmony_ci    );
37819625d8cSopenharmony_ci}
37919625d8cSopenharmony_ci
38019625d8cSopenharmony_ci#[test]
38119625d8cSopenharmony_cifn delim_values_trailingvararg() {
38219625d8cSopenharmony_ci    let m = Command::new("positional")
38319625d8cSopenharmony_ci        .arg(arg!([opt] ... "some pos").trailing_var_arg(true))
38419625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "test", "--foo", "-Wl,-bar"])
38519625d8cSopenharmony_ci        .unwrap();
38619625d8cSopenharmony_ci    assert!(m.contains_id("opt"));
38719625d8cSopenharmony_ci    assert_eq!(
38819625d8cSopenharmony_ci        m.get_many::<String>("opt")
38919625d8cSopenharmony_ci            .unwrap()
39019625d8cSopenharmony_ci            .map(|v| v.as_str())
39119625d8cSopenharmony_ci            .collect::<Vec<_>>(),
39219625d8cSopenharmony_ci        ["test", "--foo", "-Wl,-bar"]
39319625d8cSopenharmony_ci    );
39419625d8cSopenharmony_ci}
39519625d8cSopenharmony_ci
39619625d8cSopenharmony_ci#[test]
39719625d8cSopenharmony_cifn delim_values_only_pos_follows_with_delim() {
39819625d8cSopenharmony_ci    let r = Command::new("onlypos")
39919625d8cSopenharmony_ci        .args([
40019625d8cSopenharmony_ci            arg!(f: -f [flag] "some opt"),
40119625d8cSopenharmony_ci            arg!([arg] ... "some arg").value_delimiter(','),
40219625d8cSopenharmony_ci        ])
40319625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--", "-f", "-g,x"]);
40419625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
40519625d8cSopenharmony_ci    let m = r.unwrap();
40619625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
40719625d8cSopenharmony_ci    assert!(!m.contains_id("f"));
40819625d8cSopenharmony_ci    assert_eq!(
40919625d8cSopenharmony_ci        m.get_many::<String>("arg")
41019625d8cSopenharmony_ci            .unwrap()
41119625d8cSopenharmony_ci            .map(|v| v.as_str())
41219625d8cSopenharmony_ci            .collect::<Vec<_>>(),
41319625d8cSopenharmony_ci        ["-f", "-g", "x"]
41419625d8cSopenharmony_ci    );
41519625d8cSopenharmony_ci}
41619625d8cSopenharmony_ci
41719625d8cSopenharmony_ci#[test]
41819625d8cSopenharmony_cifn delim_values_trailingvararg_with_delim() {
41919625d8cSopenharmony_ci    let m = Command::new("positional")
42019625d8cSopenharmony_ci        .arg(
42119625d8cSopenharmony_ci            arg!([opt] ... "some pos")
42219625d8cSopenharmony_ci                .value_delimiter(',')
42319625d8cSopenharmony_ci                .trailing_var_arg(true),
42419625d8cSopenharmony_ci        )
42519625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "test", "--foo", "-Wl,-bar"])
42619625d8cSopenharmony_ci        .unwrap();
42719625d8cSopenharmony_ci    assert!(m.contains_id("opt"));
42819625d8cSopenharmony_ci    assert_eq!(
42919625d8cSopenharmony_ci        m.get_many::<String>("opt")
43019625d8cSopenharmony_ci            .unwrap()
43119625d8cSopenharmony_ci            .map(|v| v.as_str())
43219625d8cSopenharmony_ci            .collect::<Vec<_>>(),
43319625d8cSopenharmony_ci        ["test", "--foo", "-Wl", "-bar"]
43419625d8cSopenharmony_ci    );
43519625d8cSopenharmony_ci}
43619625d8cSopenharmony_ci
43719625d8cSopenharmony_ci#[test]
43819625d8cSopenharmony_cifn leading_hyphen_short() {
43919625d8cSopenharmony_ci    let res = Command::new("leadhy")
44019625d8cSopenharmony_ci        .arg(Arg::new("some").allow_hyphen_values(true))
44119625d8cSopenharmony_ci        .arg(Arg::new("other").short('o').action(ArgAction::SetTrue))
44219625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-bar", "-o"]);
44319625d8cSopenharmony_ci    assert!(res.is_ok(), "Error: {:?}", res.unwrap_err().kind());
44419625d8cSopenharmony_ci    let m = res.unwrap();
44519625d8cSopenharmony_ci    assert!(m.contains_id("some"));
44619625d8cSopenharmony_ci    assert!(m.contains_id("other"));
44719625d8cSopenharmony_ci    assert_eq!(
44819625d8cSopenharmony_ci        m.get_one::<String>("some").map(|v| v.as_str()).unwrap(),
44919625d8cSopenharmony_ci        "-bar"
45019625d8cSopenharmony_ci    );
45119625d8cSopenharmony_ci    assert_eq!(
45219625d8cSopenharmony_ci        *m.get_one::<bool>("other").expect("defaulted by clap"),
45319625d8cSopenharmony_ci        true
45419625d8cSopenharmony_ci    );
45519625d8cSopenharmony_ci}
45619625d8cSopenharmony_ci
45719625d8cSopenharmony_ci#[test]
45819625d8cSopenharmony_cifn leading_hyphen_long() {
45919625d8cSopenharmony_ci    let res = Command::new("leadhy")
46019625d8cSopenharmony_ci        .arg(Arg::new("some").allow_hyphen_values(true))
46119625d8cSopenharmony_ci        .arg(Arg::new("other").short('o').action(ArgAction::SetTrue))
46219625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--bar", "-o"]);
46319625d8cSopenharmony_ci    assert!(res.is_ok(), "Error: {:?}", res.unwrap_err().kind());
46419625d8cSopenharmony_ci    let m = res.unwrap();
46519625d8cSopenharmony_ci    assert!(m.contains_id("some"));
46619625d8cSopenharmony_ci    assert!(m.contains_id("other"));
46719625d8cSopenharmony_ci    assert_eq!(
46819625d8cSopenharmony_ci        m.get_one::<String>("some").map(|v| v.as_str()).unwrap(),
46919625d8cSopenharmony_ci        "--bar"
47019625d8cSopenharmony_ci    );
47119625d8cSopenharmony_ci    assert_eq!(
47219625d8cSopenharmony_ci        *m.get_one::<bool>("other").expect("defaulted by clap"),
47319625d8cSopenharmony_ci        true
47419625d8cSopenharmony_ci    );
47519625d8cSopenharmony_ci}
47619625d8cSopenharmony_ci
47719625d8cSopenharmony_ci#[test]
47819625d8cSopenharmony_cifn leading_hyphen_opt() {
47919625d8cSopenharmony_ci    let res = Command::new("leadhy")
48019625d8cSopenharmony_ci        .arg(
48119625d8cSopenharmony_ci            Arg::new("some")
48219625d8cSopenharmony_ci                .action(ArgAction::Set)
48319625d8cSopenharmony_ci                .long("opt")
48419625d8cSopenharmony_ci                .allow_hyphen_values(true),
48519625d8cSopenharmony_ci        )
48619625d8cSopenharmony_ci        .arg(Arg::new("other").short('o').action(ArgAction::SetTrue))
48719625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--opt", "--bar", "-o"]);
48819625d8cSopenharmony_ci    assert!(res.is_ok(), "Error: {:?}", res.unwrap_err().kind());
48919625d8cSopenharmony_ci    let m = res.unwrap();
49019625d8cSopenharmony_ci    assert!(m.contains_id("some"));
49119625d8cSopenharmony_ci    assert!(m.contains_id("other"));
49219625d8cSopenharmony_ci    assert_eq!(
49319625d8cSopenharmony_ci        m.get_one::<String>("some").map(|v| v.as_str()).unwrap(),
49419625d8cSopenharmony_ci        "--bar"
49519625d8cSopenharmony_ci    );
49619625d8cSopenharmony_ci    assert_eq!(
49719625d8cSopenharmony_ci        *m.get_one::<bool>("other").expect("defaulted by clap"),
49819625d8cSopenharmony_ci        true
49919625d8cSopenharmony_ci    );
50019625d8cSopenharmony_ci}
50119625d8cSopenharmony_ci
50219625d8cSopenharmony_ci#[test]
50319625d8cSopenharmony_cifn allow_negative_numbers_success() {
50419625d8cSopenharmony_ci    let res = Command::new("negnum")
50519625d8cSopenharmony_ci        .arg(Arg::new("panum").allow_negative_numbers(true))
50619625d8cSopenharmony_ci        .arg(
50719625d8cSopenharmony_ci            Arg::new("onum")
50819625d8cSopenharmony_ci                .short('o')
50919625d8cSopenharmony_ci                .action(ArgAction::Set)
51019625d8cSopenharmony_ci                .allow_negative_numbers(true),
51119625d8cSopenharmony_ci        )
51219625d8cSopenharmony_ci        .try_get_matches_from(vec!["negnum", "-20", "-o", "-1.2"]);
51319625d8cSopenharmony_ci    assert!(res.is_ok(), "Error: {:?}", res.unwrap_err().kind());
51419625d8cSopenharmony_ci    let m = res.unwrap();
51519625d8cSopenharmony_ci    assert_eq!(
51619625d8cSopenharmony_ci        m.get_one::<String>("panum").map(|v| v.as_str()).unwrap(),
51719625d8cSopenharmony_ci        "-20"
51819625d8cSopenharmony_ci    );
51919625d8cSopenharmony_ci    assert_eq!(
52019625d8cSopenharmony_ci        m.get_one::<String>("onum").map(|v| v.as_str()).unwrap(),
52119625d8cSopenharmony_ci        "-1.2"
52219625d8cSopenharmony_ci    );
52319625d8cSopenharmony_ci}
52419625d8cSopenharmony_ci
52519625d8cSopenharmony_ci#[test]
52619625d8cSopenharmony_cifn allow_negative_numbers_fail() {
52719625d8cSopenharmony_ci    let res = Command::new("negnum")
52819625d8cSopenharmony_ci        .arg(Arg::new("panum").allow_negative_numbers(true))
52919625d8cSopenharmony_ci        .arg(
53019625d8cSopenharmony_ci            Arg::new("onum")
53119625d8cSopenharmony_ci                .short('o')
53219625d8cSopenharmony_ci                .action(ArgAction::Set)
53319625d8cSopenharmony_ci                .allow_negative_numbers(true),
53419625d8cSopenharmony_ci        )
53519625d8cSopenharmony_ci        .try_get_matches_from(vec!["negnum", "--foo", "-o", "-1.2"]);
53619625d8cSopenharmony_ci    assert!(res.is_err());
53719625d8cSopenharmony_ci    assert_eq!(res.unwrap_err().kind(), ErrorKind::UnknownArgument)
53819625d8cSopenharmony_ci}
53919625d8cSopenharmony_ci
54019625d8cSopenharmony_ci#[test]
54119625d8cSopenharmony_cifn trailing_var_arg_with_hyphen_values_escape_first() {
54219625d8cSopenharmony_ci    assert_trailing_var_args(&["test", "--", "foo", "bar"], Some(&["foo", "bar"]), false);
54319625d8cSopenharmony_ci}
54419625d8cSopenharmony_ci
54519625d8cSopenharmony_ci#[test]
54619625d8cSopenharmony_cifn trailing_var_arg_with_hyphen_values_escape_middle() {
54719625d8cSopenharmony_ci    assert_trailing_var_args(
54819625d8cSopenharmony_ci        &["test", "foo", "--", "bar"],
54919625d8cSopenharmony_ci        Some(&["foo", "--", "bar"]),
55019625d8cSopenharmony_ci        false,
55119625d8cSopenharmony_ci    );
55219625d8cSopenharmony_ci}
55319625d8cSopenharmony_ci
55419625d8cSopenharmony_ci#[test]
55519625d8cSopenharmony_cifn trailing_var_arg_with_hyphen_values_short_first() {
55619625d8cSopenharmony_ci    assert_trailing_var_args(&["test", "-p", "foo", "bar"], Some(&["foo", "bar"]), true);
55719625d8cSopenharmony_ci}
55819625d8cSopenharmony_ci
55919625d8cSopenharmony_ci#[test]
56019625d8cSopenharmony_cifn trailing_var_arg_with_hyphen_values_short_middle() {
56119625d8cSopenharmony_ci    assert_trailing_var_args(
56219625d8cSopenharmony_ci        &["test", "foo", "-p", "bar"],
56319625d8cSopenharmony_ci        Some(&["foo", "-p", "bar"]),
56419625d8cSopenharmony_ci        false,
56519625d8cSopenharmony_ci    );
56619625d8cSopenharmony_ci}
56719625d8cSopenharmony_ci
56819625d8cSopenharmony_ci#[test]
56919625d8cSopenharmony_cifn trailing_var_arg_with_hyphen_values_long_first() {
57019625d8cSopenharmony_ci    assert_trailing_var_args(
57119625d8cSopenharmony_ci        &["test", "--prog", "foo", "bar"],
57219625d8cSopenharmony_ci        Some(&["foo", "bar"]),
57319625d8cSopenharmony_ci        true,
57419625d8cSopenharmony_ci    );
57519625d8cSopenharmony_ci}
57619625d8cSopenharmony_ci
57719625d8cSopenharmony_ci#[test]
57819625d8cSopenharmony_cifn trailing_var_arg_with_hyphen_values_long_middle() {
57919625d8cSopenharmony_ci    assert_trailing_var_args(
58019625d8cSopenharmony_ci        &["test", "foo", "--prog", "bar"],
58119625d8cSopenharmony_ci        Some(&["foo", "--prog", "bar"]),
58219625d8cSopenharmony_ci        false,
58319625d8cSopenharmony_ci    );
58419625d8cSopenharmony_ci}
58519625d8cSopenharmony_ci
58619625d8cSopenharmony_ci#[track_caller]
58719625d8cSopenharmony_cifn assert_trailing_var_args(
58819625d8cSopenharmony_ci    input: &[&str],
58919625d8cSopenharmony_ci    expected_var_arg: Option<&[&str]>,
59019625d8cSopenharmony_ci    expected_flag: bool,
59119625d8cSopenharmony_ci) {
59219625d8cSopenharmony_ci    let cmd = Command::new("test").arg(arg!(-p - -prog)).arg(
59319625d8cSopenharmony_ci        arg!([opt] ... "some pos")
59419625d8cSopenharmony_ci            .trailing_var_arg(true)
59519625d8cSopenharmony_ci            .allow_hyphen_values(true),
59619625d8cSopenharmony_ci    );
59719625d8cSopenharmony_ci    let m = cmd.try_get_matches_from(input);
59819625d8cSopenharmony_ci    assert!(
59919625d8cSopenharmony_ci        m.is_ok(),
60019625d8cSopenharmony_ci        "failed with args {:?}: {}",
60119625d8cSopenharmony_ci        input,
60219625d8cSopenharmony_ci        m.unwrap_err()
60319625d8cSopenharmony_ci    );
60419625d8cSopenharmony_ci    let m = m.unwrap();
60519625d8cSopenharmony_ci
60619625d8cSopenharmony_ci    let actual_var_args = m
60719625d8cSopenharmony_ci        .get_many::<String>("opt")
60819625d8cSopenharmony_ci        .map(|v| v.map(|s| s.as_str()).collect::<Vec<_>>());
60919625d8cSopenharmony_ci    assert_eq!(actual_var_args.as_deref(), expected_var_arg);
61019625d8cSopenharmony_ci    assert_eq!(m.get_flag("prog"), expected_flag);
61119625d8cSopenharmony_ci}
61219625d8cSopenharmony_ci
61319625d8cSopenharmony_ci#[test]
61419625d8cSopenharmony_cifn disable_help_subcommand() {
61519625d8cSopenharmony_ci    let result = Command::new("disablehelp")
61619625d8cSopenharmony_ci        .disable_help_subcommand(true)
61719625d8cSopenharmony_ci        .subcommand(Command::new("sub1"))
61819625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "help"]);
61919625d8cSopenharmony_ci    assert!(result.is_err());
62019625d8cSopenharmony_ci    let err = result.err().unwrap();
62119625d8cSopenharmony_ci    assert_eq!(err.kind(), ErrorKind::InvalidSubcommand);
62219625d8cSopenharmony_ci}
62319625d8cSopenharmony_ci
62419625d8cSopenharmony_ci#[test]
62519625d8cSopenharmony_cifn dont_collapse_args() {
62619625d8cSopenharmony_ci    let cmd = Command::new("clap-test").version("v1.4.8").args([
62719625d8cSopenharmony_ci        Arg::new("arg1").help("some"),
62819625d8cSopenharmony_ci        Arg::new("arg2").help("some"),
62919625d8cSopenharmony_ci        Arg::new("arg3").help("some"),
63019625d8cSopenharmony_ci    ]);
63119625d8cSopenharmony_ci    utils::assert_output(cmd, "clap-test --help", DONT_COLLAPSE_ARGS, false);
63219625d8cSopenharmony_ci}
63319625d8cSopenharmony_ci
63419625d8cSopenharmony_ci#[test]
63519625d8cSopenharmony_cifn require_eq() {
63619625d8cSopenharmony_ci    static REQUIRE_EQUALS: &str = "\
63719625d8cSopenharmony_ciUsage: clap-test --opt=<FILE>
63819625d8cSopenharmony_ci
63919625d8cSopenharmony_ciOptions:
64019625d8cSopenharmony_ci  -o, --opt=<FILE>  some
64119625d8cSopenharmony_ci  -h, --help        Print help
64219625d8cSopenharmony_ci  -V, --version     Print version
64319625d8cSopenharmony_ci";
64419625d8cSopenharmony_ci
64519625d8cSopenharmony_ci    let cmd = Command::new("clap-test").version("v1.4.8").arg(
64619625d8cSopenharmony_ci        Arg::new("opt")
64719625d8cSopenharmony_ci            .long("opt")
64819625d8cSopenharmony_ci            .short('o')
64919625d8cSopenharmony_ci            .required(true)
65019625d8cSopenharmony_ci            .require_equals(true)
65119625d8cSopenharmony_ci            .value_name("FILE")
65219625d8cSopenharmony_ci            .help("some"),
65319625d8cSopenharmony_ci    );
65419625d8cSopenharmony_ci    utils::assert_output(cmd, "clap-test --help", REQUIRE_EQUALS, false);
65519625d8cSopenharmony_ci}
65619625d8cSopenharmony_ci
65719625d8cSopenharmony_ci#[test]
65819625d8cSopenharmony_cifn propagate_vals_down() {
65919625d8cSopenharmony_ci    let m = Command::new("myprog")
66019625d8cSopenharmony_ci        .arg(arg!([cmd] "command to run").global(true))
66119625d8cSopenharmony_ci        .subcommand(Command::new("foo"))
66219625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog", "set", "foo"]);
66319625d8cSopenharmony_ci    assert!(m.is_ok(), "{:?}", m.unwrap_err().kind());
66419625d8cSopenharmony_ci    let m = m.unwrap();
66519625d8cSopenharmony_ci    assert_eq!(m.get_one::<String>("cmd").map(|v| v.as_str()), Some("set"));
66619625d8cSopenharmony_ci    let sub_m = m.subcommand_matches("foo").unwrap();
66719625d8cSopenharmony_ci    assert_eq!(
66819625d8cSopenharmony_ci        sub_m.get_one::<String>("cmd").map(|v| v.as_str()),
66919625d8cSopenharmony_ci        Some("set")
67019625d8cSopenharmony_ci    );
67119625d8cSopenharmony_ci}
67219625d8cSopenharmony_ci
67319625d8cSopenharmony_ci#[test]
67419625d8cSopenharmony_cifn allow_missing_positional() {
67519625d8cSopenharmony_ci    let m = Command::new("test")
67619625d8cSopenharmony_ci        .allow_missing_positional(true)
67719625d8cSopenharmony_ci        .arg(arg!([src] "some file").default_value("src"))
67819625d8cSopenharmony_ci        .arg(arg!(<dest> "some file"))
67919625d8cSopenharmony_ci        .try_get_matches_from(vec!["test", "file"]);
68019625d8cSopenharmony_ci    assert!(m.is_ok(), "{:?}", m.unwrap_err().kind());
68119625d8cSopenharmony_ci    let m = m.unwrap();
68219625d8cSopenharmony_ci    assert_eq!(m.get_one::<String>("src").map(|v| v.as_str()), Some("src"));
68319625d8cSopenharmony_ci    assert_eq!(
68419625d8cSopenharmony_ci        m.get_one::<String>("dest").map(|v| v.as_str()),
68519625d8cSopenharmony_ci        Some("file")
68619625d8cSopenharmony_ci    );
68719625d8cSopenharmony_ci}
68819625d8cSopenharmony_ci
68919625d8cSopenharmony_ci#[test]
69019625d8cSopenharmony_cifn allow_missing_positional_no_default() {
69119625d8cSopenharmony_ci    let m = Command::new("test")
69219625d8cSopenharmony_ci        .allow_missing_positional(true)
69319625d8cSopenharmony_ci        .arg(arg!([src] "some file"))
69419625d8cSopenharmony_ci        .arg(arg!(<dest> "some file"))
69519625d8cSopenharmony_ci        .try_get_matches_from(vec!["test", "file"]);
69619625d8cSopenharmony_ci    assert!(m.is_ok(), "{:?}", m.unwrap_err().kind());
69719625d8cSopenharmony_ci    let m = m.unwrap();
69819625d8cSopenharmony_ci    assert_eq!(m.get_one::<String>("src").map(|v| v.as_str()), None);
69919625d8cSopenharmony_ci    assert_eq!(
70019625d8cSopenharmony_ci        m.get_one::<String>("dest").map(|v| v.as_str()),
70119625d8cSopenharmony_ci        Some("file")
70219625d8cSopenharmony_ci    );
70319625d8cSopenharmony_ci}
70419625d8cSopenharmony_ci
70519625d8cSopenharmony_ci#[test]
70619625d8cSopenharmony_cifn missing_positional_no_hyphen() {
70719625d8cSopenharmony_ci    let r = Command::new("bench")
70819625d8cSopenharmony_ci        .allow_missing_positional(true)
70919625d8cSopenharmony_ci        .arg(arg!([BENCH] "some bench"))
71019625d8cSopenharmony_ci        .arg(arg!([ARGS] ... "some args"))
71119625d8cSopenharmony_ci        .try_get_matches_from(vec!["bench", "foo", "arg1", "arg2", "arg3"]);
71219625d8cSopenharmony_ci    assert!(r.is_ok(), "{:?}", r.unwrap_err().kind());
71319625d8cSopenharmony_ci
71419625d8cSopenharmony_ci    let m = r.unwrap();
71519625d8cSopenharmony_ci
71619625d8cSopenharmony_ci    let expected_bench = Some("foo");
71719625d8cSopenharmony_ci    let expected_args = vec!["arg1", "arg2", "arg3"];
71819625d8cSopenharmony_ci
71919625d8cSopenharmony_ci    assert_eq!(
72019625d8cSopenharmony_ci        m.get_one::<String>("BENCH").map(|v| v.as_str()),
72119625d8cSopenharmony_ci        expected_bench
72219625d8cSopenharmony_ci    );
72319625d8cSopenharmony_ci    assert_eq!(
72419625d8cSopenharmony_ci        m.get_many::<String>("ARGS")
72519625d8cSopenharmony_ci            .unwrap()
72619625d8cSopenharmony_ci            .map(|v| v.as_str())
72719625d8cSopenharmony_ci            .collect::<Vec<_>>(),
72819625d8cSopenharmony_ci        &*expected_args
72919625d8cSopenharmony_ci    );
73019625d8cSopenharmony_ci}
73119625d8cSopenharmony_ci
73219625d8cSopenharmony_ci#[test]
73319625d8cSopenharmony_cifn missing_positional_hyphen() {
73419625d8cSopenharmony_ci    let r = Command::new("bench")
73519625d8cSopenharmony_ci        .allow_missing_positional(true)
73619625d8cSopenharmony_ci        .arg(arg!([BENCH] "some bench"))
73719625d8cSopenharmony_ci        .arg(arg!([ARGS] ... "some args"))
73819625d8cSopenharmony_ci        .try_get_matches_from(vec!["bench", "--", "arg1", "arg2", "arg3"]);
73919625d8cSopenharmony_ci    assert!(r.is_ok(), "{:?}", r.unwrap_err().kind());
74019625d8cSopenharmony_ci
74119625d8cSopenharmony_ci    let m = r.unwrap();
74219625d8cSopenharmony_ci
74319625d8cSopenharmony_ci    let expected_bench = None;
74419625d8cSopenharmony_ci    let expected_args = vec!["arg1", "arg2", "arg3"];
74519625d8cSopenharmony_ci
74619625d8cSopenharmony_ci    assert_eq!(
74719625d8cSopenharmony_ci        m.get_one::<String>("BENCH").map(|v| v.as_str()),
74819625d8cSopenharmony_ci        expected_bench
74919625d8cSopenharmony_ci    );
75019625d8cSopenharmony_ci    assert_eq!(
75119625d8cSopenharmony_ci        m.get_many::<String>("ARGS")
75219625d8cSopenharmony_ci            .unwrap()
75319625d8cSopenharmony_ci            .map(|v| v.as_str())
75419625d8cSopenharmony_ci            .collect::<Vec<_>>(),
75519625d8cSopenharmony_ci        &*expected_args
75619625d8cSopenharmony_ci    );
75719625d8cSopenharmony_ci}
75819625d8cSopenharmony_ci
75919625d8cSopenharmony_ci#[test]
76019625d8cSopenharmony_cifn missing_positional_hyphen_far_back() {
76119625d8cSopenharmony_ci    let r = Command::new("bench")
76219625d8cSopenharmony_ci        .allow_missing_positional(true)
76319625d8cSopenharmony_ci        .arg(arg!([BENCH1] "some bench"))
76419625d8cSopenharmony_ci        .arg(arg!([BENCH2] "some bench"))
76519625d8cSopenharmony_ci        .arg(arg!([BENCH3] "some bench"))
76619625d8cSopenharmony_ci        .arg(arg!([ARGS] ... "some args"))
76719625d8cSopenharmony_ci        .try_get_matches_from(vec!["bench", "foo", "--", "arg1", "arg2", "arg3"]);
76819625d8cSopenharmony_ci    assert!(r.is_ok(), "{:?}", r.unwrap_err().kind());
76919625d8cSopenharmony_ci
77019625d8cSopenharmony_ci    let m = r.unwrap();
77119625d8cSopenharmony_ci
77219625d8cSopenharmony_ci    let expected_bench1 = Some("foo");
77319625d8cSopenharmony_ci    let expected_bench2 = None;
77419625d8cSopenharmony_ci    let expected_bench3 = None;
77519625d8cSopenharmony_ci    let expected_args = vec!["arg1", "arg2", "arg3"];
77619625d8cSopenharmony_ci
77719625d8cSopenharmony_ci    assert_eq!(
77819625d8cSopenharmony_ci        m.get_one::<String>("BENCH1").map(|v| v.as_str()),
77919625d8cSopenharmony_ci        expected_bench1
78019625d8cSopenharmony_ci    );
78119625d8cSopenharmony_ci    assert_eq!(
78219625d8cSopenharmony_ci        m.get_one::<String>("BENCH2").map(|v| v.as_str()),
78319625d8cSopenharmony_ci        expected_bench2
78419625d8cSopenharmony_ci    );
78519625d8cSopenharmony_ci    assert_eq!(
78619625d8cSopenharmony_ci        m.get_one::<String>("BENCH3").map(|v| v.as_str()),
78719625d8cSopenharmony_ci        expected_bench3
78819625d8cSopenharmony_ci    );
78919625d8cSopenharmony_ci    assert_eq!(
79019625d8cSopenharmony_ci        m.get_many::<String>("ARGS")
79119625d8cSopenharmony_ci            .unwrap()
79219625d8cSopenharmony_ci            .map(|v| v.as_str())
79319625d8cSopenharmony_ci            .collect::<Vec<_>>(),
79419625d8cSopenharmony_ci        &*expected_args
79519625d8cSopenharmony_ci    );
79619625d8cSopenharmony_ci}
79719625d8cSopenharmony_ci
79819625d8cSopenharmony_ci#[test]
79919625d8cSopenharmony_cifn missing_positional_hyphen_req_error() {
80019625d8cSopenharmony_ci    let r = Command::new("bench")
80119625d8cSopenharmony_ci        .allow_missing_positional(true)
80219625d8cSopenharmony_ci        .arg(arg!([BENCH1] "some bench"))
80319625d8cSopenharmony_ci        .arg(arg!(<BENCH2> "some bench"))
80419625d8cSopenharmony_ci        .arg(arg!([ARGS] ... "some args"))
80519625d8cSopenharmony_ci        .try_get_matches_from(vec!["bench", "foo", "--", "arg1", "arg2", "arg3"]);
80619625d8cSopenharmony_ci    assert!(r.is_err());
80719625d8cSopenharmony_ci    assert_eq!(r.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);
80819625d8cSopenharmony_ci}
80919625d8cSopenharmony_ci
81019625d8cSopenharmony_ci#[test]
81119625d8cSopenharmony_cifn issue_1066_allow_leading_hyphen_and_unknown_args_option() {
81219625d8cSopenharmony_ci    let res = Command::new("prog")
81319625d8cSopenharmony_ci        .arg(
81419625d8cSopenharmony_ci            arg!(--"some-argument" <val>)
81519625d8cSopenharmony_ci                .required(true)
81619625d8cSopenharmony_ci                .allow_hyphen_values(true),
81719625d8cSopenharmony_ci        )
81819625d8cSopenharmony_ci        .try_get_matches_from(vec!["prog", "-fish"]);
81919625d8cSopenharmony_ci
82019625d8cSopenharmony_ci    assert!(res.is_err());
82119625d8cSopenharmony_ci    assert_eq!(res.unwrap_err().kind(), ErrorKind::UnknownArgument);
82219625d8cSopenharmony_ci}
82319625d8cSopenharmony_ci
82419625d8cSopenharmony_ci#[test]
82519625d8cSopenharmony_cifn issue_1437_allow_hyphen_values_for_positional_arg() {
82619625d8cSopenharmony_ci    let m = Command::new("tmp")
82719625d8cSopenharmony_ci        .arg(
82819625d8cSopenharmony_ci            Arg::new("pat")
82919625d8cSopenharmony_ci                .allow_hyphen_values(true)
83019625d8cSopenharmony_ci                .required(true)
83119625d8cSopenharmony_ci                .action(ArgAction::Set),
83219625d8cSopenharmony_ci        )
83319625d8cSopenharmony_ci        .try_get_matches_from(["tmp", "-file"])
83419625d8cSopenharmony_ci        .unwrap();
83519625d8cSopenharmony_ci    assert_eq!(
83619625d8cSopenharmony_ci        m.get_one::<String>("pat").map(|v| v.as_str()),
83719625d8cSopenharmony_ci        Some("-file")
83819625d8cSopenharmony_ci    );
83919625d8cSopenharmony_ci}
84019625d8cSopenharmony_ci
84119625d8cSopenharmony_ci#[test]
84219625d8cSopenharmony_cifn issue_3880_allow_long_flag_hyphen_value_for_positional_arg() {
84319625d8cSopenharmony_ci    let m = Command::new("prog")
84419625d8cSopenharmony_ci        .arg(
84519625d8cSopenharmony_ci            Arg::new("pat")
84619625d8cSopenharmony_ci                .allow_hyphen_values(true)
84719625d8cSopenharmony_ci                .required(true)
84819625d8cSopenharmony_ci                .action(ArgAction::Set),
84919625d8cSopenharmony_ci        )
85019625d8cSopenharmony_ci        .try_get_matches_from(["", "--file"])
85119625d8cSopenharmony_ci        .unwrap();
85219625d8cSopenharmony_ci
85319625d8cSopenharmony_ci    assert_eq!(
85419625d8cSopenharmony_ci        m.get_one::<String>("pat").map(|v| v.as_str()),
85519625d8cSopenharmony_ci        Some("--file")
85619625d8cSopenharmony_ci    );
85719625d8cSopenharmony_ci}
85819625d8cSopenharmony_ci
85919625d8cSopenharmony_ci#[test]
86019625d8cSopenharmony_cifn issue_1093_allow_ext_sc() {
86119625d8cSopenharmony_ci    let cmd = Command::new("clap-test")
86219625d8cSopenharmony_ci        .version("v1.4.8")
86319625d8cSopenharmony_ci        .allow_external_subcommands(true);
86419625d8cSopenharmony_ci    utils::assert_output(cmd, "clap-test --help", ALLOW_EXT_SC, false);
86519625d8cSopenharmony_ci}
86619625d8cSopenharmony_ci
86719625d8cSopenharmony_ci#[test]
86819625d8cSopenharmony_cifn allow_ext_sc_empty_args() {
86919625d8cSopenharmony_ci    let res = Command::new("clap-test")
87019625d8cSopenharmony_ci        .version("v1.4.8")
87119625d8cSopenharmony_ci        .allow_external_subcommands(true)
87219625d8cSopenharmony_ci        .try_get_matches_from(vec!["clap-test", "external-cmd"]);
87319625d8cSopenharmony_ci
87419625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
87519625d8cSopenharmony_ci
87619625d8cSopenharmony_ci    match res.unwrap().subcommand() {
87719625d8cSopenharmony_ci        Some((name, args)) => {
87819625d8cSopenharmony_ci            assert_eq!(name, "external-cmd");
87919625d8cSopenharmony_ci            assert_eq!(
88019625d8cSopenharmony_ci                args.get_many::<OsString>("").unwrap().collect::<Vec<_>>(),
88119625d8cSopenharmony_ci                Vec::<&OsString>::new(),
88219625d8cSopenharmony_ci            );
88319625d8cSopenharmony_ci        }
88419625d8cSopenharmony_ci        _ => unreachable!(),
88519625d8cSopenharmony_ci    }
88619625d8cSopenharmony_ci}
88719625d8cSopenharmony_ci
88819625d8cSopenharmony_ci#[test]
88919625d8cSopenharmony_cifn allow_ext_sc_when_sc_required() {
89019625d8cSopenharmony_ci    let res = Command::new("clap-test")
89119625d8cSopenharmony_ci        .version("v1.4.8")
89219625d8cSopenharmony_ci        .allow_external_subcommands(true)
89319625d8cSopenharmony_ci        .subcommand_required(true)
89419625d8cSopenharmony_ci        .try_get_matches_from(vec!["clap-test", "external-cmd", "foo"]);
89519625d8cSopenharmony_ci
89619625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
89719625d8cSopenharmony_ci
89819625d8cSopenharmony_ci    match res.unwrap().subcommand() {
89919625d8cSopenharmony_ci        Some((name, args)) => {
90019625d8cSopenharmony_ci            assert_eq!(name, "external-cmd");
90119625d8cSopenharmony_ci            assert_eq!(
90219625d8cSopenharmony_ci                args.get_many::<OsString>("")
90319625d8cSopenharmony_ci                    .unwrap()
90419625d8cSopenharmony_ci                    .cloned()
90519625d8cSopenharmony_ci                    .collect::<Vec<_>>(),
90619625d8cSopenharmony_ci                vec![OsString::from("foo")]
90719625d8cSopenharmony_ci            );
90819625d8cSopenharmony_ci        }
90919625d8cSopenharmony_ci        _ => unreachable!(),
91019625d8cSopenharmony_ci    }
91119625d8cSopenharmony_ci}
91219625d8cSopenharmony_ci
91319625d8cSopenharmony_ci#[test]
91419625d8cSopenharmony_cifn external_subcommand_looks_like_built_in() {
91519625d8cSopenharmony_ci    let res = Command::new("cargo")
91619625d8cSopenharmony_ci        .version("1.26.0")
91719625d8cSopenharmony_ci        .allow_external_subcommands(true)
91819625d8cSopenharmony_ci        .subcommand(Command::new("install"))
91919625d8cSopenharmony_ci        .try_get_matches_from(vec!["cargo", "install-update", "foo"]);
92019625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
92119625d8cSopenharmony_ci    let m = res.unwrap();
92219625d8cSopenharmony_ci    match m.subcommand() {
92319625d8cSopenharmony_ci        Some((name, args)) => {
92419625d8cSopenharmony_ci            assert_eq!(name, "install-update");
92519625d8cSopenharmony_ci            assert_eq!(
92619625d8cSopenharmony_ci                args.get_many::<OsString>("")
92719625d8cSopenharmony_ci                    .unwrap()
92819625d8cSopenharmony_ci                    .cloned()
92919625d8cSopenharmony_ci                    .collect::<Vec<_>>(),
93019625d8cSopenharmony_ci                vec![OsString::from("foo")]
93119625d8cSopenharmony_ci            );
93219625d8cSopenharmony_ci        }
93319625d8cSopenharmony_ci        _ => panic!("external_subcommand didn't work"),
93419625d8cSopenharmony_ci    }
93519625d8cSopenharmony_ci}
93619625d8cSopenharmony_ci
93719625d8cSopenharmony_ci#[test]
93819625d8cSopenharmony_cifn built_in_subcommand_escaped() {
93919625d8cSopenharmony_ci    let res = Command::new("cargo")
94019625d8cSopenharmony_ci        .version("1.26.0")
94119625d8cSopenharmony_ci        .allow_external_subcommands(true)
94219625d8cSopenharmony_ci        .subcommand(Command::new("install"))
94319625d8cSopenharmony_ci        .try_get_matches_from(vec!["cargo", "--", "install", "foo"]);
94419625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
94519625d8cSopenharmony_ci    let m = res.unwrap();
94619625d8cSopenharmony_ci    match m.subcommand() {
94719625d8cSopenharmony_ci        Some((name, args)) => {
94819625d8cSopenharmony_ci            assert_eq!(name, "install");
94919625d8cSopenharmony_ci            assert_eq!(
95019625d8cSopenharmony_ci                args.get_many::<OsString>("")
95119625d8cSopenharmony_ci                    .unwrap()
95219625d8cSopenharmony_ci                    .cloned()
95319625d8cSopenharmony_ci                    .collect::<Vec<_>>(),
95419625d8cSopenharmony_ci                vec![OsString::from("foo")]
95519625d8cSopenharmony_ci            );
95619625d8cSopenharmony_ci        }
95719625d8cSopenharmony_ci        _ => panic!("external_subcommand didn't work"),
95819625d8cSopenharmony_ci    }
95919625d8cSopenharmony_ci}
96019625d8cSopenharmony_ci
96119625d8cSopenharmony_ci#[test]
96219625d8cSopenharmony_cifn aaos_opts_w_other_overrides() {
96319625d8cSopenharmony_ci    // opts with other overrides
96419625d8cSopenharmony_ci    let res = Command::new("posix")
96519625d8cSopenharmony_ci        .args_override_self(true)
96619625d8cSopenharmony_ci        .arg(arg!(--opt <val> "some option").action(ArgAction::Set))
96719625d8cSopenharmony_ci        .arg(
96819625d8cSopenharmony_ci            arg!(--other <val> "some other option")
96919625d8cSopenharmony_ci                .overrides_with("opt")
97019625d8cSopenharmony_ci                .action(ArgAction::Set),
97119625d8cSopenharmony_ci        )
97219625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--opt=some", "--other=test", "--opt=other"]);
97319625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
97419625d8cSopenharmony_ci    let m = res.unwrap();
97519625d8cSopenharmony_ci    assert!(m.contains_id("opt"));
97619625d8cSopenharmony_ci    assert!(!m.contains_id("other"));
97719625d8cSopenharmony_ci    assert_eq!(
97819625d8cSopenharmony_ci        m.get_one::<String>("opt").map(|v| v.as_str()),
97919625d8cSopenharmony_ci        Some("other")
98019625d8cSopenharmony_ci    );
98119625d8cSopenharmony_ci}
98219625d8cSopenharmony_ci
98319625d8cSopenharmony_ci#[test]
98419625d8cSopenharmony_cifn aaos_opts_w_other_overrides_rev() {
98519625d8cSopenharmony_ci    // opts with other overrides, rev
98619625d8cSopenharmony_ci    let res = Command::new("posix")
98719625d8cSopenharmony_ci        .args_override_self(true)
98819625d8cSopenharmony_ci        .arg(
98919625d8cSopenharmony_ci            arg!(--opt <val> "some option")
99019625d8cSopenharmony_ci                .required(true)
99119625d8cSopenharmony_ci                .action(ArgAction::Set),
99219625d8cSopenharmony_ci        )
99319625d8cSopenharmony_ci        .arg(
99419625d8cSopenharmony_ci            arg!(--other <val> "some other option")
99519625d8cSopenharmony_ci                .required(true)
99619625d8cSopenharmony_ci                .overrides_with("opt")
99719625d8cSopenharmony_ci                .action(ArgAction::Set),
99819625d8cSopenharmony_ci        )
99919625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--opt=some", "--opt=other", "--other=val"]);
100019625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
100119625d8cSopenharmony_ci    let m = res.unwrap();
100219625d8cSopenharmony_ci    assert!(!m.contains_id("opt"));
100319625d8cSopenharmony_ci    assert!(m.contains_id("other"));
100419625d8cSopenharmony_ci    assert_eq!(
100519625d8cSopenharmony_ci        m.get_one::<String>("other").map(|v| v.as_str()),
100619625d8cSopenharmony_ci        Some("val")
100719625d8cSopenharmony_ci    );
100819625d8cSopenharmony_ci}
100919625d8cSopenharmony_ci
101019625d8cSopenharmony_ci#[test]
101119625d8cSopenharmony_cifn aaos_opts_w_other_overrides_2() {
101219625d8cSopenharmony_ci    // opts with other overrides
101319625d8cSopenharmony_ci    let res = Command::new("posix")
101419625d8cSopenharmony_ci        .args_override_self(true)
101519625d8cSopenharmony_ci        .arg(
101619625d8cSopenharmony_ci            arg!(--opt <val> "some option")
101719625d8cSopenharmony_ci                .overrides_with("other")
101819625d8cSopenharmony_ci                .action(ArgAction::Set),
101919625d8cSopenharmony_ci        )
102019625d8cSopenharmony_ci        .arg(arg!(--other <val> "some other option").action(ArgAction::Set))
102119625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--opt=some", "--other=test", "--opt=other"]);
102219625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
102319625d8cSopenharmony_ci    let m = res.unwrap();
102419625d8cSopenharmony_ci    assert!(m.contains_id("opt"));
102519625d8cSopenharmony_ci    assert!(!m.contains_id("other"));
102619625d8cSopenharmony_ci    assert_eq!(
102719625d8cSopenharmony_ci        m.get_one::<String>("opt").map(|v| v.as_str()),
102819625d8cSopenharmony_ci        Some("other")
102919625d8cSopenharmony_ci    );
103019625d8cSopenharmony_ci}
103119625d8cSopenharmony_ci
103219625d8cSopenharmony_ci#[test]
103319625d8cSopenharmony_cifn aaos_opts_w_other_overrides_rev_2() {
103419625d8cSopenharmony_ci    // opts with other overrides, rev
103519625d8cSopenharmony_ci    let res = Command::new("posix")
103619625d8cSopenharmony_ci        .args_override_self(true)
103719625d8cSopenharmony_ci        .arg(
103819625d8cSopenharmony_ci            arg!(--opt <val> "some option")
103919625d8cSopenharmony_ci                .required(true)
104019625d8cSopenharmony_ci                .overrides_with("other")
104119625d8cSopenharmony_ci                .action(ArgAction::Set),
104219625d8cSopenharmony_ci        )
104319625d8cSopenharmony_ci        .arg(
104419625d8cSopenharmony_ci            arg!(--other <val> "some other option")
104519625d8cSopenharmony_ci                .required(true)
104619625d8cSopenharmony_ci                .action(ArgAction::Set),
104719625d8cSopenharmony_ci        )
104819625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--opt=some", "--opt=other", "--other=val"]);
104919625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
105019625d8cSopenharmony_ci    let m = res.unwrap();
105119625d8cSopenharmony_ci    assert!(!m.contains_id("opt"));
105219625d8cSopenharmony_ci    assert!(m.contains_id("other"));
105319625d8cSopenharmony_ci    assert_eq!(
105419625d8cSopenharmony_ci        m.get_one::<String>("other").map(|v| v.as_str()),
105519625d8cSopenharmony_ci        Some("val")
105619625d8cSopenharmony_ci    );
105719625d8cSopenharmony_ci}
105819625d8cSopenharmony_ci
105919625d8cSopenharmony_ci#[test]
106019625d8cSopenharmony_cifn aaos_opts_w_override_as_conflict_1() {
106119625d8cSopenharmony_ci    // opts with other overrides, rev
106219625d8cSopenharmony_ci    let res = Command::new("posix")
106319625d8cSopenharmony_ci        .arg(
106419625d8cSopenharmony_ci            arg!(--opt <val> "some option")
106519625d8cSopenharmony_ci                .required(true)
106619625d8cSopenharmony_ci                .overrides_with("other")
106719625d8cSopenharmony_ci                .action(ArgAction::Set),
106819625d8cSopenharmony_ci        )
106919625d8cSopenharmony_ci        .arg(
107019625d8cSopenharmony_ci            arg!(--other <val> "some other option")
107119625d8cSopenharmony_ci                .required(true)
107219625d8cSopenharmony_ci                .action(ArgAction::Set),
107319625d8cSopenharmony_ci        )
107419625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--opt=some"]);
107519625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
107619625d8cSopenharmony_ci    let m = res.unwrap();
107719625d8cSopenharmony_ci    assert!(m.contains_id("opt"));
107819625d8cSopenharmony_ci    assert!(!m.contains_id("other"));
107919625d8cSopenharmony_ci    assert_eq!(m.get_one::<String>("opt").map(|v| v.as_str()), Some("some"));
108019625d8cSopenharmony_ci}
108119625d8cSopenharmony_ci
108219625d8cSopenharmony_ci#[test]
108319625d8cSopenharmony_cifn aaos_opts_w_override_as_conflict_2() {
108419625d8cSopenharmony_ci    // opts with other overrides, rev
108519625d8cSopenharmony_ci    let res = Command::new("posix")
108619625d8cSopenharmony_ci        .arg(
108719625d8cSopenharmony_ci            arg!(--opt <val> "some option")
108819625d8cSopenharmony_ci                .required(true)
108919625d8cSopenharmony_ci                .overrides_with("other")
109019625d8cSopenharmony_ci                .action(ArgAction::Set),
109119625d8cSopenharmony_ci        )
109219625d8cSopenharmony_ci        .arg(
109319625d8cSopenharmony_ci            arg!(--other <val> "some other option")
109419625d8cSopenharmony_ci                .required(true)
109519625d8cSopenharmony_ci                .action(ArgAction::Set),
109619625d8cSopenharmony_ci        )
109719625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--other=some"]);
109819625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
109919625d8cSopenharmony_ci    let m = res.unwrap();
110019625d8cSopenharmony_ci    assert!(!m.contains_id("opt"));
110119625d8cSopenharmony_ci    assert!(m.contains_id("other"));
110219625d8cSopenharmony_ci    assert_eq!(
110319625d8cSopenharmony_ci        m.get_one::<String>("other").map(|v| v.as_str()),
110419625d8cSopenharmony_ci        Some("some")
110519625d8cSopenharmony_ci    );
110619625d8cSopenharmony_ci}
110719625d8cSopenharmony_ci
110819625d8cSopenharmony_ci#[test]
110919625d8cSopenharmony_cifn aaos_opts_mult_req_delims() {
111019625d8cSopenharmony_ci    // opts with multiple and require delims
111119625d8cSopenharmony_ci    let res = Command::new("posix")
111219625d8cSopenharmony_ci        .arg(
111319625d8cSopenharmony_ci            arg!(--opt <val> ... "some option")
111419625d8cSopenharmony_ci                .action(ArgAction::Set)
111519625d8cSopenharmony_ci                .value_delimiter(',')
111619625d8cSopenharmony_ci                .action(ArgAction::Append),
111719625d8cSopenharmony_ci        )
111819625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--opt=some", "--opt=other", "--opt=one,two"]);
111919625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
112019625d8cSopenharmony_ci    let m = res.unwrap();
112119625d8cSopenharmony_ci    assert!(m.contains_id("opt"));
112219625d8cSopenharmony_ci    assert_eq!(
112319625d8cSopenharmony_ci        m.get_many::<String>("opt")
112419625d8cSopenharmony_ci            .unwrap()
112519625d8cSopenharmony_ci            .map(|v| v.as_str())
112619625d8cSopenharmony_ci            .collect::<Vec<_>>(),
112719625d8cSopenharmony_ci        ["some", "other", "one", "two"]
112819625d8cSopenharmony_ci    );
112919625d8cSopenharmony_ci}
113019625d8cSopenharmony_ci
113119625d8cSopenharmony_ci#[test]
113219625d8cSopenharmony_cifn aaos_opts_mult() {
113319625d8cSopenharmony_ci    // opts with multiple
113419625d8cSopenharmony_ci    let res = Command::new("posix")
113519625d8cSopenharmony_ci        .arg(
113619625d8cSopenharmony_ci            arg!(--opt <val> ... "some option")
113719625d8cSopenharmony_ci                .num_args(1..)
113819625d8cSopenharmony_ci                .action(ArgAction::Append),
113919625d8cSopenharmony_ci        )
114019625d8cSopenharmony_ci        .try_get_matches_from(vec![
114119625d8cSopenharmony_ci            "",
114219625d8cSopenharmony_ci            "--opt",
114319625d8cSopenharmony_ci            "first",
114419625d8cSopenharmony_ci            "overrides",
114519625d8cSopenharmony_ci            "--opt",
114619625d8cSopenharmony_ci            "some",
114719625d8cSopenharmony_ci            "other",
114819625d8cSopenharmony_ci            "val",
114919625d8cSopenharmony_ci        ]);
115019625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
115119625d8cSopenharmony_ci    let m = res.unwrap();
115219625d8cSopenharmony_ci    assert!(m.contains_id("opt"));
115319625d8cSopenharmony_ci    assert_eq!(
115419625d8cSopenharmony_ci        m.get_many::<String>("opt")
115519625d8cSopenharmony_ci            .unwrap()
115619625d8cSopenharmony_ci            .map(|v| v.as_str())
115719625d8cSopenharmony_ci            .collect::<Vec<_>>(),
115819625d8cSopenharmony_ci        ["first", "overrides", "some", "other", "val"]
115919625d8cSopenharmony_ci    );
116019625d8cSopenharmony_ci}
116119625d8cSopenharmony_ci
116219625d8cSopenharmony_ci#[test]
116319625d8cSopenharmony_cifn aaos_pos_mult() {
116419625d8cSopenharmony_ci    // opts with multiple
116519625d8cSopenharmony_ci    let res = Command::new("posix")
116619625d8cSopenharmony_ci        .arg(arg!([val] ... "some pos"))
116719625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "some", "other", "value"]);
116819625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
116919625d8cSopenharmony_ci    let m = res.unwrap();
117019625d8cSopenharmony_ci    assert!(m.contains_id("val"));
117119625d8cSopenharmony_ci    assert_eq!(
117219625d8cSopenharmony_ci        m.get_many::<String>("val")
117319625d8cSopenharmony_ci            .unwrap()
117419625d8cSopenharmony_ci            .map(|v| v.as_str())
117519625d8cSopenharmony_ci            .collect::<Vec<_>>(),
117619625d8cSopenharmony_ci        ["some", "other", "value"]
117719625d8cSopenharmony_ci    );
117819625d8cSopenharmony_ci}
117919625d8cSopenharmony_ci
118019625d8cSopenharmony_ci#[test]
118119625d8cSopenharmony_cifn aaos_option_use_delim_false() {
118219625d8cSopenharmony_ci    let m = Command::new("posix")
118319625d8cSopenharmony_ci        .args_override_self(true)
118419625d8cSopenharmony_ci        .arg(
118519625d8cSopenharmony_ci            arg!(--opt <val> "some option")
118619625d8cSopenharmony_ci                .required(true)
118719625d8cSopenharmony_ci                .action(ArgAction::Set),
118819625d8cSopenharmony_ci        )
118919625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--opt=some,other", "--opt=one,two"])
119019625d8cSopenharmony_ci        .unwrap();
119119625d8cSopenharmony_ci    assert!(m.contains_id("opt"));
119219625d8cSopenharmony_ci    assert_eq!(
119319625d8cSopenharmony_ci        m.get_many::<String>("opt")
119419625d8cSopenharmony_ci            .unwrap()
119519625d8cSopenharmony_ci            .map(|v| v.as_str())
119619625d8cSopenharmony_ci            .collect::<Vec<_>>(),
119719625d8cSopenharmony_ci        ["one,two"]
119819625d8cSopenharmony_ci    );
119919625d8cSopenharmony_ci}
120019625d8cSopenharmony_ci
120119625d8cSopenharmony_ci#[test]
120219625d8cSopenharmony_ci#[cfg(feature = "color")]
120319625d8cSopenharmony_cifn color_is_global() {
120419625d8cSopenharmony_ci    let mut cmd = Command::new("myprog")
120519625d8cSopenharmony_ci        .color(clap::ColorChoice::Never)
120619625d8cSopenharmony_ci        .subcommand(Command::new("foo"));
120719625d8cSopenharmony_ci    cmd.build();
120819625d8cSopenharmony_ci    assert_eq!(cmd.get_color(), clap::ColorChoice::Never);
120919625d8cSopenharmony_ci
121019625d8cSopenharmony_ci    let sub = cmd.get_subcommands().collect::<Vec<_>>()[0];
121119625d8cSopenharmony_ci    assert_eq!(sub.get_color(), clap::ColorChoice::Never);
121219625d8cSopenharmony_ci}
1213