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