119625d8cSopenharmony_ciuse std::ffi::OsStr;
219625d8cSopenharmony_ciuse std::ffi::OsString;
319625d8cSopenharmony_ci
419625d8cSopenharmony_ciuse clap::builder::ArgPredicate;
519625d8cSopenharmony_ci#[cfg(feature = "error-context")]
619625d8cSopenharmony_ciuse clap::error::ErrorKind;
719625d8cSopenharmony_ciuse clap::{arg, value_parser, Arg, ArgAction, Command};
819625d8cSopenharmony_ci
919625d8cSopenharmony_ci#[cfg(feature = "error-context")]
1019625d8cSopenharmony_ciuse super::utils;
1119625d8cSopenharmony_ci
1219625d8cSopenharmony_ci#[test]
1319625d8cSopenharmony_cifn opts() {
1419625d8cSopenharmony_ci    let r = Command::new("df")
1519625d8cSopenharmony_ci        .arg(arg!(o: -o <opt> "some opt").default_value("default"))
1619625d8cSopenharmony_ci        .try_get_matches_from(vec![""]);
1719625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
1819625d8cSopenharmony_ci    let m = r.unwrap();
1919625d8cSopenharmony_ci    assert!(m.contains_id("o"));
2019625d8cSopenharmony_ci    assert_eq!(
2119625d8cSopenharmony_ci        m.value_source("o").unwrap(),
2219625d8cSopenharmony_ci        clap::parser::ValueSource::DefaultValue
2319625d8cSopenharmony_ci    );
2419625d8cSopenharmony_ci    assert_eq!(
2519625d8cSopenharmony_ci        m.get_one::<String>("o").map(|v| v.as_str()).unwrap(),
2619625d8cSopenharmony_ci        "default"
2719625d8cSopenharmony_ci    );
2819625d8cSopenharmony_ci}
2919625d8cSopenharmony_ci
3019625d8cSopenharmony_ci#[test]
3119625d8cSopenharmony_cifn default_has_index() {
3219625d8cSopenharmony_ci    let r = Command::new("df")
3319625d8cSopenharmony_ci        .arg(arg!(o: -o <opt> "some opt").default_value("default"))
3419625d8cSopenharmony_ci        .try_get_matches_from(vec![""]);
3519625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
3619625d8cSopenharmony_ci    let m = r.unwrap();
3719625d8cSopenharmony_ci    assert_eq!(m.index_of("o"), Some(1));
3819625d8cSopenharmony_ci}
3919625d8cSopenharmony_ci
4019625d8cSopenharmony_ci#[test]
4119625d8cSopenharmony_ci#[cfg(feature = "error-context")]
4219625d8cSopenharmony_cifn opt_without_value_fail() {
4319625d8cSopenharmony_ci    let r = Command::new("df")
4419625d8cSopenharmony_ci        .arg(
4519625d8cSopenharmony_ci            arg!(o: -o <opt> "some opt")
4619625d8cSopenharmony_ci                .default_value("default")
4719625d8cSopenharmony_ci                .value_parser(clap::builder::NonEmptyStringValueParser::new()),
4819625d8cSopenharmony_ci        )
4919625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-o"]);
5019625d8cSopenharmony_ci    assert!(r.is_err());
5119625d8cSopenharmony_ci    let err = r.unwrap_err();
5219625d8cSopenharmony_ci    assert_eq!(err.kind(), ErrorKind::InvalidValue);
5319625d8cSopenharmony_ci    assert!(err
5419625d8cSopenharmony_ci        .to_string()
5519625d8cSopenharmony_ci        .contains("a value is required for '-o <opt>' but none was supplied"));
5619625d8cSopenharmony_ci}
5719625d8cSopenharmony_ci
5819625d8cSopenharmony_ci#[test]
5919625d8cSopenharmony_cifn opt_user_override() {
6019625d8cSopenharmony_ci    let r = Command::new("df")
6119625d8cSopenharmony_ci        .arg(arg!(--opt <FILE> "some arg").default_value("default"))
6219625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--opt", "value"]);
6319625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
6419625d8cSopenharmony_ci    let m = r.unwrap();
6519625d8cSopenharmony_ci    assert!(m.contains_id("opt"));
6619625d8cSopenharmony_ci    assert_eq!(
6719625d8cSopenharmony_ci        m.value_source("opt").unwrap(),
6819625d8cSopenharmony_ci        clap::parser::ValueSource::CommandLine
6919625d8cSopenharmony_ci    );
7019625d8cSopenharmony_ci    assert_eq!(
7119625d8cSopenharmony_ci        m.get_one::<String>("opt").map(|v| v.as_str()).unwrap(),
7219625d8cSopenharmony_ci        "value"
7319625d8cSopenharmony_ci    );
7419625d8cSopenharmony_ci}
7519625d8cSopenharmony_ci
7619625d8cSopenharmony_ci#[test]
7719625d8cSopenharmony_cifn positionals() {
7819625d8cSopenharmony_ci    let r = Command::new("df")
7919625d8cSopenharmony_ci        .arg(arg!([arg] "some opt").default_value("default"))
8019625d8cSopenharmony_ci        .try_get_matches_from(vec![""]);
8119625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
8219625d8cSopenharmony_ci    let m = r.unwrap();
8319625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
8419625d8cSopenharmony_ci    assert_eq!(
8519625d8cSopenharmony_ci        m.value_source("arg").unwrap(),
8619625d8cSopenharmony_ci        clap::parser::ValueSource::DefaultValue
8719625d8cSopenharmony_ci    );
8819625d8cSopenharmony_ci    assert_eq!(
8919625d8cSopenharmony_ci        m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
9019625d8cSopenharmony_ci        "default"
9119625d8cSopenharmony_ci    );
9219625d8cSopenharmony_ci}
9319625d8cSopenharmony_ci
9419625d8cSopenharmony_ci#[test]
9519625d8cSopenharmony_cifn positional_user_override() {
9619625d8cSopenharmony_ci    let r = Command::new("df")
9719625d8cSopenharmony_ci        .arg(arg!([arg] "some arg").default_value("default"))
9819625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "value"]);
9919625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
10019625d8cSopenharmony_ci    let m = r.unwrap();
10119625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
10219625d8cSopenharmony_ci    assert_eq!(
10319625d8cSopenharmony_ci        m.value_source("arg").unwrap(),
10419625d8cSopenharmony_ci        clap::parser::ValueSource::CommandLine
10519625d8cSopenharmony_ci    );
10619625d8cSopenharmony_ci    assert_eq!(
10719625d8cSopenharmony_ci        m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
10819625d8cSopenharmony_ci        "value"
10919625d8cSopenharmony_ci    );
11019625d8cSopenharmony_ci}
11119625d8cSopenharmony_ci
11219625d8cSopenharmony_ci// OsStr Default Values
11319625d8cSopenharmony_ci
11419625d8cSopenharmony_ci#[test]
11519625d8cSopenharmony_cifn osstr_opts() {
11619625d8cSopenharmony_ci    use std::ffi::OsStr;
11719625d8cSopenharmony_ci    let expected = OsStr::new("default");
11819625d8cSopenharmony_ci
11919625d8cSopenharmony_ci    let r = Command::new("df")
12019625d8cSopenharmony_ci        .arg(arg!(o: -o <opt> "some opt").default_value(expected))
12119625d8cSopenharmony_ci        .try_get_matches_from(vec![""]);
12219625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
12319625d8cSopenharmony_ci    let m = r.unwrap();
12419625d8cSopenharmony_ci    assert!(m.contains_id("o"));
12519625d8cSopenharmony_ci    assert_eq!(
12619625d8cSopenharmony_ci        m.get_one::<String>("o").map(|v| v.as_str()).unwrap(),
12719625d8cSopenharmony_ci        expected
12819625d8cSopenharmony_ci    );
12919625d8cSopenharmony_ci}
13019625d8cSopenharmony_ci
13119625d8cSopenharmony_ci#[test]
13219625d8cSopenharmony_cifn osstr_opt_user_override() {
13319625d8cSopenharmony_ci    use std::ffi::OsStr;
13419625d8cSopenharmony_ci    let default = OsStr::new("default");
13519625d8cSopenharmony_ci
13619625d8cSopenharmony_ci    let r = Command::new("df")
13719625d8cSopenharmony_ci        .arg(arg!(--opt <FILE> "some arg").default_value(default))
13819625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--opt", "value"]);
13919625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
14019625d8cSopenharmony_ci    let m = r.unwrap();
14119625d8cSopenharmony_ci    assert!(m.contains_id("opt"));
14219625d8cSopenharmony_ci    assert_eq!(
14319625d8cSopenharmony_ci        m.get_one::<String>("opt").map(|v| v.as_str()).unwrap(),
14419625d8cSopenharmony_ci        "value"
14519625d8cSopenharmony_ci    );
14619625d8cSopenharmony_ci}
14719625d8cSopenharmony_ci
14819625d8cSopenharmony_ci#[test]
14919625d8cSopenharmony_cifn osstr_positionals() {
15019625d8cSopenharmony_ci    use std::ffi::OsStr;
15119625d8cSopenharmony_ci    let expected = OsStr::new("default");
15219625d8cSopenharmony_ci
15319625d8cSopenharmony_ci    let r = Command::new("df")
15419625d8cSopenharmony_ci        .arg(arg!([arg] "some opt").default_value(expected))
15519625d8cSopenharmony_ci        .try_get_matches_from(vec![""]);
15619625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
15719625d8cSopenharmony_ci    let m = r.unwrap();
15819625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
15919625d8cSopenharmony_ci    assert_eq!(
16019625d8cSopenharmony_ci        m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
16119625d8cSopenharmony_ci        expected
16219625d8cSopenharmony_ci    );
16319625d8cSopenharmony_ci}
16419625d8cSopenharmony_ci
16519625d8cSopenharmony_ci#[test]
16619625d8cSopenharmony_cifn osstr_positional_user_override() {
16719625d8cSopenharmony_ci    use std::ffi::OsStr;
16819625d8cSopenharmony_ci    let default = OsStr::new("default");
16919625d8cSopenharmony_ci
17019625d8cSopenharmony_ci    let r = Command::new("df")
17119625d8cSopenharmony_ci        .arg(arg!([arg] "some arg").default_value(default))
17219625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "value"]);
17319625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
17419625d8cSopenharmony_ci    let m = r.unwrap();
17519625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
17619625d8cSopenharmony_ci    assert_eq!(
17719625d8cSopenharmony_ci        m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
17819625d8cSopenharmony_ci        "value"
17919625d8cSopenharmony_ci    );
18019625d8cSopenharmony_ci}
18119625d8cSopenharmony_ci
18219625d8cSopenharmony_ci// --- Default if arg is present
18319625d8cSopenharmony_ci
18419625d8cSopenharmony_ci#[test]
18519625d8cSopenharmony_cifn default_if_arg_present_no_default() {
18619625d8cSopenharmony_ci    let r = Command::new("df")
18719625d8cSopenharmony_ci        .arg(arg!(--opt <FILE> "some arg").required(true))
18819625d8cSopenharmony_ci        .arg(arg!([arg] "some arg").default_value_if(
18919625d8cSopenharmony_ci            "opt",
19019625d8cSopenharmony_ci            ArgPredicate::IsPresent,
19119625d8cSopenharmony_ci            Some("default"),
19219625d8cSopenharmony_ci        ))
19319625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--opt", "some"]);
19419625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
19519625d8cSopenharmony_ci    let m = r.unwrap();
19619625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
19719625d8cSopenharmony_ci    assert_eq!(
19819625d8cSopenharmony_ci        m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
19919625d8cSopenharmony_ci        "default"
20019625d8cSopenharmony_ci    );
20119625d8cSopenharmony_ci}
20219625d8cSopenharmony_ci
20319625d8cSopenharmony_ci#[test]
20419625d8cSopenharmony_cifn default_if_arg_present_no_default_user_override() {
20519625d8cSopenharmony_ci    let r = Command::new("df")
20619625d8cSopenharmony_ci        .arg(arg!(--opt <FILE> "some arg"))
20719625d8cSopenharmony_ci        .arg(arg!([arg] "some arg").default_value_if(
20819625d8cSopenharmony_ci            "opt",
20919625d8cSopenharmony_ci            ArgPredicate::IsPresent,
21019625d8cSopenharmony_ci            Some("default"),
21119625d8cSopenharmony_ci        ))
21219625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--opt", "some", "other"]);
21319625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
21419625d8cSopenharmony_ci    let m = r.unwrap();
21519625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
21619625d8cSopenharmony_ci    assert_eq!(
21719625d8cSopenharmony_ci        m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
21819625d8cSopenharmony_ci        "other"
21919625d8cSopenharmony_ci    );
22019625d8cSopenharmony_ci}
22119625d8cSopenharmony_ci
22219625d8cSopenharmony_ci#[test]
22319625d8cSopenharmony_cifn default_if_arg_present_no_arg_with_default() {
22419625d8cSopenharmony_ci    let r = Command::new("df")
22519625d8cSopenharmony_ci        .arg(arg!(--opt <FILE> "some arg"))
22619625d8cSopenharmony_ci        .arg(
22719625d8cSopenharmony_ci            arg!([arg] "some arg")
22819625d8cSopenharmony_ci                .default_value("first")
22919625d8cSopenharmony_ci                .default_value_if("opt", ArgPredicate::IsPresent, Some("default")),
23019625d8cSopenharmony_ci        )
23119625d8cSopenharmony_ci        .try_get_matches_from(vec![""]);
23219625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
23319625d8cSopenharmony_ci    let m = r.unwrap();
23419625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
23519625d8cSopenharmony_ci    assert_eq!(
23619625d8cSopenharmony_ci        m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
23719625d8cSopenharmony_ci        "first"
23819625d8cSopenharmony_ci    );
23919625d8cSopenharmony_ci}
24019625d8cSopenharmony_ci
24119625d8cSopenharmony_ci#[test]
24219625d8cSopenharmony_cifn default_if_arg_present_with_default() {
24319625d8cSopenharmony_ci    let r = Command::new("df")
24419625d8cSopenharmony_ci        .arg(arg!(--opt <FILE> "some arg"))
24519625d8cSopenharmony_ci        .arg(
24619625d8cSopenharmony_ci            arg!([arg] "some arg")
24719625d8cSopenharmony_ci                .default_value("first")
24819625d8cSopenharmony_ci                .default_value_if("opt", ArgPredicate::IsPresent, Some("default")),
24919625d8cSopenharmony_ci        )
25019625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--opt", "some"]);
25119625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
25219625d8cSopenharmony_ci    let m = r.unwrap();
25319625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
25419625d8cSopenharmony_ci    assert_eq!(
25519625d8cSopenharmony_ci        m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
25619625d8cSopenharmony_ci        "default"
25719625d8cSopenharmony_ci    );
25819625d8cSopenharmony_ci}
25919625d8cSopenharmony_ci
26019625d8cSopenharmony_ci#[test]
26119625d8cSopenharmony_cifn default_if_arg_present_with_default_user_override() {
26219625d8cSopenharmony_ci    let r = Command::new("df")
26319625d8cSopenharmony_ci        .arg(arg!(--opt <FILE> "some arg"))
26419625d8cSopenharmony_ci        .arg(
26519625d8cSopenharmony_ci            arg!([arg] "some arg")
26619625d8cSopenharmony_ci                .default_value("first")
26719625d8cSopenharmony_ci                .default_value_if("opt", ArgPredicate::IsPresent, Some("default")),
26819625d8cSopenharmony_ci        )
26919625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--opt", "some", "other"]);
27019625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
27119625d8cSopenharmony_ci    let m = r.unwrap();
27219625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
27319625d8cSopenharmony_ci    assert_eq!(
27419625d8cSopenharmony_ci        m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
27519625d8cSopenharmony_ci        "other"
27619625d8cSopenharmony_ci    );
27719625d8cSopenharmony_ci}
27819625d8cSopenharmony_ci
27919625d8cSopenharmony_ci#[test]
28019625d8cSopenharmony_cifn default_if_arg_present_no_arg_with_default_user_override() {
28119625d8cSopenharmony_ci    let r = Command::new("df")
28219625d8cSopenharmony_ci        .arg(arg!(--opt <FILE> "some arg"))
28319625d8cSopenharmony_ci        .arg(
28419625d8cSopenharmony_ci            arg!([arg] "some arg")
28519625d8cSopenharmony_ci                .default_value("first")
28619625d8cSopenharmony_ci                .default_value_if("opt", ArgPredicate::IsPresent, Some("default")),
28719625d8cSopenharmony_ci        )
28819625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "other"]);
28919625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
29019625d8cSopenharmony_ci    let m = r.unwrap();
29119625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
29219625d8cSopenharmony_ci    assert_eq!(
29319625d8cSopenharmony_ci        m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
29419625d8cSopenharmony_ci        "other"
29519625d8cSopenharmony_ci    );
29619625d8cSopenharmony_ci}
29719625d8cSopenharmony_ci
29819625d8cSopenharmony_ci// Conditional Default Values
29919625d8cSopenharmony_ci
30019625d8cSopenharmony_ci#[test]
30119625d8cSopenharmony_cifn default_if_arg_present_with_value_no_default() {
30219625d8cSopenharmony_ci    let r = Command::new("df")
30319625d8cSopenharmony_ci        .arg(arg!(--opt <FILE> "some arg"))
30419625d8cSopenharmony_ci        .arg(arg!([arg] "some arg").default_value_if("opt", "value", Some("default")))
30519625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--opt", "value"]);
30619625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
30719625d8cSopenharmony_ci    let m = r.unwrap();
30819625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
30919625d8cSopenharmony_ci    assert_eq!(
31019625d8cSopenharmony_ci        m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
31119625d8cSopenharmony_ci        "default"
31219625d8cSopenharmony_ci    );
31319625d8cSopenharmony_ci}
31419625d8cSopenharmony_ci
31519625d8cSopenharmony_ci#[test]
31619625d8cSopenharmony_cifn default_if_arg_present_with_value_no_default_fail() {
31719625d8cSopenharmony_ci    let r = Command::new("df")
31819625d8cSopenharmony_ci        .arg(arg!(--opt <FILE> "some arg"))
31919625d8cSopenharmony_ci        .arg(arg!([arg] "some arg").default_value_if("opt", "value", Some("default")))
32019625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--opt", "other"]);
32119625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
32219625d8cSopenharmony_ci    let m = r.unwrap();
32319625d8cSopenharmony_ci    assert!(!m.contains_id("arg"));
32419625d8cSopenharmony_ci    assert!(m.get_one::<String>("arg").map(|v| v.as_str()).is_none());
32519625d8cSopenharmony_ci}
32619625d8cSopenharmony_ci
32719625d8cSopenharmony_ci#[test]
32819625d8cSopenharmony_cifn default_if_arg_present_with_value_no_default_user_override() {
32919625d8cSopenharmony_ci    let r = Command::new("df")
33019625d8cSopenharmony_ci        .arg(arg!(--opt <FILE> "some arg"))
33119625d8cSopenharmony_ci        .arg(arg!([arg] "some arg").default_value_if("opt", "some", Some("default")))
33219625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--opt", "some", "other"]);
33319625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
33419625d8cSopenharmony_ci    let m = r.unwrap();
33519625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
33619625d8cSopenharmony_ci    assert_eq!(
33719625d8cSopenharmony_ci        m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
33819625d8cSopenharmony_ci        "other"
33919625d8cSopenharmony_ci    );
34019625d8cSopenharmony_ci}
34119625d8cSopenharmony_ci
34219625d8cSopenharmony_ci#[test]
34319625d8cSopenharmony_cifn default_if_arg_present_with_value_no_arg_with_default() {
34419625d8cSopenharmony_ci    let r = Command::new("df")
34519625d8cSopenharmony_ci        .arg(arg!(--opt <FILE> "some arg"))
34619625d8cSopenharmony_ci        .arg(
34719625d8cSopenharmony_ci            arg!([arg] "some arg")
34819625d8cSopenharmony_ci                .default_value("first")
34919625d8cSopenharmony_ci                .default_value_if("opt", "some", Some("default")),
35019625d8cSopenharmony_ci        )
35119625d8cSopenharmony_ci        .try_get_matches_from(vec![""]);
35219625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
35319625d8cSopenharmony_ci    let m = r.unwrap();
35419625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
35519625d8cSopenharmony_ci    assert_eq!(
35619625d8cSopenharmony_ci        m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
35719625d8cSopenharmony_ci        "first"
35819625d8cSopenharmony_ci    );
35919625d8cSopenharmony_ci}
36019625d8cSopenharmony_ci
36119625d8cSopenharmony_ci#[test]
36219625d8cSopenharmony_cifn default_if_arg_present_with_value_no_arg_with_default_fail() {
36319625d8cSopenharmony_ci    let r = Command::new("df")
36419625d8cSopenharmony_ci        .arg(arg!(--opt <FILE> "some arg"))
36519625d8cSopenharmony_ci        .arg(
36619625d8cSopenharmony_ci            arg!([arg] "some arg")
36719625d8cSopenharmony_ci                .default_value("first")
36819625d8cSopenharmony_ci                .default_value_if("opt", "some", Some("default")),
36919625d8cSopenharmony_ci        )
37019625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--opt", "other"]);
37119625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
37219625d8cSopenharmony_ci    let m = r.unwrap();
37319625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
37419625d8cSopenharmony_ci    assert_eq!(
37519625d8cSopenharmony_ci        m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
37619625d8cSopenharmony_ci        "first"
37719625d8cSopenharmony_ci    );
37819625d8cSopenharmony_ci}
37919625d8cSopenharmony_ci
38019625d8cSopenharmony_ci#[test]
38119625d8cSopenharmony_cifn default_if_arg_present_with_value_with_default() {
38219625d8cSopenharmony_ci    let r = Command::new("df")
38319625d8cSopenharmony_ci        .arg(arg!(--opt <FILE> "some arg"))
38419625d8cSopenharmony_ci        .arg(
38519625d8cSopenharmony_ci            arg!([arg] "some arg")
38619625d8cSopenharmony_ci                .default_value("first")
38719625d8cSopenharmony_ci                .default_value_if("opt", "some", Some("default")),
38819625d8cSopenharmony_ci        )
38919625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--opt", "some"]);
39019625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
39119625d8cSopenharmony_ci    let m = r.unwrap();
39219625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
39319625d8cSopenharmony_ci    assert_eq!(
39419625d8cSopenharmony_ci        m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
39519625d8cSopenharmony_ci        "default"
39619625d8cSopenharmony_ci    );
39719625d8cSopenharmony_ci}
39819625d8cSopenharmony_ci
39919625d8cSopenharmony_ci#[test]
40019625d8cSopenharmony_cifn default_if_arg_present_with_value_with_default_user_override() {
40119625d8cSopenharmony_ci    let r = Command::new("df")
40219625d8cSopenharmony_ci        .arg(arg!(--opt <FILE> "some arg"))
40319625d8cSopenharmony_ci        .arg(
40419625d8cSopenharmony_ci            arg!([arg] "some arg")
40519625d8cSopenharmony_ci                .default_value("first")
40619625d8cSopenharmony_ci                .default_value_if("opt", "some", Some("default")),
40719625d8cSopenharmony_ci        )
40819625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--opt", "some", "other"]);
40919625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
41019625d8cSopenharmony_ci    let m = r.unwrap();
41119625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
41219625d8cSopenharmony_ci    assert_eq!(
41319625d8cSopenharmony_ci        m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
41419625d8cSopenharmony_ci        "other"
41519625d8cSopenharmony_ci    );
41619625d8cSopenharmony_ci}
41719625d8cSopenharmony_ci
41819625d8cSopenharmony_ci#[test]
41919625d8cSopenharmony_cifn default_if_arg_present_no_arg_with_value_with_default_user_override() {
42019625d8cSopenharmony_ci    let r = Command::new("df")
42119625d8cSopenharmony_ci        .arg(arg!(--opt <FILE> "some arg"))
42219625d8cSopenharmony_ci        .arg(
42319625d8cSopenharmony_ci            arg!([arg] "some arg")
42419625d8cSopenharmony_ci                .default_value("first")
42519625d8cSopenharmony_ci                .default_value_if("opt", "some", Some("default")),
42619625d8cSopenharmony_ci        )
42719625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "other"]);
42819625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
42919625d8cSopenharmony_ci    let m = r.unwrap();
43019625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
43119625d8cSopenharmony_ci    assert_eq!(
43219625d8cSopenharmony_ci        m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
43319625d8cSopenharmony_ci        "other"
43419625d8cSopenharmony_ci    );
43519625d8cSopenharmony_ci}
43619625d8cSopenharmony_ci
43719625d8cSopenharmony_ci#[test]
43819625d8cSopenharmony_cifn default_if_arg_present_no_arg_with_value_with_default_user_override_fail() {
43919625d8cSopenharmony_ci    let r = Command::new("df")
44019625d8cSopenharmony_ci        .arg(arg!(--opt <FILE> "some arg"))
44119625d8cSopenharmony_ci        .arg(
44219625d8cSopenharmony_ci            arg!([arg] "some arg")
44319625d8cSopenharmony_ci                .default_value("first")
44419625d8cSopenharmony_ci                .default_value_if("opt", "some", Some("default")),
44519625d8cSopenharmony_ci        )
44619625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--opt", "value", "other"]);
44719625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
44819625d8cSopenharmony_ci    let m = r.unwrap();
44919625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
45019625d8cSopenharmony_ci    assert_eq!(
45119625d8cSopenharmony_ci        m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
45219625d8cSopenharmony_ci        "other"
45319625d8cSopenharmony_ci    );
45419625d8cSopenharmony_ci}
45519625d8cSopenharmony_ci
45619625d8cSopenharmony_ci// Unsetting the default
45719625d8cSopenharmony_ci
45819625d8cSopenharmony_ci#[test]
45919625d8cSopenharmony_cifn no_default_if_arg_present_with_value_no_default() {
46019625d8cSopenharmony_ci    let r = Command::new("df")
46119625d8cSopenharmony_ci        .arg(arg!(--opt <FILE> "some arg"))
46219625d8cSopenharmony_ci        .arg(arg!([arg] "some arg").default_value_if("opt", "value", None))
46319625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--opt", "value"]);
46419625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
46519625d8cSopenharmony_ci    let m = r.unwrap();
46619625d8cSopenharmony_ci    assert!(!m.contains_id("arg"));
46719625d8cSopenharmony_ci}
46819625d8cSopenharmony_ci
46919625d8cSopenharmony_ci#[test]
47019625d8cSopenharmony_cifn no_default_if_arg_present_with_value_with_default() {
47119625d8cSopenharmony_ci    let r = Command::new("df")
47219625d8cSopenharmony_ci        .arg(arg!(--opt <FILE> "some arg"))
47319625d8cSopenharmony_ci        .arg(
47419625d8cSopenharmony_ci            arg!([arg] "some arg")
47519625d8cSopenharmony_ci                .default_value("default")
47619625d8cSopenharmony_ci                .default_value_if("opt", "value", None),
47719625d8cSopenharmony_ci        )
47819625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--opt", "value"]);
47919625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
48019625d8cSopenharmony_ci    let m = r.unwrap();
48119625d8cSopenharmony_ci    assert!(!m.contains_id("arg"));
48219625d8cSopenharmony_ci    assert!(m.get_one::<String>("arg").map(|v| v.as_str()).is_none());
48319625d8cSopenharmony_ci}
48419625d8cSopenharmony_ci
48519625d8cSopenharmony_ci#[test]
48619625d8cSopenharmony_cifn no_default_if_arg_present_with_value_with_default_user_override() {
48719625d8cSopenharmony_ci    let r = Command::new("df")
48819625d8cSopenharmony_ci        .arg(arg!(--opt <FILE> "some arg"))
48919625d8cSopenharmony_ci        .arg(
49019625d8cSopenharmony_ci            arg!([arg] "some arg")
49119625d8cSopenharmony_ci                .default_value("default")
49219625d8cSopenharmony_ci                .default_value_if("opt", "value", None),
49319625d8cSopenharmony_ci        )
49419625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--opt", "value", "other"]);
49519625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
49619625d8cSopenharmony_ci    let m = r.unwrap();
49719625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
49819625d8cSopenharmony_ci    assert_eq!(
49919625d8cSopenharmony_ci        m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
50019625d8cSopenharmony_ci        "other"
50119625d8cSopenharmony_ci    );
50219625d8cSopenharmony_ci}
50319625d8cSopenharmony_ci
50419625d8cSopenharmony_ci#[test]
50519625d8cSopenharmony_cifn no_default_if_arg_present_no_arg_with_value_with_default() {
50619625d8cSopenharmony_ci    let r = Command::new("df")
50719625d8cSopenharmony_ci        .arg(arg!(--opt <FILE> "some arg"))
50819625d8cSopenharmony_ci        .arg(
50919625d8cSopenharmony_ci            arg!([arg] "some arg")
51019625d8cSopenharmony_ci                .default_value("default")
51119625d8cSopenharmony_ci                .default_value_if("opt", "value", None),
51219625d8cSopenharmony_ci        )
51319625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--opt", "other"]);
51419625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
51519625d8cSopenharmony_ci    let m = r.unwrap();
51619625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
51719625d8cSopenharmony_ci    assert_eq!(
51819625d8cSopenharmony_ci        m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
51919625d8cSopenharmony_ci        "default"
52019625d8cSopenharmony_ci    );
52119625d8cSopenharmony_ci}
52219625d8cSopenharmony_ci
52319625d8cSopenharmony_ci// Multiple conditions
52419625d8cSopenharmony_ci
52519625d8cSopenharmony_ci#[test]
52619625d8cSopenharmony_cifn default_ifs_arg_present() {
52719625d8cSopenharmony_ci    let r = Command::new("df")
52819625d8cSopenharmony_ci        .arg(arg!(--opt <FILE> "some arg"))
52919625d8cSopenharmony_ci        .arg(arg!(--flag "some arg"))
53019625d8cSopenharmony_ci        .arg(
53119625d8cSopenharmony_ci            arg!([arg] "some arg")
53219625d8cSopenharmony_ci                .default_value("first")
53319625d8cSopenharmony_ci                .default_value_ifs([
53419625d8cSopenharmony_ci                    ("opt", ArgPredicate::from("some"), Some("default")),
53519625d8cSopenharmony_ci                    ("flag", ArgPredicate::IsPresent, Some("flg")),
53619625d8cSopenharmony_ci                ]),
53719625d8cSopenharmony_ci        )
53819625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--flag"]);
53919625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
54019625d8cSopenharmony_ci    let m = r.unwrap();
54119625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
54219625d8cSopenharmony_ci    assert_eq!(
54319625d8cSopenharmony_ci        m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
54419625d8cSopenharmony_ci        "flg"
54519625d8cSopenharmony_ci    );
54619625d8cSopenharmony_ci}
54719625d8cSopenharmony_ci
54819625d8cSopenharmony_ci#[test]
54919625d8cSopenharmony_cifn no_default_ifs_arg_present() {
55019625d8cSopenharmony_ci    let r = Command::new("df")
55119625d8cSopenharmony_ci        .arg(arg!(--opt <FILE> "some arg"))
55219625d8cSopenharmony_ci        .arg(arg!(--flag "some arg"))
55319625d8cSopenharmony_ci        .arg(
55419625d8cSopenharmony_ci            arg!([arg] "some arg")
55519625d8cSopenharmony_ci                .default_value("first")
55619625d8cSopenharmony_ci                .default_value_ifs([
55719625d8cSopenharmony_ci                    ("opt", ArgPredicate::from("some"), Some("default")),
55819625d8cSopenharmony_ci                    ("flag", ArgPredicate::IsPresent, None),
55919625d8cSopenharmony_ci                ]),
56019625d8cSopenharmony_ci        )
56119625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--flag"]);
56219625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
56319625d8cSopenharmony_ci    let m = r.unwrap();
56419625d8cSopenharmony_ci    assert!(!m.contains_id("arg"));
56519625d8cSopenharmony_ci    assert!(m.get_one::<String>("arg").map(|v| v.as_str()).is_none());
56619625d8cSopenharmony_ci}
56719625d8cSopenharmony_ci
56819625d8cSopenharmony_ci#[test]
56919625d8cSopenharmony_cifn default_ifs_arg_present_user_override() {
57019625d8cSopenharmony_ci    let r = Command::new("df")
57119625d8cSopenharmony_ci        .arg(arg!(--opt <FILE> "some arg"))
57219625d8cSopenharmony_ci        .arg(arg!(--flag "some arg"))
57319625d8cSopenharmony_ci        .arg(
57419625d8cSopenharmony_ci            arg!([arg] "some arg")
57519625d8cSopenharmony_ci                .default_value("first")
57619625d8cSopenharmony_ci                .default_value_ifs([
57719625d8cSopenharmony_ci                    ("opt", ArgPredicate::from("some"), Some("default")),
57819625d8cSopenharmony_ci                    ("flag", ArgPredicate::IsPresent, Some("flg")),
57919625d8cSopenharmony_ci                ]),
58019625d8cSopenharmony_ci        )
58119625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--flag", "value"]);
58219625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
58319625d8cSopenharmony_ci    let m = r.unwrap();
58419625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
58519625d8cSopenharmony_ci    assert_eq!(
58619625d8cSopenharmony_ci        m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
58719625d8cSopenharmony_ci        "value"
58819625d8cSopenharmony_ci    );
58919625d8cSopenharmony_ci}
59019625d8cSopenharmony_ci
59119625d8cSopenharmony_ci#[test]
59219625d8cSopenharmony_cifn default_ifs_arg_present_order() {
59319625d8cSopenharmony_ci    let r = Command::new("df")
59419625d8cSopenharmony_ci        .arg(arg!(--opt <FILE> "some arg"))
59519625d8cSopenharmony_ci        .arg(arg!(--flag "some arg"))
59619625d8cSopenharmony_ci        .arg(
59719625d8cSopenharmony_ci            arg!([arg] "some arg")
59819625d8cSopenharmony_ci                .default_value("first")
59919625d8cSopenharmony_ci                .default_value_ifs([
60019625d8cSopenharmony_ci                    ("opt", ArgPredicate::from("some"), Some("default")),
60119625d8cSopenharmony_ci                    ("flag", ArgPredicate::IsPresent, Some("flg")),
60219625d8cSopenharmony_ci                ]),
60319625d8cSopenharmony_ci        )
60419625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--opt=some", "--flag"]);
60519625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
60619625d8cSopenharmony_ci    let m = r.unwrap();
60719625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
60819625d8cSopenharmony_ci    assert_eq!(
60919625d8cSopenharmony_ci        m.get_one::<String>("arg").map(|v| v.as_str()).unwrap(),
61019625d8cSopenharmony_ci        "default"
61119625d8cSopenharmony_ci    );
61219625d8cSopenharmony_ci}
61319625d8cSopenharmony_ci
61419625d8cSopenharmony_ci#[test]
61519625d8cSopenharmony_cifn default_value_ifs_os() {
61619625d8cSopenharmony_ci    let cmd = Command::new("my_cargo")
61719625d8cSopenharmony_ci        .arg(
61819625d8cSopenharmony_ci            Arg::new("flag")
61919625d8cSopenharmony_ci                .long("flag")
62019625d8cSopenharmony_ci                .value_parser(value_parser!(OsString))
62119625d8cSopenharmony_ci                .action(ArgAction::Set),
62219625d8cSopenharmony_ci        )
62319625d8cSopenharmony_ci        .arg(
62419625d8cSopenharmony_ci            Arg::new("other")
62519625d8cSopenharmony_ci                .long("other")
62619625d8cSopenharmony_ci                .value_parser(value_parser!(OsString))
62719625d8cSopenharmony_ci                .default_value_ifs([("flag", "标记2", OsStr::new("flag=标记2"))]),
62819625d8cSopenharmony_ci        );
62919625d8cSopenharmony_ci    let result = cmd.try_get_matches_from(["my_cargo", "--flag", "标记2"]);
63019625d8cSopenharmony_ci    assert!(result.is_ok(), "{}", result.unwrap_err());
63119625d8cSopenharmony_ci    let m = result.unwrap();
63219625d8cSopenharmony_ci    assert_eq!(
63319625d8cSopenharmony_ci        m.get_one::<OsString>("flag").map(OsString::as_os_str),
63419625d8cSopenharmony_ci        Some(OsStr::new("标记2"))
63519625d8cSopenharmony_ci    );
63619625d8cSopenharmony_ci    assert_eq!(
63719625d8cSopenharmony_ci        m.get_one::<OsString>("other").map(OsString::as_os_str),
63819625d8cSopenharmony_ci        Some(OsStr::new("flag=标记2")),
63919625d8cSopenharmony_ci    );
64019625d8cSopenharmony_ci}
64119625d8cSopenharmony_ci
64219625d8cSopenharmony_ci// Interaction with requires
64319625d8cSopenharmony_ci
64419625d8cSopenharmony_ci#[test]
64519625d8cSopenharmony_cifn conditional_reqs_pass() {
64619625d8cSopenharmony_ci    let m = Command::new("Test cmd")
64719625d8cSopenharmony_ci        .arg(
64819625d8cSopenharmony_ci            Arg::new("target")
64919625d8cSopenharmony_ci                .action(ArgAction::Set)
65019625d8cSopenharmony_ci                .default_value("file")
65119625d8cSopenharmony_ci                .long("target"),
65219625d8cSopenharmony_ci        )
65319625d8cSopenharmony_ci        .arg(
65419625d8cSopenharmony_ci            Arg::new("input")
65519625d8cSopenharmony_ci                .action(ArgAction::Set)
65619625d8cSopenharmony_ci                .required(true)
65719625d8cSopenharmony_ci                .long("input"),
65819625d8cSopenharmony_ci        )
65919625d8cSopenharmony_ci        .arg(
66019625d8cSopenharmony_ci            Arg::new("output")
66119625d8cSopenharmony_ci                .action(ArgAction::Set)
66219625d8cSopenharmony_ci                .required_if_eq("target", "file")
66319625d8cSopenharmony_ci                .long("output"),
66419625d8cSopenharmony_ci        )
66519625d8cSopenharmony_ci        .try_get_matches_from(vec!["test", "--input", "some", "--output", "other"]);
66619625d8cSopenharmony_ci
66719625d8cSopenharmony_ci    assert!(m.is_ok(), "{}", m.unwrap_err());
66819625d8cSopenharmony_ci    let m = m.unwrap();
66919625d8cSopenharmony_ci    assert_eq!(
67019625d8cSopenharmony_ci        m.get_one::<String>("output").map(|v| v.as_str()),
67119625d8cSopenharmony_ci        Some("other")
67219625d8cSopenharmony_ci    );
67319625d8cSopenharmony_ci    assert_eq!(
67419625d8cSopenharmony_ci        m.get_one::<String>("input").map(|v| v.as_str()),
67519625d8cSopenharmony_ci        Some("some")
67619625d8cSopenharmony_ci    );
67719625d8cSopenharmony_ci}
67819625d8cSopenharmony_ci
67919625d8cSopenharmony_ci#[test]
68019625d8cSopenharmony_cifn multiple_defaults() {
68119625d8cSopenharmony_ci    let r = Command::new("diff")
68219625d8cSopenharmony_ci        .arg(
68319625d8cSopenharmony_ci            Arg::new("files")
68419625d8cSopenharmony_ci                .long("files")
68519625d8cSopenharmony_ci                .num_args(2)
68619625d8cSopenharmony_ci                .default_values(["old", "new"]),
68719625d8cSopenharmony_ci        )
68819625d8cSopenharmony_ci        .try_get_matches_from(vec![""]);
68919625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
69019625d8cSopenharmony_ci    let m = r.unwrap();
69119625d8cSopenharmony_ci    assert!(m.contains_id("files"));
69219625d8cSopenharmony_ci    assert_eq!(
69319625d8cSopenharmony_ci        m.get_many::<String>("files").unwrap().collect::<Vec<_>>(),
69419625d8cSopenharmony_ci        vec!["old", "new"]
69519625d8cSopenharmony_ci    );
69619625d8cSopenharmony_ci}
69719625d8cSopenharmony_ci
69819625d8cSopenharmony_ci#[test]
69919625d8cSopenharmony_cifn multiple_defaults_override() {
70019625d8cSopenharmony_ci    let r = Command::new("diff")
70119625d8cSopenharmony_ci        .arg(
70219625d8cSopenharmony_ci            Arg::new("files")
70319625d8cSopenharmony_ci                .long("files")
70419625d8cSopenharmony_ci                .num_args(2)
70519625d8cSopenharmony_ci                .default_values(["old", "new"]),
70619625d8cSopenharmony_ci        )
70719625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--files", "other", "mine"]);
70819625d8cSopenharmony_ci    assert!(r.is_ok(), "{}", r.unwrap_err());
70919625d8cSopenharmony_ci    let m = r.unwrap();
71019625d8cSopenharmony_ci    assert!(m.contains_id("files"));
71119625d8cSopenharmony_ci    assert_eq!(
71219625d8cSopenharmony_ci        m.get_many::<String>("files").unwrap().collect::<Vec<_>>(),
71319625d8cSopenharmony_ci        vec!["other", "mine"]
71419625d8cSopenharmony_ci    );
71519625d8cSopenharmony_ci}
71619625d8cSopenharmony_ci
71719625d8cSopenharmony_ci#[test]
71819625d8cSopenharmony_ci#[cfg(feature = "error-context")]
71919625d8cSopenharmony_cifn default_vals_donnot_show_in_smart_usage() {
72019625d8cSopenharmony_ci    let cmd = Command::new("bug")
72119625d8cSopenharmony_ci        .arg(
72219625d8cSopenharmony_ci            Arg::new("foo")
72319625d8cSopenharmony_ci                .long("config")
72419625d8cSopenharmony_ci                .action(ArgAction::Set)
72519625d8cSopenharmony_ci                .default_value("bar"),
72619625d8cSopenharmony_ci        )
72719625d8cSopenharmony_ci        .arg(Arg::new("input").required(true));
72819625d8cSopenharmony_ci
72919625d8cSopenharmony_ci    utils::assert_output(
73019625d8cSopenharmony_ci        cmd,
73119625d8cSopenharmony_ci        "bug",
73219625d8cSopenharmony_ci        "\
73319625d8cSopenharmony_cierror: the following required arguments were not provided:
73419625d8cSopenharmony_ci  <input>
73519625d8cSopenharmony_ci
73619625d8cSopenharmony_ciUsage: bug <input>
73719625d8cSopenharmony_ci
73819625d8cSopenharmony_ciFor more information, try '--help'.
73919625d8cSopenharmony_ci",
74019625d8cSopenharmony_ci        true,
74119625d8cSopenharmony_ci    );
74219625d8cSopenharmony_ci}
74319625d8cSopenharmony_ci
74419625d8cSopenharmony_ci#[test]
74519625d8cSopenharmony_cifn issue_1050_num_vals_and_defaults() {
74619625d8cSopenharmony_ci    let res = Command::new("hello")
74719625d8cSopenharmony_ci        .arg(
74819625d8cSopenharmony_ci            Arg::new("exit-code")
74919625d8cSopenharmony_ci                .long("exit-code")
75019625d8cSopenharmony_ci                .action(ArgAction::Set)
75119625d8cSopenharmony_ci                .num_args(1)
75219625d8cSopenharmony_ci                .default_value("0"),
75319625d8cSopenharmony_ci        )
75419625d8cSopenharmony_ci        .try_get_matches_from(vec!["hello", "--exit-code=1"]);
75519625d8cSopenharmony_ci    assert!(res.is_ok(), "{}", res.unwrap_err());
75619625d8cSopenharmony_ci    let m = res.unwrap();
75719625d8cSopenharmony_ci    assert_eq!(
75819625d8cSopenharmony_ci        m.get_one::<String>("exit-code").map(|v| v.as_str()),
75919625d8cSopenharmony_ci        Some("1")
76019625d8cSopenharmony_ci    );
76119625d8cSopenharmony_ci}
76219625d8cSopenharmony_ci
76319625d8cSopenharmony_ci#[test]
76419625d8cSopenharmony_cifn required_groups_with_default_values() {
76519625d8cSopenharmony_ci    use clap::{Arg, ArgGroup, Command};
76619625d8cSopenharmony_ci
76719625d8cSopenharmony_ci    let cmd = Command::new("test")
76819625d8cSopenharmony_ci        .arg(Arg::new("arg").default_value("value"))
76919625d8cSopenharmony_ci        .group(ArgGroup::new("group").args(["arg"]).required(true));
77019625d8cSopenharmony_ci
77119625d8cSopenharmony_ci    let result = cmd.clone().try_get_matches_from(["test"]);
77219625d8cSopenharmony_ci    assert!(result.is_err());
77319625d8cSopenharmony_ci
77419625d8cSopenharmony_ci    let result = cmd.clone().try_get_matches_from(["test", "value"]);
77519625d8cSopenharmony_ci    assert!(result.is_ok(), "{}", result.unwrap_err());
77619625d8cSopenharmony_ci    let m = result.unwrap();
77719625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
77819625d8cSopenharmony_ci    assert!(m.contains_id("group"));
77919625d8cSopenharmony_ci}
78019625d8cSopenharmony_ci
78119625d8cSopenharmony_ci#[test]
78219625d8cSopenharmony_cifn required_args_with_default_values() {
78319625d8cSopenharmony_ci    use clap::{Arg, Command};
78419625d8cSopenharmony_ci
78519625d8cSopenharmony_ci    let cmd = Command::new("test").arg(Arg::new("arg").required(true).default_value("value"));
78619625d8cSopenharmony_ci
78719625d8cSopenharmony_ci    let result = cmd.clone().try_get_matches_from(["test"]);
78819625d8cSopenharmony_ci    assert!(result.is_err());
78919625d8cSopenharmony_ci
79019625d8cSopenharmony_ci    let result = cmd.clone().try_get_matches_from(["test", "value"]);
79119625d8cSopenharmony_ci    assert!(result.is_ok(), "{}", result.unwrap_err());
79219625d8cSopenharmony_ci    let m = result.unwrap();
79319625d8cSopenharmony_ci    assert!(m.contains_id("arg"));
79419625d8cSopenharmony_ci}
79519625d8cSopenharmony_ci
79619625d8cSopenharmony_ci#[cfg(debug_assertions)]
79719625d8cSopenharmony_ci#[test]
79819625d8cSopenharmony_ci#[cfg(feature = "error-context")]
79919625d8cSopenharmony_ci#[should_panic = "Argument `arg`'s default_value=\"value\" failed validation: error: invalid value 'value' for '[arg]'"]
80019625d8cSopenharmony_cifn default_values_are_possible_values() {
80119625d8cSopenharmony_ci    use clap::{Arg, Command};
80219625d8cSopenharmony_ci
80319625d8cSopenharmony_ci    let _ = Command::new("test")
80419625d8cSopenharmony_ci        .arg(
80519625d8cSopenharmony_ci            Arg::new("arg")
80619625d8cSopenharmony_ci                .value_parser(["one", "two"])
80719625d8cSopenharmony_ci                .default_value("value"),
80819625d8cSopenharmony_ci        )
80919625d8cSopenharmony_ci        .try_get_matches();
81019625d8cSopenharmony_ci}
81119625d8cSopenharmony_ci
81219625d8cSopenharmony_ci#[cfg(debug_assertions)]
81319625d8cSopenharmony_ci#[test]
81419625d8cSopenharmony_ci#[cfg(feature = "error-context")]
81519625d8cSopenharmony_ci#[should_panic = "Argument `arg`'s default_value=\"one\" failed validation: error: invalid value 'one' for '[arg]"]
81619625d8cSopenharmony_cifn invalid_default_values() {
81719625d8cSopenharmony_ci    use clap::{Arg, Command};
81819625d8cSopenharmony_ci
81919625d8cSopenharmony_ci    let _ = Command::new("test")
82019625d8cSopenharmony_ci        .arg(
82119625d8cSopenharmony_ci            Arg::new("arg")
82219625d8cSopenharmony_ci                .value_parser(clap::value_parser!(u32))
82319625d8cSopenharmony_ci                .default_value("one"),
82419625d8cSopenharmony_ci        )
82519625d8cSopenharmony_ci        .try_get_matches();
82619625d8cSopenharmony_ci}
82719625d8cSopenharmony_ci
82819625d8cSopenharmony_ci#[test]
82919625d8cSopenharmony_cifn valid_delimited_default_values() {
83019625d8cSopenharmony_ci    use clap::{Arg, Command};
83119625d8cSopenharmony_ci
83219625d8cSopenharmony_ci    Command::new("test")
83319625d8cSopenharmony_ci        .arg(
83419625d8cSopenharmony_ci            Arg::new("arg")
83519625d8cSopenharmony_ci                .value_parser(clap::value_parser!(u32))
83619625d8cSopenharmony_ci                .value_delimiter(',')
83719625d8cSopenharmony_ci                .default_value("1,2,3"),
83819625d8cSopenharmony_ci        )
83919625d8cSopenharmony_ci        .debug_assert();
84019625d8cSopenharmony_ci}
84119625d8cSopenharmony_ci
84219625d8cSopenharmony_ci#[cfg(debug_assertions)]
84319625d8cSopenharmony_ci#[test]
84419625d8cSopenharmony_ci#[cfg(feature = "error-context")]
84519625d8cSopenharmony_ci#[should_panic = "Argument `arg`'s default_value=\"one\" failed validation: error: invalid value 'one' for '[arg]"]
84619625d8cSopenharmony_cifn invalid_delimited_default_values() {
84719625d8cSopenharmony_ci    use clap::{Arg, Command};
84819625d8cSopenharmony_ci
84919625d8cSopenharmony_ci    Command::new("test")
85019625d8cSopenharmony_ci        .arg(
85119625d8cSopenharmony_ci            Arg::new("arg")
85219625d8cSopenharmony_ci                .value_parser(clap::value_parser!(u32))
85319625d8cSopenharmony_ci                .value_delimiter(',')
85419625d8cSopenharmony_ci                .default_value("one,two"),
85519625d8cSopenharmony_ci        )
85619625d8cSopenharmony_ci        .debug_assert();
85719625d8cSopenharmony_ci}
85819625d8cSopenharmony_ci
85919625d8cSopenharmony_ci#[test]
86019625d8cSopenharmony_cifn with_value_delimiter() {
86119625d8cSopenharmony_ci    let cmd = Command::new("multiple_values").arg(
86219625d8cSopenharmony_ci        Arg::new("option")
86319625d8cSopenharmony_ci            .long("option")
86419625d8cSopenharmony_ci            .help("multiple options")
86519625d8cSopenharmony_ci            .value_delimiter(';')
86619625d8cSopenharmony_ci            .default_value("first;second"),
86719625d8cSopenharmony_ci    );
86819625d8cSopenharmony_ci
86919625d8cSopenharmony_ci    let matches = cmd.try_get_matches_from(vec![""]).unwrap();
87019625d8cSopenharmony_ci
87119625d8cSopenharmony_ci    assert_eq!(
87219625d8cSopenharmony_ci        matches
87319625d8cSopenharmony_ci            .get_many::<String>("option")
87419625d8cSopenharmony_ci            .unwrap()
87519625d8cSopenharmony_ci            .map(|v| v.as_str())
87619625d8cSopenharmony_ci            .collect::<Vec<_>>(),
87719625d8cSopenharmony_ci        ["first", "second"]
87819625d8cSopenharmony_ci    );
87919625d8cSopenharmony_ci}
88019625d8cSopenharmony_ci
88119625d8cSopenharmony_ci#[test]
88219625d8cSopenharmony_cifn missing_with_value_delimiter() {
88319625d8cSopenharmony_ci    let cmd = Command::new("program").arg(
88419625d8cSopenharmony_ci        Arg::new("option")
88519625d8cSopenharmony_ci            .long("option")
88619625d8cSopenharmony_ci            .value_delimiter(';')
88719625d8cSopenharmony_ci            .num_args(0..=1)
88819625d8cSopenharmony_ci            .default_missing_values(["value1;value2;value3", "value4;value5"]),
88919625d8cSopenharmony_ci    );
89019625d8cSopenharmony_ci
89119625d8cSopenharmony_ci    let matches = cmd
89219625d8cSopenharmony_ci        .try_get_matches_from(vec!["program", "--option"])
89319625d8cSopenharmony_ci        .unwrap();
89419625d8cSopenharmony_ci
89519625d8cSopenharmony_ci    assert_eq!(
89619625d8cSopenharmony_ci        matches
89719625d8cSopenharmony_ci            .get_many::<String>("option")
89819625d8cSopenharmony_ci            .unwrap()
89919625d8cSopenharmony_ci            .map(|v| v.as_str())
90019625d8cSopenharmony_ci            .collect::<Vec<_>>(),
90119625d8cSopenharmony_ci        ["value1", "value2", "value3", "value4", "value5"]
90219625d8cSopenharmony_ci    );
90319625d8cSopenharmony_ci}
90419625d8cSopenharmony_ci
90519625d8cSopenharmony_ci#[test]
90619625d8cSopenharmony_cifn default_independent_of_trailing() {
90719625d8cSopenharmony_ci    let cmd = Command::new("test")
90819625d8cSopenharmony_ci        .dont_delimit_trailing_values(true)
90919625d8cSopenharmony_ci        .arg(Arg::new("pos").required(true))
91019625d8cSopenharmony_ci        .arg(
91119625d8cSopenharmony_ci            Arg::new("flag")
91219625d8cSopenharmony_ci                .long("flag")
91319625d8cSopenharmony_ci                .default_value("one,two")
91419625d8cSopenharmony_ci                .value_delimiter(','),
91519625d8cSopenharmony_ci        );
91619625d8cSopenharmony_ci
91719625d8cSopenharmony_ci    // Baseline behavior
91819625d8cSopenharmony_ci    let m = cmd
91919625d8cSopenharmony_ci        .clone()
92019625d8cSopenharmony_ci        .try_get_matches_from(vec!["program", "here"])
92119625d8cSopenharmony_ci        .unwrap();
92219625d8cSopenharmony_ci    assert_eq!(
92319625d8cSopenharmony_ci        m.get_one::<String>("pos").map(|v| v.as_str()).unwrap(),
92419625d8cSopenharmony_ci        "here"
92519625d8cSopenharmony_ci    );
92619625d8cSopenharmony_ci    assert_eq!(
92719625d8cSopenharmony_ci        m.get_many::<String>("flag")
92819625d8cSopenharmony_ci            .unwrap()
92919625d8cSopenharmony_ci            .map(|v| v.as_str())
93019625d8cSopenharmony_ci            .collect::<Vec<_>>(),
93119625d8cSopenharmony_ci        ["one", "two"]
93219625d8cSopenharmony_ci    );
93319625d8cSopenharmony_ci
93419625d8cSopenharmony_ci    // Trailing-values behavior should match the baseline
93519625d8cSopenharmony_ci    let m = cmd
93619625d8cSopenharmony_ci        .try_get_matches_from(vec!["program", "--", "here"])
93719625d8cSopenharmony_ci        .unwrap();
93819625d8cSopenharmony_ci    assert_eq!(
93919625d8cSopenharmony_ci        m.get_one::<String>("pos").map(|v| v.as_str()).unwrap(),
94019625d8cSopenharmony_ci        "here"
94119625d8cSopenharmony_ci    );
94219625d8cSopenharmony_ci    assert_eq!(
94319625d8cSopenharmony_ci        m.get_many::<String>("flag")
94419625d8cSopenharmony_ci            .unwrap()
94519625d8cSopenharmony_ci            .map(|v| v.as_str())
94619625d8cSopenharmony_ci            .collect::<Vec<_>>(),
94719625d8cSopenharmony_ci        ["one", "two"]
94819625d8cSopenharmony_ci    );
94919625d8cSopenharmony_ci}
950