blob: f8eb4105823bea7e302ce1f1d68c8140405ee61d [file] [log] [blame]
Alexander Kuvaev7a2375b2015-09-06 20:08:131extern crate clap;
Kevin Kb42ca0b2016-05-10 02:46:092extern crate regex;
3
4include!("../clap-test.rs");
Alexander Kuvaev7a2375b2015-09-06 20:08:135
Kevin K7fc18e62016-01-21 05:18:536use clap::{App, Arg, ErrorKind, ArgGroup};
Alexander Kuvaev7a2375b2015-09-06 20:08:137
Kevin Kf9672352017-01-03 04:05:238static MISSING_REQ: &'static str = "error: The following required arguments were not provided:
9 <positional2>
10 --long-option-2 <option2>
11
12USAGE:
13 clap-test <positional2> -F --long-option-2 <option2>
14
15For more information try --help";
16
Kevin K92919f52017-02-03 22:43:4917static COND_REQ_IN_USAGE: &'static str = "error: The following required arguments were not provided:
18 --output <output>
19
20USAGE:
21 test --target <target> --input <input> --output <output>
22
23For more information try --help";
24
Alexander Kuvaev7a2375b2015-09-06 20:08:1325#[test]
26fn flag_required() {
27 let result = App::new("flag_required")
Kevin K92919f52017-02-03 22:43:4928 .arg(Arg::from_usage("-f, --flag 'some flag'").requires("color"))
Alexander Kuvaev7a2375b2015-09-06 20:08:1329 .arg(Arg::from_usage("-c, --color 'third flag'"))
Kevin Kf17e1502016-01-25 20:56:3730 .get_matches_from_safe(vec!["", "-f"]);
Alexander Kuvaev7a2375b2015-09-06 20:08:1331 assert!(result.is_err());
32 let err = result.err().unwrap();
Kevin K7fc18e62016-01-21 05:18:5333 assert_eq!(err.kind, ErrorKind::MissingRequiredArgument);
Alexander Kuvaev7a2375b2015-09-06 20:08:1334}
35
36#[test]
37fn flag_required_2() {
38 let m = App::new("flag_required")
Kevin K92919f52017-02-03 22:43:4939 .arg(Arg::from_usage("-f, --flag 'some flag'").requires("color"))
Alexander Kuvaev7a2375b2015-09-06 20:08:1340 .arg(Arg::from_usage("-c, --color 'third flag'"))
Kevin Kf17e1502016-01-25 20:56:3741 .get_matches_from(vec!["", "-f", "-c"]);
Alexander Kuvaev7a2375b2015-09-06 20:08:1342 assert!(m.is_present("color"));
43 assert!(m.is_present("flag"));
44}
45
46#[test]
47fn option_required() {
48 let result = App::new("option_required")
Kevin K92919f52017-02-03 22:43:4949 .arg(Arg::from_usage("-f [flag] 'some flag'").requires("color"))
Alexander Kuvaev7a2375b2015-09-06 20:08:1350 .arg(Arg::from_usage("-c [color] 'third flag'"))
Kevin Kf17e1502016-01-25 20:56:3751 .get_matches_from_safe(vec!["", "-f", "val"]);
Alexander Kuvaev7a2375b2015-09-06 20:08:1352 assert!(result.is_err());
53 let err = result.err().unwrap();
Kevin K7fc18e62016-01-21 05:18:5354 assert_eq!(err.kind, ErrorKind::MissingRequiredArgument);
Alexander Kuvaev7a2375b2015-09-06 20:08:1355}
56
57#[test]
58fn option_required_2() {
59 let m = App::new("option_required")
Kevin K92919f52017-02-03 22:43:4960 .arg(Arg::from_usage("-f [flag] 'some flag'").requires("c"))
Alexander Kuvaev7a2375b2015-09-06 20:08:1361 .arg(Arg::from_usage("-c [color] 'third flag'"))
Kevin Kf17e1502016-01-25 20:56:3762 .get_matches_from(vec!["", "-f", "val", "-c", "other_val"]);
63 assert!(m.is_present("c"));
64 assert_eq!(m.value_of("c").unwrap(), "other_val");
65 assert!(m.is_present("f"));
66 assert_eq!(m.value_of("f").unwrap(), "val");
Alexander Kuvaev7a2375b2015-09-06 20:08:1367}
68
69#[test]
70fn positional_required() {
71 let result = App::new("positional_required")
72 .arg(Arg::with_name("flag")
73 .index(1)
74 .required(true))
75 .get_matches_from_safe(vec![""]);
76 assert!(result.is_err());
77 let err = result.err().unwrap();
Kevin K7fc18e62016-01-21 05:18:5378 assert_eq!(err.kind, ErrorKind::MissingRequiredArgument);
Alexander Kuvaev7a2375b2015-09-06 20:08:1379}
80
81#[test]
82fn positional_required_2() {
83 let m = App::new("positional_required")
84 .arg(Arg::with_name("flag")
85 .index(1)
86 .required(true))
Kevin Kf17e1502016-01-25 20:56:3787 .get_matches_from(vec!["", "someval"]);
Alexander Kuvaev7a2375b2015-09-06 20:08:1388 assert!(m.is_present("flag"));
89 assert_eq!(m.value_of("flag").unwrap(), "someval");
90}
91
92#[test]
93fn group_required() {
94 let result = App::new("group_required")
95 .arg(Arg::from_usage("-f, --flag 'some flag'"))
Kevin K7fc18e62016-01-21 05:18:5396 .group(ArgGroup::with_name("gr")
Alexander Kuvaev7a2375b2015-09-06 20:08:1397 .required(true)
Kevin K7fc18e62016-01-21 05:18:5398 .arg("some")
99 .arg("other"))
Alexander Kuvaev7a2375b2015-09-06 20:08:13100 .arg(Arg::from_usage("--some 'some arg'"))
101 .arg(Arg::from_usage("--other 'other arg'"))
Kevin Kf17e1502016-01-25 20:56:37102 .get_matches_from_safe(vec!["", "-f"]);
Alexander Kuvaev7a2375b2015-09-06 20:08:13103 assert!(result.is_err());
104 let err = result.err().unwrap();
Kevin K7fc18e62016-01-21 05:18:53105 assert_eq!(err.kind, ErrorKind::MissingRequiredArgument);
Alexander Kuvaev7a2375b2015-09-06 20:08:13106}
107
108#[test]
109fn group_required_2() {
110 let m = App::new("group_required")
111 .arg(Arg::from_usage("-f, --flag 'some flag'"))
Kevin K7fc18e62016-01-21 05:18:53112 .group(ArgGroup::with_name("gr")
Alexander Kuvaev7a2375b2015-09-06 20:08:13113 .required(true)
Kevin K7fc18e62016-01-21 05:18:53114 .arg("some")
115 .arg("other"))
Alexander Kuvaev7a2375b2015-09-06 20:08:13116 .arg(Arg::from_usage("--some 'some arg'"))
117 .arg(Arg::from_usage("--other 'other arg'"))
Kevin Kf17e1502016-01-25 20:56:37118 .get_matches_from(vec!["", "-f", "--some"]);
Alexander Kuvaev7a2375b2015-09-06 20:08:13119 assert!(m.is_present("some"));
120 assert!(!m.is_present("other"));
121 assert!(m.is_present("flag"));
122}
123
124#[test]
125fn group_required_3() {
126 let m = App::new("group_required")
127 .arg(Arg::from_usage("-f, --flag 'some flag'"))
Kevin K7fc18e62016-01-21 05:18:53128 .group(ArgGroup::with_name("gr")
Alexander Kuvaev7a2375b2015-09-06 20:08:13129 .required(true)
Kevin K7fc18e62016-01-21 05:18:53130 .arg("some")
131 .arg("other"))
Alexander Kuvaev7a2375b2015-09-06 20:08:13132 .arg(Arg::from_usage("--some 'some arg'"))
133 .arg(Arg::from_usage("--other 'other arg'"))
Kevin Kf17e1502016-01-25 20:56:37134 .get_matches_from(vec!["", "-f", "--other"]);
Alexander Kuvaev7a2375b2015-09-06 20:08:13135 assert!(!m.is_present("some"));
136 assert!(m.is_present("other"));
137 assert!(m.is_present("flag"));
138}
139
140#[test]
141fn arg_require_group() {
142 let result = App::new("arg_require_group")
Kevin K92919f52017-02-03 22:43:49143 .arg(Arg::from_usage("-f, --flag 'some flag'").requires("gr"))
Kevin K7fc18e62016-01-21 05:18:53144 .group(ArgGroup::with_name("gr")
145 .arg("some")
146 .arg("other"))
Alexander Kuvaev7a2375b2015-09-06 20:08:13147 .arg(Arg::from_usage("--some 'some arg'"))
148 .arg(Arg::from_usage("--other 'other arg'"))
Kevin Kf17e1502016-01-25 20:56:37149 .get_matches_from_safe(vec!["", "-f"]);
Alexander Kuvaev7a2375b2015-09-06 20:08:13150 assert!(result.is_err());
151 let err = result.err().unwrap();
Kevin K7fc18e62016-01-21 05:18:53152 assert_eq!(err.kind, ErrorKind::MissingRequiredArgument);
Alexander Kuvaev7a2375b2015-09-06 20:08:13153}
154
155#[test]
156fn arg_require_group_2() {
157 let m = App::new("arg_require_group")
Kevin K92919f52017-02-03 22:43:49158 .arg(Arg::from_usage("-f, --flag 'some flag'").requires("gr"))
Kevin K7fc18e62016-01-21 05:18:53159 .group(ArgGroup::with_name("gr")
160 .arg("some")
161 .arg("other"))
Alexander Kuvaev7a2375b2015-09-06 20:08:13162 .arg(Arg::from_usage("--some 'some arg'"))
163 .arg(Arg::from_usage("--other 'other arg'"))
Kevin Kf17e1502016-01-25 20:56:37164 .get_matches_from(vec!["", "-f", "--some"]);
Alexander Kuvaev7a2375b2015-09-06 20:08:13165 assert!(m.is_present("some"));
166 assert!(!m.is_present("other"));
167 assert!(m.is_present("flag"));
168}
169
170#[test]
171fn arg_require_group_3() {
172 let m = App::new("arg_require_group")
Kevin K92919f52017-02-03 22:43:49173 .arg(Arg::from_usage("-f, --flag 'some flag'").requires("gr"))
Kevin K7fc18e62016-01-21 05:18:53174 .group(ArgGroup::with_name("gr")
175 .arg("some")
176 .arg("other"))
Alexander Kuvaev7a2375b2015-09-06 20:08:13177 .arg(Arg::from_usage("--some 'some arg'"))
178 .arg(Arg::from_usage("--other 'other arg'"))
Kevin Kf17e1502016-01-25 20:56:37179 .get_matches_from(vec!["", "-f", "--other"]);
Alexander Kuvaev7a2375b2015-09-06 20:08:13180 assert!(!m.is_present("some"));
181 assert!(m.is_present("other"));
182 assert!(m.is_present("flag"));
Kevin Kf17e1502016-01-25 20:56:37183}
Kevin K9fdad2e2016-05-02 18:12:57184
185// REQUIRED_UNLESS
186
187#[test]
Kevin Kd20331b2016-11-20 14:48:16188fn issue_753() {
189 let m = App::new("test")
190 .arg(Arg::from_usage("-l, --list 'List available interfaces (and stop there)'"))
191 .arg(Arg::from_usage("-i, --iface=[INTERFACE] 'Ethernet interface for fetching NTP packets'")
192 .required_unless("list"))
193 .arg(Arg::from_usage("-f, --file=[TESTFILE] 'Fetch NTP packets from pcap file'")
194 .conflicts_with("iface")
195 .required_unless("list"))
196 .arg(Arg::from_usage("-s, --server=[SERVER_IP] 'NTP server IP address'")
197 .required_unless("list"))
198 .arg(Arg::from_usage("-p, --port=[SERVER_PORT] 'NTP server port'")
199 .default_value("123"))
200 .get_matches_from_safe(vec!["test", "--list"]);
Kevin K92919f52017-02-03 22:43:49201 assert!(m.is_ok());
Kevin Kd20331b2016-11-20 14:48:16202}
203
204#[test]
Kevin K9fdad2e2016-05-02 18:12:57205fn required_unless() {
206 let res = App::new("unlesstest")
207 .arg(Arg::with_name("cfg")
208 .required_unless("dbg")
209 .takes_value(true)
210 .long("config"))
Kevin K92919f52017-02-03 22:43:49211 .arg(Arg::with_name("dbg").long("debug"))
212 .get_matches_from_safe(vec!["unlesstest", "--debug"]);
Kevin K9fdad2e2016-05-02 18:12:57213
214 assert!(res.is_ok());
215 let m = res.unwrap();
216 assert!(m.is_present("dbg"));
217 assert!(!m.is_present("cfg"));
218}
219
220#[test]
221fn required_unless_err() {
222 let res = App::new("unlesstest")
223 .arg(Arg::with_name("cfg")
224 .required_unless("dbg")
225 .takes_value(true)
226 .long("config"))
Kevin K92919f52017-02-03 22:43:49227 .arg(Arg::with_name("dbg").long("debug"))
228 .get_matches_from_safe(vec!["unlesstest"]);
Kevin K9fdad2e2016-05-02 18:12:57229
230 assert!(res.is_err());
231 assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
232}
233
234// REQUIRED_UNLESS_ALL
235
236#[test]
237fn required_unless_all() {
238 let res = App::new("unlessall")
239 .arg(Arg::with_name("cfg")
240 .required_unless_all(&["dbg", "infile"])
241 .takes_value(true)
242 .long("config"))
Kevin K92919f52017-02-03 22:43:49243 .arg(Arg::with_name("dbg").long("debug"))
Kevin K9fdad2e2016-05-02 18:12:57244 .arg(Arg::with_name("infile")
245 .short("i")
246 .takes_value(true))
Kevin K92919f52017-02-03 22:43:49247 .get_matches_from_safe(vec!["unlessall", "--debug", "-i", "file"]);
Kevin K9fdad2e2016-05-02 18:12:57248
249 assert!(res.is_ok());
250 let m = res.unwrap();
251 assert!(m.is_present("dbg"));
252 assert!(m.is_present("infile"));
253 assert!(!m.is_present("cfg"));
254}
255
256#[test]
257fn required_unless_all_err() {
258 let res = App::new("unlessall")
259 .arg(Arg::with_name("cfg")
260 .required_unless_all(&["dbg", "infile"])
261 .takes_value(true)
262 .long("config"))
Kevin K92919f52017-02-03 22:43:49263 .arg(Arg::with_name("dbg").long("debug"))
Kevin K9fdad2e2016-05-02 18:12:57264 .arg(Arg::with_name("infile")
265 .short("i")
266 .takes_value(true))
Kevin K92919f52017-02-03 22:43:49267 .get_matches_from_safe(vec!["unlessall", "--debug"]);
Kevin K9fdad2e2016-05-02 18:12:57268
269 assert!(res.is_err());
270 assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
271}
272
273// REQUIRED_UNLESS_ONE
274
275#[test]
276fn required_unless_one() {
277 let res = App::new("unlessone")
278 .arg(Arg::with_name("cfg")
279 .required_unless_one(&["dbg", "infile"])
280 .takes_value(true)
281 .long("config"))
Kevin K92919f52017-02-03 22:43:49282 .arg(Arg::with_name("dbg").long("debug"))
Kevin K9fdad2e2016-05-02 18:12:57283 .arg(Arg::with_name("infile")
284 .short("i")
285 .takes_value(true))
Kevin K92919f52017-02-03 22:43:49286 .get_matches_from_safe(vec!["unlessone", "--debug"]);
Kevin K9fdad2e2016-05-02 18:12:57287
288 assert!(res.is_ok());
289 let m = res.unwrap();
290 assert!(m.is_present("dbg"));
291 assert!(!m.is_present("cfg"));
292}
293
294#[test]
Christopher Field1b990912016-07-23 17:43:22295fn required_unless_one_2() {
296 // This tests that the required_unless_one works when the second arg in the array is used
297 // instead of the first.
298 let res = App::new("unlessone")
299 .arg(Arg::with_name("cfg")
300 .required_unless_one(&["dbg", "infile"])
301 .takes_value(true)
302 .long("config"))
Kevin K92919f52017-02-03 22:43:49303 .arg(Arg::with_name("dbg").long("debug"))
Christopher Field1b990912016-07-23 17:43:22304 .arg(Arg::with_name("infile")
305 .short("i")
306 .takes_value(true))
Kevin K92919f52017-02-03 22:43:49307 .get_matches_from_safe(vec!["unlessone", "-i", "file"]);
Christopher Field1b990912016-07-23 17:43:22308
309 assert!(res.is_ok());
310 let m = res.unwrap();
311 assert!(m.is_present("infile"));
312 assert!(!m.is_present("cfg"));
313}
314
315#[test]
Kevin K625cbbc2016-07-23 21:22:14316fn required_unless_one_1() {
317 let res = App::new("unlessone")
318 .arg(Arg::with_name("cfg")
319 .required_unless_one(&["dbg", "infile"])
320 .takes_value(true)
321 .long("config"))
Kevin K92919f52017-02-03 22:43:49322 .arg(Arg::with_name("dbg").long("debug"))
Kevin K625cbbc2016-07-23 21:22:14323 .arg(Arg::with_name("infile")
324 .short("i")
325 .takes_value(true))
Kevin K92919f52017-02-03 22:43:49326 .get_matches_from_safe(vec!["unlessone", "--debug"]);
Kevin K625cbbc2016-07-23 21:22:14327
328 assert!(res.is_ok());
329 let m = res.unwrap();
330 assert!(!m.is_present("infile"));
331 assert!(!m.is_present("cfg"));
332 assert!(m.is_present("dbg"));
333}
334
335#[test]
Kevin K9fdad2e2016-05-02 18:12:57336fn required_unless_one_err() {
337 let res = App::new("unlessone")
338 .arg(Arg::with_name("cfg")
339 .required_unless_one(&["dbg", "infile"])
340 .takes_value(true)
341 .long("config"))
Kevin K92919f52017-02-03 22:43:49342 .arg(Arg::with_name("dbg").long("debug"))
Kevin K9fdad2e2016-05-02 18:12:57343 .arg(Arg::with_name("infile")
344 .short("i")
345 .takes_value(true))
Kevin K92919f52017-02-03 22:43:49346 .get_matches_from_safe(vec!["unlessone"]);
Kevin K9fdad2e2016-05-02 18:12:57347
348 assert!(res.is_err());
349 assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
350}
Kevin K852e5812016-05-09 03:20:50351
352#[test]
353fn missing_required_output() {
Kevin Kf9672352017-01-03 04:05:23354 assert!(test::compare_output(test::complex_app(), "clap-test -F", MISSING_REQ, true));
Kevin K852e5812016-05-09 03:20:50355}
Kevin Keca60912016-12-14 16:41:21356
357// Conditional external requirements
358
359#[test]
360fn requires_if_present_val() {
361 let res = App::new("unlessone")
362 .arg(Arg::with_name("cfg")
363 .requires_if("my.cfg", "extra")
364 .takes_value(true)
365 .long("config"))
Kevin K92919f52017-02-03 22:43:49366 .arg(Arg::with_name("extra").long("extra"))
367 .get_matches_from_safe(vec!["unlessone", "--config=my.cfg"]);
Kevin Keca60912016-12-14 16:41:21368
369 assert!(res.is_err());
370 assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
371}
372
373#[test]
374fn requires_if_present_mult() {
375 let res = App::new("unlessone")
376 .arg(Arg::with_name("cfg")
Kevin K92919f52017-02-03 22:43:49377 .requires_ifs(&[("my.cfg", "extra"), ("other.cfg", "other")])
Kevin Keca60912016-12-14 16:41:21378 .takes_value(true)
379 .long("config"))
Kevin K92919f52017-02-03 22:43:49380 .arg(Arg::with_name("extra").long("extra"))
381 .arg(Arg::with_name("other").long("other"))
382 .get_matches_from_safe(vec!["unlessone", "--config=other.cfg"]);
Kevin Keca60912016-12-14 16:41:21383
384 assert!(res.is_err());
385 assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
386}
387
388#[test]
389fn requires_if_present_mult_pass() {
390 let res = App::new("unlessone")
391 .arg(Arg::with_name("cfg")
Kevin K92919f52017-02-03 22:43:49392 .requires_ifs(&[("my.cfg", "extra"), ("other.cfg", "other")])
Kevin Keca60912016-12-14 16:41:21393 .takes_value(true)
394 .long("config"))
Kevin K92919f52017-02-03 22:43:49395 .arg(Arg::with_name("extra").long("extra"))
396 .arg(Arg::with_name("other").long("other"))
397 .get_matches_from_safe(vec!["unlessone", "--config=some.cfg"]);
Kevin Keca60912016-12-14 16:41:21398
399 assert!(res.is_ok());
400 // assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
401}
402
403#[test]
404fn requires_if_present_val_no_present_pass() {
405 let res = App::new("unlessone")
406 .arg(Arg::with_name("cfg")
407 .requires_if("my.cfg", "extra")
408 .takes_value(true)
409 .long("config"))
Kevin K92919f52017-02-03 22:43:49410 .arg(Arg::with_name("extra").long("extra"))
411 .get_matches_from_safe(vec!["unlessone"]);
Kevin Keca60912016-12-14 16:41:21412
413 assert!(res.is_ok());
Kevin K60e1a3a2016-12-29 01:35:34414}
415
416// Conditionally required
417
418#[test]
419fn required_if_val_present_pass() {
420 let res = App::new("ri")
421 .arg(Arg::with_name("cfg")
422 .required_if("extra", "val")
423 .takes_value(true)
424 .long("config"))
425 .arg(Arg::with_name("extra")
426 .takes_value(true)
427 .long("extra"))
Kevin K92919f52017-02-03 22:43:49428 .get_matches_from_safe(vec!["ri", "--extra", "val", "--config", "my.cfg"]);
Kevin K60e1a3a2016-12-29 01:35:34429
430 assert!(res.is_ok());
Kevin K60e1a3a2016-12-29 01:35:34431}
432
433#[test]
434fn required_if_val_present_fail() {
435 let res = App::new("ri")
436 .arg(Arg::with_name("cfg")
437 .required_if("extra", "val")
438 .takes_value(true)
439 .long("config"))
440 .arg(Arg::with_name("extra")
441 .takes_value(true)
442 .long("extra"))
Kevin K92919f52017-02-03 22:43:49443 .get_matches_from_safe(vec!["ri", "--extra", "val"]);
Kevin K60e1a3a2016-12-29 01:35:34444
445 assert!(res.is_err());
446 assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
447}
448
449#[test]
Kevin K92919f52017-02-03 22:43:49450fn required_if_val_present_fail_error_output() {
451 let app = App::new("Test app")
452 .version("1.0")
453 .author("F0x06")
454 .about("Arg test")
455 .arg(Arg::with_name("target")
456 .takes_value(true)
457 .required(true)
458 .possible_values(&["file", "stdout"])
459 .long("target"))
460 .arg(Arg::with_name("input")
461 .takes_value(true)
462 .required(true)
463 .long("input"))
464 .arg(Arg::with_name("output")
465 .takes_value(true)
466 .required_if("target", "file")
467 .long("output"));
468
469 assert!(test::compare_output(app,
470 "test --input somepath --target file",
471 COND_REQ_IN_USAGE,
472 true));
473}
474
475#[test]
Kevin K60e1a3a2016-12-29 01:35:34476fn required_if_wrong_val() {
477 let res = App::new("ri")
478 .arg(Arg::with_name("cfg")
479 .required_if("extra", "val")
480 .takes_value(true)
481 .long("config"))
482 .arg(Arg::with_name("extra")
483 .takes_value(true)
484 .long("extra"))
Kevin K92919f52017-02-03 22:43:49485 .get_matches_from_safe(vec!["ri", "--extra", "other"]);
Kevin K60e1a3a2016-12-29 01:35:34486
487 assert!(res.is_ok());
488}
489
490#[test]
491fn required_ifs_val_present_pass() {
492 let res = App::new("ri")
493 .arg(Arg::with_name("cfg")
Kevin K92919f52017-02-03 22:43:49494 .required_ifs(&[("extra", "val"), ("option", "spec")])
Kevin K60e1a3a2016-12-29 01:35:34495 .takes_value(true)
496 .long("config"))
497 .arg(Arg::with_name("option")
498 .takes_value(true)
499 .long("option"))
500 .arg(Arg::with_name("extra")
501 .takes_value(true)
502 .long("extra"))
Kevin K92919f52017-02-03 22:43:49503 .get_matches_from_safe(vec!["ri", "--option", "spec", "--config", "my.cfg"]);
Kevin K60e1a3a2016-12-29 01:35:34504
505 assert!(res.is_ok());
506 // assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
507}
508
509#[test]
510fn required_ifs_val_present_fail() {
511 let res = App::new("ri")
512 .arg(Arg::with_name("cfg")
Kevin K92919f52017-02-03 22:43:49513 .required_ifs(&[("extra", "val"), ("option", "spec")])
Kevin K60e1a3a2016-12-29 01:35:34514 .takes_value(true)
515 .long("config"))
516 .arg(Arg::with_name("extra")
517 .takes_value(true)
518 .long("extra"))
519 .arg(Arg::with_name("option")
520 .takes_value(true)
521 .long("option"))
Kevin K92919f52017-02-03 22:43:49522 .get_matches_from_safe(vec!["ri", "--option", "spec"]);
Kevin K60e1a3a2016-12-29 01:35:34523
524 assert!(res.is_err());
525 assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
526}
527
528#[test]
529fn required_ifs_wrong_val() {
530 let res = App::new("ri")
531 .arg(Arg::with_name("cfg")
Kevin K92919f52017-02-03 22:43:49532 .required_ifs(&[("extra", "val"), ("option", "spec")])
Kevin K60e1a3a2016-12-29 01:35:34533 .takes_value(true)
534 .long("config"))
535 .arg(Arg::with_name("extra")
536 .takes_value(true)
537 .long("extra"))
538 .arg(Arg::with_name("option")
539 .takes_value(true)
540 .long("option"))
Kevin K92919f52017-02-03 22:43:49541 .get_matches_from_safe(vec!["ri", "--option", "other"]);
Kevin K60e1a3a2016-12-29 01:35:34542
543 assert!(res.is_ok());
544}
545
546#[test]
547fn required_ifs_wrong_val_mult_fail() {
548 let res = App::new("ri")
549 .arg(Arg::with_name("cfg")
Kevin K92919f52017-02-03 22:43:49550 .required_ifs(&[("extra", "val"), ("option", "spec")])
Kevin K60e1a3a2016-12-29 01:35:34551 .takes_value(true)
552 .long("config"))
553 .arg(Arg::with_name("extra")
554 .takes_value(true)
555 .long("extra"))
556 .arg(Arg::with_name("option")
557 .takes_value(true)
558 .long("option"))
Kevin K92919f52017-02-03 22:43:49559 .get_matches_from_safe(vec!["ri", "--extra", "other", "--option", "spec"]);
Kevin K60e1a3a2016-12-29 01:35:34560
561 assert!(res.is_err());
562 assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
Kevin Keca60912016-12-14 16:41:21563}