119625d8cSopenharmony_ciuse clap::{arg, Arg, ArgAction, Command};
219625d8cSopenharmony_ci
319625d8cSopenharmony_ci#[cfg(feature = "error-context")]
419625d8cSopenharmony_ciuse super::utils;
519625d8cSopenharmony_ci
619625d8cSopenharmony_ci#[test]
719625d8cSopenharmony_cifn flag_using_short() {
819625d8cSopenharmony_ci    let m = Command::new("flag")
919625d8cSopenharmony_ci        .args([
1019625d8cSopenharmony_ci            arg!(-f --flag "some flag").action(ArgAction::SetTrue),
1119625d8cSopenharmony_ci            arg!(-c --color "some other flag").action(ArgAction::SetTrue),
1219625d8cSopenharmony_ci        ])
1319625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-f", "-c"])
1419625d8cSopenharmony_ci        .unwrap();
1519625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("flag").expect("defaulted by clap"));
1619625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("color").expect("defaulted by clap"));
1719625d8cSopenharmony_ci}
1819625d8cSopenharmony_ci
1919625d8cSopenharmony_ci#[test]
2019625d8cSopenharmony_cifn lots_o_flags_sep() {
2119625d8cSopenharmony_ci    let r = Command::new("opts")
2219625d8cSopenharmony_ci        .args_override_self(true)
2319625d8cSopenharmony_ci        .arg(arg!(o: -o ... "some flag").action(ArgAction::SetTrue))
2419625d8cSopenharmony_ci        .try_get_matches_from(vec![
2519625d8cSopenharmony_ci            "", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o",
2619625d8cSopenharmony_ci            "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o",
2719625d8cSopenharmony_ci            "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o",
2819625d8cSopenharmony_ci            "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o",
2919625d8cSopenharmony_ci            "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o",
3019625d8cSopenharmony_ci            "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o",
3119625d8cSopenharmony_ci            "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o",
3219625d8cSopenharmony_ci            "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o",
3319625d8cSopenharmony_ci            "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o",
3419625d8cSopenharmony_ci            "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o",
3519625d8cSopenharmony_ci            "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o",
3619625d8cSopenharmony_ci            "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o",
3719625d8cSopenharmony_ci            "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o",
3819625d8cSopenharmony_ci            "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o",
3919625d8cSopenharmony_ci            "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o",
4019625d8cSopenharmony_ci            "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o",
4119625d8cSopenharmony_ci            "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o",
4219625d8cSopenharmony_ci            "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o",
4319625d8cSopenharmony_ci            "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o",
4419625d8cSopenharmony_ci            "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o",
4519625d8cSopenharmony_ci            "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o", "-o",
4619625d8cSopenharmony_ci            "-o", "-o", "-o",
4719625d8cSopenharmony_ci        ]);
4819625d8cSopenharmony_ci    assert!(r.is_ok(), "{:?}", r.unwrap_err().kind());
4919625d8cSopenharmony_ci    let m = r.unwrap();
5019625d8cSopenharmony_ci    assert!(m.contains_id("o"));
5119625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("o").expect("defaulted by clap"));
5219625d8cSopenharmony_ci}
5319625d8cSopenharmony_ci
5419625d8cSopenharmony_ci#[test]
5519625d8cSopenharmony_cifn lots_o_flags_combined() {
5619625d8cSopenharmony_ci    let r = Command::new("opts")
5719625d8cSopenharmony_ci        .args_override_self(true)
5819625d8cSopenharmony_ci        .arg(arg!(o: -o ... "some flag").action(ArgAction::SetTrue))
5919625d8cSopenharmony_ci        .try_get_matches_from(vec![
6019625d8cSopenharmony_ci            "",
6119625d8cSopenharmony_ci            "-oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo",
6219625d8cSopenharmony_ci            "-oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo",
6319625d8cSopenharmony_ci            "-oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo",
6419625d8cSopenharmony_ci            "-oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo",
6519625d8cSopenharmony_ci            "-ooooooooooooooooooooooooooooooooooooooooo",
6619625d8cSopenharmony_ci        ]);
6719625d8cSopenharmony_ci    assert!(r.is_ok(), "{:?}", r.unwrap_err().kind());
6819625d8cSopenharmony_ci    let m = r.unwrap();
6919625d8cSopenharmony_ci    assert!(m.contains_id("o"));
7019625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("o").expect("defaulted by clap"));
7119625d8cSopenharmony_ci}
7219625d8cSopenharmony_ci
7319625d8cSopenharmony_ci#[test]
7419625d8cSopenharmony_cifn flag_using_long() {
7519625d8cSopenharmony_ci    let m = Command::new("flag")
7619625d8cSopenharmony_ci        .args([
7719625d8cSopenharmony_ci            arg!(--flag "some flag").action(ArgAction::SetTrue),
7819625d8cSopenharmony_ci            arg!(--color "some other flag").action(ArgAction::SetTrue),
7919625d8cSopenharmony_ci        ])
8019625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--flag", "--color"])
8119625d8cSopenharmony_ci        .unwrap();
8219625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("flag").expect("defaulted by clap"));
8319625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("color").expect("defaulted by clap"));
8419625d8cSopenharmony_ci}
8519625d8cSopenharmony_ci
8619625d8cSopenharmony_ci#[test]
8719625d8cSopenharmony_cifn flag_using_long_with_literals() {
8819625d8cSopenharmony_ci    use clap::error::ErrorKind;
8919625d8cSopenharmony_ci
9019625d8cSopenharmony_ci    let m = Command::new("flag")
9119625d8cSopenharmony_ci        .arg(
9219625d8cSopenharmony_ci            Arg::new("rainbow")
9319625d8cSopenharmony_ci                .long("rainbow")
9419625d8cSopenharmony_ci                .action(ArgAction::SetTrue),
9519625d8cSopenharmony_ci        )
9619625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--rainbow=false"]);
9719625d8cSopenharmony_ci    assert!(m.is_err(), "{:#?}", m.unwrap());
9819625d8cSopenharmony_ci    assert_eq!(m.unwrap_err().kind(), ErrorKind::TooManyValues);
9919625d8cSopenharmony_ci}
10019625d8cSopenharmony_ci
10119625d8cSopenharmony_ci#[test]
10219625d8cSopenharmony_cifn flag_using_mixed() {
10319625d8cSopenharmony_ci    let m = Command::new("flag")
10419625d8cSopenharmony_ci        .args([
10519625d8cSopenharmony_ci            arg!(-f --flag "some flag").action(ArgAction::SetTrue),
10619625d8cSopenharmony_ci            arg!(-c --color "some other flag").action(ArgAction::SetTrue),
10719625d8cSopenharmony_ci        ])
10819625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-f", "--color"])
10919625d8cSopenharmony_ci        .unwrap();
11019625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("flag").expect("defaulted by clap"));
11119625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("color").expect("defaulted by clap"));
11219625d8cSopenharmony_ci
11319625d8cSopenharmony_ci    let m = Command::new("flag")
11419625d8cSopenharmony_ci        .args([
11519625d8cSopenharmony_ci            arg!(-f --flag "some flag").action(ArgAction::SetTrue),
11619625d8cSopenharmony_ci            arg!(-c --color "some other flag").action(ArgAction::SetTrue),
11719625d8cSopenharmony_ci        ])
11819625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--flag", "-c"])
11919625d8cSopenharmony_ci        .unwrap();
12019625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("flag").expect("defaulted by clap"));
12119625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("color").expect("defaulted by clap"));
12219625d8cSopenharmony_ci}
12319625d8cSopenharmony_ci
12419625d8cSopenharmony_ci#[test]
12519625d8cSopenharmony_cifn multiple_flags_in_single() {
12619625d8cSopenharmony_ci    let m = Command::new("multe_flags")
12719625d8cSopenharmony_ci        .args([
12819625d8cSopenharmony_ci            arg!(-f --flag "some flag").action(ArgAction::SetTrue),
12919625d8cSopenharmony_ci            arg!(-c --color "some other flag").action(ArgAction::SetTrue),
13019625d8cSopenharmony_ci            arg!(-d --debug "another other flag").action(ArgAction::SetTrue),
13119625d8cSopenharmony_ci        ])
13219625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "-fcd"])
13319625d8cSopenharmony_ci        .unwrap();
13419625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("flag").expect("defaulted by clap"));
13519625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("color").expect("defaulted by clap"));
13619625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("debug").expect("defaulted by clap"));
13719625d8cSopenharmony_ci}
13819625d8cSopenharmony_ci
13919625d8cSopenharmony_ci#[test]
14019625d8cSopenharmony_ci#[cfg(feature = "error-context")]
14119625d8cSopenharmony_cifn unexpected_value_error() {
14219625d8cSopenharmony_ci    const USE_FLAG_AS_ARGUMENT: &str = "\
14319625d8cSopenharmony_cierror: unexpected value 'foo' for '--a-flag' found; no more were expected
14419625d8cSopenharmony_ci
14519625d8cSopenharmony_ciUsage: mycat --a-flag [filename]
14619625d8cSopenharmony_ci
14719625d8cSopenharmony_ciFor more information, try '--help'.
14819625d8cSopenharmony_ci";
14919625d8cSopenharmony_ci
15019625d8cSopenharmony_ci    let cmd = Command::new("mycat")
15119625d8cSopenharmony_ci        .arg(Arg::new("filename"))
15219625d8cSopenharmony_ci        .arg(Arg::new("a-flag").long("a-flag").action(ArgAction::SetTrue));
15319625d8cSopenharmony_ci
15419625d8cSopenharmony_ci    utils::assert_output(cmd, "mycat --a-flag=foo", USE_FLAG_AS_ARGUMENT, true);
15519625d8cSopenharmony_ci}
15619625d8cSopenharmony_ci
15719625d8cSopenharmony_ci#[test]
15819625d8cSopenharmony_ci#[cfg(feature = "error-context")]
15919625d8cSopenharmony_cifn issue_1284_argument_in_flag_style() {
16019625d8cSopenharmony_ci    const USE_FLAG_AS_ARGUMENT: &str = "\
16119625d8cSopenharmony_cierror: unexpected argument '--another-flag' found
16219625d8cSopenharmony_ci
16319625d8cSopenharmony_ci  note: to pass '--another-flag' as a value, use '-- --another-flag'
16419625d8cSopenharmony_ci
16519625d8cSopenharmony_ciUsage: mycat [OPTIONS] [filename]
16619625d8cSopenharmony_ci
16719625d8cSopenharmony_ciFor more information, try '--help'.
16819625d8cSopenharmony_ci";
16919625d8cSopenharmony_ci
17019625d8cSopenharmony_ci    let cmd = Command::new("mycat")
17119625d8cSopenharmony_ci        .arg(Arg::new("filename"))
17219625d8cSopenharmony_ci        .arg(Arg::new("a-flag").long("a-flag").action(ArgAction::SetTrue));
17319625d8cSopenharmony_ci
17419625d8cSopenharmony_ci    let m = cmd
17519625d8cSopenharmony_ci        .clone()
17619625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--", "--another-flag"])
17719625d8cSopenharmony_ci        .unwrap();
17819625d8cSopenharmony_ci    assert_eq!(
17919625d8cSopenharmony_ci        m.get_one::<String>("filename").map(|v| v.as_str()),
18019625d8cSopenharmony_ci        Some("--another-flag")
18119625d8cSopenharmony_ci    );
18219625d8cSopenharmony_ci
18319625d8cSopenharmony_ci    let m = cmd
18419625d8cSopenharmony_ci        .clone()
18519625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--a-flag"])
18619625d8cSopenharmony_ci        .unwrap();
18719625d8cSopenharmony_ci    assert!(*m.get_one::<bool>("a-flag").expect("defaulted by clap"));
18819625d8cSopenharmony_ci
18919625d8cSopenharmony_ci    let m = cmd
19019625d8cSopenharmony_ci        .clone()
19119625d8cSopenharmony_ci        .try_get_matches_from(vec!["", "--", "--a-flag"])
19219625d8cSopenharmony_ci        .unwrap();
19319625d8cSopenharmony_ci    assert_eq!(
19419625d8cSopenharmony_ci        m.get_one::<String>("filename").map(|v| v.as_str()),
19519625d8cSopenharmony_ci        Some("--a-flag")
19619625d8cSopenharmony_ci    );
19719625d8cSopenharmony_ci
19819625d8cSopenharmony_ci    utils::assert_output(cmd, "mycat --another-flag", USE_FLAG_AS_ARGUMENT, true);
19919625d8cSopenharmony_ci}
20019625d8cSopenharmony_ci
20119625d8cSopenharmony_ci#[test]
20219625d8cSopenharmony_ci#[cfg(feature = "error-context")]
20319625d8cSopenharmony_cifn issue_2308_multiple_dashes() {
20419625d8cSopenharmony_ci    static MULTIPLE_DASHES: &str = "\
20519625d8cSopenharmony_cierror: unexpected argument '-----' found
20619625d8cSopenharmony_ci
20719625d8cSopenharmony_ci  note: to pass '-----' as a value, use '-- -----'
20819625d8cSopenharmony_ci
20919625d8cSopenharmony_ciUsage: test <arg>
21019625d8cSopenharmony_ci
21119625d8cSopenharmony_ciFor more information, try '--help'.
21219625d8cSopenharmony_ci";
21319625d8cSopenharmony_ci    let cmd = Command::new("test").arg(Arg::new("arg").action(ArgAction::Set).required(true));
21419625d8cSopenharmony_ci
21519625d8cSopenharmony_ci    utils::assert_output(cmd, "test -----", MULTIPLE_DASHES, true);
21619625d8cSopenharmony_ci}
21719625d8cSopenharmony_ci
21819625d8cSopenharmony_ci#[test]
21919625d8cSopenharmony_ci#[cfg(debug_assertions)]
22019625d8cSopenharmony_ci#[should_panic = "Argument filename: long \"--filename\" must not start with a `-`, that will be handled by the parser"]
22119625d8cSopenharmony_cifn leading_dash_stripped() {
22219625d8cSopenharmony_ci    let cmd = Command::new("mycat").arg(Arg::new("filename").long("--filename"));
22319625d8cSopenharmony_ci    cmd.debug_assert();
22419625d8cSopenharmony_ci}
225