• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #![allow(clippy::bool_assert_comparison)]
2 
3 use clap::builder::ArgPredicate;
4 use clap::error::ErrorKind;
5 use clap::Arg;
6 use clap::ArgAction;
7 use clap::Command;
8 
9 #[test]
set()10 fn set() {
11     let cmd = Command::new("test").arg(Arg::new("mammal").long("mammal").action(ArgAction::Set));
12 
13     let matches = cmd.clone().try_get_matches_from(["test"]).unwrap();
14     assert_eq!(matches.get_one::<String>("mammal"), None);
15     assert_eq!(matches.contains_id("mammal"), false);
16     assert_eq!(matches.index_of("mammal"), None);
17 
18     let matches = cmd
19         .clone()
20         .try_get_matches_from(["test", "--mammal", "dog"])
21         .unwrap();
22     assert_eq!(matches.get_one::<String>("mammal").unwrap(), "dog");
23     assert_eq!(matches.contains_id("mammal"), true);
24     assert_eq!(matches.index_of("mammal"), Some(2));
25 
26     let result = cmd
27         .clone()
28         .try_get_matches_from(["test", "--mammal", "dog", "--mammal", "cat"]);
29     let err = result.err().unwrap();
30     assert_eq!(err.kind(), ErrorKind::ArgumentConflict);
31 
32     let matches = cmd
33         .clone()
34         .args_override_self(true)
35         .try_get_matches_from(["test", "--mammal", "dog", "--mammal", "cat"])
36         .unwrap();
37     assert_eq!(matches.get_one::<String>("mammal").unwrap(), "cat");
38     assert_eq!(matches.contains_id("mammal"), true);
39     assert_eq!(matches.index_of("mammal"), Some(4));
40 }
41 
42 #[test]
append()43 fn append() {
44     let cmd = Command::new("test").arg(Arg::new("mammal").long("mammal").action(ArgAction::Append));
45 
46     let matches = cmd.clone().try_get_matches_from(["test"]).unwrap();
47     assert_eq!(matches.get_one::<String>("mammal"), None);
48     assert_eq!(matches.contains_id("mammal"), false);
49     assert_eq!(matches.index_of("mammal"), None);
50 
51     let matches = cmd
52         .clone()
53         .try_get_matches_from(["test", "--mammal", "dog"])
54         .unwrap();
55     assert_eq!(matches.get_one::<String>("mammal").unwrap(), "dog");
56     assert_eq!(matches.contains_id("mammal"), true);
57     assert_eq!(
58         matches.indices_of("mammal").unwrap().collect::<Vec<_>>(),
59         vec![2]
60     );
61 
62     let matches = cmd
63         .clone()
64         .try_get_matches_from(["test", "--mammal", "dog", "--mammal", "cat"])
65         .unwrap();
66     assert_eq!(
67         matches
68             .get_many::<String>("mammal")
69             .unwrap()
70             .map(|s| s.as_str())
71             .collect::<Vec<_>>(),
72         vec!["dog", "cat"]
73     );
74     assert_eq!(matches.contains_id("mammal"), true);
75     assert_eq!(
76         matches.indices_of("mammal").unwrap().collect::<Vec<_>>(),
77         vec![2, 4]
78     );
79 }
80 
81 #[test]
set_true()82 fn set_true() {
83     let cmd =
84         Command::new("test").arg(Arg::new("mammal").long("mammal").action(ArgAction::SetTrue));
85 
86     let matches = cmd.clone().try_get_matches_from(["test"]).unwrap();
87     assert_eq!(matches.get_flag("mammal"), false);
88     assert_eq!(matches.contains_id("mammal"), true);
89     assert_eq!(matches.index_of("mammal"), Some(1));
90 
91     let matches = cmd
92         .clone()
93         .try_get_matches_from(["test", "--mammal"])
94         .unwrap();
95     assert_eq!(matches.get_flag("mammal"), true);
96     assert_eq!(matches.contains_id("mammal"), true);
97     assert_eq!(matches.index_of("mammal"), Some(1));
98 
99     let result = cmd
100         .clone()
101         .try_get_matches_from(["test", "--mammal", "--mammal"]);
102     let err = result.err().unwrap();
103     assert_eq!(err.kind(), ErrorKind::ArgumentConflict);
104 
105     let matches = cmd
106         .clone()
107         .args_override_self(true)
108         .try_get_matches_from(["test", "--mammal", "--mammal"])
109         .unwrap();
110     assert_eq!(matches.get_flag("mammal"), true);
111     assert_eq!(matches.contains_id("mammal"), true);
112     assert_eq!(matches.index_of("mammal"), Some(2));
113 }
114 
115 #[test]
set_true_with_explicit_default_value()116 fn set_true_with_explicit_default_value() {
117     let cmd = Command::new("test").arg(
118         Arg::new("mammal")
119             .long("mammal")
120             .action(ArgAction::SetTrue)
121             .default_value("false"),
122     );
123 
124     let matches = cmd
125         .clone()
126         .try_get_matches_from(["test", "--mammal"])
127         .unwrap();
128     assert_eq!(matches.get_flag("mammal"), true);
129     assert_eq!(matches.contains_id("mammal"), true);
130     assert_eq!(matches.index_of("mammal"), Some(1));
131 
132     let matches = cmd.clone().try_get_matches_from(["test"]).unwrap();
133     assert_eq!(matches.get_flag("mammal"), false);
134     assert_eq!(matches.contains_id("mammal"), true);
135     assert_eq!(matches.index_of("mammal"), Some(1));
136 }
137 
138 #[test]
set_true_with_default_value_if_present()139 fn set_true_with_default_value_if_present() {
140     let cmd = Command::new("test")
141         .arg(
142             Arg::new("mammal")
143                 .long("mammal")
144                 .action(ArgAction::SetTrue)
145                 .default_value_if("dog", ArgPredicate::IsPresent, Some("true")),
146         )
147         .arg(Arg::new("dog").long("dog").action(ArgAction::SetTrue));
148 
149     let matches = cmd.clone().try_get_matches_from(["test"]).unwrap();
150     assert_eq!(matches.get_flag("dog"), false);
151     assert_eq!(matches.get_flag("mammal"), false);
152 
153     let matches = cmd.clone().try_get_matches_from(["test", "--dog"]).unwrap();
154     assert_eq!(matches.get_flag("dog"), true);
155     assert_eq!(matches.get_flag("mammal"), true);
156 
157     let matches = cmd
158         .clone()
159         .try_get_matches_from(["test", "--mammal"])
160         .unwrap();
161     assert_eq!(matches.get_flag("dog"), false);
162     assert_eq!(matches.get_flag("mammal"), true);
163 }
164 
165 #[test]
set_true_with_default_value_if_value()166 fn set_true_with_default_value_if_value() {
167     let cmd = Command::new("test")
168         .arg(
169             Arg::new("mammal")
170                 .long("mammal")
171                 .action(ArgAction::SetTrue)
172                 .default_value_if("dog", "true", Some("true")),
173         )
174         .arg(Arg::new("dog").long("dog").action(ArgAction::SetTrue));
175 
176     let matches = cmd.clone().try_get_matches_from(["test"]).unwrap();
177     assert_eq!(matches.get_flag("dog"), false);
178     assert_eq!(matches.get_flag("mammal"), false);
179 
180     let matches = cmd.clone().try_get_matches_from(["test", "--dog"]).unwrap();
181     assert_eq!(matches.get_flag("dog"), true);
182     assert_eq!(matches.get_flag("mammal"), true);
183 
184     let matches = cmd
185         .clone()
186         .try_get_matches_from(["test", "--mammal"])
187         .unwrap();
188     assert_eq!(matches.get_flag("dog"), false);
189     assert_eq!(matches.get_flag("mammal"), true);
190 }
191 
192 #[test]
set_true_with_required_if_eq()193 fn set_true_with_required_if_eq() {
194     let cmd = Command::new("test")
195         .arg(
196             Arg::new("mammal")
197                 .long("mammal")
198                 .action(ArgAction::SetTrue)
199                 .required_if_eq("dog", "true"),
200         )
201         .arg(Arg::new("dog").long("dog").action(ArgAction::SetTrue));
202 
203     let matches = cmd
204         .clone()
205         .try_get_matches_from(["test", "--mammal"])
206         .unwrap();
207     assert_eq!(matches.get_flag("dog"), false);
208     assert_eq!(matches.get_flag("mammal"), true);
209 
210     cmd.clone()
211         .try_get_matches_from(["test", "--dog"])
212         .unwrap_err();
213 
214     let matches = cmd
215         .clone()
216         .try_get_matches_from(["test", "--dog", "--mammal"])
217         .unwrap();
218     assert_eq!(matches.get_flag("dog"), true);
219     assert_eq!(matches.get_flag("mammal"), true);
220 }
221 
222 #[test]
set_false()223 fn set_false() {
224     let cmd = Command::new("test").arg(
225         Arg::new("mammal")
226             .long("mammal")
227             .action(ArgAction::SetFalse),
228     );
229 
230     let matches = cmd.clone().try_get_matches_from(["test"]).unwrap();
231     assert_eq!(matches.get_flag("mammal"), true);
232     assert_eq!(matches.contains_id("mammal"), true);
233     assert_eq!(matches.index_of("mammal"), Some(1));
234 
235     let matches = cmd
236         .clone()
237         .try_get_matches_from(["test", "--mammal"])
238         .unwrap();
239     assert_eq!(matches.get_flag("mammal"), false);
240     assert_eq!(matches.contains_id("mammal"), true);
241     assert_eq!(matches.index_of("mammal"), Some(1));
242 
243     let result = cmd
244         .clone()
245         .try_get_matches_from(["test", "--mammal", "--mammal"]);
246     let err = result.err().unwrap();
247     assert_eq!(err.kind(), ErrorKind::ArgumentConflict);
248 
249     let matches = cmd
250         .clone()
251         .args_override_self(true)
252         .try_get_matches_from(["test", "--mammal", "--mammal"])
253         .unwrap();
254     assert_eq!(matches.get_flag("mammal"), false);
255     assert_eq!(matches.contains_id("mammal"), true);
256     assert_eq!(matches.index_of("mammal"), Some(2));
257 }
258 
259 #[test]
set_false_with_explicit_default_value()260 fn set_false_with_explicit_default_value() {
261     let cmd = Command::new("test").arg(
262         Arg::new("mammal")
263             .long("mammal")
264             .action(ArgAction::SetFalse)
265             .default_value("true"),
266     );
267 
268     let matches = cmd
269         .clone()
270         .try_get_matches_from(["test", "--mammal"])
271         .unwrap();
272     assert_eq!(matches.get_flag("mammal"), false);
273     assert_eq!(matches.contains_id("mammal"), true);
274     assert_eq!(matches.index_of("mammal"), Some(1));
275 
276     let matches = cmd.clone().try_get_matches_from(["test"]).unwrap();
277     assert_eq!(matches.get_flag("mammal"), true);
278     assert_eq!(matches.contains_id("mammal"), true);
279     assert_eq!(matches.index_of("mammal"), Some(1));
280 }
281 
282 #[test]
set_false_with_default_value_if_present()283 fn set_false_with_default_value_if_present() {
284     let cmd = Command::new("test")
285         .arg(
286             Arg::new("mammal")
287                 .long("mammal")
288                 .action(ArgAction::SetFalse)
289                 .default_value_if("dog", ArgPredicate::IsPresent, Some("false")),
290         )
291         .arg(Arg::new("dog").long("dog").action(ArgAction::SetFalse));
292 
293     let matches = cmd.clone().try_get_matches_from(["test"]).unwrap();
294     assert_eq!(matches.get_flag("dog"), true);
295     assert_eq!(matches.get_flag("mammal"), true);
296 
297     let matches = cmd.clone().try_get_matches_from(["test", "--dog"]).unwrap();
298     assert_eq!(matches.get_flag("dog"), false);
299     assert_eq!(matches.get_flag("mammal"), false);
300 
301     let matches = cmd
302         .clone()
303         .try_get_matches_from(["test", "--mammal"])
304         .unwrap();
305     assert_eq!(matches.get_flag("dog"), true);
306     assert_eq!(matches.get_flag("mammal"), false);
307 }
308 
309 #[test]
set_false_with_default_value_if_value()310 fn set_false_with_default_value_if_value() {
311     let cmd = Command::new("test")
312         .arg(
313             Arg::new("mammal")
314                 .long("mammal")
315                 .action(ArgAction::SetFalse)
316                 .default_value_if("dog", "false", Some("false")),
317         )
318         .arg(Arg::new("dog").long("dog").action(ArgAction::SetFalse));
319 
320     let matches = cmd.clone().try_get_matches_from(["test"]).unwrap();
321     assert_eq!(matches.get_flag("dog"), true);
322     assert_eq!(matches.get_flag("mammal"), true);
323 
324     let matches = cmd.clone().try_get_matches_from(["test", "--dog"]).unwrap();
325     assert_eq!(matches.get_flag("dog"), false);
326     assert_eq!(matches.get_flag("mammal"), false);
327 
328     let matches = cmd
329         .clone()
330         .try_get_matches_from(["test", "--mammal"])
331         .unwrap();
332     assert_eq!(matches.get_flag("dog"), true);
333     assert_eq!(matches.get_flag("mammal"), false);
334 }
335 
336 #[test]
count()337 fn count() {
338     let cmd = Command::new("test").arg(Arg::new("mammal").long("mammal").action(ArgAction::Count));
339 
340     let matches = cmd.clone().try_get_matches_from(["test"]).unwrap();
341     assert_eq!(*matches.get_one::<u8>("mammal").unwrap(), 0);
342     assert_eq!(matches.contains_id("mammal"), true);
343     assert_eq!(matches.index_of("mammal"), Some(1));
344 
345     let matches = cmd
346         .clone()
347         .try_get_matches_from(["test", "--mammal"])
348         .unwrap();
349     assert_eq!(*matches.get_one::<u8>("mammal").unwrap(), 1);
350     assert_eq!(matches.contains_id("mammal"), true);
351     assert_eq!(matches.index_of("mammal"), Some(1));
352 
353     let matches = cmd
354         .clone()
355         .try_get_matches_from(["test", "--mammal", "--mammal"])
356         .unwrap();
357     assert_eq!(*matches.get_one::<u8>("mammal").unwrap(), 2);
358     assert_eq!(matches.contains_id("mammal"), true);
359     assert_eq!(matches.index_of("mammal"), Some(2));
360 }
361 
362 #[test]
count_with_explicit_default_value()363 fn count_with_explicit_default_value() {
364     let cmd = Command::new("test").arg(
365         Arg::new("mammal")
366             .long("mammal")
367             .action(ArgAction::Count)
368             .default_value("10"),
369     );
370 
371     let matches = cmd
372         .clone()
373         .try_get_matches_from(["test", "--mammal"])
374         .unwrap();
375     assert_eq!(*matches.get_one::<u8>("mammal").unwrap(), 1);
376     assert_eq!(matches.contains_id("mammal"), true);
377     assert_eq!(matches.index_of("mammal"), Some(1));
378 
379     let matches = cmd.clone().try_get_matches_from(["test"]).unwrap();
380     assert_eq!(*matches.get_one::<u8>("mammal").unwrap(), 10);
381     assert_eq!(matches.contains_id("mammal"), true);
382     assert_eq!(matches.index_of("mammal"), Some(1));
383 }
384 
385 #[test]
count_with_default_value_if_present()386 fn count_with_default_value_if_present() {
387     let cmd = Command::new("test")
388         .arg(
389             Arg::new("mammal")
390                 .long("mammal")
391                 .action(ArgAction::Count)
392                 .default_value_if("dog", ArgPredicate::IsPresent, Some("10")),
393         )
394         .arg(Arg::new("dog").long("dog").action(ArgAction::Count));
395 
396     let matches = cmd.clone().try_get_matches_from(["test"]).unwrap();
397     assert_eq!(*matches.get_one::<u8>("dog").unwrap(), 0);
398     assert_eq!(*matches.get_one::<u8>("mammal").unwrap(), 0);
399 
400     let matches = cmd.clone().try_get_matches_from(["test", "--dog"]).unwrap();
401     assert_eq!(*matches.get_one::<u8>("dog").unwrap(), 1);
402     assert_eq!(*matches.get_one::<u8>("mammal").unwrap(), 10);
403 
404     let matches = cmd
405         .clone()
406         .try_get_matches_from(["test", "--mammal"])
407         .unwrap();
408     assert_eq!(*matches.get_one::<u8>("dog").unwrap(), 0);
409     assert_eq!(*matches.get_one::<u8>("mammal").unwrap(), 1);
410 }
411 
412 #[test]
count_with_default_value_if_value()413 fn count_with_default_value_if_value() {
414     let cmd = Command::new("test")
415         .arg(
416             Arg::new("mammal")
417                 .long("mammal")
418                 .action(ArgAction::Count)
419                 .default_value_if("dog", "2", Some("10")),
420         )
421         .arg(Arg::new("dog").long("dog").action(ArgAction::Count));
422 
423     let matches = cmd.clone().try_get_matches_from(["test"]).unwrap();
424     assert_eq!(*matches.get_one::<u8>("dog").unwrap(), 0);
425     assert_eq!(*matches.get_one::<u8>("mammal").unwrap(), 0);
426 
427     let matches = cmd.clone().try_get_matches_from(["test", "--dog"]).unwrap();
428     assert_eq!(*matches.get_one::<u8>("dog").unwrap(), 1);
429     assert_eq!(*matches.get_one::<u8>("mammal").unwrap(), 0);
430 
431     let matches = cmd
432         .clone()
433         .try_get_matches_from(["test", "--dog", "--dog"])
434         .unwrap();
435     assert_eq!(*matches.get_one::<u8>("dog").unwrap(), 2);
436     assert_eq!(*matches.get_one::<u8>("mammal").unwrap(), 10);
437 
438     let matches = cmd
439         .clone()
440         .try_get_matches_from(["test", "--mammal"])
441         .unwrap();
442     assert_eq!(*matches.get_one::<u8>("dog").unwrap(), 0);
443     assert_eq!(*matches.get_one::<u8>("mammal").unwrap(), 1);
444 }
445