• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use super::utils;
2 
3 use clap::{arg, Arg, ArgAction, Command};
4 
5 #[test]
single_short_alias_of_option()6 fn single_short_alias_of_option() {
7     let a = Command::new("single_alias")
8         .arg(
9             Arg::new("alias")
10                 .long("alias")
11                 .action(ArgAction::Set)
12                 .help("single short alias")
13                 .short_alias('a'),
14         )
15         .try_get_matches_from(vec!["", "-a", "cool"]);
16     assert!(a.is_ok(), "{}", a.unwrap_err());
17     let a = a.unwrap();
18     assert!(a.contains_id("alias"));
19     assert_eq!(
20         a.get_one::<String>("alias").map(|v| v.as_str()).unwrap(),
21         "cool"
22     );
23 }
24 
25 #[test]
multiple_short_aliases_of_option()26 fn multiple_short_aliases_of_option() {
27     let a = Command::new("multiple_aliases").arg(
28         Arg::new("aliases")
29             .long("aliases")
30             .action(ArgAction::Set)
31             .help("multiple aliases")
32             .short_aliases(['1', '2', '3']),
33     );
34     let long = a
35         .clone()
36         .try_get_matches_from(vec!["", "--aliases", "value"]);
37     assert!(long.is_ok(), "{}", long.unwrap_err());
38     let long = long.unwrap();
39 
40     let als1 = a.clone().try_get_matches_from(vec!["", "-1", "value"]);
41     assert!(als1.is_ok(), "{}", als1.unwrap_err());
42     let als1 = als1.unwrap();
43 
44     let als2 = a.clone().try_get_matches_from(vec!["", "-2", "value"]);
45     assert!(als2.is_ok(), "{}", als2.unwrap_err());
46     let als2 = als2.unwrap();
47 
48     let als3 = a.clone().try_get_matches_from(vec!["", "-3", "value"]);
49     assert!(als3.is_ok(), "{}", als3.unwrap_err());
50     let als3 = als3.unwrap();
51 
52     assert!(long.contains_id("aliases"));
53     assert!(als1.contains_id("aliases"));
54     assert!(als2.contains_id("aliases"));
55     assert!(als3.contains_id("aliases"));
56     assert_eq!(
57         long.get_one::<String>("aliases")
58             .map(|v| v.as_str())
59             .unwrap(),
60         "value"
61     );
62     assert_eq!(
63         als1.get_one::<String>("aliases")
64             .map(|v| v.as_str())
65             .unwrap(),
66         "value"
67     );
68     assert_eq!(
69         als2.get_one::<String>("aliases")
70             .map(|v| v.as_str())
71             .unwrap(),
72         "value"
73     );
74     assert_eq!(
75         als3.get_one::<String>("aliases")
76             .map(|v| v.as_str())
77             .unwrap(),
78         "value"
79     );
80 }
81 
82 #[test]
single_short_alias_of_flag()83 fn single_short_alias_of_flag() {
84     let a = Command::new("test")
85         .arg(
86             Arg::new("flag")
87                 .long("flag")
88                 .short_alias('f')
89                 .action(ArgAction::SetTrue),
90         )
91         .try_get_matches_from(vec!["", "-f"]);
92     assert!(a.is_ok(), "{}", a.unwrap_err());
93     let a = a.unwrap();
94     assert!(*a.get_one::<bool>("flag").expect("defaulted by clap"));
95 }
96 
97 #[test]
multiple_short_aliases_of_flag()98 fn multiple_short_aliases_of_flag() {
99     let a = Command::new("test").arg(
100         Arg::new("flag")
101             .long("flag")
102             .short_aliases(['a', 'b', 'c', 'd', 'e'])
103             .action(ArgAction::SetTrue),
104     );
105 
106     let flag = a.clone().try_get_matches_from(vec!["", "--flag"]);
107     assert!(flag.is_ok(), "{}", flag.unwrap_err());
108     let flag = flag.unwrap();
109 
110     let als1 = a.clone().try_get_matches_from(vec!["", "-a"]);
111     assert!(als1.is_ok(), "{}", als1.unwrap_err());
112     let als1 = als1.unwrap();
113 
114     let als2 = a.clone().try_get_matches_from(vec!["", "-b"]);
115     assert!(als2.is_ok(), "{}", als2.unwrap_err());
116     let als2 = als2.unwrap();
117 
118     let als3 = a.clone().try_get_matches_from(vec!["", "-c"]);
119     assert!(als3.is_ok(), "{}", als3.unwrap_err());
120     let als3 = als3.unwrap();
121 
122     assert!(*flag.get_one::<bool>("flag").expect("defaulted by clap"));
123     assert!(*als1.get_one::<bool>("flag").expect("defaulted by clap"));
124     assert!(*als2.get_one::<bool>("flag").expect("defaulted by clap"));
125     assert!(*als3.get_one::<bool>("flag").expect("defaulted by clap"));
126 }
127 
128 #[test]
short_alias_on_a_subcommand_option()129 fn short_alias_on_a_subcommand_option() {
130     let m = Command::new("test")
131         .subcommand(
132             Command::new("some").arg(
133                 Arg::new("test")
134                     .short('t')
135                     .long("test")
136                     .action(ArgAction::Set)
137                     .short_alias('o')
138                     .help("testing testing"),
139             ),
140         )
141         .arg(
142             Arg::new("other")
143                 .long("other")
144                 .short_aliases(['1', '2', '3']),
145         )
146         .try_get_matches_from(vec!["test", "some", "-o", "awesome"])
147         .unwrap();
148 
149     assert!(m.subcommand_matches("some").is_some());
150     let sub_m = m.subcommand_matches("some").unwrap();
151     assert!(sub_m.contains_id("test"));
152     assert_eq!(
153         sub_m.get_one::<String>("test").map(|v| v.as_str()).unwrap(),
154         "awesome"
155     );
156 }
157 
158 #[test]
invisible_short_arg_aliases_help_output()159 fn invisible_short_arg_aliases_help_output() {
160     static SC_INVISIBLE_ALIAS_HELP: &str = "\
161 Some help
162 
163 Usage: ct test [OPTIONS]
164 
165 Options:
166   -o, --opt <opt>
167   -f, --flag
168   -h, --help       Print help
169   -V, --version    Print version
170 ";
171 
172     let cmd = Command::new("ct").author("Salim Afiune").subcommand(
173         Command::new("test")
174             .about("Some help")
175             .version("1.2")
176             .arg(
177                 Arg::new("opt")
178                     .long("opt")
179                     .short('o')
180                     .action(ArgAction::Set)
181                     .short_aliases(['a', 'b', 'c']),
182             )
183             .arg(arg!(-f - -flag).short_aliases(['x', 'y', 'z'])),
184     );
185     utils::assert_output(cmd, "ct test --help", SC_INVISIBLE_ALIAS_HELP, false);
186 }
187 
188 #[test]
visible_short_arg_aliases_help_output()189 fn visible_short_arg_aliases_help_output() {
190     static SC_VISIBLE_ALIAS_HELP: &str = "\
191 Some help
192 
193 Usage: ct test [OPTIONS]
194 
195 Options:
196   -o, --opt <opt>  [short aliases: v]
197   -f, --flag       [aliases: flag1] [short aliases: a, b, ��]
198   -h, --help       Print help
199   -V, --version    Print version
200 ";
201 
202     let cmd = Command::new("ct").author("Salim Afiune").subcommand(
203         Command::new("test")
204             .about("Some help")
205             .version("1.2")
206             .arg(
207                 Arg::new("opt")
208                     .long("opt")
209                     .short('o')
210                     .action(ArgAction::Set)
211                     .short_alias('i')
212                     .visible_short_alias('v'),
213             )
214             .arg(
215                 Arg::new("flg")
216                     .long("flag")
217                     .short('f')
218                     .action(ArgAction::SetTrue)
219                     .visible_alias("flag1")
220                     .visible_short_aliases(['a', 'b', '��']),
221             ),
222     );
223     utils::assert_output(cmd, "ct test --help", SC_VISIBLE_ALIAS_HELP, false);
224 }
225