119625d8cSopenharmony_ciuse clap::{arg, Arg, ArgAction, Command};
219625d8cSopenharmony_ci
319625d8cSopenharmony_ci#[test]
419625d8cSopenharmony_cifn issue_1076() {
519625d8cSopenharmony_ci    let mut cmd = Command::new("myprog")
619625d8cSopenharmony_ci        .arg(
719625d8cSopenharmony_ci            Arg::new("GLOBAL_ARG")
819625d8cSopenharmony_ci                .long("global-arg")
919625d8cSopenharmony_ci                .help("Specifies something needed by the subcommands")
1019625d8cSopenharmony_ci                .global(true)
1119625d8cSopenharmony_ci                .action(ArgAction::Set)
1219625d8cSopenharmony_ci                .default_value("default_value"),
1319625d8cSopenharmony_ci        )
1419625d8cSopenharmony_ci        .arg(
1519625d8cSopenharmony_ci            Arg::new("GLOBAL_FLAG")
1619625d8cSopenharmony_ci                .long("global-flag")
1719625d8cSopenharmony_ci                .help("Specifies something needed by the subcommands")
1819625d8cSopenharmony_ci                .global(true)
1919625d8cSopenharmony_ci                .action(ArgAction::Set),
2019625d8cSopenharmony_ci        )
2119625d8cSopenharmony_ci        .subcommand(Command::new("outer").subcommand(Command::new("inner")));
2219625d8cSopenharmony_ci    let _ = cmd.try_get_matches_from_mut(vec!["myprog"]);
2319625d8cSopenharmony_ci    let _ = cmd.try_get_matches_from_mut(vec!["myprog"]);
2419625d8cSopenharmony_ci    let _ = cmd.try_get_matches_from_mut(vec!["myprog"]);
2519625d8cSopenharmony_ci}
2619625d8cSopenharmony_ci
2719625d8cSopenharmony_ci#[test]
2819625d8cSopenharmony_cifn propagate_global_arg_in_subcommand_to_subsubcommand_1385() {
2919625d8cSopenharmony_ci    let m1 = Command::new("foo")
3019625d8cSopenharmony_ci        .subcommand(
3119625d8cSopenharmony_ci            Command::new("sub1")
3219625d8cSopenharmony_ci                .arg(
3319625d8cSopenharmony_ci                    Arg::new("arg1")
3419625d8cSopenharmony_ci                        .long("arg1")
3519625d8cSopenharmony_ci                        .action(ArgAction::Set)
3619625d8cSopenharmony_ci                        .global(true),
3719625d8cSopenharmony_ci                )
3819625d8cSopenharmony_ci                .subcommand(Command::new("sub1a")),
3919625d8cSopenharmony_ci        )
4019625d8cSopenharmony_ci        .try_get_matches_from(["foo", "sub1", "--arg1", "v1", "sub1a"])
4119625d8cSopenharmony_ci        .unwrap();
4219625d8cSopenharmony_ci    assert_eq!(
4319625d8cSopenharmony_ci        "v1",
4419625d8cSopenharmony_ci        m1.subcommand_matches("sub1")
4519625d8cSopenharmony_ci            .unwrap()
4619625d8cSopenharmony_ci            .subcommand_matches("sub1a")
4719625d8cSopenharmony_ci            .unwrap()
4819625d8cSopenharmony_ci            .get_one::<String>("arg1")
4919625d8cSopenharmony_ci            .map(|v| v.as_str())
5019625d8cSopenharmony_ci            .unwrap()
5119625d8cSopenharmony_ci    );
5219625d8cSopenharmony_ci}
5319625d8cSopenharmony_ci
5419625d8cSopenharmony_ci#[test]
5519625d8cSopenharmony_cifn propagate_global_arg_to_subcommand_in_subsubcommand_2053() {
5619625d8cSopenharmony_ci    let m = Command::new("opts")
5719625d8cSopenharmony_ci        .arg(arg!(--"global-flag").global(true))
5819625d8cSopenharmony_ci        .arg(arg!(--"global-str" <str>).global(true))
5919625d8cSopenharmony_ci        .subcommand(
6019625d8cSopenharmony_ci            Command::new("test")
6119625d8cSopenharmony_ci                .arg(arg!(--"sub-flag").global(true))
6219625d8cSopenharmony_ci                .arg(arg!(--"sub-str" <str>).global(true))
6319625d8cSopenharmony_ci                .subcommand(Command::new("test")),
6419625d8cSopenharmony_ci        )
6519625d8cSopenharmony_ci        .try_get_matches_from([
6619625d8cSopenharmony_ci            "cmd",
6719625d8cSopenharmony_ci            "test",
6819625d8cSopenharmony_ci            "test",
6919625d8cSopenharmony_ci            "--global-flag",
7019625d8cSopenharmony_ci            "--global-str",
7119625d8cSopenharmony_ci            "hello",
7219625d8cSopenharmony_ci            "--sub-flag",
7319625d8cSopenharmony_ci            "--sub-str",
7419625d8cSopenharmony_ci            "world",
7519625d8cSopenharmony_ci        ])
7619625d8cSopenharmony_ci        .unwrap();
7719625d8cSopenharmony_ci    assert_eq!(
7819625d8cSopenharmony_ci        Some("world"),
7919625d8cSopenharmony_ci        m.subcommand_matches("test")
8019625d8cSopenharmony_ci            .unwrap()
8119625d8cSopenharmony_ci            .get_one::<String>("sub-str")
8219625d8cSopenharmony_ci            .map(|v| v.as_str())
8319625d8cSopenharmony_ci    );
8419625d8cSopenharmony_ci}
8519625d8cSopenharmony_ci
8619625d8cSopenharmony_ci#[test]
8719625d8cSopenharmony_cifn global_arg_available_in_subcommand() {
8819625d8cSopenharmony_ci    let m = Command::new("opt")
8919625d8cSopenharmony_ci        .args([
9019625d8cSopenharmony_ci            Arg::new("global")
9119625d8cSopenharmony_ci                .global(true)
9219625d8cSopenharmony_ci                .long("global")
9319625d8cSopenharmony_ci                .action(ArgAction::SetTrue),
9419625d8cSopenharmony_ci            Arg::new("not")
9519625d8cSopenharmony_ci                .global(false)
9619625d8cSopenharmony_ci                .long("not")
9719625d8cSopenharmony_ci                .action(ArgAction::SetTrue),
9819625d8cSopenharmony_ci        ])
9919625d8cSopenharmony_ci        .subcommand(Command::new("ping"))
10019625d8cSopenharmony_ci        .try_get_matches_from(["opt", "ping", "--global"])
10119625d8cSopenharmony_ci        .unwrap();
10219625d8cSopenharmony_ci
10319625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("global").expect("defaulted by clap"));
10419625d8cSopenharmony_ci    assert!(*m
10519625d8cSopenharmony_ci        .subcommand_matches("ping")
10619625d8cSopenharmony_ci        .unwrap()
10719625d8cSopenharmony_ci        .get_one::<bool>("global")
10819625d8cSopenharmony_ci        .expect("defaulted by clap"));
10919625d8cSopenharmony_ci}
11019625d8cSopenharmony_ci
11119625d8cSopenharmony_ci#[test]
11219625d8cSopenharmony_cifn deeply_nested_discovery() {
11319625d8cSopenharmony_ci    let cmd = Command::new("a")
11419625d8cSopenharmony_ci        .arg(arg!(--"long-a").global(true).action(ArgAction::SetTrue))
11519625d8cSopenharmony_ci        .subcommand(
11619625d8cSopenharmony_ci            Command::new("b")
11719625d8cSopenharmony_ci                .arg(arg!(--"long-b").global(true).action(ArgAction::SetTrue))
11819625d8cSopenharmony_ci                .subcommand(
11919625d8cSopenharmony_ci                    Command::new("c")
12019625d8cSopenharmony_ci                        .arg(arg!(--"long-c").global(true).action(ArgAction::SetTrue))
12119625d8cSopenharmony_ci                        .subcommand(Command::new("d")),
12219625d8cSopenharmony_ci                ),
12319625d8cSopenharmony_ci        );
12419625d8cSopenharmony_ci
12519625d8cSopenharmony_ci    let m = cmd
12619625d8cSopenharmony_ci        .try_get_matches_from(["a", "b", "c", "d", "--long-a", "--long-b", "--long-c"])
12719625d8cSopenharmony_ci        .unwrap();
12819625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("long-a").expect("defaulted by clap"));
12919625d8cSopenharmony_ci    let m = m.subcommand_matches("b").unwrap();
13019625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("long-b").expect("defaulted by clap"));
13119625d8cSopenharmony_ci    let m = m.subcommand_matches("c").unwrap();
13219625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("long-c").expect("defaulted by clap"));
13319625d8cSopenharmony_ci}
13419625d8cSopenharmony_ci
13519625d8cSopenharmony_ci#[test]
13619625d8cSopenharmony_cifn global_overrides_default() {
13719625d8cSopenharmony_ci    let cmd = Command::new("test")
13819625d8cSopenharmony_ci        .arg(
13919625d8cSopenharmony_ci            Arg::new("name")
14019625d8cSopenharmony_ci                .long("name")
14119625d8cSopenharmony_ci                .global(true)
14219625d8cSopenharmony_ci                .action(ArgAction::Set)
14319625d8cSopenharmony_ci                .default_value("from_default"),
14419625d8cSopenharmony_ci        )
14519625d8cSopenharmony_ci        .subcommand(Command::new("sub"));
14619625d8cSopenharmony_ci
14719625d8cSopenharmony_ci    let m = cmd.clone().try_get_matches_from(["test"]).unwrap();
14819625d8cSopenharmony_ci    assert_eq!(
14919625d8cSopenharmony_ci        m.get_one::<String>("name").unwrap().as_str(),
15019625d8cSopenharmony_ci        "from_default"
15119625d8cSopenharmony_ci    );
15219625d8cSopenharmony_ci
15319625d8cSopenharmony_ci    let m = cmd
15419625d8cSopenharmony_ci        .clone()
15519625d8cSopenharmony_ci        .try_get_matches_from(["test", "--name", "from_arg"])
15619625d8cSopenharmony_ci        .unwrap();
15719625d8cSopenharmony_ci    assert_eq!(m.get_one::<String>("name").unwrap().as_str(), "from_arg");
15819625d8cSopenharmony_ci
15919625d8cSopenharmony_ci    let m = cmd
16019625d8cSopenharmony_ci        .clone()
16119625d8cSopenharmony_ci        .try_get_matches_from(["test", "--name", "from_arg", "sub"])
16219625d8cSopenharmony_ci        .unwrap();
16319625d8cSopenharmony_ci    assert_eq!(m.get_one::<String>("name").unwrap().as_str(), "from_arg");
16419625d8cSopenharmony_ci
16519625d8cSopenharmony_ci    let m = cmd
16619625d8cSopenharmony_ci        .clone()
16719625d8cSopenharmony_ci        .try_get_matches_from(["test", "sub", "--name", "from_arg"])
16819625d8cSopenharmony_ci        .unwrap();
16919625d8cSopenharmony_ci    assert_eq!(m.get_one::<String>("name").unwrap().as_str(), "from_arg");
17019625d8cSopenharmony_ci}
17119625d8cSopenharmony_ci
17219625d8cSopenharmony_ci#[test]
17319625d8cSopenharmony_ci#[cfg(feature = "env")]
17419625d8cSopenharmony_cifn global_overrides_env() {
17519625d8cSopenharmony_ci    std::env::set_var("GLOBAL_OVERRIDES_ENV", "from_env");
17619625d8cSopenharmony_ci
17719625d8cSopenharmony_ci    let cmd = Command::new("test")
17819625d8cSopenharmony_ci        .arg(
17919625d8cSopenharmony_ci            Arg::new("name")
18019625d8cSopenharmony_ci                .long("name")
18119625d8cSopenharmony_ci                .global(true)
18219625d8cSopenharmony_ci                .action(ArgAction::Set)
18319625d8cSopenharmony_ci                .env("GLOBAL_OVERRIDES_ENV"),
18419625d8cSopenharmony_ci        )
18519625d8cSopenharmony_ci        .subcommand(Command::new("sub"));
18619625d8cSopenharmony_ci
18719625d8cSopenharmony_ci    let m = cmd.clone().try_get_matches_from(["test"]).unwrap();
18819625d8cSopenharmony_ci    assert_eq!(m.get_one::<String>("name").unwrap().as_str(), "from_env");
18919625d8cSopenharmony_ci
19019625d8cSopenharmony_ci    let m = cmd
19119625d8cSopenharmony_ci        .clone()
19219625d8cSopenharmony_ci        .try_get_matches_from(["test", "--name", "from_arg"])
19319625d8cSopenharmony_ci        .unwrap();
19419625d8cSopenharmony_ci    assert_eq!(m.get_one::<String>("name").unwrap().as_str(), "from_arg");
19519625d8cSopenharmony_ci
19619625d8cSopenharmony_ci    let m = cmd
19719625d8cSopenharmony_ci        .clone()
19819625d8cSopenharmony_ci        .try_get_matches_from(["test", "--name", "from_arg", "sub"])
19919625d8cSopenharmony_ci        .unwrap();
20019625d8cSopenharmony_ci    assert_eq!(m.get_one::<String>("name").unwrap().as_str(), "from_arg");
20119625d8cSopenharmony_ci
20219625d8cSopenharmony_ci    let m = cmd
20319625d8cSopenharmony_ci        .clone()
20419625d8cSopenharmony_ci        .try_get_matches_from(["test", "sub", "--name", "from_arg"])
20519625d8cSopenharmony_ci        .unwrap();
20619625d8cSopenharmony_ci    assert_eq!(m.get_one::<String>("name").unwrap().as_str(), "from_arg");
20719625d8cSopenharmony_ci}
208