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