119625d8cSopenharmony_ciuse super::utils;
219625d8cSopenharmony_ci
319625d8cSopenharmony_ciuse clap::{arg, Arg, ArgAction, Command};
419625d8cSopenharmony_ci
519625d8cSopenharmony_ci#[test]
619625d8cSopenharmony_cifn single_alias_of_option() {
719625d8cSopenharmony_ci    let a = Command::new("single_alias")
819625d8cSopenharmony_ci        .arg(
919625d8cSopenharmony_ci            Arg::new("alias")
1019625d8cSopenharmony_ci                .long("alias")
1119625d8cSopenharmony_ci                .action(ArgAction::Set)
1219625d8cSopenharmony_ci                .help("single alias")
1319625d8cSopenharmony_ci                .alias("new-opt"),
1419625d8cSopenharmony_ci        )
1519625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--new-opt", "cool"]);
1619625d8cSopenharmony_ci    assert!(a.is_ok(), "{}", a.unwrap_err());
1719625d8cSopenharmony_ci    let a = a.unwrap();
1819625d8cSopenharmony_ci    assert!(a.contains_id("alias"));
1919625d8cSopenharmony_ci    assert_eq!(
2019625d8cSopenharmony_ci        a.get_one::<String>("alias").map(|v| v.as_str()).unwrap(),
2119625d8cSopenharmony_ci        "cool"
2219625d8cSopenharmony_ci    );
2319625d8cSopenharmony_ci}
2419625d8cSopenharmony_ci
2519625d8cSopenharmony_ci#[test]
2619625d8cSopenharmony_cifn multiple_aliases_of_option() {
2719625d8cSopenharmony_ci    let a = Command::new("multiple_aliases").arg(
2819625d8cSopenharmony_ci        Arg::new("aliases")
2919625d8cSopenharmony_ci            .long("aliases")
3019625d8cSopenharmony_ci            .action(ArgAction::Set)
3119625d8cSopenharmony_ci            .help("multiple aliases")
3219625d8cSopenharmony_ci            .aliases(["alias1", "alias2", "alias3"]),
3319625d8cSopenharmony_ci    );
3419625d8cSopenharmony_ci    let long = a
3519625d8cSopenharmony_ci        .clone()
3619625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--aliases", "value"]);
3719625d8cSopenharmony_ci    assert!(long.is_ok(), "{}", long.unwrap_err());
3819625d8cSopenharmony_ci    let long = long.unwrap();
3919625d8cSopenharmony_ci
4019625d8cSopenharmony_ci    let als1 = a
4119625d8cSopenharmony_ci        .clone()
4219625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--alias1", "value"]);
4319625d8cSopenharmony_ci    assert!(als1.is_ok(), "{}", als1.unwrap_err());
4419625d8cSopenharmony_ci    let als1 = als1.unwrap();
4519625d8cSopenharmony_ci
4619625d8cSopenharmony_ci    let als2 = a
4719625d8cSopenharmony_ci        .clone()
4819625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--alias2", "value"]);
4919625d8cSopenharmony_ci    assert!(als2.is_ok(), "{}", als2.unwrap_err());
5019625d8cSopenharmony_ci    let als2 = als2.unwrap();
5119625d8cSopenharmony_ci
5219625d8cSopenharmony_ci    let als3 = a
5319625d8cSopenharmony_ci        .clone()
5419625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--alias3", "value"]);
5519625d8cSopenharmony_ci    assert!(als3.is_ok(), "{}", als3.unwrap_err());
5619625d8cSopenharmony_ci    let als3 = als3.unwrap();
5719625d8cSopenharmony_ci
5819625d8cSopenharmony_ci    assert!(long.contains_id("aliases"));
5919625d8cSopenharmony_ci    assert!(als1.contains_id("aliases"));
6019625d8cSopenharmony_ci    assert!(als2.contains_id("aliases"));
6119625d8cSopenharmony_ci    assert!(als3.contains_id("aliases"));
6219625d8cSopenharmony_ci    assert_eq!(
6319625d8cSopenharmony_ci        long.get_one::<String>("aliases")
6419625d8cSopenharmony_ci            .map(|v| v.as_str())
6519625d8cSopenharmony_ci            .unwrap(),
6619625d8cSopenharmony_ci        "value"
6719625d8cSopenharmony_ci    );
6819625d8cSopenharmony_ci    assert_eq!(
6919625d8cSopenharmony_ci        als1.get_one::<String>("aliases")
7019625d8cSopenharmony_ci            .map(|v| v.as_str())
7119625d8cSopenharmony_ci            .unwrap(),
7219625d8cSopenharmony_ci        "value"
7319625d8cSopenharmony_ci    );
7419625d8cSopenharmony_ci    assert_eq!(
7519625d8cSopenharmony_ci        als2.get_one::<String>("aliases")
7619625d8cSopenharmony_ci            .map(|v| v.as_str())
7719625d8cSopenharmony_ci            .unwrap(),
7819625d8cSopenharmony_ci        "value"
7919625d8cSopenharmony_ci    );
8019625d8cSopenharmony_ci    assert_eq!(
8119625d8cSopenharmony_ci        als3.get_one::<String>("aliases")
8219625d8cSopenharmony_ci            .map(|v| v.as_str())
8319625d8cSopenharmony_ci            .unwrap(),
8419625d8cSopenharmony_ci        "value"
8519625d8cSopenharmony_ci    );
8619625d8cSopenharmony_ci}
8719625d8cSopenharmony_ci
8819625d8cSopenharmony_ci#[test]
8919625d8cSopenharmony_cifn get_aliases() {
9019625d8cSopenharmony_ci    let a = Arg::new("aliases")
9119625d8cSopenharmony_ci        .long("aliases")
9219625d8cSopenharmony_ci        .action(ArgAction::Set)
9319625d8cSopenharmony_ci        .help("multiple aliases")
9419625d8cSopenharmony_ci        .aliases(["alias1", "alias2", "alias3"])
9519625d8cSopenharmony_ci        .short_aliases(['a', 'b', 'c'])
9619625d8cSopenharmony_ci        .visible_aliases(["alias4", "alias5", "alias6"])
9719625d8cSopenharmony_ci        .visible_short_aliases(['d', 'e', 'f']);
9819625d8cSopenharmony_ci
9919625d8cSopenharmony_ci    assert!(a.get_short_and_visible_aliases().is_none());
10019625d8cSopenharmony_ci    assert_eq!(
10119625d8cSopenharmony_ci        a.get_long_and_visible_aliases().unwrap(),
10219625d8cSopenharmony_ci        ["aliases", "alias4", "alias5", "alias6"]
10319625d8cSopenharmony_ci    );
10419625d8cSopenharmony_ci    assert_eq!(
10519625d8cSopenharmony_ci        a.get_visible_aliases().unwrap(),
10619625d8cSopenharmony_ci        ["alias4", "alias5", "alias6"]
10719625d8cSopenharmony_ci    );
10819625d8cSopenharmony_ci    assert_eq!(
10919625d8cSopenharmony_ci        a.get_all_aliases().unwrap(),
11019625d8cSopenharmony_ci        ["alias1", "alias2", "alias3", "alias4", "alias5", "alias6"]
11119625d8cSopenharmony_ci    );
11219625d8cSopenharmony_ci    assert_eq!(a.get_visible_short_aliases().unwrap(), vec!['d', 'e', 'f']);
11319625d8cSopenharmony_ci    assert_eq!(
11419625d8cSopenharmony_ci        a.get_all_short_aliases().unwrap(),
11519625d8cSopenharmony_ci        vec!['a', 'b', 'c', 'd', 'e', 'f']
11619625d8cSopenharmony_ci    );
11719625d8cSopenharmony_ci}
11819625d8cSopenharmony_ci
11919625d8cSopenharmony_ci#[test]
12019625d8cSopenharmony_cifn single_alias_of_flag() {
12119625d8cSopenharmony_ci    let a = Command::new("test")
12219625d8cSopenharmony_ci        .arg(
12319625d8cSopenharmony_ci            Arg::new("flag")
12419625d8cSopenharmony_ci                .long("flag")
12519625d8cSopenharmony_ci                .alias("alias")
12619625d8cSopenharmony_ci                .action(ArgAction::SetTrue),
12719625d8cSopenharmony_ci        )
12819625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--alias"]);
12919625d8cSopenharmony_ci    assert!(a.is_ok(), "{}", a.unwrap_err());
13019625d8cSopenharmony_ci    let a = a.unwrap();
13119625d8cSopenharmony_ci    assert!(*a.get_one::<bool>("flag").expect("defaulted by clap"));
13219625d8cSopenharmony_ci}
13319625d8cSopenharmony_ci
13419625d8cSopenharmony_ci#[test]
13519625d8cSopenharmony_cifn multiple_aliases_of_flag() {
13619625d8cSopenharmony_ci    let a = Command::new("test").arg(
13719625d8cSopenharmony_ci        Arg::new("flag")
13819625d8cSopenharmony_ci            .long("flag")
13919625d8cSopenharmony_ci            .aliases(["invisible", "set", "of", "cool", "aliases"])
14019625d8cSopenharmony_ci            .action(ArgAction::SetTrue),
14119625d8cSopenharmony_ci    );
14219625d8cSopenharmony_ci
14319625d8cSopenharmony_ci    let flag = a.clone().try_get_matches_from(vec!["", "--flag"]);
14419625d8cSopenharmony_ci    assert!(flag.is_ok(), "{}", flag.unwrap_err());
14519625d8cSopenharmony_ci    let flag = flag.unwrap();
14619625d8cSopenharmony_ci
14719625d8cSopenharmony_ci    let inv = a.clone().try_get_matches_from(vec!["", "--invisible"]);
14819625d8cSopenharmony_ci    assert!(inv.is_ok(), "{}", inv.unwrap_err());
14919625d8cSopenharmony_ci    let inv = inv.unwrap();
15019625d8cSopenharmony_ci
15119625d8cSopenharmony_ci    let cool = a.clone().try_get_matches_from(vec!["", "--cool"]);
15219625d8cSopenharmony_ci    assert!(cool.is_ok(), "{}", cool.unwrap_err());
15319625d8cSopenharmony_ci    let cool = cool.unwrap();
15419625d8cSopenharmony_ci
15519625d8cSopenharmony_ci    let als = a.clone().try_get_matches_from(vec!["", "--aliases"]);
15619625d8cSopenharmony_ci    assert!(als.is_ok(), "{}", als.unwrap_err());
15719625d8cSopenharmony_ci    let als = als.unwrap();
15819625d8cSopenharmony_ci
15919625d8cSopenharmony_ci    assert!(*flag.get_one::<bool>("flag").expect("defaulted by clap"));
16019625d8cSopenharmony_ci    assert!(*inv.get_one::<bool>("flag").expect("defaulted by clap"));
16119625d8cSopenharmony_ci    assert!(*cool.get_one::<bool>("flag").expect("defaulted by clap"));
16219625d8cSopenharmony_ci    assert!(*als.get_one::<bool>("flag").expect("defaulted by clap"));
16319625d8cSopenharmony_ci}
16419625d8cSopenharmony_ci
16519625d8cSopenharmony_ci#[test]
16619625d8cSopenharmony_cifn alias_on_a_subcommand_option() {
16719625d8cSopenharmony_ci    let m = Command::new("test")
16819625d8cSopenharmony_ci        .subcommand(
16919625d8cSopenharmony_ci            Command::new("some").arg(
17019625d8cSopenharmony_ci                Arg::new("test")
17119625d8cSopenharmony_ci                    .short('t')
17219625d8cSopenharmony_ci                    .long("test")
17319625d8cSopenharmony_ci                    .action(ArgAction::Set)
17419625d8cSopenharmony_ci                    .alias("opt")
17519625d8cSopenharmony_ci                    .help("testing testing"),
17619625d8cSopenharmony_ci            ),
17719625d8cSopenharmony_ci        )
17819625d8cSopenharmony_ci        .arg(Arg::new("other").long("other").aliases(["o1", "o2", "o3"]))
17919625d8cSopenharmony_ci        .try_get_matches_from(vec!["test", "some", "--opt", "awesome"])
18019625d8cSopenharmony_ci        .unwrap();
18119625d8cSopenharmony_ci
18219625d8cSopenharmony_ci    assert!(m.subcommand_matches("some").is_some());
18319625d8cSopenharmony_ci    let sub_m = m.subcommand_matches("some").unwrap();
18419625d8cSopenharmony_ci    assert!(sub_m.contains_id("test"));
18519625d8cSopenharmony_ci    assert_eq!(
18619625d8cSopenharmony_ci        sub_m.get_one::<String>("test").map(|v| v.as_str()).unwrap(),
18719625d8cSopenharmony_ci        "awesome"
18819625d8cSopenharmony_ci    );
18919625d8cSopenharmony_ci}
19019625d8cSopenharmony_ci
19119625d8cSopenharmony_ci#[test]
19219625d8cSopenharmony_cifn invisible_arg_aliases_help_output() {
19319625d8cSopenharmony_ci    static SC_INVISIBLE_ALIAS_HELP: &str = "\
19419625d8cSopenharmony_ciSome help
19519625d8cSopenharmony_ci
19619625d8cSopenharmony_ciUsage: ct test [OPTIONS]
19719625d8cSopenharmony_ci
19819625d8cSopenharmony_ciOptions:
19919625d8cSopenharmony_ci  -o, --opt <opt>
20019625d8cSopenharmony_ci  -f, --flag
20119625d8cSopenharmony_ci  -h, --help       Print help
20219625d8cSopenharmony_ci  -V, --version    Print version
20319625d8cSopenharmony_ci";
20419625d8cSopenharmony_ci
20519625d8cSopenharmony_ci    let cmd = Command::new("ct").author("Salim Afiune").subcommand(
20619625d8cSopenharmony_ci        Command::new("test")
20719625d8cSopenharmony_ci            .about("Some help")
20819625d8cSopenharmony_ci            .version("1.2")
20919625d8cSopenharmony_ci            .arg(
21019625d8cSopenharmony_ci                Arg::new("opt")
21119625d8cSopenharmony_ci                    .long("opt")
21219625d8cSopenharmony_ci                    .short('o')
21319625d8cSopenharmony_ci                    .action(ArgAction::Set)
21419625d8cSopenharmony_ci                    .aliases(["invisible", "als1", "more"]),
21519625d8cSopenharmony_ci            )
21619625d8cSopenharmony_ci            .arg(arg!(-f - -flag).aliases(["unseeable", "flg1", "anyway"])),
21719625d8cSopenharmony_ci    );
21819625d8cSopenharmony_ci    utils::assert_output(cmd, "ct test --help", SC_INVISIBLE_ALIAS_HELP, false);
21919625d8cSopenharmony_ci}
22019625d8cSopenharmony_ci
22119625d8cSopenharmony_ci#[test]
22219625d8cSopenharmony_cifn visible_arg_aliases_help_output() {
22319625d8cSopenharmony_ci    static SC_VISIBLE_ALIAS_HELP: &str = "\
22419625d8cSopenharmony_ciSome help
22519625d8cSopenharmony_ci
22619625d8cSopenharmony_ciUsage: ct test [OPTIONS]
22719625d8cSopenharmony_ci
22819625d8cSopenharmony_ciOptions:
22919625d8cSopenharmony_ci  -o, --opt <opt>  [aliases: visible]
23019625d8cSopenharmony_ci  -f, --flag       [aliases: v_flg, flag2, flg3]
23119625d8cSopenharmony_ci  -h, --help       Print help
23219625d8cSopenharmony_ci  -V, --version    Print version
23319625d8cSopenharmony_ci";
23419625d8cSopenharmony_ci
23519625d8cSopenharmony_ci    let cmd = Command::new("ct").author("Salim Afiune").subcommand(
23619625d8cSopenharmony_ci        Command::new("test")
23719625d8cSopenharmony_ci            .about("Some help")
23819625d8cSopenharmony_ci            .version("1.2")
23919625d8cSopenharmony_ci            .arg(
24019625d8cSopenharmony_ci                Arg::new("opt")
24119625d8cSopenharmony_ci                    .long("opt")
24219625d8cSopenharmony_ci                    .short('o')
24319625d8cSopenharmony_ci                    .action(ArgAction::Set)
24419625d8cSopenharmony_ci                    .alias("invisible")
24519625d8cSopenharmony_ci                    .visible_alias("visible"),
24619625d8cSopenharmony_ci            )
24719625d8cSopenharmony_ci            .arg(
24819625d8cSopenharmony_ci                Arg::new("flg")
24919625d8cSopenharmony_ci                    .long("flag")
25019625d8cSopenharmony_ci                    .short('f')
25119625d8cSopenharmony_ci                    .action(ArgAction::SetTrue)
25219625d8cSopenharmony_ci                    .visible_aliases(["v_flg", "flag2", "flg3"]),
25319625d8cSopenharmony_ci            ),
25419625d8cSopenharmony_ci    );
25519625d8cSopenharmony_ci    utils::assert_output(cmd, "ct test --help", SC_VISIBLE_ALIAS_HELP, false);
25619625d8cSopenharmony_ci}
257