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