From 5e20a29b4fdc8a2d442d1093681b396dcb4b816b Mon Sep 17 00:00:00 2001 From: Robin Krahl Date: Tue, 7 Jan 2020 11:18:04 +0000 Subject: Add structopt dependency in version 0.3.7 This patch series replaces argparse with structopt in the argument handling code. As a first step, we need structopt as a dependency. Import subrepo structopt/:structopt at efbdda4753592e27bc430fb01f7b9650b2f3174d Import subrepo bitflags/:bitflags at 30668016aca6bd3b02c766e8347e0b4080d4c296 Import subrepo clap/:clap at 784524f7eb193e35f81082cc69454c8c21b948f7 Import subrepo heck/:heck at 093d56fbf001e1506e56dbfa38631d99b1066df1 Import subrepo proc-macro-error/:proc-macro-error at 6c4cfe79a622c5de8ae68557993542be46eacae2 Import subrepo proc-macro2/:proc-macro2 at d5d48eddca4566e5438e8a2cbed4a74e049544de Import subrepo quote/:quote at 727436c6c137b20f0f34dde5d8fda2679b9747ad Import subrepo rustversion/:rustversion at 0c5663313516263059ce9059ef81fc7a1cf655ca Import subrepo syn-mid/:syn-mid at 5d3d85414a9e6674e1857ec22a87b96e04a6851a Import subrepo syn/:syn at e87c27e87f6f4ef8919d0372bdb056d53ef0d8f3 Import subrepo textwrap/:textwrap at abcd618beae3f74841032aa5b53c1086b0a57ca2 Import subrepo unicode-segmentation/:unicode-segmentation at 637c9874c4fe0c205ff27787faf150a40295c6c3 Import subrepo unicode-width/:unicode-width at 3033826f8bf05e82724140a981d5941e48fce393 Import subrepo unicode-xid/:unicode-xid at 4baae9fffb156ba229665b972a9cd5991787ceb7 --- clap/tests/subcommands.rs | 216 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100644 clap/tests/subcommands.rs (limited to 'clap/tests/subcommands.rs') diff --git a/clap/tests/subcommands.rs b/clap/tests/subcommands.rs new file mode 100644 index 0000000..6257aaf --- /dev/null +++ b/clap/tests/subcommands.rs @@ -0,0 +1,216 @@ +extern crate clap; +extern crate regex; + +include!("../clap-test.rs"); + +use clap::{App, Arg, SubCommand, ErrorKind}; + +static VISIBLE_ALIAS_HELP: &'static str = "clap-test 2.6 + +USAGE: + clap-test [SUBCOMMAND] + +FLAGS: + -h, --help Prints help information + -V, --version Prints version information + +SUBCOMMANDS: + help Prints this message or the help of the given subcommand(s) + test Some help [aliases: dongle, done]"; + +static INVISIBLE_ALIAS_HELP: &'static str = "clap-test 2.6 + +USAGE: + clap-test [SUBCOMMAND] + +FLAGS: + -h, --help Prints help information + -V, --version Prints version information + +SUBCOMMANDS: + help Prints this message or the help of the given subcommand(s) + test Some help"; + +#[cfg(feature = "suggestions")] +static DYM_SUBCMD: &'static str = "error: The subcommand 'subcm' wasn't recognized + Did you mean 'subcmd'? + +If you believe you received this message in error, try re-running with 'dym -- subcm' + +USAGE: + dym [SUBCOMMAND] + +For more information try --help"; + +#[test] +fn subcommand() { + let m = App::new("test") + .subcommand(SubCommand::with_name("some") + .arg(Arg::with_name("test") + .short("t") + .long("test") + .takes_value(true) + .help("testing testing"))) + .arg(Arg::with_name("other").long("other")) + .get_matches_from(vec!["myprog", "some", "--test", "testing"]); + + assert_eq!(m.subcommand_name().unwrap(), "some"); + let sub_m = m.subcommand_matches("some").unwrap(); + assert!(sub_m.is_present("test")); + assert_eq!(sub_m.value_of("test").unwrap(), "testing"); +} + +#[test] +fn subcommand_none_given() { + let m = App::new("test") + .subcommand(SubCommand::with_name("some") + .arg(Arg::with_name("test") + .short("t") + .long("test") + .takes_value(true) + .help("testing testing"))) + .arg(Arg::with_name("other").long("other")) + .get_matches_from(vec![""]); + + assert!(m.subcommand_name().is_none()); +} + +#[test] +fn subcommand_multiple() { + let m = App::new("test") + .subcommands(vec![ + SubCommand::with_name("some") + .arg(Arg::with_name("test") + .short("t") + .long("test") + .takes_value(true) + .help("testing testing")), + SubCommand::with_name("add") + .arg(Arg::with_name("roster").short("r")) + ]) + .arg(Arg::with_name("other").long("other")) + .get_matches_from(vec!["myprog", "some", "--test", "testing"]); + + assert!(m.subcommand_matches("some").is_some()); + assert!(m.subcommand_matches("add").is_none()); + assert_eq!(m.subcommand_name().unwrap(), "some"); + let sub_m = m.subcommand_matches("some").unwrap(); + assert!(sub_m.is_present("test")); + assert_eq!(sub_m.value_of("test").unwrap(), "testing"); +} + +#[test] +fn single_alias() { + let m = App::new("myprog") + .subcommand(SubCommand::with_name("test") + .alias("do-stuff")) + .get_matches_from(vec!["myprog", "do-stuff"]); + assert_eq!(m.subcommand_name(), Some("test")); +} + +#[test] +fn multiple_aliases() { + let m = App::new("myprog") + .subcommand(SubCommand::with_name("test") + .aliases(&["do-stuff", "test-stuff"])) + .get_matches_from(vec!["myprog", "test-stuff"]); + assert_eq!(m.subcommand_name(), Some("test")); +} + +#[test] +#[cfg(feature="suggestions")] +fn subcmd_did_you_mean_output() { + let app = App::new("dym") + .subcommand(SubCommand::with_name("subcmd")); + assert!(test::compare_output(app, "dym subcm", DYM_SUBCMD, true)); +} + +#[test] +#[cfg(feature="suggestions")] +fn subcmd_did_you_mean_output_arg() { + static EXPECTED: &'static str = "error: Found argument '--subcmarg' which wasn't expected, or isn't valid in this context +\tDid you mean to put '--subcmdarg' after the subcommand 'subcmd'? + +USAGE: + dym [SUBCOMMAND] + +For more information try --help"; + + let app = App::new("dym") + .subcommand(SubCommand::with_name("subcmd") + .arg_from_usage("-s --subcmdarg [subcmdarg] 'tests'") ); + assert!(test::compare_output(app, "dym --subcmarg subcmd", EXPECTED, true)); +} + +#[test] +#[cfg(feature="suggestions")] +fn subcmd_did_you_mean_output_arg_false_positives() { + static EXPECTED: &'static str = "error: Found argument '--subcmarg' which wasn't expected, or isn't valid in this context + +USAGE: + dym [SUBCOMMAND] + +For more information try --help"; + + let app = App::new("dym") + .subcommand(SubCommand::with_name("subcmd") + .arg_from_usage("-s --subcmdarg [subcmdarg] 'tests'") ); + assert!(test::compare_output(app, "dym --subcmarg foo", EXPECTED, true)); +} + +#[test] +fn alias_help() { + let m = App::new("myprog") + .subcommand(SubCommand::with_name("test") + .alias("do-stuff")) + .get_matches_from_safe(vec!["myprog", "help", "do-stuff"]); + assert!(m.is_err()); + assert_eq!(m.unwrap_err().kind, ErrorKind::HelpDisplayed); +} + +#[test] +fn visible_aliases_help_output() { + let app = App::new("clap-test") + .version("2.6") + .subcommand(SubCommand::with_name("test") + .about("Some help") + .alias("invisible") + .visible_alias("dongle") + .visible_alias("done")); + assert!(test::compare_output(app, "clap-test --help", VISIBLE_ALIAS_HELP, false)); +} + +#[test] +fn invisible_aliases_help_output() { + let app = App::new("clap-test") + .version("2.6") + .subcommand(SubCommand::with_name("test") + .about("Some help") + .alias("invisible")); + assert!(test::compare_output(app, "clap-test --help", INVISIBLE_ALIAS_HELP, false)); +} + +#[test] +fn issue_1031_args_with_same_name() { + let res = App::new("prog") + .arg(Arg::from_usage("--ui-path=")) + .subcommand(SubCommand::with_name("signer")) + .get_matches_from_safe(vec!["prog", "--ui-path", "signer"]); + + assert!(res.is_ok(), "{:?}", res.unwrap_err().kind); + let m = res.unwrap(); + assert_eq!(m.value_of("ui-path"), Some("signer")); +} + +#[test] +fn issue_1031_args_with_same_name_no_more_vals() { + let res = App::new("prog") + .arg(Arg::from_usage("--ui-path=")) + .subcommand(SubCommand::with_name("signer")) + .get_matches_from_safe(vec!["prog", "--ui-path", "value", "signer"]); + + assert!(res.is_ok(), "{:?}", res.unwrap_err().kind); + let m = res.unwrap(); + assert_eq!(m.value_of("ui-path"), Some("value")); + assert_eq!(m.subcommand_name(), Some("signer")); +} -- cgit v1.2.1