119625d8cSopenharmony_ciuse clap::{arg, error::ErrorKind, Arg, ArgAction, Command};
219625d8cSopenharmony_ci
319625d8cSopenharmony_ciuse super::utils;
419625d8cSopenharmony_ci
519625d8cSopenharmony_ci#[test]
619625d8cSopenharmony_cifn subcommand() {
719625d8cSopenharmony_ci    let m = Command::new("test")
819625d8cSopenharmony_ci        .subcommand(
919625d8cSopenharmony_ci            Command::new("some").arg(
1019625d8cSopenharmony_ci                Arg::new("test")
1119625d8cSopenharmony_ci                    .short('t')
1219625d8cSopenharmony_ci                    .long("test")
1319625d8cSopenharmony_ci                    .action(ArgAction::Set)
1419625d8cSopenharmony_ci                    .help("testing testing"),
1519625d8cSopenharmony_ci            ),
1619625d8cSopenharmony_ci        )
1719625d8cSopenharmony_ci        .arg(Arg::new("other").long("other"))
1819625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog", "some", "--test", "testing"])
1919625d8cSopenharmony_ci        .unwrap();
2019625d8cSopenharmony_ci
2119625d8cSopenharmony_ci    assert_eq!(m.subcommand_name().unwrap(), "some");
2219625d8cSopenharmony_ci    let sub_m = m.subcommand_matches("some").unwrap();
2319625d8cSopenharmony_ci    assert!(sub_m.contains_id("test"));
2419625d8cSopenharmony_ci    assert_eq!(
2519625d8cSopenharmony_ci        sub_m.get_one::<String>("test").map(|v| v.as_str()).unwrap(),
2619625d8cSopenharmony_ci        "testing"
2719625d8cSopenharmony_ci    );
2819625d8cSopenharmony_ci}
2919625d8cSopenharmony_ci
3019625d8cSopenharmony_ci#[test]
3119625d8cSopenharmony_cifn subcommand_none_given() {
3219625d8cSopenharmony_ci    let m = Command::new("test")
3319625d8cSopenharmony_ci        .subcommand(
3419625d8cSopenharmony_ci            Command::new("some").arg(
3519625d8cSopenharmony_ci                Arg::new("test")
3619625d8cSopenharmony_ci                    .short('t')
3719625d8cSopenharmony_ci                    .long("test")
3819625d8cSopenharmony_ci                    .action(ArgAction::Set)
3919625d8cSopenharmony_ci                    .help("testing testing"),
4019625d8cSopenharmony_ci            ),
4119625d8cSopenharmony_ci        )
4219625d8cSopenharmony_ci        .arg(Arg::new("other").long("other"))
4319625d8cSopenharmony_ci        .try_get_matches_from(vec![""])
4419625d8cSopenharmony_ci        .unwrap();
4519625d8cSopenharmony_ci
4619625d8cSopenharmony_ci    assert!(m.subcommand_name().is_none());
4719625d8cSopenharmony_ci}
4819625d8cSopenharmony_ci
4919625d8cSopenharmony_ci#[test]
5019625d8cSopenharmony_cifn subcommand_multiple() {
5119625d8cSopenharmony_ci    let m = Command::new("test")
5219625d8cSopenharmony_ci        .subcommands(vec![
5319625d8cSopenharmony_ci            Command::new("some").arg(
5419625d8cSopenharmony_ci                Arg::new("test")
5519625d8cSopenharmony_ci                    .short('t')
5619625d8cSopenharmony_ci                    .long("test")
5719625d8cSopenharmony_ci                    .action(ArgAction::Set)
5819625d8cSopenharmony_ci                    .help("testing testing"),
5919625d8cSopenharmony_ci            ),
6019625d8cSopenharmony_ci            Command::new("add").arg(Arg::new("roster").short('r')),
6119625d8cSopenharmony_ci        ])
6219625d8cSopenharmony_ci        .arg(Arg::new("other").long("other"))
6319625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog", "some", "--test", "testing"])
6419625d8cSopenharmony_ci        .unwrap();
6519625d8cSopenharmony_ci
6619625d8cSopenharmony_ci    assert!(m.subcommand_matches("some").is_some());
6719625d8cSopenharmony_ci    assert!(m.subcommand_matches("add").is_none());
6819625d8cSopenharmony_ci    assert_eq!(m.subcommand_name().unwrap(), "some");
6919625d8cSopenharmony_ci    let sub_m = m.subcommand_matches("some").unwrap();
7019625d8cSopenharmony_ci    assert!(sub_m.contains_id("test"));
7119625d8cSopenharmony_ci    assert_eq!(
7219625d8cSopenharmony_ci        sub_m.get_one::<String>("test").map(|v| v.as_str()).unwrap(),
7319625d8cSopenharmony_ci        "testing"
7419625d8cSopenharmony_ci    );
7519625d8cSopenharmony_ci}
7619625d8cSopenharmony_ci
7719625d8cSopenharmony_ci#[test]
7819625d8cSopenharmony_cifn single_alias() {
7919625d8cSopenharmony_ci    let m = Command::new("myprog")
8019625d8cSopenharmony_ci        .subcommand(Command::new("test").alias("do-stuff"))
8119625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog", "do-stuff"])
8219625d8cSopenharmony_ci        .unwrap();
8319625d8cSopenharmony_ci    assert_eq!(m.subcommand_name(), Some("test"));
8419625d8cSopenharmony_ci}
8519625d8cSopenharmony_ci
8619625d8cSopenharmony_ci#[test]
8719625d8cSopenharmony_cifn multiple_aliases() {
8819625d8cSopenharmony_ci    let m = Command::new("myprog")
8919625d8cSopenharmony_ci        .subcommand(Command::new("test").aliases(["do-stuff", "test-stuff"]))
9019625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog", "test-stuff"])
9119625d8cSopenharmony_ci        .unwrap();
9219625d8cSopenharmony_ci    assert_eq!(m.subcommand_name(), Some("test"));
9319625d8cSopenharmony_ci}
9419625d8cSopenharmony_ci
9519625d8cSopenharmony_ci#[test]
9619625d8cSopenharmony_ci#[cfg(feature = "suggestions")]
9719625d8cSopenharmony_ci#[cfg(feature = "error-context")]
9819625d8cSopenharmony_cifn subcmd_did_you_mean_output() {
9919625d8cSopenharmony_ci    #[cfg(feature = "suggestions")]
10019625d8cSopenharmony_ci    static DYM_SUBCMD: &str = "\
10119625d8cSopenharmony_cierror: unrecognized subcommand 'subcm'
10219625d8cSopenharmony_ci
10319625d8cSopenharmony_ci  note: subcommand 'subcmd' exists
10419625d8cSopenharmony_ci  note: to pass 'subcm' as a value, use 'dym -- subcm'
10519625d8cSopenharmony_ci
10619625d8cSopenharmony_ciUsage: dym [COMMAND]
10719625d8cSopenharmony_ci
10819625d8cSopenharmony_ciFor more information, try '--help'.
10919625d8cSopenharmony_ci";
11019625d8cSopenharmony_ci
11119625d8cSopenharmony_ci    let cmd = Command::new("dym").subcommand(Command::new("subcmd"));
11219625d8cSopenharmony_ci    utils::assert_output(cmd, "dym subcm", DYM_SUBCMD, true);
11319625d8cSopenharmony_ci}
11419625d8cSopenharmony_ci
11519625d8cSopenharmony_ci#[test]
11619625d8cSopenharmony_ci#[cfg(feature = "suggestions")]
11719625d8cSopenharmony_ci#[cfg(feature = "error-context")]
11819625d8cSopenharmony_cifn subcmd_did_you_mean_output_ambiguous() {
11919625d8cSopenharmony_ci    #[cfg(feature = "suggestions")]
12019625d8cSopenharmony_ci    static DYM_SUBCMD_AMBIGUOUS: &str = "\
12119625d8cSopenharmony_cierror: unrecognized subcommand 'te'
12219625d8cSopenharmony_ci
12319625d8cSopenharmony_ci  note: subcommands 'test', 'temp' exist
12419625d8cSopenharmony_ci  note: to pass 'te' as a value, use 'dym -- te'
12519625d8cSopenharmony_ci
12619625d8cSopenharmony_ciUsage: dym [COMMAND]
12719625d8cSopenharmony_ci
12819625d8cSopenharmony_ciFor more information, try '--help'.
12919625d8cSopenharmony_ci";
13019625d8cSopenharmony_ci
13119625d8cSopenharmony_ci    let cmd = Command::new("dym")
13219625d8cSopenharmony_ci        .subcommand(Command::new("test"))
13319625d8cSopenharmony_ci        .subcommand(Command::new("temp"));
13419625d8cSopenharmony_ci    utils::assert_output(cmd, "dym te", DYM_SUBCMD_AMBIGUOUS, true);
13519625d8cSopenharmony_ci}
13619625d8cSopenharmony_ci
13719625d8cSopenharmony_ci#[test]
13819625d8cSopenharmony_ci#[cfg(feature = "suggestions")]
13919625d8cSopenharmony_ci#[cfg(feature = "error-context")]
14019625d8cSopenharmony_cifn subcmd_did_you_mean_output_arg() {
14119625d8cSopenharmony_ci    static EXPECTED: &str = "\
14219625d8cSopenharmony_cierror: unexpected argument '--subcmarg' found
14319625d8cSopenharmony_ci
14419625d8cSopenharmony_ci  note: 'subcmd --subcmdarg' exists
14519625d8cSopenharmony_ci
14619625d8cSopenharmony_ciUsage: dym [COMMAND]
14719625d8cSopenharmony_ci
14819625d8cSopenharmony_ciFor more information, try '--help'.
14919625d8cSopenharmony_ci";
15019625d8cSopenharmony_ci
15119625d8cSopenharmony_ci    let cmd = Command::new("dym")
15219625d8cSopenharmony_ci        .subcommand(Command::new("subcmd").arg(arg!(-s --subcmdarg <subcmdarg> "tests")));
15319625d8cSopenharmony_ci
15419625d8cSopenharmony_ci    utils::assert_output(cmd, "dym --subcmarg subcmd", EXPECTED, true);
15519625d8cSopenharmony_ci}
15619625d8cSopenharmony_ci
15719625d8cSopenharmony_ci#[test]
15819625d8cSopenharmony_ci#[cfg(feature = "suggestions")]
15919625d8cSopenharmony_ci#[cfg(feature = "error-context")]
16019625d8cSopenharmony_cifn subcmd_did_you_mean_output_arg_false_positives() {
16119625d8cSopenharmony_ci    static EXPECTED: &str = "\
16219625d8cSopenharmony_cierror: unexpected argument '--subcmarg' found
16319625d8cSopenharmony_ci
16419625d8cSopenharmony_ciUsage: dym [COMMAND]
16519625d8cSopenharmony_ci
16619625d8cSopenharmony_ciFor more information, try '--help'.
16719625d8cSopenharmony_ci";
16819625d8cSopenharmony_ci
16919625d8cSopenharmony_ci    let cmd = Command::new("dym")
17019625d8cSopenharmony_ci        .subcommand(Command::new("subcmd").arg(arg!(-s --subcmdarg <subcmdarg> "tests")));
17119625d8cSopenharmony_ci
17219625d8cSopenharmony_ci    utils::assert_output(cmd, "dym --subcmarg foo", EXPECTED, true);
17319625d8cSopenharmony_ci}
17419625d8cSopenharmony_ci
17519625d8cSopenharmony_ci#[test]
17619625d8cSopenharmony_cifn alias_help() {
17719625d8cSopenharmony_ci    let m = Command::new("myprog")
17819625d8cSopenharmony_ci        .subcommand(Command::new("test").alias("do-stuff"))
17919625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog", "help", "do-stuff"]);
18019625d8cSopenharmony_ci    assert!(m.is_err());
18119625d8cSopenharmony_ci    assert_eq!(m.unwrap_err().kind(), ErrorKind::DisplayHelp);
18219625d8cSopenharmony_ci}
18319625d8cSopenharmony_ci
18419625d8cSopenharmony_ci#[test]
18519625d8cSopenharmony_cifn visible_aliases_help_output() {
18619625d8cSopenharmony_ci    static VISIBLE_ALIAS_HELP: &str = "\
18719625d8cSopenharmony_ciUsage: clap-test [COMMAND]
18819625d8cSopenharmony_ci
18919625d8cSopenharmony_ciCommands:
19019625d8cSopenharmony_ci  test  Some help [aliases: dongle, done]
19119625d8cSopenharmony_ci  help  Print this message or the help of the given subcommand(s)
19219625d8cSopenharmony_ci
19319625d8cSopenharmony_ciOptions:
19419625d8cSopenharmony_ci  -h, --help     Print help
19519625d8cSopenharmony_ci  -V, --version  Print version
19619625d8cSopenharmony_ci";
19719625d8cSopenharmony_ci
19819625d8cSopenharmony_ci    let cmd = Command::new("clap-test").version("2.6").subcommand(
19919625d8cSopenharmony_ci        Command::new("test")
20019625d8cSopenharmony_ci            .about("Some help")
20119625d8cSopenharmony_ci            .alias("invisible")
20219625d8cSopenharmony_ci            .visible_alias("dongle")
20319625d8cSopenharmony_ci            .visible_alias("done"),
20419625d8cSopenharmony_ci    );
20519625d8cSopenharmony_ci    utils::assert_output(cmd, "clap-test --help", VISIBLE_ALIAS_HELP, false);
20619625d8cSopenharmony_ci}
20719625d8cSopenharmony_ci
20819625d8cSopenharmony_ci#[test]
20919625d8cSopenharmony_cifn invisible_aliases_help_output() {
21019625d8cSopenharmony_ci    static INVISIBLE_ALIAS_HELP: &str = "\
21119625d8cSopenharmony_ciUsage: clap-test [COMMAND]
21219625d8cSopenharmony_ci
21319625d8cSopenharmony_ciCommands:
21419625d8cSopenharmony_ci  test  Some help
21519625d8cSopenharmony_ci  help  Print this message or the help of the given subcommand(s)
21619625d8cSopenharmony_ci
21719625d8cSopenharmony_ciOptions:
21819625d8cSopenharmony_ci  -h, --help     Print help
21919625d8cSopenharmony_ci  -V, --version  Print version
22019625d8cSopenharmony_ci";
22119625d8cSopenharmony_ci
22219625d8cSopenharmony_ci    let cmd = Command::new("clap-test")
22319625d8cSopenharmony_ci        .version("2.6")
22419625d8cSopenharmony_ci        .subcommand(Command::new("test").about("Some help").alias("invisible"));
22519625d8cSopenharmony_ci    utils::assert_output(cmd, "clap-test --help", INVISIBLE_ALIAS_HELP, false);
22619625d8cSopenharmony_ci}
22719625d8cSopenharmony_ci
22819625d8cSopenharmony_ci#[test]
22919625d8cSopenharmony_ci#[cfg(feature = "unstable-replace")]
23019625d8cSopenharmony_cifn replace() {
23119625d8cSopenharmony_ci    let m = Command::new("prog")
23219625d8cSopenharmony_ci        .subcommand(
23319625d8cSopenharmony_ci            Command::new("module").subcommand(Command::new("install").about("Install module")),
23419625d8cSopenharmony_ci        )
23519625d8cSopenharmony_ci        .replace("install", ["module", "install"])
23619625d8cSopenharmony_ci        .try_get_matches_from(vec!["prog", "install"])
23719625d8cSopenharmony_ci        .unwrap();
23819625d8cSopenharmony_ci
23919625d8cSopenharmony_ci    assert_eq!(m.subcommand_name(), Some("module"));
24019625d8cSopenharmony_ci    assert_eq!(
24119625d8cSopenharmony_ci        m.subcommand_matches("module").unwrap().subcommand_name(),
24219625d8cSopenharmony_ci        Some("install")
24319625d8cSopenharmony_ci    );
24419625d8cSopenharmony_ci}
24519625d8cSopenharmony_ci
24619625d8cSopenharmony_ci#[test]
24719625d8cSopenharmony_cifn issue_1031_args_with_same_name() {
24819625d8cSopenharmony_ci    let res = Command::new("prog")
24919625d8cSopenharmony_ci        .arg(arg!(--"ui-path" <PATH>).required(true))
25019625d8cSopenharmony_ci        .subcommand(Command::new("signer"))
25119625d8cSopenharmony_ci        .try_get_matches_from(vec!["prog", "--ui-path", "signer"]);
25219625d8cSopenharmony_ci
25319625d8cSopenharmony_ci    assert!(res.is_ok(), "{:?}", res.unwrap_err().kind());
25419625d8cSopenharmony_ci    let m = res.unwrap();
25519625d8cSopenharmony_ci    assert_eq!(
25619625d8cSopenharmony_ci        m.get_one::<String>("ui-path").map(|v| v.as_str()),
25719625d8cSopenharmony_ci        Some("signer")
25819625d8cSopenharmony_ci    );
25919625d8cSopenharmony_ci}
26019625d8cSopenharmony_ci
26119625d8cSopenharmony_ci#[test]
26219625d8cSopenharmony_cifn issue_1031_args_with_same_name_no_more_vals() {
26319625d8cSopenharmony_ci    let res = Command::new("prog")
26419625d8cSopenharmony_ci        .arg(arg!(--"ui-path" <PATH>).required(true))
26519625d8cSopenharmony_ci        .subcommand(Command::new("signer"))
26619625d8cSopenharmony_ci        .try_get_matches_from(vec!["prog", "--ui-path", "value", "signer"]);
26719625d8cSopenharmony_ci
26819625d8cSopenharmony_ci    assert!(res.is_ok(), "{:?}", res.unwrap_err().kind());
26919625d8cSopenharmony_ci    let m = res.unwrap();
27019625d8cSopenharmony_ci    assert_eq!(
27119625d8cSopenharmony_ci        m.get_one::<String>("ui-path").map(|v| v.as_str()),
27219625d8cSopenharmony_ci        Some("value")
27319625d8cSopenharmony_ci    );
27419625d8cSopenharmony_ci    assert_eq!(m.subcommand_name(), Some("signer"));
27519625d8cSopenharmony_ci}
27619625d8cSopenharmony_ci
27719625d8cSopenharmony_ci#[test]
27819625d8cSopenharmony_cifn issue_1161_multiple_hyphen_hyphen() {
27919625d8cSopenharmony_ci    // from example 22
28019625d8cSopenharmony_ci    let res = Command::new("myprog")
28119625d8cSopenharmony_ci        .arg(Arg::new("eff").short('f'))
28219625d8cSopenharmony_ci        .arg(Arg::new("pea").short('p').action(ArgAction::Set))
28319625d8cSopenharmony_ci        .arg(
28419625d8cSopenharmony_ci            Arg::new("slop")
28519625d8cSopenharmony_ci                .action(ArgAction::Set)
28619625d8cSopenharmony_ci                .num_args(1..)
28719625d8cSopenharmony_ci                .last(true),
28819625d8cSopenharmony_ci        )
28919625d8cSopenharmony_ci        .try_get_matches_from(vec![
29019625d8cSopenharmony_ci            "-f",
29119625d8cSopenharmony_ci            "-p=bob",
29219625d8cSopenharmony_ci            "--",
29319625d8cSopenharmony_ci            "sloppy",
29419625d8cSopenharmony_ci            "slop",
29519625d8cSopenharmony_ci            "-a",
29619625d8cSopenharmony_ci            "--",
29719625d8cSopenharmony_ci            "subprogram",
29819625d8cSopenharmony_ci            "position",
29919625d8cSopenharmony_ci            "args",
30019625d8cSopenharmony_ci        ]);
30119625d8cSopenharmony_ci
30219625d8cSopenharmony_ci    assert!(res.is_ok(), "{:?}", res.unwrap_err().kind());
30319625d8cSopenharmony_ci    let m = res.unwrap();
30419625d8cSopenharmony_ci
30519625d8cSopenharmony_ci    let expected = Some(vec![
30619625d8cSopenharmony_ci        "sloppy",
30719625d8cSopenharmony_ci        "slop",
30819625d8cSopenharmony_ci        "-a",
30919625d8cSopenharmony_ci        "--",
31019625d8cSopenharmony_ci        "subprogram",
31119625d8cSopenharmony_ci        "position",
31219625d8cSopenharmony_ci        "args",
31319625d8cSopenharmony_ci    ]);
31419625d8cSopenharmony_ci    let actual = m
31519625d8cSopenharmony_ci        .get_many::<String>("slop")
31619625d8cSopenharmony_ci        .map(|vals| vals.map(|s| s.as_str()).collect::<Vec<_>>());
31719625d8cSopenharmony_ci
31819625d8cSopenharmony_ci    assert_eq!(expected, actual);
31919625d8cSopenharmony_ci}
32019625d8cSopenharmony_ci
32119625d8cSopenharmony_ci#[test]
32219625d8cSopenharmony_cifn issue_1722_not_emit_error_when_arg_follows_similar_to_a_subcommand() {
32319625d8cSopenharmony_ci    let m = Command::new("myprog")
32419625d8cSopenharmony_ci        .subcommand(Command::new("subcommand"))
32519625d8cSopenharmony_ci        .arg(Arg::new("argument"))
32619625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog", "--", "subcommand"]);
32719625d8cSopenharmony_ci    assert_eq!(
32819625d8cSopenharmony_ci        m.unwrap().get_one::<String>("argument").map(|v| v.as_str()),
32919625d8cSopenharmony_ci        Some("subcommand")
33019625d8cSopenharmony_ci    );
33119625d8cSopenharmony_ci}
33219625d8cSopenharmony_ci
33319625d8cSopenharmony_ci#[test]
33419625d8cSopenharmony_cifn subcommand_placeholder_test() {
33519625d8cSopenharmony_ci    let mut cmd = Command::new("myprog")
33619625d8cSopenharmony_ci        .subcommand(Command::new("subcommand"))
33719625d8cSopenharmony_ci        .subcommand_value_name("TEST_PLACEHOLDER")
33819625d8cSopenharmony_ci        .subcommand_help_heading("TEST_HEADER");
33919625d8cSopenharmony_ci
34019625d8cSopenharmony_ci    assert_eq!(
34119625d8cSopenharmony_ci        &cmd.render_usage().to_string(),
34219625d8cSopenharmony_ci        "Usage: myprog [TEST_PLACEHOLDER]"
34319625d8cSopenharmony_ci    );
34419625d8cSopenharmony_ci
34519625d8cSopenharmony_ci    let help_text = cmd.render_help().to_string();
34619625d8cSopenharmony_ci
34719625d8cSopenharmony_ci    assert!(help_text.contains("TEST_HEADER:"));
34819625d8cSopenharmony_ci}
34919625d8cSopenharmony_ci
35019625d8cSopenharmony_ci#[test]
35119625d8cSopenharmony_ci#[cfg(feature = "error-context")]
35219625d8cSopenharmony_cifn subcommand_used_after_double_dash() {
35319625d8cSopenharmony_ci    static SUBCMD_AFTER_DOUBLE_DASH: &str = "\
35419625d8cSopenharmony_cierror: unexpected argument 'subcmd' found
35519625d8cSopenharmony_ci
35619625d8cSopenharmony_ci  note: subcommand 'subcmd' exists; to use it, remove the '--' before it
35719625d8cSopenharmony_ci
35819625d8cSopenharmony_ciUsage: cmd [COMMAND]
35919625d8cSopenharmony_ci
36019625d8cSopenharmony_ciFor more information, try '--help'.
36119625d8cSopenharmony_ci";
36219625d8cSopenharmony_ci
36319625d8cSopenharmony_ci    let cmd = Command::new("cmd").subcommand(Command::new("subcmd"));
36419625d8cSopenharmony_ci
36519625d8cSopenharmony_ci    utils::assert_output(cmd, "cmd -- subcmd", SUBCMD_AFTER_DOUBLE_DASH, true);
36619625d8cSopenharmony_ci}
36719625d8cSopenharmony_ci
36819625d8cSopenharmony_ci#[test]
36919625d8cSopenharmony_cifn subcommand_after_argument() {
37019625d8cSopenharmony_ci    let m = Command::new("myprog")
37119625d8cSopenharmony_ci        .arg(Arg::new("some_text"))
37219625d8cSopenharmony_ci        .subcommand(Command::new("test"))
37319625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog", "teat", "test"])
37419625d8cSopenharmony_ci        .unwrap();
37519625d8cSopenharmony_ci    assert_eq!(
37619625d8cSopenharmony_ci        m.get_one::<String>("some_text").map(|v| v.as_str()),
37719625d8cSopenharmony_ci        Some("teat")
37819625d8cSopenharmony_ci    );
37919625d8cSopenharmony_ci    assert_eq!(m.subcommand().unwrap().0, "test");
38019625d8cSopenharmony_ci}
38119625d8cSopenharmony_ci
38219625d8cSopenharmony_ci#[test]
38319625d8cSopenharmony_cifn subcommand_after_argument_looks_like_help() {
38419625d8cSopenharmony_ci    let m = Command::new("myprog")
38519625d8cSopenharmony_ci        .arg(Arg::new("some_text"))
38619625d8cSopenharmony_ci        .subcommand(Command::new("test"))
38719625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog", "helt", "test"])
38819625d8cSopenharmony_ci        .unwrap();
38919625d8cSopenharmony_ci    assert_eq!(
39019625d8cSopenharmony_ci        m.get_one::<String>("some_text").map(|v| v.as_str()),
39119625d8cSopenharmony_ci        Some("helt")
39219625d8cSopenharmony_ci    );
39319625d8cSopenharmony_ci    assert_eq!(m.subcommand().unwrap().0, "test");
39419625d8cSopenharmony_ci}
39519625d8cSopenharmony_ci
39619625d8cSopenharmony_ci#[test]
39719625d8cSopenharmony_cifn issue_2494_subcommand_is_present() {
39819625d8cSopenharmony_ci    let cmd = Command::new("opt")
39919625d8cSopenharmony_ci        .arg(Arg::new("global").long("global").action(ArgAction::SetTrue))
40019625d8cSopenharmony_ci        .subcommand(Command::new("global"));
40119625d8cSopenharmony_ci
40219625d8cSopenharmony_ci    let m = cmd
40319625d8cSopenharmony_ci        .clone()
40419625d8cSopenharmony_ci        .try_get_matches_from(["opt", "--global", "global"])
40519625d8cSopenharmony_ci        .unwrap();
40619625d8cSopenharmony_ci    assert_eq!(m.subcommand_name().unwrap(), "global");
40719625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("global").expect("defaulted by clap"));
40819625d8cSopenharmony_ci
40919625d8cSopenharmony_ci    let m = cmd
41019625d8cSopenharmony_ci        .clone()
41119625d8cSopenharmony_ci        .try_get_matches_from(["opt", "--global"])
41219625d8cSopenharmony_ci        .unwrap();
41319625d8cSopenharmony_ci    assert!(m.subcommand_name().is_none());
41419625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("global").expect("defaulted by clap"));
41519625d8cSopenharmony_ci
41619625d8cSopenharmony_ci    let m = cmd.try_get_matches_from(["opt", "global"]).unwrap();
41719625d8cSopenharmony_ci    assert_eq!(m.subcommand_name().unwrap(), "global");
41819625d8cSopenharmony_ci    assert!(!*m.get_one::<bool>("global").expect("defaulted by clap"));
41919625d8cSopenharmony_ci}
42019625d8cSopenharmony_ci
42119625d8cSopenharmony_ci#[test]
42219625d8cSopenharmony_ci#[cfg(feature = "error-context")]
42319625d8cSopenharmony_cifn subcommand_not_recognized() {
42419625d8cSopenharmony_ci    let cmd = Command::new("fake")
42519625d8cSopenharmony_ci        .subcommand(Command::new("sub"))
42619625d8cSopenharmony_ci        .disable_help_subcommand(true)
42719625d8cSopenharmony_ci        .infer_subcommands(true);
42819625d8cSopenharmony_ci    utils::assert_output(
42919625d8cSopenharmony_ci        cmd,
43019625d8cSopenharmony_ci        "fake help",
43119625d8cSopenharmony_ci        "error: unrecognized subcommand 'help'
43219625d8cSopenharmony_ci
43319625d8cSopenharmony_ciUsage: fake [COMMAND]
43419625d8cSopenharmony_ci
43519625d8cSopenharmony_ciFor more information, try '--help'.
43619625d8cSopenharmony_ci",
43719625d8cSopenharmony_ci        true,
43819625d8cSopenharmony_ci    );
43919625d8cSopenharmony_ci}
44019625d8cSopenharmony_ci
44119625d8cSopenharmony_ci#[test]
44219625d8cSopenharmony_cifn busybox_like_multicall() {
44319625d8cSopenharmony_ci    fn applet_commands() -> [Command; 2] {
44419625d8cSopenharmony_ci        [Command::new("true"), Command::new("false")]
44519625d8cSopenharmony_ci    }
44619625d8cSopenharmony_ci    let cmd = Command::new("busybox")
44719625d8cSopenharmony_ci        .multicall(true)
44819625d8cSopenharmony_ci        .subcommand(Command::new("busybox").subcommands(applet_commands()))
44919625d8cSopenharmony_ci        .subcommands(applet_commands());
45019625d8cSopenharmony_ci
45119625d8cSopenharmony_ci    let m = cmd
45219625d8cSopenharmony_ci        .clone()
45319625d8cSopenharmony_ci        .try_get_matches_from(["busybox", "true"])
45419625d8cSopenharmony_ci        .unwrap();
45519625d8cSopenharmony_ci    assert_eq!(m.subcommand_name(), Some("busybox"));
45619625d8cSopenharmony_ci    assert_eq!(m.subcommand().unwrap().1.subcommand_name(), Some("true"));
45719625d8cSopenharmony_ci
45819625d8cSopenharmony_ci    let m = cmd.clone().try_get_matches_from(["true"]).unwrap();
45919625d8cSopenharmony_ci    assert_eq!(m.subcommand_name(), Some("true"));
46019625d8cSopenharmony_ci
46119625d8cSopenharmony_ci    let m = cmd.clone().try_get_matches_from(["a.out"]);
46219625d8cSopenharmony_ci    assert!(m.is_err());
46319625d8cSopenharmony_ci    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidSubcommand);
46419625d8cSopenharmony_ci}
46519625d8cSopenharmony_ci
46619625d8cSopenharmony_ci#[test]
46719625d8cSopenharmony_cifn hostname_like_multicall() {
46819625d8cSopenharmony_ci    let mut cmd = Command::new("hostname")
46919625d8cSopenharmony_ci        .multicall(true)
47019625d8cSopenharmony_ci        .subcommand(Command::new("hostname"))
47119625d8cSopenharmony_ci        .subcommand(Command::new("dnsdomainname"));
47219625d8cSopenharmony_ci
47319625d8cSopenharmony_ci    let m = cmd.clone().try_get_matches_from(["hostname"]).unwrap();
47419625d8cSopenharmony_ci    assert_eq!(m.subcommand_name(), Some("hostname"));
47519625d8cSopenharmony_ci
47619625d8cSopenharmony_ci    let m = cmd.clone().try_get_matches_from(["dnsdomainname"]).unwrap();
47719625d8cSopenharmony_ci    assert_eq!(m.subcommand_name(), Some("dnsdomainname"));
47819625d8cSopenharmony_ci
47919625d8cSopenharmony_ci    let m = cmd.clone().try_get_matches_from(["a.out"]);
48019625d8cSopenharmony_ci    assert!(m.is_err());
48119625d8cSopenharmony_ci    assert_eq!(m.unwrap_err().kind(), ErrorKind::InvalidSubcommand);
48219625d8cSopenharmony_ci
48319625d8cSopenharmony_ci    let m = cmd.try_get_matches_from_mut(["hostname", "hostname"]);
48419625d8cSopenharmony_ci    assert!(m.is_err());
48519625d8cSopenharmony_ci    assert_eq!(m.unwrap_err().kind(), ErrorKind::UnknownArgument);
48619625d8cSopenharmony_ci
48719625d8cSopenharmony_ci    let m = cmd.try_get_matches_from(["hostname", "dnsdomainname"]);
48819625d8cSopenharmony_ci    assert!(m.is_err());
48919625d8cSopenharmony_ci    assert_eq!(m.unwrap_err().kind(), ErrorKind::UnknownArgument);
49019625d8cSopenharmony_ci}
49119625d8cSopenharmony_ci
49219625d8cSopenharmony_ci#[test]
49319625d8cSopenharmony_ci#[cfg(feature = "error-context")]
49419625d8cSopenharmony_cifn bad_multicall_command_error() {
49519625d8cSopenharmony_ci    let cmd = Command::new("repl")
49619625d8cSopenharmony_ci        .version("1.0.0")
49719625d8cSopenharmony_ci        .propagate_version(true)
49819625d8cSopenharmony_ci        .multicall(true)
49919625d8cSopenharmony_ci        .subcommand(Command::new("foo"))
50019625d8cSopenharmony_ci        .subcommand(Command::new("bar"));
50119625d8cSopenharmony_ci
50219625d8cSopenharmony_ci    let err = cmd.clone().try_get_matches_from(["world"]).unwrap_err();
50319625d8cSopenharmony_ci    assert_eq!(err.kind(), ErrorKind::InvalidSubcommand);
50419625d8cSopenharmony_ci    static HELLO_EXPECTED: &str = "\
50519625d8cSopenharmony_cierror: unrecognized subcommand 'world'
50619625d8cSopenharmony_ci
50719625d8cSopenharmony_ciUsage: <COMMAND>
50819625d8cSopenharmony_ci
50919625d8cSopenharmony_ciFor more information, try 'help'.
51019625d8cSopenharmony_ci";
51119625d8cSopenharmony_ci    utils::assert_eq(HELLO_EXPECTED, err.to_string());
51219625d8cSopenharmony_ci
51319625d8cSopenharmony_ci    #[cfg(feature = "suggestions")]
51419625d8cSopenharmony_ci    {
51519625d8cSopenharmony_ci        let err = cmd.clone().try_get_matches_from(["baz"]).unwrap_err();
51619625d8cSopenharmony_ci        assert_eq!(err.kind(), ErrorKind::InvalidSubcommand);
51719625d8cSopenharmony_ci        static BAZ_EXPECTED: &str = "\
51819625d8cSopenharmony_cierror: unrecognized subcommand 'baz'
51919625d8cSopenharmony_ci
52019625d8cSopenharmony_ci  note: subcommand 'bar' exists
52119625d8cSopenharmony_ci  note: to pass 'baz' as a value, use ' -- baz'
52219625d8cSopenharmony_ci
52319625d8cSopenharmony_ciUsage: <COMMAND>
52419625d8cSopenharmony_ci
52519625d8cSopenharmony_ciFor more information, try 'help'.
52619625d8cSopenharmony_ci";
52719625d8cSopenharmony_ci        utils::assert_eq(BAZ_EXPECTED, err.to_string());
52819625d8cSopenharmony_ci    }
52919625d8cSopenharmony_ci
53019625d8cSopenharmony_ci    // Verify whatever we did to get the above to work didn't disable `--help` and `--version`.
53119625d8cSopenharmony_ci
53219625d8cSopenharmony_ci    let err = cmd
53319625d8cSopenharmony_ci        .clone()
53419625d8cSopenharmony_ci        .try_get_matches_from(["foo", "--help"])
53519625d8cSopenharmony_ci        .unwrap_err();
53619625d8cSopenharmony_ci    assert_eq!(err.kind(), ErrorKind::DisplayHelp);
53719625d8cSopenharmony_ci
53819625d8cSopenharmony_ci    let err = cmd
53919625d8cSopenharmony_ci        .clone()
54019625d8cSopenharmony_ci        .try_get_matches_from(["foo", "--version"])
54119625d8cSopenharmony_ci        .unwrap_err();
54219625d8cSopenharmony_ci    assert_eq!(err.kind(), ErrorKind::DisplayVersion);
54319625d8cSopenharmony_ci}
54419625d8cSopenharmony_ci
54519625d8cSopenharmony_ci#[test]
54619625d8cSopenharmony_ci#[should_panic = "Command repl: Arguments like oh-no cannot be set on a multicall command"]
54719625d8cSopenharmony_cifn cant_have_args_with_multicall() {
54819625d8cSopenharmony_ci    let mut cmd = Command::new("repl")
54919625d8cSopenharmony_ci        .version("1.0.0")
55019625d8cSopenharmony_ci        .propagate_version(true)
55119625d8cSopenharmony_ci        .multicall(true)
55219625d8cSopenharmony_ci        .subcommand(Command::new("foo"))
55319625d8cSopenharmony_ci        .subcommand(Command::new("bar"))
55419625d8cSopenharmony_ci        .arg(Arg::new("oh-no"));
55519625d8cSopenharmony_ci    cmd.build();
55619625d8cSopenharmony_ci}
55719625d8cSopenharmony_ci
55819625d8cSopenharmony_ci#[test]
55919625d8cSopenharmony_cifn multicall_help_flag() {
56019625d8cSopenharmony_ci    static EXPECTED: &str = "\
56119625d8cSopenharmony_ciUsage: foo bar [value]
56219625d8cSopenharmony_ci
56319625d8cSopenharmony_ciArguments:
56419625d8cSopenharmony_ci  [value]
56519625d8cSopenharmony_ci
56619625d8cSopenharmony_ciOptions:
56719625d8cSopenharmony_ci  -h, --help     Print help
56819625d8cSopenharmony_ci  -V, --version  Print version
56919625d8cSopenharmony_ci";
57019625d8cSopenharmony_ci    let cmd = Command::new("repl")
57119625d8cSopenharmony_ci        .version("1.0.0")
57219625d8cSopenharmony_ci        .propagate_version(true)
57319625d8cSopenharmony_ci        .multicall(true)
57419625d8cSopenharmony_ci        .subcommand(Command::new("foo").subcommand(Command::new("bar").arg(Arg::new("value"))));
57519625d8cSopenharmony_ci    utils::assert_output(cmd, "foo bar --help", EXPECTED, false);
57619625d8cSopenharmony_ci}
57719625d8cSopenharmony_ci
57819625d8cSopenharmony_ci#[test]
57919625d8cSopenharmony_cifn multicall_help_subcommand() {
58019625d8cSopenharmony_ci    static EXPECTED: &str = "\
58119625d8cSopenharmony_ciUsage: foo bar [value]
58219625d8cSopenharmony_ci
58319625d8cSopenharmony_ciArguments:
58419625d8cSopenharmony_ci  [value]
58519625d8cSopenharmony_ci
58619625d8cSopenharmony_ciOptions:
58719625d8cSopenharmony_ci  -h, --help     Print help
58819625d8cSopenharmony_ci  -V, --version  Print version
58919625d8cSopenharmony_ci";
59019625d8cSopenharmony_ci    let cmd = Command::new("repl")
59119625d8cSopenharmony_ci        .version("1.0.0")
59219625d8cSopenharmony_ci        .propagate_version(true)
59319625d8cSopenharmony_ci        .multicall(true)
59419625d8cSopenharmony_ci        .subcommand(Command::new("foo").subcommand(Command::new("bar").arg(Arg::new("value"))));
59519625d8cSopenharmony_ci    utils::assert_output(cmd, "help foo bar", EXPECTED, false);
59619625d8cSopenharmony_ci}
59719625d8cSopenharmony_ci
59819625d8cSopenharmony_ci#[test]
59919625d8cSopenharmony_cifn multicall_render_help() {
60019625d8cSopenharmony_ci    static EXPECTED: &str = "\
60119625d8cSopenharmony_ciUsage: foo bar [value]
60219625d8cSopenharmony_ci
60319625d8cSopenharmony_ciArguments:
60419625d8cSopenharmony_ci  [value]
60519625d8cSopenharmony_ci
60619625d8cSopenharmony_ciOptions:
60719625d8cSopenharmony_ci  -h, --help     Print help
60819625d8cSopenharmony_ci  -V, --version  Print version
60919625d8cSopenharmony_ci";
61019625d8cSopenharmony_ci    let mut cmd = Command::new("repl")
61119625d8cSopenharmony_ci        .version("1.0.0")
61219625d8cSopenharmony_ci        .propagate_version(true)
61319625d8cSopenharmony_ci        .multicall(true)
61419625d8cSopenharmony_ci        .subcommand(Command::new("foo").subcommand(Command::new("bar").arg(Arg::new("value"))));
61519625d8cSopenharmony_ci    cmd.build();
61619625d8cSopenharmony_ci    let subcmd = cmd.find_subcommand_mut("foo").unwrap();
61719625d8cSopenharmony_ci    let subcmd = subcmd.find_subcommand_mut("bar").unwrap();
61819625d8cSopenharmony_ci
61919625d8cSopenharmony_ci    let help = subcmd.render_help().to_string();
62019625d8cSopenharmony_ci    utils::assert_eq(EXPECTED, help);
62119625d8cSopenharmony_ci}
62219625d8cSopenharmony_ci
62319625d8cSopenharmony_ci#[test]
62419625d8cSopenharmony_ci#[should_panic = "Command test: command name `repeat` is duplicated"]
62519625d8cSopenharmony_cifn duplicate_subcommand() {
62619625d8cSopenharmony_ci    Command::new("test")
62719625d8cSopenharmony_ci        .subcommand(Command::new("repeat"))
62819625d8cSopenharmony_ci        .subcommand(Command::new("repeat"))
62919625d8cSopenharmony_ci        .build()
63019625d8cSopenharmony_ci}
63119625d8cSopenharmony_ci
63219625d8cSopenharmony_ci#[test]
63319625d8cSopenharmony_ci#[should_panic = "Command test: command `unique` alias `repeat` is duplicated"]
63419625d8cSopenharmony_cifn duplicate_subcommand_alias() {
63519625d8cSopenharmony_ci    Command::new("test")
63619625d8cSopenharmony_ci        .subcommand(Command::new("repeat"))
63719625d8cSopenharmony_ci        .subcommand(Command::new("unique").alias("repeat"))
63819625d8cSopenharmony_ci        .build()
63919625d8cSopenharmony_ci}
640