1// https://github.com/TeXitoi/structopt/issues/{NUMBER} 2 3use crate::utils; 4 5use clap::{ArgGroup, Args, Parser, Subcommand}; 6 7#[test] 8fn issue_151_groups_within_subcommands() { 9 #[derive(Args, Debug)] 10 #[command(group = ArgGroup::new("verb").required(true).multiple(true))] 11 struct Opt { 12 #[arg(long, group = "verb")] 13 foo: Option<String>, 14 #[arg(long, group = "verb")] 15 bar: Option<String>, 16 } 17 18 #[derive(Debug, Parser)] 19 struct Cli { 20 #[command(flatten)] 21 a: Opt, 22 } 23 24 assert!(Cli::try_parse_from(["test"]).is_err()); 25 assert!(Cli::try_parse_from(["test", "--foo=v1"]).is_ok()); 26 assert!(Cli::try_parse_from(["test", "--bar=v2"]).is_ok()); 27 assert!(Cli::try_parse_from(["test", "--zebra=v3"]).is_err()); 28 assert!(Cli::try_parse_from(["test", "--foo=v1", "--bar=v2"]).is_ok()); 29} 30 31#[test] 32fn issue_289() { 33 #[derive(Parser)] 34 #[command(infer_subcommands = true)] 35 enum Args { 36 SomeCommand { 37 #[command(subcommand)] 38 sub: SubSubCommand, 39 }, 40 AnotherCommand, 41 } 42 43 #[derive(Subcommand)] 44 #[command(infer_subcommands = true)] 45 enum SubSubCommand { 46 TestCommand, 47 } 48 49 assert!(Args::try_parse_from(["test", "some-command", "test-command"]).is_ok()); 50 assert!(Args::try_parse_from(["test", "some", "test-command"]).is_ok()); 51 assert!(Args::try_parse_from(["test", "some-command", "test"]).is_ok()); 52 assert!(Args::try_parse_from(["test", "some", "test"]).is_ok()); 53} 54 55#[test] 56fn issue_324() { 57 fn my_version() -> &'static str { 58 "MY_VERSION" 59 } 60 61 #[derive(Parser)] 62 #[command(version = my_version())] 63 #[command(help_template = utils::FULL_TEMPLATE)] 64 struct Opt { 65 #[command(subcommand)] 66 _cmd: SubCommand, 67 } 68 69 #[derive(Subcommand)] 70 enum SubCommand { 71 Start, 72 } 73 74 let help = utils::get_long_help::<Opt>(); 75 assert!(help.contains("MY_VERSION")); 76} 77 78#[test] 79fn issue_418() { 80 #[derive(Debug, Parser)] 81 struct Opts { 82 #[command(subcommand)] 83 /// The command to run 84 command: Command, 85 } 86 87 #[derive(Debug, Subcommand)] 88 enum Command { 89 /// Reticulate the splines 90 #[command(visible_alias = "ret")] 91 Reticulate { 92 /// How many splines 93 num_splines: u8, 94 }, 95 /// Frobnicate the rest 96 #[command(visible_alias = "frob")] 97 Frobnicate, 98 } 99 100 let help = utils::get_long_help::<Opts>(); 101 assert!(help.contains("Reticulate the splines [aliases: ret]")); 102} 103 104#[test] 105fn issue_490() { 106 use clap::Parser; 107 use std::iter::FromIterator; 108 use std::str::FromStr; 109 110 struct U16ish; 111 impl FromStr for U16ish { 112 type Err = (); 113 fn from_str(_: &str) -> Result<Self, Self::Err> { 114 unimplemented!() 115 } 116 } 117 impl<'a> FromIterator<&'a U16ish> for Vec<u16> { 118 fn from_iter<T: IntoIterator<Item = &'a U16ish>>(_: T) -> Self { 119 unimplemented!() 120 } 121 } 122 123 #[derive(Parser, Debug)] 124 struct Opt { 125 opt_vec: Vec<u16>, 126 #[arg(long)] 127 opt_opt_vec: Option<Vec<u16>>, 128 } 129 130 // Assert that it compiles 131} 132