119625d8cSopenharmony_ciuse clap::{error::ErrorKind, ArgAction, Command};
219625d8cSopenharmony_ci
319625d8cSopenharmony_ciuse crate::utils;
419625d8cSopenharmony_ci
519625d8cSopenharmony_cifn common() -> Command {
619625d8cSopenharmony_ci    Command::new("foo").help_template(utils::FULL_TEMPLATE)
719625d8cSopenharmony_ci}
819625d8cSopenharmony_ci
919625d8cSopenharmony_cifn with_version() -> Command {
1019625d8cSopenharmony_ci    common().version("3.0")
1119625d8cSopenharmony_ci}
1219625d8cSopenharmony_ci
1319625d8cSopenharmony_cifn with_long_version() -> Command {
1419625d8cSopenharmony_ci    common().long_version("3.0 (abcdefg)")
1519625d8cSopenharmony_ci}
1619625d8cSopenharmony_ci
1719625d8cSopenharmony_cifn with_both() -> Command {
1819625d8cSopenharmony_ci    common().version("3.0").long_version("3.0 (abcdefg)")
1919625d8cSopenharmony_ci}
2019625d8cSopenharmony_ci
2119625d8cSopenharmony_cifn with_subcommand() -> Command {
2219625d8cSopenharmony_ci    with_version().subcommand(Command::new("bar").subcommand(Command::new("baz")))
2319625d8cSopenharmony_ci}
2419625d8cSopenharmony_ci
2519625d8cSopenharmony_ci#[test]
2619625d8cSopenharmony_cifn version_short_flag_no_version() {
2719625d8cSopenharmony_ci    let res = common().try_get_matches_from("foo -V".split(' '));
2819625d8cSopenharmony_ci
2919625d8cSopenharmony_ci    assert!(res.is_err());
3019625d8cSopenharmony_ci    let err = res.unwrap_err();
3119625d8cSopenharmony_ci    assert_eq!(err.kind(), clap::error::ErrorKind::UnknownArgument);
3219625d8cSopenharmony_ci}
3319625d8cSopenharmony_ci
3419625d8cSopenharmony_ci#[test]
3519625d8cSopenharmony_cifn version_long_flag_no_version() {
3619625d8cSopenharmony_ci    let res = common().try_get_matches_from("foo --version".split(' '));
3719625d8cSopenharmony_ci
3819625d8cSopenharmony_ci    assert!(res.is_err());
3919625d8cSopenharmony_ci    let err = res.unwrap_err();
4019625d8cSopenharmony_ci    assert_eq!(err.kind(), clap::error::ErrorKind::UnknownArgument);
4119625d8cSopenharmony_ci}
4219625d8cSopenharmony_ci
4319625d8cSopenharmony_ci#[test]
4419625d8cSopenharmony_cifn version_short_flag_with_version() {
4519625d8cSopenharmony_ci    let res = with_version().try_get_matches_from("foo -V".split(' '));
4619625d8cSopenharmony_ci
4719625d8cSopenharmony_ci    assert!(res.is_err());
4819625d8cSopenharmony_ci    let err = res.unwrap_err();
4919625d8cSopenharmony_ci    assert_eq!(err.kind(), ErrorKind::DisplayVersion);
5019625d8cSopenharmony_ci    assert_eq!(err.to_string(), "foo 3.0\n");
5119625d8cSopenharmony_ci}
5219625d8cSopenharmony_ci
5319625d8cSopenharmony_ci#[test]
5419625d8cSopenharmony_cifn version_long_flag_with_version() {
5519625d8cSopenharmony_ci    let res = with_version().try_get_matches_from("foo --version".split(' '));
5619625d8cSopenharmony_ci
5719625d8cSopenharmony_ci    assert!(res.is_err());
5819625d8cSopenharmony_ci    let err = res.unwrap_err();
5919625d8cSopenharmony_ci    assert_eq!(err.kind(), ErrorKind::DisplayVersion);
6019625d8cSopenharmony_ci    assert_eq!(err.to_string(), "foo 3.0\n");
6119625d8cSopenharmony_ci}
6219625d8cSopenharmony_ci
6319625d8cSopenharmony_ci#[test]
6419625d8cSopenharmony_cifn version_short_flag_with_long_version() {
6519625d8cSopenharmony_ci    let res = with_long_version().try_get_matches_from("foo -V".split(' '));
6619625d8cSopenharmony_ci
6719625d8cSopenharmony_ci    assert!(res.is_err());
6819625d8cSopenharmony_ci    let err = res.unwrap_err();
6919625d8cSopenharmony_ci    assert_eq!(err.kind(), ErrorKind::DisplayVersion);
7019625d8cSopenharmony_ci    assert_eq!(err.to_string(), "foo 3.0 (abcdefg)\n");
7119625d8cSopenharmony_ci}
7219625d8cSopenharmony_ci
7319625d8cSopenharmony_ci#[test]
7419625d8cSopenharmony_cifn version_long_flag_with_long_version() {
7519625d8cSopenharmony_ci    let res = with_long_version().try_get_matches_from("foo --version".split(' '));
7619625d8cSopenharmony_ci
7719625d8cSopenharmony_ci    assert!(res.is_err());
7819625d8cSopenharmony_ci    let err = res.unwrap_err();
7919625d8cSopenharmony_ci    assert_eq!(err.kind(), ErrorKind::DisplayVersion);
8019625d8cSopenharmony_ci    assert_eq!(err.to_string(), "foo 3.0 (abcdefg)\n");
8119625d8cSopenharmony_ci}
8219625d8cSopenharmony_ci
8319625d8cSopenharmony_ci#[test]
8419625d8cSopenharmony_cifn version_short_flag_with_both() {
8519625d8cSopenharmony_ci    let res = with_both().try_get_matches_from("foo -V".split(' '));
8619625d8cSopenharmony_ci
8719625d8cSopenharmony_ci    assert!(res.is_err());
8819625d8cSopenharmony_ci    let err = res.unwrap_err();
8919625d8cSopenharmony_ci    assert_eq!(err.kind(), ErrorKind::DisplayVersion);
9019625d8cSopenharmony_ci    assert_eq!(err.to_string(), "foo 3.0\n");
9119625d8cSopenharmony_ci}
9219625d8cSopenharmony_ci
9319625d8cSopenharmony_ci#[test]
9419625d8cSopenharmony_cifn version_long_flag_with_both() {
9519625d8cSopenharmony_ci    let res = with_both().try_get_matches_from("foo --version".split(' '));
9619625d8cSopenharmony_ci
9719625d8cSopenharmony_ci    assert!(res.is_err());
9819625d8cSopenharmony_ci    let err = res.unwrap_err();
9919625d8cSopenharmony_ci    assert_eq!(err.kind(), ErrorKind::DisplayVersion);
10019625d8cSopenharmony_ci    assert_eq!(err.to_string(), "foo 3.0 (abcdefg)\n");
10119625d8cSopenharmony_ci}
10219625d8cSopenharmony_ci
10319625d8cSopenharmony_ci#[test]
10419625d8cSopenharmony_cifn help_short_flag_no_version() {
10519625d8cSopenharmony_ci    static EXPECTED: &str = "\
10619625d8cSopenharmony_cifoo
10719625d8cSopenharmony_ci
10819625d8cSopenharmony_ciUsage: foo
10919625d8cSopenharmony_ci
11019625d8cSopenharmony_ciOptions:
11119625d8cSopenharmony_ci  -h, --help  Print help
11219625d8cSopenharmony_ci";
11319625d8cSopenharmony_ci    let cmd = common();
11419625d8cSopenharmony_ci    utils::assert_output(cmd, "foo -h", EXPECTED, false);
11519625d8cSopenharmony_ci}
11619625d8cSopenharmony_ci
11719625d8cSopenharmony_ci#[test]
11819625d8cSopenharmony_cifn help_long_flag_no_version() {
11919625d8cSopenharmony_ci    static EXPECTED: &str = "\
12019625d8cSopenharmony_cifoo
12119625d8cSopenharmony_ci
12219625d8cSopenharmony_ciUsage: foo
12319625d8cSopenharmony_ci
12419625d8cSopenharmony_ciOptions:
12519625d8cSopenharmony_ci  -h, --help  Print help
12619625d8cSopenharmony_ci";
12719625d8cSopenharmony_ci    let cmd = common();
12819625d8cSopenharmony_ci    utils::assert_output(cmd, "foo --help", EXPECTED, false);
12919625d8cSopenharmony_ci}
13019625d8cSopenharmony_ci
13119625d8cSopenharmony_ci#[test]
13219625d8cSopenharmony_cifn help_short_flag_with_version() {
13319625d8cSopenharmony_ci    static EXPECTED: &str = "\
13419625d8cSopenharmony_cifoo 3.0
13519625d8cSopenharmony_ci
13619625d8cSopenharmony_ciUsage: foo
13719625d8cSopenharmony_ci
13819625d8cSopenharmony_ciOptions:
13919625d8cSopenharmony_ci  -h, --help     Print help
14019625d8cSopenharmony_ci  -V, --version  Print version
14119625d8cSopenharmony_ci";
14219625d8cSopenharmony_ci    let cmd = with_version();
14319625d8cSopenharmony_ci    utils::assert_output(cmd, "foo -h", EXPECTED, false);
14419625d8cSopenharmony_ci}
14519625d8cSopenharmony_ci
14619625d8cSopenharmony_ci#[test]
14719625d8cSopenharmony_cifn help_long_flag_with_version() {
14819625d8cSopenharmony_ci    static EXPECTED: &str = "\
14919625d8cSopenharmony_cifoo 3.0
15019625d8cSopenharmony_ci
15119625d8cSopenharmony_ciUsage: foo
15219625d8cSopenharmony_ci
15319625d8cSopenharmony_ciOptions:
15419625d8cSopenharmony_ci  -h, --help     Print help
15519625d8cSopenharmony_ci  -V, --version  Print version
15619625d8cSopenharmony_ci";
15719625d8cSopenharmony_ci    let cmd = with_version();
15819625d8cSopenharmony_ci    utils::assert_output(cmd, "foo --help", EXPECTED, false);
15919625d8cSopenharmony_ci}
16019625d8cSopenharmony_ci
16119625d8cSopenharmony_ci#[test]
16219625d8cSopenharmony_cifn help_short_flag_with_long_version() {
16319625d8cSopenharmony_ci    static EXPECTED: &str = "\
16419625d8cSopenharmony_cifoo 3.0 (abcdefg)
16519625d8cSopenharmony_ci
16619625d8cSopenharmony_ciUsage: foo
16719625d8cSopenharmony_ci
16819625d8cSopenharmony_ciOptions:
16919625d8cSopenharmony_ci  -h, --help     Print help
17019625d8cSopenharmony_ci  -V, --version  Print version
17119625d8cSopenharmony_ci";
17219625d8cSopenharmony_ci    let cmd = with_long_version();
17319625d8cSopenharmony_ci    utils::assert_output(cmd, "foo -h", EXPECTED, false);
17419625d8cSopenharmony_ci}
17519625d8cSopenharmony_ci
17619625d8cSopenharmony_ci#[test]
17719625d8cSopenharmony_cifn help_long_flag_with_long_version() {
17819625d8cSopenharmony_ci    static EXPECTED: &str = "\
17919625d8cSopenharmony_cifoo 3.0 (abcdefg)
18019625d8cSopenharmony_ci
18119625d8cSopenharmony_ciUsage: foo
18219625d8cSopenharmony_ci
18319625d8cSopenharmony_ciOptions:
18419625d8cSopenharmony_ci  -h, --help     Print help
18519625d8cSopenharmony_ci  -V, --version  Print version
18619625d8cSopenharmony_ci";
18719625d8cSopenharmony_ci    let cmd = with_long_version();
18819625d8cSopenharmony_ci    utils::assert_output(cmd, "foo --help", EXPECTED, false);
18919625d8cSopenharmony_ci}
19019625d8cSopenharmony_ci
19119625d8cSopenharmony_ci#[test]
19219625d8cSopenharmony_cifn help_short_flag_with_both() {
19319625d8cSopenharmony_ci    static EXPECTED: &str = "\
19419625d8cSopenharmony_cifoo 3.0
19519625d8cSopenharmony_ci
19619625d8cSopenharmony_ciUsage: foo
19719625d8cSopenharmony_ci
19819625d8cSopenharmony_ciOptions:
19919625d8cSopenharmony_ci  -h, --help     Print help
20019625d8cSopenharmony_ci  -V, --version  Print version
20119625d8cSopenharmony_ci";
20219625d8cSopenharmony_ci    let cmd = with_both();
20319625d8cSopenharmony_ci    utils::assert_output(cmd, "foo -h", EXPECTED, false);
20419625d8cSopenharmony_ci}
20519625d8cSopenharmony_ci
20619625d8cSopenharmony_ci#[test]
20719625d8cSopenharmony_cifn help_long_flag_with_both() {
20819625d8cSopenharmony_ci    static EXPECTED: &str = "\
20919625d8cSopenharmony_cifoo 3.0
21019625d8cSopenharmony_ci
21119625d8cSopenharmony_ciUsage: foo
21219625d8cSopenharmony_ci
21319625d8cSopenharmony_ciOptions:
21419625d8cSopenharmony_ci  -h, --help     Print help
21519625d8cSopenharmony_ci  -V, --version  Print version
21619625d8cSopenharmony_ci";
21719625d8cSopenharmony_ci    let cmd = with_both();
21819625d8cSopenharmony_ci    utils::assert_output(cmd, "foo --help", EXPECTED, false);
21919625d8cSopenharmony_ci}
22019625d8cSopenharmony_ci
22119625d8cSopenharmony_ci#[test]
22219625d8cSopenharmony_ci#[cfg(debug_assertions)]
22319625d8cSopenharmony_ci#[should_panic = "Command foo: Long option names must be unique for each argument, but '--version' is in use by both 'ver' and 'version' (call `cmd.disable_version_flag(true)` to remove the auto-generated `--version`)"]
22419625d8cSopenharmony_cifn override_version_long_with_user_flag() {
22519625d8cSopenharmony_ci    with_version()
22619625d8cSopenharmony_ci        .arg(
22719625d8cSopenharmony_ci            clap::Arg::new("ver")
22819625d8cSopenharmony_ci                .long("version")
22919625d8cSopenharmony_ci                .action(ArgAction::SetTrue),
23019625d8cSopenharmony_ci        )
23119625d8cSopenharmony_ci        .debug_assert();
23219625d8cSopenharmony_ci}
23319625d8cSopenharmony_ci
23419625d8cSopenharmony_ci#[test]
23519625d8cSopenharmony_ci#[cfg(debug_assertions)]
23619625d8cSopenharmony_ci#[should_panic = "Command foo: Short option names must be unique for each argument, but '-V' is in use by both 'ver' and 'version' (call `cmd.disable_version_flag(true)` to remove the auto-generated `--version`)"]
23719625d8cSopenharmony_cifn override_version_short_with_user_flag() {
23819625d8cSopenharmony_ci    with_version()
23919625d8cSopenharmony_ci        .arg(clap::Arg::new("ver").short('V').action(ArgAction::SetTrue))
24019625d8cSopenharmony_ci        .debug_assert();
24119625d8cSopenharmony_ci}
24219625d8cSopenharmony_ci
24319625d8cSopenharmony_ci#[test]
24419625d8cSopenharmony_cifn no_propagation_by_default_long() {
24519625d8cSopenharmony_ci    // Version Flag should not be propagated to subcommands
24619625d8cSopenharmony_ci    let res = with_subcommand().try_get_matches_from("foo bar --version".split(' '));
24719625d8cSopenharmony_ci
24819625d8cSopenharmony_ci    assert!(res.is_err());
24919625d8cSopenharmony_ci    let err = res.unwrap_err();
25019625d8cSopenharmony_ci    assert_eq!(err.kind(), ErrorKind::UnknownArgument);
25119625d8cSopenharmony_ci}
25219625d8cSopenharmony_ci
25319625d8cSopenharmony_ci#[test]
25419625d8cSopenharmony_cifn no_propagation_by_default_short() {
25519625d8cSopenharmony_ci    let res = with_subcommand().try_get_matches_from("foo bar -V".split(' '));
25619625d8cSopenharmony_ci
25719625d8cSopenharmony_ci    assert!(res.is_err());
25819625d8cSopenharmony_ci    let err = res.unwrap_err();
25919625d8cSopenharmony_ci    assert_eq!(err.kind(), ErrorKind::UnknownArgument);
26019625d8cSopenharmony_ci}
26119625d8cSopenharmony_ci
26219625d8cSopenharmony_ci#[test]
26319625d8cSopenharmony_cifn propagate_version_long() {
26419625d8cSopenharmony_ci    let res = with_subcommand()
26519625d8cSopenharmony_ci        .propagate_version(true)
26619625d8cSopenharmony_ci        .try_get_matches_from("foo bar --version".split(' '));
26719625d8cSopenharmony_ci
26819625d8cSopenharmony_ci    assert!(res.is_err());
26919625d8cSopenharmony_ci    let err = res.unwrap_err();
27019625d8cSopenharmony_ci    assert_eq!(err.kind(), ErrorKind::DisplayVersion);
27119625d8cSopenharmony_ci}
27219625d8cSopenharmony_ci
27319625d8cSopenharmony_ci#[test]
27419625d8cSopenharmony_cifn propagate_version_short() {
27519625d8cSopenharmony_ci    let res = with_subcommand()
27619625d8cSopenharmony_ci        .propagate_version(true)
27719625d8cSopenharmony_ci        .try_get_matches_from("foo bar -V".split(' '));
27819625d8cSopenharmony_ci
27919625d8cSopenharmony_ci    assert!(res.is_err());
28019625d8cSopenharmony_ci    let err = res.unwrap_err();
28119625d8cSopenharmony_ci    assert_eq!(err.kind(), ErrorKind::DisplayVersion);
28219625d8cSopenharmony_ci}
28319625d8cSopenharmony_ci
28419625d8cSopenharmony_ci#[cfg(debug_assertions)]
28519625d8cSopenharmony_ci#[test]
28619625d8cSopenharmony_ci#[should_panic = "`ArgAction::Version` used without providing Command::version or Command::long_version"]
28719625d8cSopenharmony_cifn version_required() {
28819625d8cSopenharmony_ci    let _res = common()
28919625d8cSopenharmony_ci        .arg(clap::arg!(--version).action(ArgAction::Version))
29019625d8cSopenharmony_ci        .try_get_matches_from("foo -z".split(' '));
29119625d8cSopenharmony_ci}
29219625d8cSopenharmony_ci
29319625d8cSopenharmony_ci#[test]
29419625d8cSopenharmony_ci#[should_panic = "Argument `version` is undefined"]
29519625d8cSopenharmony_cifn mut_arg_version_no_auto_version() {
29619625d8cSopenharmony_ci    let _ = common().mut_arg("version", |v| v.short('z').action(ArgAction::SetTrue));
29719625d8cSopenharmony_ci}
29819625d8cSopenharmony_ci
29919625d8cSopenharmony_ci#[cfg(debug_assertions)]
30019625d8cSopenharmony_ci#[test]
30119625d8cSopenharmony_ci#[should_panic = "No version information via Command::version or Command::long_version to propagate"]
30219625d8cSopenharmony_cifn propagate_version_no_version_info() {
30319625d8cSopenharmony_ci    let _res = common()
30419625d8cSopenharmony_ci        .propagate_version(true)
30519625d8cSopenharmony_ci        .subcommand(Command::new("bar"))
30619625d8cSopenharmony_ci        .try_get_matches_from("foo".split(' '));
30719625d8cSopenharmony_ci}
308