119625d8cSopenharmony_ciuse clap::builder::ArgPredicate;
219625d8cSopenharmony_ciuse clap::{arg, error::ErrorKind, Arg, ArgAction, ArgGroup, Command};
319625d8cSopenharmony_ci
419625d8cSopenharmony_ci#[cfg(feature = "error-context")]
519625d8cSopenharmony_ciuse super::utils;
619625d8cSopenharmony_ci
719625d8cSopenharmony_ci#[test]
819625d8cSopenharmony_cifn flag_required() {
919625d8cSopenharmony_ci    let result = Command::new("flag_required")
1019625d8cSopenharmony_ci        .arg(arg!(-f --flag "some flag").requires("color"))
1119625d8cSopenharmony_ci        .arg(arg!(-c --color "third flag"))
1219625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-f"]);
1319625d8cSopenharmony_ci    assert!(result.is_err());
1419625d8cSopenharmony_ci    let err = result.err().unwrap();
1519625d8cSopenharmony_ci    assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument);
1619625d8cSopenharmony_ci}
1719625d8cSopenharmony_ci
1819625d8cSopenharmony_ci#[test]
1919625d8cSopenharmony_cifn flag_required_2() {
2019625d8cSopenharmony_ci    let m = Command::new("flag_required")
2119625d8cSopenharmony_ci        .arg(
2219625d8cSopenharmony_ci            arg!(-f --flag "some flag")
2319625d8cSopenharmony_ci                .requires("color")
2419625d8cSopenharmony_ci                .action(ArgAction::SetTrue),
2519625d8cSopenharmony_ci        )
2619625d8cSopenharmony_ci        .arg(arg!(-c --color "third flag").action(ArgAction::SetTrue))
2719625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-f", "-c"])
2819625d8cSopenharmony_ci        .unwrap();
2919625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("color").expect("defaulted by clap"));
3019625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("flag").expect("defaulted by clap"));
3119625d8cSopenharmony_ci}
3219625d8cSopenharmony_ci
3319625d8cSopenharmony_ci#[test]
3419625d8cSopenharmony_cifn option_required() {
3519625d8cSopenharmony_ci    let result = Command::new("option_required")
3619625d8cSopenharmony_ci        .arg(arg!(f: -f <flag> "some flag").requires("c"))
3719625d8cSopenharmony_ci        .arg(arg!(c: -c <color> "third flag"))
3819625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-f", "val"]);
3919625d8cSopenharmony_ci    assert!(result.is_err());
4019625d8cSopenharmony_ci    let err = result.err().unwrap();
4119625d8cSopenharmony_ci    assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument);
4219625d8cSopenharmony_ci}
4319625d8cSopenharmony_ci
4419625d8cSopenharmony_ci#[test]
4519625d8cSopenharmony_cifn option_required_2() {
4619625d8cSopenharmony_ci    let m = Command::new("option_required")
4719625d8cSopenharmony_ci        .arg(arg!(f: -f <flag> "some flag").requires("c"))
4819625d8cSopenharmony_ci        .arg(arg!(c: -c <color> "third flag"))
4919625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-f", "val", "-c", "other_val"])
5019625d8cSopenharmony_ci        .unwrap();
5119625d8cSopenharmony_ci    assert!(m.contains_id("c"));
5219625d8cSopenharmony_ci    assert_eq!(
5319625d8cSopenharmony_ci        m.get_one::<String>("c").map(|v| v.as_str()).unwrap(),
5419625d8cSopenharmony_ci        "other_val"
5519625d8cSopenharmony_ci    );
5619625d8cSopenharmony_ci    assert!(m.contains_id("f"));
5719625d8cSopenharmony_ci    assert_eq!(m.get_one::<String>("f").map(|v| v.as_str()).unwrap(), "val");
5819625d8cSopenharmony_ci}
5919625d8cSopenharmony_ci
6019625d8cSopenharmony_ci#[test]
6119625d8cSopenharmony_cifn positional_required() {
6219625d8cSopenharmony_ci    let result = Command::new("positional_required")
6319625d8cSopenharmony_ci        .arg(Arg::new("flag").index(1).required(true))
6419625d8cSopenharmony_ci        .try_get_matches_from(vec![""]);
6519625d8cSopenharmony_ci    assert!(result.is_err());
6619625d8cSopenharmony_ci    let err = result.err().unwrap();
6719625d8cSopenharmony_ci    assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument);
6819625d8cSopenharmony_ci}
6919625d8cSopenharmony_ci
7019625d8cSopenharmony_ci#[test]
7119625d8cSopenharmony_cifn positional_required_2() {
7219625d8cSopenharmony_ci    let m = Command::new("positional_required")
7319625d8cSopenharmony_ci        .arg(Arg::new("flag").index(1).required(true))
7419625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "someval"])
7519625d8cSopenharmony_ci        .unwrap();
7619625d8cSopenharmony_ci    assert!(m.contains_id("flag"));
7719625d8cSopenharmony_ci    assert_eq!(
7819625d8cSopenharmony_ci        m.get_one::<String>("flag").map(|v| v.as_str()).unwrap(),
7919625d8cSopenharmony_ci        "someval"
8019625d8cSopenharmony_ci    );
8119625d8cSopenharmony_ci}
8219625d8cSopenharmony_ci
8319625d8cSopenharmony_ci#[test]
8419625d8cSopenharmony_ci#[cfg(feature = "error-context")]
8519625d8cSopenharmony_cifn positional_required_with_requires() {
8619625d8cSopenharmony_ci    static POSITIONAL_REQ: &str = "\
8719625d8cSopenharmony_cierror: the following required arguments were not provided:
8819625d8cSopenharmony_ci  <flag>
8919625d8cSopenharmony_ci  <opt>
9019625d8cSopenharmony_ci
9119625d8cSopenharmony_ciUsage: clap-test <flag> <opt> [bar]
9219625d8cSopenharmony_ci
9319625d8cSopenharmony_ciFor more information, try '--help'.
9419625d8cSopenharmony_ci";
9519625d8cSopenharmony_ci
9619625d8cSopenharmony_ci    let cmd = Command::new("positional_required")
9719625d8cSopenharmony_ci        .arg(Arg::new("flag").required(true).requires("opt"))
9819625d8cSopenharmony_ci        .arg(Arg::new("opt"))
9919625d8cSopenharmony_ci        .arg(Arg::new("bar"));
10019625d8cSopenharmony_ci
10119625d8cSopenharmony_ci    utils::assert_output(cmd, "clap-test", POSITIONAL_REQ, true);
10219625d8cSopenharmony_ci}
10319625d8cSopenharmony_ci
10419625d8cSopenharmony_ci#[test]
10519625d8cSopenharmony_ci#[cfg(feature = "error-context")]
10619625d8cSopenharmony_cifn positional_required_with_requires_if_no_value() {
10719625d8cSopenharmony_ci    static POSITIONAL_REQ_IF_NO_VAL: &str = "\
10819625d8cSopenharmony_cierror: the following required arguments were not provided:
10919625d8cSopenharmony_ci  <flag>
11019625d8cSopenharmony_ci
11119625d8cSopenharmony_ciUsage: clap-test <flag> [opt] [bar]
11219625d8cSopenharmony_ci
11319625d8cSopenharmony_ciFor more information, try '--help'.
11419625d8cSopenharmony_ci";
11519625d8cSopenharmony_ci
11619625d8cSopenharmony_ci    let cmd = Command::new("positional_required")
11719625d8cSopenharmony_ci        .arg(Arg::new("flag").required(true).requires_if("val", "opt"))
11819625d8cSopenharmony_ci        .arg(Arg::new("opt"))
11919625d8cSopenharmony_ci        .arg(Arg::new("bar"));
12019625d8cSopenharmony_ci
12119625d8cSopenharmony_ci    utils::assert_output(cmd, "clap-test", POSITIONAL_REQ_IF_NO_VAL, true);
12219625d8cSopenharmony_ci}
12319625d8cSopenharmony_ci
12419625d8cSopenharmony_ci#[test]
12519625d8cSopenharmony_ci#[cfg(feature = "error-context")]
12619625d8cSopenharmony_cifn positional_required_with_requires_if_value() {
12719625d8cSopenharmony_ci    static POSITIONAL_REQ_IF_VAL: &str = "\
12819625d8cSopenharmony_cierror: the following required arguments were not provided:
12919625d8cSopenharmony_ci  <foo>
13019625d8cSopenharmony_ci  <opt>
13119625d8cSopenharmony_ci
13219625d8cSopenharmony_ciUsage: clap-test <flag> <foo> <opt> [bar]
13319625d8cSopenharmony_ci
13419625d8cSopenharmony_ciFor more information, try '--help'.
13519625d8cSopenharmony_ci";
13619625d8cSopenharmony_ci
13719625d8cSopenharmony_ci    let cmd = Command::new("positional_required")
13819625d8cSopenharmony_ci        .arg(Arg::new("flag").required(true).requires_if("val", "opt"))
13919625d8cSopenharmony_ci        .arg(Arg::new("foo").required(true))
14019625d8cSopenharmony_ci        .arg(Arg::new("opt"))
14119625d8cSopenharmony_ci        .arg(Arg::new("bar"));
14219625d8cSopenharmony_ci
14319625d8cSopenharmony_ci    utils::assert_output(cmd, "clap-test val", POSITIONAL_REQ_IF_VAL, true);
14419625d8cSopenharmony_ci}
14519625d8cSopenharmony_ci
14619625d8cSopenharmony_ci#[test]
14719625d8cSopenharmony_cifn group_required() {
14819625d8cSopenharmony_ci    let result = Command::new("group_required")
14919625d8cSopenharmony_ci        .arg(arg!(-f --flag "some flag"))
15019625d8cSopenharmony_ci        .group(ArgGroup::new("gr").required(true).arg("some").arg("other"))
15119625d8cSopenharmony_ci        .arg(arg!(--some "some arg"))
15219625d8cSopenharmony_ci        .arg(arg!(--other "other arg"))
15319625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-f"]);
15419625d8cSopenharmony_ci    assert!(result.is_err());
15519625d8cSopenharmony_ci    let err = result.err().unwrap();
15619625d8cSopenharmony_ci    assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument);
15719625d8cSopenharmony_ci}
15819625d8cSopenharmony_ci
15919625d8cSopenharmony_ci#[test]
16019625d8cSopenharmony_cifn group_required_2() {
16119625d8cSopenharmony_ci    let m = Command::new("group_required")
16219625d8cSopenharmony_ci        .arg(arg!(-f --flag "some flag").action(ArgAction::SetTrue))
16319625d8cSopenharmony_ci        .group(ArgGroup::new("gr").required(true).arg("some").arg("other"))
16419625d8cSopenharmony_ci        .arg(arg!(--some "some arg").action(ArgAction::SetTrue))
16519625d8cSopenharmony_ci        .arg(arg!(--other "other arg").action(ArgAction::SetTrue))
16619625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-f", "--some"])
16719625d8cSopenharmony_ci        .unwrap();
16819625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("some").expect("defaulted by clap"));
16919625d8cSopenharmony_ci    assert!(!*m.get_one::<bool>("other").expect("defaulted by clap"));
17019625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("flag").expect("defaulted by clap"));
17119625d8cSopenharmony_ci}
17219625d8cSopenharmony_ci
17319625d8cSopenharmony_ci#[test]
17419625d8cSopenharmony_cifn group_required_3() {
17519625d8cSopenharmony_ci    let m = Command::new("group_required")
17619625d8cSopenharmony_ci        .arg(arg!(-f --flag "some flag").action(ArgAction::SetTrue))
17719625d8cSopenharmony_ci        .group(ArgGroup::new("gr").required(true).arg("some").arg("other"))
17819625d8cSopenharmony_ci        .arg(arg!(--some "some arg").action(ArgAction::SetTrue))
17919625d8cSopenharmony_ci        .arg(arg!(--other "other arg").action(ArgAction::SetTrue))
18019625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-f", "--other"])
18119625d8cSopenharmony_ci        .unwrap();
18219625d8cSopenharmony_ci    assert!(!*m.get_one::<bool>("some").expect("defaulted by clap"));
18319625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("other").expect("defaulted by clap"));
18419625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("flag").expect("defaulted by clap"));
18519625d8cSopenharmony_ci}
18619625d8cSopenharmony_ci
18719625d8cSopenharmony_ci#[test]
18819625d8cSopenharmony_cifn arg_require_group() {
18919625d8cSopenharmony_ci    let result = Command::new("arg_require_group")
19019625d8cSopenharmony_ci        .arg(arg!(-f --flag "some flag").requires("gr"))
19119625d8cSopenharmony_ci        .group(ArgGroup::new("gr").arg("some").arg("other"))
19219625d8cSopenharmony_ci        .arg(arg!(--some "some arg"))
19319625d8cSopenharmony_ci        .arg(arg!(--other "other arg"))
19419625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-f"]);
19519625d8cSopenharmony_ci    assert!(result.is_err());
19619625d8cSopenharmony_ci    let err = result.err().unwrap();
19719625d8cSopenharmony_ci    assert_eq!(err.kind(), ErrorKind::MissingRequiredArgument);
19819625d8cSopenharmony_ci}
19919625d8cSopenharmony_ci
20019625d8cSopenharmony_ci#[test]
20119625d8cSopenharmony_cifn arg_require_group_2() {
20219625d8cSopenharmony_ci    let res = Command::new("arg_require_group")
20319625d8cSopenharmony_ci        .arg(
20419625d8cSopenharmony_ci            arg!(-f --flag "some flag")
20519625d8cSopenharmony_ci                .requires("gr")
20619625d8cSopenharmony_ci                .action(ArgAction::SetTrue),
20719625d8cSopenharmony_ci        )
20819625d8cSopenharmony_ci        .group(ArgGroup::new("gr").arg("some").arg("other"))
20919625d8cSopenharmony_ci        .arg(arg!(--some "some arg").action(ArgAction::SetTrue))
21019625d8cSopenharmony_ci        .arg(arg!(--other "other arg").action(ArgAction::SetTrue))
21119625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-f", "--some"]);
21219625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
21319625d8cSopenharmony_ci    let m = res.unwrap();
21419625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("some").expect("defaulted by clap"));
21519625d8cSopenharmony_ci    assert!(!*m.get_one::<bool>("other").expect("defaulted by clap"));
21619625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("flag").expect("defaulted by clap"));
21719625d8cSopenharmony_ci}
21819625d8cSopenharmony_ci
21919625d8cSopenharmony_ci#[test]
22019625d8cSopenharmony_cifn arg_require_group_3() {
22119625d8cSopenharmony_ci    let res = Command::new("arg_require_group")
22219625d8cSopenharmony_ci        .arg(
22319625d8cSopenharmony_ci            arg!(-f --flag "some flag")
22419625d8cSopenharmony_ci                .requires("gr")
22519625d8cSopenharmony_ci                .action(ArgAction::SetTrue),
22619625d8cSopenharmony_ci        )
22719625d8cSopenharmony_ci        .group(ArgGroup::new("gr").arg("some").arg("other"))
22819625d8cSopenharmony_ci        .arg(arg!(--some "some arg").action(ArgAction::SetTrue))
22919625d8cSopenharmony_ci        .arg(arg!(--other "other arg").action(ArgAction::SetTrue))
23019625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-f", "--other"]);
23119625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
23219625d8cSopenharmony_ci    let m = res.unwrap();
23319625d8cSopenharmony_ci    assert!(!*m.get_one::<bool>("some").expect("defaulted by clap"));
23419625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("other").expect("defaulted by clap"));
23519625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("flag").expect("defaulted by clap"));
23619625d8cSopenharmony_ci}
23719625d8cSopenharmony_ci
23819625d8cSopenharmony_ci// REQUIRED_UNLESS
23919625d8cSopenharmony_ci
24019625d8cSopenharmony_ci#[test]
24119625d8cSopenharmony_cifn issue_753() {
24219625d8cSopenharmony_ci    let m = Command::new("test")
24319625d8cSopenharmony_ci        .arg(arg!(
24419625d8cSopenharmony_ci            -l --list "List available interfaces (and stop there)"
24519625d8cSopenharmony_ci        ))
24619625d8cSopenharmony_ci        .arg(
24719625d8cSopenharmony_ci            arg!(
24819625d8cSopenharmony_ci                -i --iface <INTERFACE> "Ethernet interface for fetching NTP packets"
24919625d8cSopenharmony_ci            )
25019625d8cSopenharmony_ci            .required(false)
25119625d8cSopenharmony_ci            .required_unless_present("list"),
25219625d8cSopenharmony_ci        )
25319625d8cSopenharmony_ci        .arg(
25419625d8cSopenharmony_ci            arg!(-f --file <TESTFILE> "Fetch NTP packets from pcap file")
25519625d8cSopenharmony_ci                .conflicts_with("iface")
25619625d8cSopenharmony_ci                .required_unless_present("list"),
25719625d8cSopenharmony_ci        )
25819625d8cSopenharmony_ci        .arg(arg!(-s --server <SERVER_IP> "NTP server IP address").required_unless_present("list"))
25919625d8cSopenharmony_ci        .try_get_matches_from(vec!["test", "--list"]);
26019625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
26119625d8cSopenharmony_ci}
26219625d8cSopenharmony_ci
26319625d8cSopenharmony_ci#[test]
26419625d8cSopenharmony_cifn required_unless_present() {
26519625d8cSopenharmony_ci    let res = Command::new("unlesstest")
26619625d8cSopenharmony_ci        .arg(
26719625d8cSopenharmony_ci            Arg::new("cfg")
26819625d8cSopenharmony_ci                .required_unless_present("dbg")
26919625d8cSopenharmony_ci                .action(ArgAction::Set)
27019625d8cSopenharmony_ci                .long("config"),
27119625d8cSopenharmony_ci        )
27219625d8cSopenharmony_ci        .arg(Arg::new("dbg").long("debug").action(ArgAction::SetTrue))
27319625d8cSopenharmony_ci        .try_get_matches_from(vec!["unlesstest", "--debug"]);
27419625d8cSopenharmony_ci
27519625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
27619625d8cSopenharmony_ci    let m = res.unwrap();
27719625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("dbg").expect("defaulted by clap"));
27819625d8cSopenharmony_ci    assert!(!m.contains_id("cfg"));
27919625d8cSopenharmony_ci}
28019625d8cSopenharmony_ci
28119625d8cSopenharmony_ci#[test]
28219625d8cSopenharmony_cifn required_unless_present_err() {
28319625d8cSopenharmony_ci    let res = Command::new("unlesstest")
28419625d8cSopenharmony_ci        .arg(
28519625d8cSopenharmony_ci            Arg::new("cfg")
28619625d8cSopenharmony_ci                .required_unless_present("dbg")
28719625d8cSopenharmony_ci                .action(ArgAction::Set)
28819625d8cSopenharmony_ci                .long("config"),
28919625d8cSopenharmony_ci        )
29019625d8cSopenharmony_ci        .arg(Arg::new("dbg").long("debug"))
29119625d8cSopenharmony_ci        .try_get_matches_from(vec!["unlesstest"]);
29219625d8cSopenharmony_ci
29319625d8cSopenharmony_ci    assert!(res.is_err());
29419625d8cSopenharmony_ci    assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);
29519625d8cSopenharmony_ci}
29619625d8cSopenharmony_ci
29719625d8cSopenharmony_ci#[test]
29819625d8cSopenharmony_cifn required_unless_present_with_optional_value() {
29919625d8cSopenharmony_ci    let res = Command::new("unlesstest")
30019625d8cSopenharmony_ci        .arg(Arg::new("opt").long("opt").num_args(0..=1))
30119625d8cSopenharmony_ci        .arg(
30219625d8cSopenharmony_ci            Arg::new("cfg")
30319625d8cSopenharmony_ci                .required_unless_present("dbg")
30419625d8cSopenharmony_ci                .action(ArgAction::Set)
30519625d8cSopenharmony_ci                .long("config"),
30619625d8cSopenharmony_ci        )
30719625d8cSopenharmony_ci        .arg(Arg::new("dbg").long("debug"))
30819625d8cSopenharmony_ci        .try_get_matches_from(vec!["unlesstest", "--opt"]);
30919625d8cSopenharmony_ci
31019625d8cSopenharmony_ci    assert!(res.is_err());
31119625d8cSopenharmony_ci    assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);
31219625d8cSopenharmony_ci}
31319625d8cSopenharmony_ci
31419625d8cSopenharmony_ci// REQUIRED_UNLESS_ALL
31519625d8cSopenharmony_ci
31619625d8cSopenharmony_ci#[test]
31719625d8cSopenharmony_cifn required_unless_present_all() {
31819625d8cSopenharmony_ci    let res = Command::new("unlessall")
31919625d8cSopenharmony_ci        .arg(
32019625d8cSopenharmony_ci            Arg::new("cfg")
32119625d8cSopenharmony_ci                .required_unless_present_all(["dbg", "infile"])
32219625d8cSopenharmony_ci                .action(ArgAction::Set)
32319625d8cSopenharmony_ci                .long("config"),
32419625d8cSopenharmony_ci        )
32519625d8cSopenharmony_ci        .arg(Arg::new("dbg").long("debug").action(ArgAction::SetTrue))
32619625d8cSopenharmony_ci        .arg(Arg::new("infile").short('i').action(ArgAction::Set))
32719625d8cSopenharmony_ci        .try_get_matches_from(vec!["unlessall", "--debug", "-i", "file"]);
32819625d8cSopenharmony_ci
32919625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
33019625d8cSopenharmony_ci    let m = res.unwrap();
33119625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("dbg").expect("defaulted by clap"));
33219625d8cSopenharmony_ci    assert!(m.contains_id("infile"));
33319625d8cSopenharmony_ci    assert!(!m.contains_id("cfg"));
33419625d8cSopenharmony_ci}
33519625d8cSopenharmony_ci
33619625d8cSopenharmony_ci#[test]
33719625d8cSopenharmony_cifn required_unless_all_err() {
33819625d8cSopenharmony_ci    let res = Command::new("unlessall")
33919625d8cSopenharmony_ci        .arg(
34019625d8cSopenharmony_ci            Arg::new("cfg")
34119625d8cSopenharmony_ci                .required_unless_present_all(["dbg", "infile"])
34219625d8cSopenharmony_ci                .action(ArgAction::Set)
34319625d8cSopenharmony_ci                .long("config"),
34419625d8cSopenharmony_ci        )
34519625d8cSopenharmony_ci        .arg(Arg::new("dbg").long("debug").action(ArgAction::SetTrue))
34619625d8cSopenharmony_ci        .arg(Arg::new("infile").short('i').action(ArgAction::Set))
34719625d8cSopenharmony_ci        .try_get_matches_from(vec!["unlessall", "--debug"]);
34819625d8cSopenharmony_ci
34919625d8cSopenharmony_ci    assert!(res.is_err());
35019625d8cSopenharmony_ci    assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);
35119625d8cSopenharmony_ci}
35219625d8cSopenharmony_ci
35319625d8cSopenharmony_ci// REQUIRED_UNLESS_ONE
35419625d8cSopenharmony_ci
35519625d8cSopenharmony_ci#[test]
35619625d8cSopenharmony_cifn required_unless_present_any() {
35719625d8cSopenharmony_ci    let res = Command::new("unlessone")
35819625d8cSopenharmony_ci        .arg(
35919625d8cSopenharmony_ci            Arg::new("cfg")
36019625d8cSopenharmony_ci                .required_unless_present_any(["dbg", "infile"])
36119625d8cSopenharmony_ci                .action(ArgAction::Set)
36219625d8cSopenharmony_ci                .long("config"),
36319625d8cSopenharmony_ci        )
36419625d8cSopenharmony_ci        .arg(Arg::new("dbg").long("debug").action(ArgAction::SetTrue))
36519625d8cSopenharmony_ci        .arg(Arg::new("infile").short('i').action(ArgAction::Set))
36619625d8cSopenharmony_ci        .try_get_matches_from(vec!["unlessone", "--debug"]);
36719625d8cSopenharmony_ci
36819625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
36919625d8cSopenharmony_ci    let m = res.unwrap();
37019625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("dbg").expect("defaulted by clap"));
37119625d8cSopenharmony_ci    assert!(!m.contains_id("cfg"));
37219625d8cSopenharmony_ci}
37319625d8cSopenharmony_ci
37419625d8cSopenharmony_ci#[test]
37519625d8cSopenharmony_cifn required_unless_any_2() {
37619625d8cSopenharmony_ci    // This tests that the required_unless_present_any works when the second arg in the array is used
37719625d8cSopenharmony_ci    // instead of the first.
37819625d8cSopenharmony_ci    let res = Command::new("unlessone")
37919625d8cSopenharmony_ci        .arg(
38019625d8cSopenharmony_ci            Arg::new("cfg")
38119625d8cSopenharmony_ci                .required_unless_present_any(["dbg", "infile"])
38219625d8cSopenharmony_ci                .action(ArgAction::Set)
38319625d8cSopenharmony_ci                .long("config"),
38419625d8cSopenharmony_ci        )
38519625d8cSopenharmony_ci        .arg(Arg::new("dbg").long("debug").action(ArgAction::SetTrue))
38619625d8cSopenharmony_ci        .arg(Arg::new("infile").short('i').action(ArgAction::Set))
38719625d8cSopenharmony_ci        .try_get_matches_from(vec!["unlessone", "-i", "file"]);
38819625d8cSopenharmony_ci
38919625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
39019625d8cSopenharmony_ci    let m = res.unwrap();
39119625d8cSopenharmony_ci    assert!(m.contains_id("infile"));
39219625d8cSopenharmony_ci    assert!(!m.contains_id("cfg"));
39319625d8cSopenharmony_ci}
39419625d8cSopenharmony_ci
39519625d8cSopenharmony_ci#[test]
39619625d8cSopenharmony_cifn required_unless_any_works_with_short() {
39719625d8cSopenharmony_ci    // GitHub issue: https://github.com/clap-rs/clap/issues/1135
39819625d8cSopenharmony_ci    let res = Command::new("unlessone")
39919625d8cSopenharmony_ci        .arg(
40019625d8cSopenharmony_ci            Arg::new("a")
40119625d8cSopenharmony_ci                .conflicts_with("b")
40219625d8cSopenharmony_ci                .short('a')
40319625d8cSopenharmony_ci                .action(ArgAction::SetTrue),
40419625d8cSopenharmony_ci        )
40519625d8cSopenharmony_ci        .arg(Arg::new("b").short('b').action(ArgAction::SetTrue))
40619625d8cSopenharmony_ci        .arg(
40719625d8cSopenharmony_ci            Arg::new("x")
40819625d8cSopenharmony_ci                .short('x')
40919625d8cSopenharmony_ci                .action(ArgAction::SetTrue)
41019625d8cSopenharmony_ci                .required_unless_present_any(["a", "b"]),
41119625d8cSopenharmony_ci        )
41219625d8cSopenharmony_ci        .try_get_matches_from(vec!["unlessone", "-a"]);
41319625d8cSopenharmony_ci
41419625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
41519625d8cSopenharmony_ci}
41619625d8cSopenharmony_ci
41719625d8cSopenharmony_ci#[test]
41819625d8cSopenharmony_cifn required_unless_any_works_with_short_err() {
41919625d8cSopenharmony_ci    let res = Command::new("unlessone")
42019625d8cSopenharmony_ci        .arg(
42119625d8cSopenharmony_ci            Arg::new("a")
42219625d8cSopenharmony_ci                .conflicts_with("b")
42319625d8cSopenharmony_ci                .short('a')
42419625d8cSopenharmony_ci                .action(ArgAction::SetTrue),
42519625d8cSopenharmony_ci        )
42619625d8cSopenharmony_ci        .arg(Arg::new("b").short('b').action(ArgAction::SetTrue))
42719625d8cSopenharmony_ci        .arg(
42819625d8cSopenharmony_ci            Arg::new("x")
42919625d8cSopenharmony_ci                .short('x')
43019625d8cSopenharmony_ci                .action(ArgAction::SetTrue)
43119625d8cSopenharmony_ci                .required_unless_present_any(["a", "b"]),
43219625d8cSopenharmony_ci        )
43319625d8cSopenharmony_ci        .try_get_matches_from(vec!["unlessone"]);
43419625d8cSopenharmony_ci
43519625d8cSopenharmony_ci    assert!(res.is_err());
43619625d8cSopenharmony_ci}
43719625d8cSopenharmony_ci
43819625d8cSopenharmony_ci#[test]
43919625d8cSopenharmony_cifn required_unless_any_works_without() {
44019625d8cSopenharmony_ci    let res = Command::new("unlessone")
44119625d8cSopenharmony_ci        .arg(
44219625d8cSopenharmony_ci            Arg::new("a")
44319625d8cSopenharmony_ci                .conflicts_with("b")
44419625d8cSopenharmony_ci                .short('a')
44519625d8cSopenharmony_ci                .action(ArgAction::SetTrue),
44619625d8cSopenharmony_ci        )
44719625d8cSopenharmony_ci        .arg(Arg::new("b").short('b').action(ArgAction::SetTrue))
44819625d8cSopenharmony_ci        .arg(Arg::new("x").required_unless_present_any(["a", "b"]))
44919625d8cSopenharmony_ci        .try_get_matches_from(vec!["unlessone", "-a"]);
45019625d8cSopenharmony_ci
45119625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
45219625d8cSopenharmony_ci}
45319625d8cSopenharmony_ci
45419625d8cSopenharmony_ci#[test]
45519625d8cSopenharmony_cifn required_unless_any_works_with_long() {
45619625d8cSopenharmony_ci    let res = Command::new("unlessone")
45719625d8cSopenharmony_ci        .arg(
45819625d8cSopenharmony_ci            Arg::new("a")
45919625d8cSopenharmony_ci                .conflicts_with("b")
46019625d8cSopenharmony_ci                .short('a')
46119625d8cSopenharmony_ci                .action(ArgAction::SetTrue),
46219625d8cSopenharmony_ci        )
46319625d8cSopenharmony_ci        .arg(Arg::new("b").short('b').action(ArgAction::SetTrue))
46419625d8cSopenharmony_ci        .arg(
46519625d8cSopenharmony_ci            Arg::new("x")
46619625d8cSopenharmony_ci                .long("x_is_the_option")
46719625d8cSopenharmony_ci                .action(ArgAction::SetTrue)
46819625d8cSopenharmony_ci                .required_unless_present_any(["a", "b"]),
46919625d8cSopenharmony_ci        )
47019625d8cSopenharmony_ci        .try_get_matches_from(vec!["unlessone", "-a"]);
47119625d8cSopenharmony_ci
47219625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
47319625d8cSopenharmony_ci}
47419625d8cSopenharmony_ci
47519625d8cSopenharmony_ci#[test]
47619625d8cSopenharmony_cifn required_unless_any_1() {
47719625d8cSopenharmony_ci    let res = Command::new("unlessone")
47819625d8cSopenharmony_ci        .arg(
47919625d8cSopenharmony_ci            Arg::new("cfg")
48019625d8cSopenharmony_ci                .required_unless_present_any(["dbg", "infile"])
48119625d8cSopenharmony_ci                .action(ArgAction::Set)
48219625d8cSopenharmony_ci                .long("config"),
48319625d8cSopenharmony_ci        )
48419625d8cSopenharmony_ci        .arg(Arg::new("dbg").long("debug").action(ArgAction::SetTrue))
48519625d8cSopenharmony_ci        .arg(Arg::new("infile").short('i').action(ArgAction::Set))
48619625d8cSopenharmony_ci        .try_get_matches_from(vec!["unlessone", "--debug"]);
48719625d8cSopenharmony_ci
48819625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
48919625d8cSopenharmony_ci    let m = res.unwrap();
49019625d8cSopenharmony_ci    assert!(!m.contains_id("infile"));
49119625d8cSopenharmony_ci    assert!(!m.contains_id("cfg"));
49219625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("dbg").expect("defaulted by clap"));
49319625d8cSopenharmony_ci}
49419625d8cSopenharmony_ci
49519625d8cSopenharmony_ci#[test]
49619625d8cSopenharmony_cifn required_unless_any_err() {
49719625d8cSopenharmony_ci    let res = Command::new("unlessone")
49819625d8cSopenharmony_ci        .arg(
49919625d8cSopenharmony_ci            Arg::new("cfg")
50019625d8cSopenharmony_ci                .required_unless_present_any(["dbg", "infile"])
50119625d8cSopenharmony_ci                .action(ArgAction::Set)
50219625d8cSopenharmony_ci                .long("config"),
50319625d8cSopenharmony_ci        )
50419625d8cSopenharmony_ci        .arg(Arg::new("dbg").long("debug").action(ArgAction::SetTrue))
50519625d8cSopenharmony_ci        .arg(Arg::new("infile").short('i').action(ArgAction::Set))
50619625d8cSopenharmony_ci        .try_get_matches_from(vec!["unlessone"]);
50719625d8cSopenharmony_ci
50819625d8cSopenharmony_ci    assert!(res.is_err());
50919625d8cSopenharmony_ci    assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);
51019625d8cSopenharmony_ci}
51119625d8cSopenharmony_ci
51219625d8cSopenharmony_ci#[test]
51319625d8cSopenharmony_ci#[cfg(feature = "error-context")]
51419625d8cSopenharmony_cifn missing_required_output() {
51519625d8cSopenharmony_ci    static MISSING_REQ: &str = "\
51619625d8cSopenharmony_cierror: the following required arguments were not provided:
51719625d8cSopenharmony_ci  --long-option-2 <option2>
51819625d8cSopenharmony_ci  <positional>
51919625d8cSopenharmony_ci  <positional2>
52019625d8cSopenharmony_ci
52119625d8cSopenharmony_ciUsage: clap-test --long-option-2 <option2> -F <positional> <positional2> [positional3]...
52219625d8cSopenharmony_ci
52319625d8cSopenharmony_ciFor more information, try '--help'.
52419625d8cSopenharmony_ci";
52519625d8cSopenharmony_ci
52619625d8cSopenharmony_ci    utils::assert_output(utils::complex_app(), "clap-test -F", MISSING_REQ, true);
52719625d8cSopenharmony_ci}
52819625d8cSopenharmony_ci
52919625d8cSopenharmony_ci// Conditional external requirements
53019625d8cSopenharmony_ci
53119625d8cSopenharmony_ci#[test]
53219625d8cSopenharmony_cifn requires_if_present_val() {
53319625d8cSopenharmony_ci    let res = Command::new("unlessone")
53419625d8cSopenharmony_ci        .arg(
53519625d8cSopenharmony_ci            Arg::new("cfg")
53619625d8cSopenharmony_ci                .requires_if("my.cfg", "extra")
53719625d8cSopenharmony_ci                .action(ArgAction::Set)
53819625d8cSopenharmony_ci                .long("config"),
53919625d8cSopenharmony_ci        )
54019625d8cSopenharmony_ci        .arg(Arg::new("extra").long("extra").action(ArgAction::SetTrue))
54119625d8cSopenharmony_ci        .try_get_matches_from(vec!["unlessone", "--config=my.cfg"]);
54219625d8cSopenharmony_ci
54319625d8cSopenharmony_ci    assert!(res.is_err());
54419625d8cSopenharmony_ci    assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);
54519625d8cSopenharmony_ci}
54619625d8cSopenharmony_ci
54719625d8cSopenharmony_ci#[test]
54819625d8cSopenharmony_cifn requires_if_present_mult() {
54919625d8cSopenharmony_ci    let res = Command::new("unlessone")
55019625d8cSopenharmony_ci        .arg(
55119625d8cSopenharmony_ci            Arg::new("cfg")
55219625d8cSopenharmony_ci                .requires_ifs([("my.cfg", "extra"), ("other.cfg", "other")])
55319625d8cSopenharmony_ci                .action(ArgAction::Set)
55419625d8cSopenharmony_ci                .long("config"),
55519625d8cSopenharmony_ci        )
55619625d8cSopenharmony_ci        .arg(Arg::new("extra").long("extra").action(ArgAction::SetTrue))
55719625d8cSopenharmony_ci        .arg(Arg::new("other").long("other").action(ArgAction::SetTrue))
55819625d8cSopenharmony_ci        .try_get_matches_from(vec!["unlessone", "--config=other.cfg"]);
55919625d8cSopenharmony_ci
56019625d8cSopenharmony_ci    assert!(res.is_err());
56119625d8cSopenharmony_ci    assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);
56219625d8cSopenharmony_ci}
56319625d8cSopenharmony_ci
56419625d8cSopenharmony_ci#[test]
56519625d8cSopenharmony_cifn requires_if_present_mult_pass() {
56619625d8cSopenharmony_ci    let res = Command::new("unlessone")
56719625d8cSopenharmony_ci        .arg(
56819625d8cSopenharmony_ci            Arg::new("cfg")
56919625d8cSopenharmony_ci                .requires_ifs([("my.cfg", "extra"), ("other.cfg", "other")])
57019625d8cSopenharmony_ci                .action(ArgAction::Set)
57119625d8cSopenharmony_ci                .long("config"),
57219625d8cSopenharmony_ci        )
57319625d8cSopenharmony_ci        .arg(Arg::new("extra").long("extra").action(ArgAction::SetTrue))
57419625d8cSopenharmony_ci        .arg(Arg::new("other").long("other").action(ArgAction::SetTrue))
57519625d8cSopenharmony_ci        .try_get_matches_from(vec!["unlessone", "--config=some.cfg"]);
57619625d8cSopenharmony_ci
57719625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
57819625d8cSopenharmony_ci}
57919625d8cSopenharmony_ci
58019625d8cSopenharmony_ci#[test]
58119625d8cSopenharmony_cifn requires_if_present_val_no_present_pass() {
58219625d8cSopenharmony_ci    let res = Command::new("unlessone")
58319625d8cSopenharmony_ci        .arg(
58419625d8cSopenharmony_ci            Arg::new("cfg")
58519625d8cSopenharmony_ci                .requires_if("my.cfg", "extra")
58619625d8cSopenharmony_ci                .action(ArgAction::Set)
58719625d8cSopenharmony_ci                .long("config"),
58819625d8cSopenharmony_ci        )
58919625d8cSopenharmony_ci        .arg(Arg::new("extra").long("extra").action(ArgAction::SetTrue))
59019625d8cSopenharmony_ci        .try_get_matches_from(vec!["unlessone"]);
59119625d8cSopenharmony_ci
59219625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
59319625d8cSopenharmony_ci}
59419625d8cSopenharmony_ci
59519625d8cSopenharmony_ci// Conditionally required
59619625d8cSopenharmony_ci
59719625d8cSopenharmony_ci#[test]
59819625d8cSopenharmony_cifn required_if_val_present_pass() {
59919625d8cSopenharmony_ci    let res = Command::new("ri")
60019625d8cSopenharmony_ci        .arg(
60119625d8cSopenharmony_ci            Arg::new("cfg")
60219625d8cSopenharmony_ci                .required_if_eq("extra", "val")
60319625d8cSopenharmony_ci                .action(ArgAction::Set)
60419625d8cSopenharmony_ci                .long("config"),
60519625d8cSopenharmony_ci        )
60619625d8cSopenharmony_ci        .arg(Arg::new("extra").action(ArgAction::Set).long("extra"))
60719625d8cSopenharmony_ci        .try_get_matches_from(vec!["ri", "--extra", "val", "--config", "my.cfg"]);
60819625d8cSopenharmony_ci
60919625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
61019625d8cSopenharmony_ci}
61119625d8cSopenharmony_ci
61219625d8cSopenharmony_ci#[test]
61319625d8cSopenharmony_cifn required_if_val_present_fail() {
61419625d8cSopenharmony_ci    let res = Command::new("ri")
61519625d8cSopenharmony_ci        .arg(
61619625d8cSopenharmony_ci            Arg::new("cfg")
61719625d8cSopenharmony_ci                .required_if_eq("extra", "val")
61819625d8cSopenharmony_ci                .action(ArgAction::Set)
61919625d8cSopenharmony_ci                .long("config"),
62019625d8cSopenharmony_ci        )
62119625d8cSopenharmony_ci        .arg(Arg::new("extra").action(ArgAction::Set).long("extra"))
62219625d8cSopenharmony_ci        .try_get_matches_from(vec!["ri", "--extra", "val"]);
62319625d8cSopenharmony_ci
62419625d8cSopenharmony_ci    assert!(res.is_err());
62519625d8cSopenharmony_ci    assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);
62619625d8cSopenharmony_ci}
62719625d8cSopenharmony_ci
62819625d8cSopenharmony_ci#[test]
62919625d8cSopenharmony_cifn required_if_val_present_ignore_case_pass() {
63019625d8cSopenharmony_ci    let res = Command::new("ri")
63119625d8cSopenharmony_ci        .arg(
63219625d8cSopenharmony_ci            Arg::new("cfg")
63319625d8cSopenharmony_ci                .required_if_eq("extra", "Val")
63419625d8cSopenharmony_ci                .action(ArgAction::Set)
63519625d8cSopenharmony_ci                .long("config"),
63619625d8cSopenharmony_ci        )
63719625d8cSopenharmony_ci        .arg(
63819625d8cSopenharmony_ci            Arg::new("extra")
63919625d8cSopenharmony_ci                .action(ArgAction::Set)
64019625d8cSopenharmony_ci                .long("extra")
64119625d8cSopenharmony_ci                .ignore_case(true),
64219625d8cSopenharmony_ci        )
64319625d8cSopenharmony_ci        .try_get_matches_from(vec!["ri", "--extra", "vaL", "--config", "my.cfg"]);
64419625d8cSopenharmony_ci
64519625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
64619625d8cSopenharmony_ci}
64719625d8cSopenharmony_ci
64819625d8cSopenharmony_ci#[test]
64919625d8cSopenharmony_cifn required_if_val_present_ignore_case_fail() {
65019625d8cSopenharmony_ci    let res = Command::new("ri")
65119625d8cSopenharmony_ci        .arg(
65219625d8cSopenharmony_ci            Arg::new("cfg")
65319625d8cSopenharmony_ci                .required_if_eq("extra", "Val")
65419625d8cSopenharmony_ci                .action(ArgAction::Set)
65519625d8cSopenharmony_ci                .long("config"),
65619625d8cSopenharmony_ci        )
65719625d8cSopenharmony_ci        .arg(
65819625d8cSopenharmony_ci            Arg::new("extra")
65919625d8cSopenharmony_ci                .action(ArgAction::Set)
66019625d8cSopenharmony_ci                .long("extra")
66119625d8cSopenharmony_ci                .ignore_case(true),
66219625d8cSopenharmony_ci        )
66319625d8cSopenharmony_ci        .try_get_matches_from(vec!["ri", "--extra", "vaL"]);
66419625d8cSopenharmony_ci
66519625d8cSopenharmony_ci    assert!(res.is_err());
66619625d8cSopenharmony_ci    assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);
66719625d8cSopenharmony_ci}
66819625d8cSopenharmony_ci
66919625d8cSopenharmony_ci#[test]
67019625d8cSopenharmony_cifn required_if_all_values_present_pass() {
67119625d8cSopenharmony_ci    let res = Command::new("ri")
67219625d8cSopenharmony_ci        .arg(
67319625d8cSopenharmony_ci            Arg::new("cfg")
67419625d8cSopenharmony_ci                .required_if_eq_all([("extra", "val"), ("option", "spec")])
67519625d8cSopenharmony_ci                .action(ArgAction::Set)
67619625d8cSopenharmony_ci                .long("config"),
67719625d8cSopenharmony_ci        )
67819625d8cSopenharmony_ci        .arg(Arg::new("extra").action(ArgAction::Set).long("extra"))
67919625d8cSopenharmony_ci        .arg(Arg::new("option").action(ArgAction::Set).long("option"))
68019625d8cSopenharmony_ci        .try_get_matches_from(vec![
68119625d8cSopenharmony_ci            "ri", "--extra", "val", "--option", "spec", "--config", "my.cfg",
68219625d8cSopenharmony_ci        ]);
68319625d8cSopenharmony_ci
68419625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
68519625d8cSopenharmony_ci}
68619625d8cSopenharmony_ci
68719625d8cSopenharmony_ci#[test]
68819625d8cSopenharmony_cifn required_if_some_values_present_pass() {
68919625d8cSopenharmony_ci    let res = Command::new("ri")
69019625d8cSopenharmony_ci        .arg(
69119625d8cSopenharmony_ci            Arg::new("cfg")
69219625d8cSopenharmony_ci                .required_if_eq_all([("extra", "val"), ("option", "spec")])
69319625d8cSopenharmony_ci                .action(ArgAction::Set)
69419625d8cSopenharmony_ci                .long("config"),
69519625d8cSopenharmony_ci        )
69619625d8cSopenharmony_ci        .arg(Arg::new("extra").action(ArgAction::Set).long("extra"))
69719625d8cSopenharmony_ci        .arg(Arg::new("option").action(ArgAction::Set).long("option"))
69819625d8cSopenharmony_ci        .try_get_matches_from(vec!["ri", "--extra", "val"]);
69919625d8cSopenharmony_ci
70019625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
70119625d8cSopenharmony_ci}
70219625d8cSopenharmony_ci
70319625d8cSopenharmony_ci#[test]
70419625d8cSopenharmony_cifn required_if_all_values_present_fail() {
70519625d8cSopenharmony_ci    let res = Command::new("ri")
70619625d8cSopenharmony_ci        .arg(
70719625d8cSopenharmony_ci            Arg::new("cfg")
70819625d8cSopenharmony_ci                .required_if_eq_all([("extra", "val"), ("option", "spec")])
70919625d8cSopenharmony_ci                .action(ArgAction::Set)
71019625d8cSopenharmony_ci                .long("config"),
71119625d8cSopenharmony_ci        )
71219625d8cSopenharmony_ci        .arg(Arg::new("extra").action(ArgAction::Set).long("extra"))
71319625d8cSopenharmony_ci        .arg(Arg::new("option").action(ArgAction::Set).long("option"))
71419625d8cSopenharmony_ci        .try_get_matches_from(vec!["ri", "--extra", "val", "--option", "spec"]);
71519625d8cSopenharmony_ci
71619625d8cSopenharmony_ci    assert!(res.is_err());
71719625d8cSopenharmony_ci    assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);
71819625d8cSopenharmony_ci}
71919625d8cSopenharmony_ci
72019625d8cSopenharmony_ci#[test]
72119625d8cSopenharmony_cifn required_if_any_all_values_present_pass() {
72219625d8cSopenharmony_ci    let res = Command::new("ri")
72319625d8cSopenharmony_ci        .arg(
72419625d8cSopenharmony_ci            Arg::new("cfg")
72519625d8cSopenharmony_ci                .required_if_eq_all([("extra", "val"), ("option", "spec")])
72619625d8cSopenharmony_ci                .required_if_eq_any([("extra", "val2"), ("option", "spec2")])
72719625d8cSopenharmony_ci                .action(ArgAction::Set)
72819625d8cSopenharmony_ci                .long("config"),
72919625d8cSopenharmony_ci        )
73019625d8cSopenharmony_ci        .arg(Arg::new("extra").action(ArgAction::Set).long("extra"))
73119625d8cSopenharmony_ci        .arg(Arg::new("option").action(ArgAction::Set).long("option"))
73219625d8cSopenharmony_ci        .try_get_matches_from(vec![
73319625d8cSopenharmony_ci            "ri", "--extra", "val", "--option", "spec", "--config", "my.cfg",
73419625d8cSopenharmony_ci        ]);
73519625d8cSopenharmony_ci
73619625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
73719625d8cSopenharmony_ci}
73819625d8cSopenharmony_ci
73919625d8cSopenharmony_ci#[test]
74019625d8cSopenharmony_cifn required_if_any_all_values_present_fail() {
74119625d8cSopenharmony_ci    let res = Command::new("ri")
74219625d8cSopenharmony_ci        .arg(
74319625d8cSopenharmony_ci            Arg::new("cfg")
74419625d8cSopenharmony_ci                .required_if_eq_all([("extra", "val"), ("option", "spec")])
74519625d8cSopenharmony_ci                .required_if_eq_any([("extra", "val2"), ("option", "spec2")])
74619625d8cSopenharmony_ci                .action(ArgAction::Set)
74719625d8cSopenharmony_ci                .long("config"),
74819625d8cSopenharmony_ci        )
74919625d8cSopenharmony_ci        .arg(Arg::new("extra").action(ArgAction::Set).long("extra"))
75019625d8cSopenharmony_ci        .arg(Arg::new("option").action(ArgAction::Set).long("option"))
75119625d8cSopenharmony_ci        .try_get_matches_from(vec!["ri", "--extra", "val", "--option", "spec"]);
75219625d8cSopenharmony_ci
75319625d8cSopenharmony_ci    assert!(res.is_err());
75419625d8cSopenharmony_ci    assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);
75519625d8cSopenharmony_ci}
75619625d8cSopenharmony_ci
75719625d8cSopenharmony_ci#[test]
75819625d8cSopenharmony_ci#[cfg(feature = "error-context")]
75919625d8cSopenharmony_cifn list_correct_required_args() {
76019625d8cSopenharmony_ci    static COND_REQ_IN_USAGE: &str = "\
76119625d8cSopenharmony_cierror: the following required arguments were not provided:
76219625d8cSopenharmony_ci  --output <output>
76319625d8cSopenharmony_ci
76419625d8cSopenharmony_ciUsage: test --target <target> --input <input> --output <output>
76519625d8cSopenharmony_ci
76619625d8cSopenharmony_ciFor more information, try '--help'.
76719625d8cSopenharmony_ci";
76819625d8cSopenharmony_ci
76919625d8cSopenharmony_ci    let cmd = Command::new("Test cmd")
77019625d8cSopenharmony_ci        .version("1.0")
77119625d8cSopenharmony_ci        .author("F0x06")
77219625d8cSopenharmony_ci        .about("Arg test")
77319625d8cSopenharmony_ci        .arg(
77419625d8cSopenharmony_ci            Arg::new("target")
77519625d8cSopenharmony_ci                .action(ArgAction::Set)
77619625d8cSopenharmony_ci                .required(true)
77719625d8cSopenharmony_ci                .value_parser(["file", "stdout"])
77819625d8cSopenharmony_ci                .long("target"),
77919625d8cSopenharmony_ci        )
78019625d8cSopenharmony_ci        .arg(
78119625d8cSopenharmony_ci            Arg::new("input")
78219625d8cSopenharmony_ci                .action(ArgAction::Set)
78319625d8cSopenharmony_ci                .required(true)
78419625d8cSopenharmony_ci                .long("input"),
78519625d8cSopenharmony_ci        )
78619625d8cSopenharmony_ci        .arg(
78719625d8cSopenharmony_ci            Arg::new("output")
78819625d8cSopenharmony_ci                .action(ArgAction::Set)
78919625d8cSopenharmony_ci                .required(true)
79019625d8cSopenharmony_ci                .long("output"),
79119625d8cSopenharmony_ci        );
79219625d8cSopenharmony_ci
79319625d8cSopenharmony_ci    utils::assert_output(
79419625d8cSopenharmony_ci        cmd,
79519625d8cSopenharmony_ci        "test --input somepath --target file",
79619625d8cSopenharmony_ci        COND_REQ_IN_USAGE,
79719625d8cSopenharmony_ci        true,
79819625d8cSopenharmony_ci    );
79919625d8cSopenharmony_ci}
80019625d8cSopenharmony_ci
80119625d8cSopenharmony_ci#[test]
80219625d8cSopenharmony_ci#[cfg(feature = "error-context")]
80319625d8cSopenharmony_cifn required_if_val_present_fail_error_output() {
80419625d8cSopenharmony_ci    static COND_REQ_IN_USAGE: &str = "\
80519625d8cSopenharmony_cierror: the following required arguments were not provided:
80619625d8cSopenharmony_ci  --output <output>
80719625d8cSopenharmony_ci
80819625d8cSopenharmony_ciUsage: test --target <target> --input <input> --output <output>
80919625d8cSopenharmony_ci
81019625d8cSopenharmony_ciFor more information, try '--help'.
81119625d8cSopenharmony_ci";
81219625d8cSopenharmony_ci
81319625d8cSopenharmony_ci    let cmd = Command::new("Test cmd")
81419625d8cSopenharmony_ci        .version("1.0")
81519625d8cSopenharmony_ci        .author("F0x06")
81619625d8cSopenharmony_ci        .about("Arg test")
81719625d8cSopenharmony_ci        .arg(
81819625d8cSopenharmony_ci            Arg::new("target")
81919625d8cSopenharmony_ci                .action(ArgAction::Set)
82019625d8cSopenharmony_ci                .required(true)
82119625d8cSopenharmony_ci                .value_parser(["file", "stdout"])
82219625d8cSopenharmony_ci                .long("target"),
82319625d8cSopenharmony_ci        )
82419625d8cSopenharmony_ci        .arg(
82519625d8cSopenharmony_ci            Arg::new("input")
82619625d8cSopenharmony_ci                .action(ArgAction::Set)
82719625d8cSopenharmony_ci                .required(true)
82819625d8cSopenharmony_ci                .long("input"),
82919625d8cSopenharmony_ci        )
83019625d8cSopenharmony_ci        .arg(
83119625d8cSopenharmony_ci            Arg::new("output")
83219625d8cSopenharmony_ci                .action(ArgAction::Set)
83319625d8cSopenharmony_ci                .required_if_eq("target", "file")
83419625d8cSopenharmony_ci                .long("output"),
83519625d8cSopenharmony_ci        );
83619625d8cSopenharmony_ci
83719625d8cSopenharmony_ci    utils::assert_output(
83819625d8cSopenharmony_ci        cmd,
83919625d8cSopenharmony_ci        "test --input somepath --target file",
84019625d8cSopenharmony_ci        COND_REQ_IN_USAGE,
84119625d8cSopenharmony_ci        true,
84219625d8cSopenharmony_ci    );
84319625d8cSopenharmony_ci}
84419625d8cSopenharmony_ci
84519625d8cSopenharmony_ci#[test]
84619625d8cSopenharmony_cifn required_if_wrong_val() {
84719625d8cSopenharmony_ci    let res = Command::new("ri")
84819625d8cSopenharmony_ci        .arg(
84919625d8cSopenharmony_ci            Arg::new("cfg")
85019625d8cSopenharmony_ci                .required_if_eq("extra", "val")
85119625d8cSopenharmony_ci                .action(ArgAction::Set)
85219625d8cSopenharmony_ci                .long("config"),
85319625d8cSopenharmony_ci        )
85419625d8cSopenharmony_ci        .arg(Arg::new("extra").action(ArgAction::Set).long("extra"))
85519625d8cSopenharmony_ci        .try_get_matches_from(vec!["ri", "--extra", "other"]);
85619625d8cSopenharmony_ci
85719625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
85819625d8cSopenharmony_ci}
85919625d8cSopenharmony_ci
86019625d8cSopenharmony_ci#[test]
86119625d8cSopenharmony_cifn required_ifs_val_present_pass() {
86219625d8cSopenharmony_ci    let res = Command::new("ri")
86319625d8cSopenharmony_ci        .arg(
86419625d8cSopenharmony_ci            Arg::new("cfg")
86519625d8cSopenharmony_ci                .required_if_eq_any([("extra", "val"), ("option", "spec")])
86619625d8cSopenharmony_ci                .action(ArgAction::Set)
86719625d8cSopenharmony_ci                .long("config"),
86819625d8cSopenharmony_ci        )
86919625d8cSopenharmony_ci        .arg(Arg::new("option").action(ArgAction::Set).long("option"))
87019625d8cSopenharmony_ci        .arg(Arg::new("extra").action(ArgAction::Set).long("extra"))
87119625d8cSopenharmony_ci        .try_get_matches_from(vec!["ri", "--option", "spec", "--config", "my.cfg"]);
87219625d8cSopenharmony_ci
87319625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
87419625d8cSopenharmony_ci}
87519625d8cSopenharmony_ci
87619625d8cSopenharmony_ci#[test]
87719625d8cSopenharmony_cifn required_ifs_val_present_fail() {
87819625d8cSopenharmony_ci    let res = Command::new("ri")
87919625d8cSopenharmony_ci        .arg(
88019625d8cSopenharmony_ci            Arg::new("cfg")
88119625d8cSopenharmony_ci                .required_if_eq_any([("extra", "val"), ("option", "spec")])
88219625d8cSopenharmony_ci                .action(ArgAction::Set)
88319625d8cSopenharmony_ci                .long("config"),
88419625d8cSopenharmony_ci        )
88519625d8cSopenharmony_ci        .arg(Arg::new("extra").action(ArgAction::Set).long("extra"))
88619625d8cSopenharmony_ci        .arg(Arg::new("option").action(ArgAction::Set).long("option"))
88719625d8cSopenharmony_ci        .try_get_matches_from(vec!["ri", "--option", "spec"]);
88819625d8cSopenharmony_ci
88919625d8cSopenharmony_ci    assert!(res.is_err());
89019625d8cSopenharmony_ci    assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);
89119625d8cSopenharmony_ci}
89219625d8cSopenharmony_ci
89319625d8cSopenharmony_ci#[test]
89419625d8cSopenharmony_cifn required_ifs_wrong_val() {
89519625d8cSopenharmony_ci    let res = Command::new("ri")
89619625d8cSopenharmony_ci        .arg(
89719625d8cSopenharmony_ci            Arg::new("cfg")
89819625d8cSopenharmony_ci                .required_if_eq_any([("extra", "val"), ("option", "spec")])
89919625d8cSopenharmony_ci                .action(ArgAction::Set)
90019625d8cSopenharmony_ci                .long("config"),
90119625d8cSopenharmony_ci        )
90219625d8cSopenharmony_ci        .arg(Arg::new("extra").action(ArgAction::Set).long("extra"))
90319625d8cSopenharmony_ci        .arg(Arg::new("option").action(ArgAction::Set).long("option"))
90419625d8cSopenharmony_ci        .try_get_matches_from(vec!["ri", "--option", "other"]);
90519625d8cSopenharmony_ci
90619625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
90719625d8cSopenharmony_ci}
90819625d8cSopenharmony_ci
90919625d8cSopenharmony_ci#[test]
91019625d8cSopenharmony_cifn required_ifs_wrong_val_mult_fail() {
91119625d8cSopenharmony_ci    let res = Command::new("ri")
91219625d8cSopenharmony_ci        .arg(
91319625d8cSopenharmony_ci            Arg::new("cfg")
91419625d8cSopenharmony_ci                .required_if_eq_any([("extra", "val"), ("option", "spec")])
91519625d8cSopenharmony_ci                .action(ArgAction::Set)
91619625d8cSopenharmony_ci                .long("config"),
91719625d8cSopenharmony_ci        )
91819625d8cSopenharmony_ci        .arg(Arg::new("extra").action(ArgAction::Set).long("extra"))
91919625d8cSopenharmony_ci        .arg(Arg::new("option").action(ArgAction::Set).long("option"))
92019625d8cSopenharmony_ci        .try_get_matches_from(vec!["ri", "--extra", "other", "--option", "spec"]);
92119625d8cSopenharmony_ci
92219625d8cSopenharmony_ci    assert!(res.is_err());
92319625d8cSopenharmony_ci    assert_eq!(res.unwrap_err().kind(), ErrorKind::MissingRequiredArgument);
92419625d8cSopenharmony_ci}
92519625d8cSopenharmony_ci
92619625d8cSopenharmony_ci#[test]
92719625d8cSopenharmony_ci#[cfg(feature = "error-context")]
92819625d8cSopenharmony_cifn require_eq() {
92919625d8cSopenharmony_ci    static REQUIRE_EQUALS: &str = "\
93019625d8cSopenharmony_cierror: the following required arguments were not provided:
93119625d8cSopenharmony_ci  --opt=<FILE>
93219625d8cSopenharmony_ci
93319625d8cSopenharmony_ciUsage: clap-test --opt=<FILE>
93419625d8cSopenharmony_ci
93519625d8cSopenharmony_ciFor more information, try '--help'.
93619625d8cSopenharmony_ci";
93719625d8cSopenharmony_ci
93819625d8cSopenharmony_ci    let cmd = Command::new("clap-test").version("v1.4.8").arg(
93919625d8cSopenharmony_ci        Arg::new("opt")
94019625d8cSopenharmony_ci            .long("opt")
94119625d8cSopenharmony_ci            .short('o')
94219625d8cSopenharmony_ci            .required(true)
94319625d8cSopenharmony_ci            .require_equals(true)
94419625d8cSopenharmony_ci            .value_name("FILE")
94519625d8cSopenharmony_ci            .help("some"),
94619625d8cSopenharmony_ci    );
94719625d8cSopenharmony_ci    utils::assert_output(cmd, "clap-test", REQUIRE_EQUALS, true);
94819625d8cSopenharmony_ci}
94919625d8cSopenharmony_ci
95019625d8cSopenharmony_ci#[test]
95119625d8cSopenharmony_ci#[cfg(feature = "error-context")]
95219625d8cSopenharmony_cifn require_eq_filtered() {
95319625d8cSopenharmony_ci    static REQUIRE_EQUALS_FILTERED: &str = "\
95419625d8cSopenharmony_cierror: the following required arguments were not provided:
95519625d8cSopenharmony_ci  --opt=<FILE>
95619625d8cSopenharmony_ci
95719625d8cSopenharmony_ciUsage: clap-test --opt=<FILE> --foo=<FILE>
95819625d8cSopenharmony_ci
95919625d8cSopenharmony_ciFor more information, try '--help'.
96019625d8cSopenharmony_ci";
96119625d8cSopenharmony_ci
96219625d8cSopenharmony_ci    let cmd = Command::new("clap-test")
96319625d8cSopenharmony_ci        .version("v1.4.8")
96419625d8cSopenharmony_ci        .arg(
96519625d8cSopenharmony_ci            Arg::new("opt")
96619625d8cSopenharmony_ci                .long("opt")
96719625d8cSopenharmony_ci                .short('o')
96819625d8cSopenharmony_ci                .required(true)
96919625d8cSopenharmony_ci                .require_equals(true)
97019625d8cSopenharmony_ci                .value_name("FILE")
97119625d8cSopenharmony_ci                .help("some"),
97219625d8cSopenharmony_ci        )
97319625d8cSopenharmony_ci        .arg(
97419625d8cSopenharmony_ci            Arg::new("foo")
97519625d8cSopenharmony_ci                .long("foo")
97619625d8cSopenharmony_ci                .short('f')
97719625d8cSopenharmony_ci                .required(true)
97819625d8cSopenharmony_ci                .require_equals(true)
97919625d8cSopenharmony_ci                .value_name("FILE")
98019625d8cSopenharmony_ci                .help("some other arg"),
98119625d8cSopenharmony_ci        );
98219625d8cSopenharmony_ci    utils::assert_output(cmd, "clap-test -f=blah", REQUIRE_EQUALS_FILTERED, true);
98319625d8cSopenharmony_ci}
98419625d8cSopenharmony_ci
98519625d8cSopenharmony_ci#[test]
98619625d8cSopenharmony_ci#[cfg(feature = "error-context")]
98719625d8cSopenharmony_cifn require_eq_filtered_group() {
98819625d8cSopenharmony_ci    static REQUIRE_EQUALS_FILTERED_GROUP: &str = "\
98919625d8cSopenharmony_cierror: the following required arguments were not provided:
99019625d8cSopenharmony_ci  --opt=<FILE>
99119625d8cSopenharmony_ci
99219625d8cSopenharmony_ciUsage: clap-test --opt=<FILE> --foo=<FILE> <--g1=<FILE>|--g2=<FILE>>
99319625d8cSopenharmony_ci
99419625d8cSopenharmony_ciFor more information, try '--help'.
99519625d8cSopenharmony_ci";
99619625d8cSopenharmony_ci
99719625d8cSopenharmony_ci    let cmd = Command::new("clap-test")
99819625d8cSopenharmony_ci        .version("v1.4.8")
99919625d8cSopenharmony_ci        .arg(
100019625d8cSopenharmony_ci            Arg::new("opt")
100119625d8cSopenharmony_ci                .long("opt")
100219625d8cSopenharmony_ci                .short('o')
100319625d8cSopenharmony_ci                .required(true)
100419625d8cSopenharmony_ci                .require_equals(true)
100519625d8cSopenharmony_ci                .value_name("FILE")
100619625d8cSopenharmony_ci                .help("some"),
100719625d8cSopenharmony_ci        )
100819625d8cSopenharmony_ci        .arg(
100919625d8cSopenharmony_ci            Arg::new("foo")
101019625d8cSopenharmony_ci                .long("foo")
101119625d8cSopenharmony_ci                .short('f')
101219625d8cSopenharmony_ci                .required(true)
101319625d8cSopenharmony_ci                .require_equals(true)
101419625d8cSopenharmony_ci                .value_name("FILE")
101519625d8cSopenharmony_ci                .help("some other arg"),
101619625d8cSopenharmony_ci        )
101719625d8cSopenharmony_ci        .arg(
101819625d8cSopenharmony_ci            Arg::new("g1")
101919625d8cSopenharmony_ci                .long("g1")
102019625d8cSopenharmony_ci                .require_equals(true)
102119625d8cSopenharmony_ci                .value_name("FILE"),
102219625d8cSopenharmony_ci        )
102319625d8cSopenharmony_ci        .arg(
102419625d8cSopenharmony_ci            Arg::new("g2")
102519625d8cSopenharmony_ci                .long("g2")
102619625d8cSopenharmony_ci                .require_equals(true)
102719625d8cSopenharmony_ci                .value_name("FILE"),
102819625d8cSopenharmony_ci        )
102919625d8cSopenharmony_ci        .group(
103019625d8cSopenharmony_ci            ArgGroup::new("test_group")
103119625d8cSopenharmony_ci                .args(["g1", "g2"])
103219625d8cSopenharmony_ci                .required(true),
103319625d8cSopenharmony_ci        );
103419625d8cSopenharmony_ci    utils::assert_output(
103519625d8cSopenharmony_ci        cmd,
103619625d8cSopenharmony_ci        "clap-test -f=blah --g1=blah",
103719625d8cSopenharmony_ci        REQUIRE_EQUALS_FILTERED_GROUP,
103819625d8cSopenharmony_ci        true,
103919625d8cSopenharmony_ci    );
104019625d8cSopenharmony_ci}
104119625d8cSopenharmony_ci
104219625d8cSopenharmony_cifn issue_1158_app() -> Command {
104319625d8cSopenharmony_ci    Command::new("example")
104419625d8cSopenharmony_ci        .arg(
104519625d8cSopenharmony_ci            arg!(-c --config <FILE> "Custom config file.")
104619625d8cSopenharmony_ci                .required_unless_present("ID")
104719625d8cSopenharmony_ci                .conflicts_with("ID"),
104819625d8cSopenharmony_ci        )
104919625d8cSopenharmony_ci        .arg(
105019625d8cSopenharmony_ci            arg!([ID] "ID")
105119625d8cSopenharmony_ci                .required_unless_present("config")
105219625d8cSopenharmony_ci                .conflicts_with("config")
105319625d8cSopenharmony_ci                .requires_ifs([
105419625d8cSopenharmony_ci                    (ArgPredicate::IsPresent, "x"),
105519625d8cSopenharmony_ci                    (ArgPredicate::IsPresent, "y"),
105619625d8cSopenharmony_ci                    (ArgPredicate::IsPresent, "z"),
105719625d8cSopenharmony_ci                ]),
105819625d8cSopenharmony_ci        )
105919625d8cSopenharmony_ci        .arg(arg!(x: -x <X> "X"))
106019625d8cSopenharmony_ci        .arg(arg!(y: -y <Y> "Y"))
106119625d8cSopenharmony_ci        .arg(arg!(z: -z <Z> "Z"))
106219625d8cSopenharmony_ci}
106319625d8cSopenharmony_ci
106419625d8cSopenharmony_ci#[test]
106519625d8cSopenharmony_ci#[cfg(feature = "error-context")]
106619625d8cSopenharmony_cifn multiple_required_unless_usage_printing() {
106719625d8cSopenharmony_ci    static MULTIPLE_REQUIRED_UNLESS_USAGE: &str = "\
106819625d8cSopenharmony_cierror: the following required arguments were not provided:
106919625d8cSopenharmony_ci  --a <a>
107019625d8cSopenharmony_ci  --b <b>
107119625d8cSopenharmony_ci
107219625d8cSopenharmony_ciUsage: test --c <c> --a <a> --b <b>
107319625d8cSopenharmony_ci
107419625d8cSopenharmony_ciFor more information, try '--help'.
107519625d8cSopenharmony_ci";
107619625d8cSopenharmony_ci    let cmd = Command::new("test")
107719625d8cSopenharmony_ci        .arg(
107819625d8cSopenharmony_ci            Arg::new("a")
107919625d8cSopenharmony_ci                .long("a")
108019625d8cSopenharmony_ci                .action(ArgAction::Set)
108119625d8cSopenharmony_ci                .required_unless_present("b")
108219625d8cSopenharmony_ci                .conflicts_with("b"),
108319625d8cSopenharmony_ci        )
108419625d8cSopenharmony_ci        .arg(
108519625d8cSopenharmony_ci            Arg::new("b")
108619625d8cSopenharmony_ci                .long("b")
108719625d8cSopenharmony_ci                .action(ArgAction::Set)
108819625d8cSopenharmony_ci                .required_unless_present("a")
108919625d8cSopenharmony_ci                .conflicts_with("a"),
109019625d8cSopenharmony_ci        )
109119625d8cSopenharmony_ci        .arg(
109219625d8cSopenharmony_ci            Arg::new("c")
109319625d8cSopenharmony_ci                .long("c")
109419625d8cSopenharmony_ci                .action(ArgAction::Set)
109519625d8cSopenharmony_ci                .required_unless_present("d")
109619625d8cSopenharmony_ci                .conflicts_with("d"),
109719625d8cSopenharmony_ci        )
109819625d8cSopenharmony_ci        .arg(
109919625d8cSopenharmony_ci            Arg::new("d")
110019625d8cSopenharmony_ci                .long("d")
110119625d8cSopenharmony_ci                .action(ArgAction::Set)
110219625d8cSopenharmony_ci                .required_unless_present("c")
110319625d8cSopenharmony_ci                .conflicts_with("c"),
110419625d8cSopenharmony_ci        );
110519625d8cSopenharmony_ci    utils::assert_output(cmd, "test --c asd", MULTIPLE_REQUIRED_UNLESS_USAGE, true);
110619625d8cSopenharmony_ci}
110719625d8cSopenharmony_ci
110819625d8cSopenharmony_ci#[test]
110919625d8cSopenharmony_ci#[cfg(feature = "error-context")]
111019625d8cSopenharmony_cifn issue_1158_conflicting_requirements() {
111119625d8cSopenharmony_ci    static ISSUE_1158: &str = "\
111219625d8cSopenharmony_cierror: the following required arguments were not provided:
111319625d8cSopenharmony_ci  -x <X>
111419625d8cSopenharmony_ci  -y <Y>
111519625d8cSopenharmony_ci  -z <Z>
111619625d8cSopenharmony_ci
111719625d8cSopenharmony_ciUsage: example -x <X> -y <Y> -z <Z> <ID>
111819625d8cSopenharmony_ci
111919625d8cSopenharmony_ciFor more information, try '--help'.
112019625d8cSopenharmony_ci";
112119625d8cSopenharmony_ci
112219625d8cSopenharmony_ci    let cmd = issue_1158_app();
112319625d8cSopenharmony_ci
112419625d8cSopenharmony_ci    utils::assert_output(cmd, "example id", ISSUE_1158, true);
112519625d8cSopenharmony_ci}
112619625d8cSopenharmony_ci
112719625d8cSopenharmony_ci#[test]
112819625d8cSopenharmony_cifn issue_1158_conflicting_requirements_rev() {
112919625d8cSopenharmony_ci    let res = issue_1158_app().try_get_matches_from(["", "--config", "some.conf"]);
113019625d8cSopenharmony_ci
113119625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
113219625d8cSopenharmony_ci}
113319625d8cSopenharmony_ci
113419625d8cSopenharmony_ci#[test]
113519625d8cSopenharmony_cifn issue_1643_args_mutually_require_each_other() {
113619625d8cSopenharmony_ci    use clap::*;
113719625d8cSopenharmony_ci
113819625d8cSopenharmony_ci    let cmd = Command::new("test")
113919625d8cSopenharmony_ci        .arg(
114019625d8cSopenharmony_ci            Arg::new("relation_id")
114119625d8cSopenharmony_ci                .help("The relation id to get the data from")
114219625d8cSopenharmony_ci                .long("relation-id")
114319625d8cSopenharmony_ci                .short('r')
114419625d8cSopenharmony_ci                .action(ArgAction::Set)
114519625d8cSopenharmony_ci                .requires("remote_unit_name"),
114619625d8cSopenharmony_ci        )
114719625d8cSopenharmony_ci        .arg(
114819625d8cSopenharmony_ci            Arg::new("remote_unit_name")
114919625d8cSopenharmony_ci                .help("The name of the remote unit to get data from")
115019625d8cSopenharmony_ci                .long("remote-unit")
115119625d8cSopenharmony_ci                .short('u')
115219625d8cSopenharmony_ci                .action(ArgAction::Set)
115319625d8cSopenharmony_ci                .requires("relation_id"),
115419625d8cSopenharmony_ci        );
115519625d8cSopenharmony_ci
115619625d8cSopenharmony_ci    cmd.try_get_matches_from(["test", "-u", "hello", "-r", "farewell"])
115719625d8cSopenharmony_ci        .unwrap();
115819625d8cSopenharmony_ci}
115919625d8cSopenharmony_ci
116019625d8cSopenharmony_ci#[test]
116119625d8cSopenharmony_cifn short_flag_require_equals_with_minvals_zero() {
116219625d8cSopenharmony_ci    let m = Command::new("foo")
116319625d8cSopenharmony_ci        .arg(
116419625d8cSopenharmony_ci            Arg::new("check")
116519625d8cSopenharmony_ci                .short('c')
116619625d8cSopenharmony_ci                .num_args(0..)
116719625d8cSopenharmony_ci                .require_equals(true),
116819625d8cSopenharmony_ci        )
116919625d8cSopenharmony_ci        .arg(Arg::new("unique").short('u').action(ArgAction::SetTrue))
117019625d8cSopenharmony_ci        .try_get_matches_from(["foo", "-cu"])
117119625d8cSopenharmony_ci        .unwrap();
117219625d8cSopenharmony_ci    assert!(m.contains_id("check"));
117319625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("unique").expect("defaulted by clap"));
117419625d8cSopenharmony_ci}
117519625d8cSopenharmony_ci
117619625d8cSopenharmony_ci#[test]
117719625d8cSopenharmony_cifn issue_2624() {
117819625d8cSopenharmony_ci    let matches = Command::new("foo")
117919625d8cSopenharmony_ci        .arg(
118019625d8cSopenharmony_ci            Arg::new("check")
118119625d8cSopenharmony_ci                .short('c')
118219625d8cSopenharmony_ci                .long("check")
118319625d8cSopenharmony_ci                .require_equals(true)
118419625d8cSopenharmony_ci                .num_args(0..)
118519625d8cSopenharmony_ci                .value_parser(["silent", "quiet", "diagnose-first"]),
118619625d8cSopenharmony_ci        )
118719625d8cSopenharmony_ci        .arg(
118819625d8cSopenharmony_ci            Arg::new("unique")
118919625d8cSopenharmony_ci                .short('u')
119019625d8cSopenharmony_ci                .long("unique")
119119625d8cSopenharmony_ci                .action(ArgAction::SetTrue),
119219625d8cSopenharmony_ci        )
119319625d8cSopenharmony_ci        .try_get_matches_from(["foo", "-cu"])
119419625d8cSopenharmony_ci        .unwrap();
119519625d8cSopenharmony_ci    assert!(matches.contains_id("check"));
119619625d8cSopenharmony_ci    assert!(*matches
119719625d8cSopenharmony_ci        .get_one::<bool>("unique")
119819625d8cSopenharmony_ci        .expect("defaulted by clap"));
119919625d8cSopenharmony_ci}
120019625d8cSopenharmony_ci
120119625d8cSopenharmony_ci#[test]
120219625d8cSopenharmony_cifn required_unless_all_with_any() {
120319625d8cSopenharmony_ci    let cmd = Command::new("prog")
120419625d8cSopenharmony_ci        .arg(Arg::new("foo").long("foo").action(ArgAction::SetTrue))
120519625d8cSopenharmony_ci        .arg(Arg::new("bar").long("bar").action(ArgAction::SetTrue))
120619625d8cSopenharmony_ci        .arg(Arg::new("baz").long("baz").action(ArgAction::SetTrue))
120719625d8cSopenharmony_ci        .arg(
120819625d8cSopenharmony_ci            Arg::new("flag")
120919625d8cSopenharmony_ci                .long("flag")
121019625d8cSopenharmony_ci                .action(ArgAction::SetTrue)
121119625d8cSopenharmony_ci                .required_unless_present_any(["foo"])
121219625d8cSopenharmony_ci                .required_unless_present_all(["bar", "baz"]),
121319625d8cSopenharmony_ci        );
121419625d8cSopenharmony_ci
121519625d8cSopenharmony_ci    let result = cmd.clone().try_get_matches_from(vec!["myprog"]);
121619625d8cSopenharmony_ci    assert!(result.is_err(), "{:?}", result.unwrap());
121719625d8cSopenharmony_ci
121819625d8cSopenharmony_ci    let result = cmd.clone().try_get_matches_from(vec!["myprog", "--foo"]);
121919625d8cSopenharmony_ci    assert!(result.is_ok(), "{:?}", result.unwrap_err());
122019625d8cSopenharmony_ci    let matches = result.unwrap();
122119625d8cSopenharmony_ci    assert!(!*matches.get_one::<bool>("flag").expect("defaulted by clap"));
122219625d8cSopenharmony_ci
122319625d8cSopenharmony_ci    let result = cmd
122419625d8cSopenharmony_ci        .clone()
122519625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog", "--bar", "--baz"]);
122619625d8cSopenharmony_ci    assert!(result.is_ok(), "{:?}", result.unwrap_err());
122719625d8cSopenharmony_ci    let matches = result.unwrap();
122819625d8cSopenharmony_ci    assert!(!*matches.get_one::<bool>("flag").expect("defaulted by clap"));
122919625d8cSopenharmony_ci
123019625d8cSopenharmony_ci    let result = cmd.try_get_matches_from(vec!["myprog", "--bar"]);
123119625d8cSopenharmony_ci    assert!(result.is_err(), "{:?}", result.unwrap());
123219625d8cSopenharmony_ci}
123319625d8cSopenharmony_ci
123419625d8cSopenharmony_ci#[cfg(debug_assertions)]
123519625d8cSopenharmony_ci#[test]
123619625d8cSopenharmony_ci#[should_panic = "Command prog: Argument or group 'extra' specified in 'requires*' for 'config' does not exist"]
123719625d8cSopenharmony_cifn requires_invalid_arg() {
123819625d8cSopenharmony_ci    let _ = Command::new("prog")
123919625d8cSopenharmony_ci        .arg(Arg::new("config").requires("extra").long("config"))
124019625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--config"]);
124119625d8cSopenharmony_ci}
124219625d8cSopenharmony_ci
124319625d8cSopenharmony_ci#[cfg(debug_assertions)]
124419625d8cSopenharmony_ci#[test]
124519625d8cSopenharmony_ci#[should_panic = "Command prog: Argument or group 'extra' specified in 'requires*' for 'config' does not exist"]
124619625d8cSopenharmony_cifn requires_if_invalid_arg() {
124719625d8cSopenharmony_ci    let _ = Command::new("prog")
124819625d8cSopenharmony_ci        .arg(
124919625d8cSopenharmony_ci            Arg::new("config")
125019625d8cSopenharmony_ci                .requires_if("val", "extra")
125119625d8cSopenharmony_ci                .long("config"),
125219625d8cSopenharmony_ci        )
125319625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--config"]);
125419625d8cSopenharmony_ci}
125519625d8cSopenharmony_ci
125619625d8cSopenharmony_ci#[cfg(debug_assertions)]
125719625d8cSopenharmony_ci#[test]
125819625d8cSopenharmony_ci#[should_panic = "Command prog: Argument or group 'extra' specified in 'required_if_eq*' for 'config' does not exist"]
125919625d8cSopenharmony_cifn required_if_invalid_arg() {
126019625d8cSopenharmony_ci    let _ = Command::new("prog")
126119625d8cSopenharmony_ci        .arg(
126219625d8cSopenharmony_ci            Arg::new("config")
126319625d8cSopenharmony_ci                .required_if_eq("extra", "val")
126419625d8cSopenharmony_ci                .long("config"),
126519625d8cSopenharmony_ci        )
126619625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--config"]);
126719625d8cSopenharmony_ci}
126819625d8cSopenharmony_ci
126919625d8cSopenharmony_ci#[cfg(debug_assertions)]
127019625d8cSopenharmony_ci#[test]
127119625d8cSopenharmony_ci#[should_panic = "Command prog: Argument or group 'extra' specified in 'required_unless*' for 'config' does not exist"]
127219625d8cSopenharmony_cifn required_unless_invalid_arg() {
127319625d8cSopenharmony_ci    let _ = Command::new("prog")
127419625d8cSopenharmony_ci        .arg(
127519625d8cSopenharmony_ci            Arg::new("config")
127619625d8cSopenharmony_ci                .required_unless_present("extra")
127719625d8cSopenharmony_ci                .long("config"),
127819625d8cSopenharmony_ci        )
127919625d8cSopenharmony_ci        .try_get_matches_from(vec![""]);
128019625d8cSopenharmony_ci}
128119625d8cSopenharmony_ci
128219625d8cSopenharmony_ci#[test]
128319625d8cSopenharmony_cifn requires_with_default_value() {
128419625d8cSopenharmony_ci    let result = Command::new("prog")
128519625d8cSopenharmony_ci        .arg(
128619625d8cSopenharmony_ci            Arg::new("opt")
128719625d8cSopenharmony_ci                .long("opt")
128819625d8cSopenharmony_ci                .default_value("default")
128919625d8cSopenharmony_ci                .requires("flag"),
129019625d8cSopenharmony_ci        )
129119625d8cSopenharmony_ci        .arg(Arg::new("flag").long("flag").action(ArgAction::SetTrue))
129219625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog"]);
129319625d8cSopenharmony_ci
129419625d8cSopenharmony_ci    assert!(
129519625d8cSopenharmony_ci        result.is_ok(),
129619625d8cSopenharmony_ci        "requires should ignore default_value: {:?}",
129719625d8cSopenharmony_ci        result.unwrap_err()
129819625d8cSopenharmony_ci    );
129919625d8cSopenharmony_ci    let m = result.unwrap();
130019625d8cSopenharmony_ci
130119625d8cSopenharmony_ci    assert_eq!(
130219625d8cSopenharmony_ci        m.get_one::<String>("opt").map(|v| v.as_str()),
130319625d8cSopenharmony_ci        Some("default")
130419625d8cSopenharmony_ci    );
130519625d8cSopenharmony_ci    assert!(!*m.get_one::<bool>("flag").expect("defaulted by clap"));
130619625d8cSopenharmony_ci}
130719625d8cSopenharmony_ci
130819625d8cSopenharmony_ci#[test]
130919625d8cSopenharmony_cifn requires_if_with_default_value() {
131019625d8cSopenharmony_ci    let result = Command::new("prog")
131119625d8cSopenharmony_ci        .arg(
131219625d8cSopenharmony_ci            Arg::new("opt")
131319625d8cSopenharmony_ci                .long("opt")
131419625d8cSopenharmony_ci                .default_value("default")
131519625d8cSopenharmony_ci                .requires_if("default", "flag"),
131619625d8cSopenharmony_ci        )
131719625d8cSopenharmony_ci        .arg(Arg::new("flag").long("flag").action(ArgAction::SetTrue))
131819625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog"]);
131919625d8cSopenharmony_ci
132019625d8cSopenharmony_ci    assert!(
132119625d8cSopenharmony_ci        result.is_ok(),
132219625d8cSopenharmony_ci        "requires_if should ignore default_value: {:?}",
132319625d8cSopenharmony_ci        result.unwrap_err()
132419625d8cSopenharmony_ci    );
132519625d8cSopenharmony_ci    let m = result.unwrap();
132619625d8cSopenharmony_ci
132719625d8cSopenharmony_ci    assert_eq!(
132819625d8cSopenharmony_ci        m.get_one::<String>("opt").map(|v| v.as_str()),
132919625d8cSopenharmony_ci        Some("default")
133019625d8cSopenharmony_ci    );
133119625d8cSopenharmony_ci    assert!(!*m.get_one::<bool>("flag").expect("defaulted by clap"));
133219625d8cSopenharmony_ci}
133319625d8cSopenharmony_ci
133419625d8cSopenharmony_ci#[test]
133519625d8cSopenharmony_cifn group_requires_with_default_value() {
133619625d8cSopenharmony_ci    let result = Command::new("prog")
133719625d8cSopenharmony_ci        .arg(Arg::new("opt").long("opt").default_value("default"))
133819625d8cSopenharmony_ci        .arg(Arg::new("flag").long("flag").action(ArgAction::SetTrue))
133919625d8cSopenharmony_ci        .group(ArgGroup::new("one").arg("opt").requires("flag"))
134019625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog"]);
134119625d8cSopenharmony_ci
134219625d8cSopenharmony_ci    assert!(
134319625d8cSopenharmony_ci        result.is_ok(),
134419625d8cSopenharmony_ci        "arg group requires should ignore default_value: {:?}",
134519625d8cSopenharmony_ci        result.unwrap_err()
134619625d8cSopenharmony_ci    );
134719625d8cSopenharmony_ci    let m = result.unwrap();
134819625d8cSopenharmony_ci
134919625d8cSopenharmony_ci    assert_eq!(
135019625d8cSopenharmony_ci        m.get_one::<String>("opt").map(|v| v.as_str()),
135119625d8cSopenharmony_ci        Some("default")
135219625d8cSopenharmony_ci    );
135319625d8cSopenharmony_ci    assert!(!*m.get_one::<bool>("flag").expect("defaulted by clap"));
135419625d8cSopenharmony_ci}
135519625d8cSopenharmony_ci
135619625d8cSopenharmony_ci#[test]
135719625d8cSopenharmony_cifn required_if_eq_on_default_value() {
135819625d8cSopenharmony_ci    let result = Command::new("prog")
135919625d8cSopenharmony_ci        .arg(Arg::new("opt").long("opt").default_value("default"))
136019625d8cSopenharmony_ci        .arg(
136119625d8cSopenharmony_ci            Arg::new("flag")
136219625d8cSopenharmony_ci                .long("flag")
136319625d8cSopenharmony_ci                .action(ArgAction::SetTrue)
136419625d8cSopenharmony_ci                .required_if_eq("opt", "default"),
136519625d8cSopenharmony_ci        )
136619625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog"]);
136719625d8cSopenharmony_ci
136819625d8cSopenharmony_ci    assert!(
136919625d8cSopenharmony_ci        result.is_ok(),
137019625d8cSopenharmony_ci        "required_if_eq should ignore default_value: {:?}",
137119625d8cSopenharmony_ci        result.unwrap_err()
137219625d8cSopenharmony_ci    );
137319625d8cSopenharmony_ci    let m = result.unwrap();
137419625d8cSopenharmony_ci
137519625d8cSopenharmony_ci    assert_eq!(
137619625d8cSopenharmony_ci        m.get_one::<String>("opt").map(|v| v.as_str()),
137719625d8cSopenharmony_ci        Some("default")
137819625d8cSopenharmony_ci    );
137919625d8cSopenharmony_ci    assert!(!*m.get_one::<bool>("flag").expect("defaulted by clap"));
138019625d8cSopenharmony_ci}
138119625d8cSopenharmony_ci
138219625d8cSopenharmony_ci#[test]
138319625d8cSopenharmony_cifn required_if_eq_all_on_default_value() {
138419625d8cSopenharmony_ci    let result = Command::new("prog")
138519625d8cSopenharmony_ci        .arg(Arg::new("opt").long("opt").default_value("default"))
138619625d8cSopenharmony_ci        .arg(
138719625d8cSopenharmony_ci            Arg::new("flag")
138819625d8cSopenharmony_ci                .long("flag")
138919625d8cSopenharmony_ci                .action(ArgAction::SetTrue)
139019625d8cSopenharmony_ci                .required_if_eq_all([("opt", "default")]),
139119625d8cSopenharmony_ci        )
139219625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog"]);
139319625d8cSopenharmony_ci
139419625d8cSopenharmony_ci    assert!(
139519625d8cSopenharmony_ci        result.is_ok(),
139619625d8cSopenharmony_ci        "required_if_eq_all should ignore default_value: {:?}",
139719625d8cSopenharmony_ci        result.unwrap_err()
139819625d8cSopenharmony_ci    );
139919625d8cSopenharmony_ci    let m = result.unwrap();
140019625d8cSopenharmony_ci
140119625d8cSopenharmony_ci    assert_eq!(
140219625d8cSopenharmony_ci        m.get_one::<String>("opt").map(|v| v.as_str()),
140319625d8cSopenharmony_ci        Some("default")
140419625d8cSopenharmony_ci    );
140519625d8cSopenharmony_ci    assert!(!*m.get_one::<bool>("flag").expect("defaulted by clap"));
140619625d8cSopenharmony_ci}
140719625d8cSopenharmony_ci
140819625d8cSopenharmony_ci#[test]
140919625d8cSopenharmony_cifn required_unless_on_default_value() {
141019625d8cSopenharmony_ci    let result = Command::new("prog")
141119625d8cSopenharmony_ci        .arg(Arg::new("opt").long("opt").default_value("default"))
141219625d8cSopenharmony_ci        .arg(Arg::new("flag").long("flag").required_unless_present("opt"))
141319625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog"]);
141419625d8cSopenharmony_ci
141519625d8cSopenharmony_ci    assert!(result.is_err(), "{:?}", result.unwrap());
141619625d8cSopenharmony_ci}
141719625d8cSopenharmony_ci
141819625d8cSopenharmony_ci#[test]
141919625d8cSopenharmony_cifn required_unless_all_on_default_value() {
142019625d8cSopenharmony_ci    let result = Command::new("prog")
142119625d8cSopenharmony_ci        .arg(Arg::new("opt").long("opt").default_value("default"))
142219625d8cSopenharmony_ci        .arg(
142319625d8cSopenharmony_ci            Arg::new("flag")
142419625d8cSopenharmony_ci                .long("flag")
142519625d8cSopenharmony_ci                .required_unless_present_all(["opt"]),
142619625d8cSopenharmony_ci        )
142719625d8cSopenharmony_ci        .try_get_matches_from(vec!["myprog"]);
142819625d8cSopenharmony_ci
142919625d8cSopenharmony_ci    assert!(result.is_err(), "{:?}", result.unwrap());
143019625d8cSopenharmony_ci}
143119625d8cSopenharmony_ci
143219625d8cSopenharmony_ci#[test]
143319625d8cSopenharmony_ci#[cfg(feature = "error-context")]
143419625d8cSopenharmony_cifn required_error_doesnt_duplicate() {
143519625d8cSopenharmony_ci    let cmd = Command::new("Clap-created-USAGE-string-bug")
143619625d8cSopenharmony_ci        .arg(Arg::new("a").required(true))
143719625d8cSopenharmony_ci        .arg(
143819625d8cSopenharmony_ci            Arg::new("b")
143919625d8cSopenharmony_ci                .short('b')
144019625d8cSopenharmony_ci                .action(ArgAction::Set)
144119625d8cSopenharmony_ci                .conflicts_with("c"),
144219625d8cSopenharmony_ci        )
144319625d8cSopenharmony_ci        .arg(
144419625d8cSopenharmony_ci            Arg::new("c")
144519625d8cSopenharmony_ci                .short('c')
144619625d8cSopenharmony_ci                .action(ArgAction::Set)
144719625d8cSopenharmony_ci                .conflicts_with("b"),
144819625d8cSopenharmony_ci        );
144919625d8cSopenharmony_ci    const EXPECTED: &str = "\
145019625d8cSopenharmony_cierror: the argument '-b <b>' cannot be used with '-c <c>'
145119625d8cSopenharmony_ci
145219625d8cSopenharmony_ciUsage: clap-test -b <b> <a>
145319625d8cSopenharmony_ci
145419625d8cSopenharmony_ciFor more information, try '--help'.
145519625d8cSopenharmony_ci";
145619625d8cSopenharmony_ci    utils::assert_output(cmd, "clap-test aaa -b bbb -c ccc", EXPECTED, true);
145719625d8cSopenharmony_ci}
145819625d8cSopenharmony_ci
145919625d8cSopenharmony_ci#[test]
146019625d8cSopenharmony_ci#[cfg(feature = "error-context")]
146119625d8cSopenharmony_cifn required_require_with_group_shows_flag() {
146219625d8cSopenharmony_ci    let cmd = Command::new("test")
146319625d8cSopenharmony_ci        .arg(arg!(--"require-first").requires("first"))
146419625d8cSopenharmony_ci        .arg(arg!(--first).group("either_or_both"))
146519625d8cSopenharmony_ci        .arg(arg!(--second).group("either_or_both"))
146619625d8cSopenharmony_ci        .group(
146719625d8cSopenharmony_ci            ArgGroup::new("either_or_both")
146819625d8cSopenharmony_ci                .multiple(true)
146919625d8cSopenharmony_ci                .required(true),
147019625d8cSopenharmony_ci        );
147119625d8cSopenharmony_ci    const EXPECTED: &str = "\
147219625d8cSopenharmony_cierror: the following required arguments were not provided:
147319625d8cSopenharmony_ci  --first
147419625d8cSopenharmony_ci
147519625d8cSopenharmony_ciUsage: test --require-first <--first|--second>
147619625d8cSopenharmony_ci
147719625d8cSopenharmony_ciFor more information, try '--help'.
147819625d8cSopenharmony_ci";
147919625d8cSopenharmony_ci    utils::assert_output(cmd, "test --require-first --second", EXPECTED, true);
148019625d8cSopenharmony_ci}
1481