119625d8cSopenharmony_ci#![allow(unused_imports, dead_code)]
219625d8cSopenharmony_ci
319625d8cSopenharmony_ciuse std::io::{BufRead, Cursor, Write};
419625d8cSopenharmony_ciuse std::str;
519625d8cSopenharmony_ci
619625d8cSopenharmony_ciuse clap::{arg, Arg, ArgAction, ArgGroup, Command};
719625d8cSopenharmony_ci
819625d8cSopenharmony_cipub const FULL_TEMPLATE: &str = "\
919625d8cSopenharmony_ci{before-help}{name} {version}
1019625d8cSopenharmony_ci{author-with-newline}{about-with-newline}
1119625d8cSopenharmony_ci{usage-heading} {usage}
1219625d8cSopenharmony_ci
1319625d8cSopenharmony_ci{all-args}{after-help}";
1419625d8cSopenharmony_ci
1519625d8cSopenharmony_ci#[track_caller]
1619625d8cSopenharmony_cipub fn assert_eq<S, S2>(expected: S, actual: S2)
1719625d8cSopenharmony_ciwhere
1819625d8cSopenharmony_ci    S: AsRef<str>,
1919625d8cSopenharmony_ci    S2: AsRef<str>,
2019625d8cSopenharmony_ci{
2119625d8cSopenharmony_ci    let expected = expected.as_ref();
2219625d8cSopenharmony_ci    let actual = actual.as_ref();
2319625d8cSopenharmony_ci    snapbox::assert_eq(expected, actual);
2419625d8cSopenharmony_ci}
2519625d8cSopenharmony_ci
2619625d8cSopenharmony_ci#[track_caller]
2719625d8cSopenharmony_cipub fn assert_output(l: Command, args: &str, expected: &str, stderr: bool) {
2819625d8cSopenharmony_ci    let mut buf = Cursor::new(Vec::with_capacity(50));
2919625d8cSopenharmony_ci    let res = l.try_get_matches_from(args.split(' ').collect::<Vec<_>>());
3019625d8cSopenharmony_ci    let err = res.unwrap_err();
3119625d8cSopenharmony_ci    write!(&mut buf, "{err}").unwrap();
3219625d8cSopenharmony_ci    let actual = buf.into_inner();
3319625d8cSopenharmony_ci    let actual = String::from_utf8(actual).unwrap();
3419625d8cSopenharmony_ci    assert_eq!(
3519625d8cSopenharmony_ci        stderr,
3619625d8cSopenharmony_ci        err.use_stderr(),
3719625d8cSopenharmony_ci        "Should Use STDERR failed. Should be {} but is {}",
3819625d8cSopenharmony_ci        stderr,
3919625d8cSopenharmony_ci        err.use_stderr()
4019625d8cSopenharmony_ci    );
4119625d8cSopenharmony_ci    assert_eq(expected, actual)
4219625d8cSopenharmony_ci}
4319625d8cSopenharmony_ci
4419625d8cSopenharmony_ci// Legacy tests from the python script days
4519625d8cSopenharmony_ci
4619625d8cSopenharmony_cipub fn complex_app() -> Command {
4719625d8cSopenharmony_ci    let opt3_vals = ["fast", "slow"];
4819625d8cSopenharmony_ci    let pos3_vals = ["vi", "emacs"];
4919625d8cSopenharmony_ci
5019625d8cSopenharmony_ci    Command::new("clap-test")
5119625d8cSopenharmony_ci        .version("v1.4.8")
5219625d8cSopenharmony_ci        .about("tests clap library")
5319625d8cSopenharmony_ci        .author("Kevin K. <kbknapp@gmail.com>")
5419625d8cSopenharmony_ci        .help_template(FULL_TEMPLATE)
5519625d8cSopenharmony_ci        .arg(
5619625d8cSopenharmony_ci            arg!(
5719625d8cSopenharmony_ci                -o --option <opt> "tests options"
5819625d8cSopenharmony_ci            )
5919625d8cSopenharmony_ci            .required(false)
6019625d8cSopenharmony_ci            .num_args(1..)
6119625d8cSopenharmony_ci            .action(ArgAction::Append),
6219625d8cSopenharmony_ci        )
6319625d8cSopenharmony_ci        .arg(arg!([positional] "tests positionals"))
6419625d8cSopenharmony_ci        .arg(
6519625d8cSopenharmony_ci            arg!(-f --flag  "tests flags")
6619625d8cSopenharmony_ci                .action(ArgAction::Count)
6719625d8cSopenharmony_ci                .global(true),
6819625d8cSopenharmony_ci        )
6919625d8cSopenharmony_ci        .args([
7019625d8cSopenharmony_ci            arg!(flag2: -F "tests flags with exclusions")
7119625d8cSopenharmony_ci                .conflicts_with("flag")
7219625d8cSopenharmony_ci                .requires("long-option-2")
7319625d8cSopenharmony_ci                .action(ArgAction::SetTrue),
7419625d8cSopenharmony_ci            arg!(--"long-option-2" <option2> "tests long options with exclusions")
7519625d8cSopenharmony_ci                .conflicts_with("option")
7619625d8cSopenharmony_ci                .requires("positional2"),
7719625d8cSopenharmony_ci            arg!([positional2] "tests positionals with exclusions"),
7819625d8cSopenharmony_ci            arg!(-O --option3 <option3> "specific vals").value_parser(opt3_vals),
7919625d8cSopenharmony_ci            arg!([positional3] ... "tests specific values").value_parser(pos3_vals),
8019625d8cSopenharmony_ci            arg!(--multvals <val> "Tests multiple values, not mult occs")
8119625d8cSopenharmony_ci                .value_names(["one", "two"]),
8219625d8cSopenharmony_ci            arg!(--multvalsmo <val> ... "Tests multiple values, and mult occs")
8319625d8cSopenharmony_ci                .value_names(["one", "two"]),
8419625d8cSopenharmony_ci            arg!(--minvals2 <minvals> "Tests 2 min vals").num_args(2..),
8519625d8cSopenharmony_ci            arg!(--maxvals3 <maxvals> "Tests 3 max vals").num_args(1..=3),
8619625d8cSopenharmony_ci            arg!(--optvaleq <optval> "Tests optional value, require = sign")
8719625d8cSopenharmony_ci                .num_args(0..=1)
8819625d8cSopenharmony_ci                .require_equals(true),
8919625d8cSopenharmony_ci            arg!(--optvalnoeq <optval> "Tests optional value").num_args(0..=1),
9019625d8cSopenharmony_ci        ])
9119625d8cSopenharmony_ci        .subcommand(
9219625d8cSopenharmony_ci            Command::new("subcmd")
9319625d8cSopenharmony_ci                .about("tests subcommands")
9419625d8cSopenharmony_ci                .version("0.1")
9519625d8cSopenharmony_ci                .author("Kevin K. <kbknapp@gmail.com>")
9619625d8cSopenharmony_ci                .help_template(FULL_TEMPLATE)
9719625d8cSopenharmony_ci                .arg(arg!(-o --option <scoption> "tests options").num_args(1..))
9819625d8cSopenharmony_ci                .arg(arg!(-s --subcmdarg <subcmdarg> "tests other args"))
9919625d8cSopenharmony_ci                .arg(arg!([scpositional] "tests positionals")),
10019625d8cSopenharmony_ci        )
10119625d8cSopenharmony_ci}
102