blob: 912e3985612d432e737dfd1c7db54b42035f9724 [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
8#[test]
9fn flag_required() {
10 let result = App::new("flag_required")
11 .arg(Arg::from_usage("-f, --flag 'some flag'")
12 .requires("color"))
13 .arg(Arg::from_usage("-c, --color 'third flag'"))
Kevin Kf17e1502016-01-25 20:56:3714 .get_matches_from_safe(vec!["", "-f"]);
Alexander Kuvaev7a2375b2015-09-06 20:08:1315 assert!(result.is_err());
16 let err = result.err().unwrap();
Kevin K7fc18e62016-01-21 05:18:5317 assert_eq!(err.kind, ErrorKind::MissingRequiredArgument);
Alexander Kuvaev7a2375b2015-09-06 20:08:1318}
19
20#[test]
21fn flag_required_2() {
22 let m = App::new("flag_required")
23 .arg(Arg::from_usage("-f, --flag 'some flag'")
24 .requires("color"))
25 .arg(Arg::from_usage("-c, --color 'third flag'"))
Kevin Kf17e1502016-01-25 20:56:3726 .get_matches_from(vec!["", "-f", "-c"]);
Alexander Kuvaev7a2375b2015-09-06 20:08:1327 assert!(m.is_present("color"));
28 assert!(m.is_present("flag"));
29}
30
31#[test]
32fn option_required() {
33 let result = App::new("option_required")
34 .arg(Arg::from_usage("-f [flag] 'some flag'")
35 .requires("color"))
36 .arg(Arg::from_usage("-c [color] 'third flag'"))
Kevin Kf17e1502016-01-25 20:56:3737 .get_matches_from_safe(vec!["", "-f", "val"]);
Alexander Kuvaev7a2375b2015-09-06 20:08:1338 assert!(result.is_err());
39 let err = result.err().unwrap();
Kevin K7fc18e62016-01-21 05:18:5340 assert_eq!(err.kind, ErrorKind::MissingRequiredArgument);
Alexander Kuvaev7a2375b2015-09-06 20:08:1341}
42
43#[test]
44fn option_required_2() {
45 let m = App::new("option_required")
46 .arg(Arg::from_usage("-f [flag] 'some flag'")
Kevin Kf17e1502016-01-25 20:56:3747 .requires("c"))
Alexander Kuvaev7a2375b2015-09-06 20:08:1348 .arg(Arg::from_usage("-c [color] 'third flag'"))
Kevin Kf17e1502016-01-25 20:56:3749 .get_matches_from(vec!["", "-f", "val", "-c", "other_val"]);
50 assert!(m.is_present("c"));
51 assert_eq!(m.value_of("c").unwrap(), "other_val");
52 assert!(m.is_present("f"));
53 assert_eq!(m.value_of("f").unwrap(), "val");
Alexander Kuvaev7a2375b2015-09-06 20:08:1354}
55
56#[test]
57fn positional_required() {
58 let result = App::new("positional_required")
59 .arg(Arg::with_name("flag")
60 .index(1)
61 .required(true))
62 .get_matches_from_safe(vec![""]);
63 assert!(result.is_err());
64 let err = result.err().unwrap();
Kevin K7fc18e62016-01-21 05:18:5365 assert_eq!(err.kind, ErrorKind::MissingRequiredArgument);
Alexander Kuvaev7a2375b2015-09-06 20:08:1366}
67
68#[test]
69fn positional_required_2() {
70 let m = App::new("positional_required")
71 .arg(Arg::with_name("flag")
72 .index(1)
73 .required(true))
Kevin Kf17e1502016-01-25 20:56:3774 .get_matches_from(vec!["", "someval"]);
Alexander Kuvaev7a2375b2015-09-06 20:08:1375 assert!(m.is_present("flag"));
76 assert_eq!(m.value_of("flag").unwrap(), "someval");
77}
78
79#[test]
80fn group_required() {
81 let result = App::new("group_required")
82 .arg(Arg::from_usage("-f, --flag 'some flag'"))
Kevin K7fc18e62016-01-21 05:18:5383 .group(ArgGroup::with_name("gr")
Alexander Kuvaev7a2375b2015-09-06 20:08:1384 .required(true)
Kevin K7fc18e62016-01-21 05:18:5385 .arg("some")
86 .arg("other"))
Alexander Kuvaev7a2375b2015-09-06 20:08:1387 .arg(Arg::from_usage("--some 'some arg'"))
88 .arg(Arg::from_usage("--other 'other arg'"))
Kevin Kf17e1502016-01-25 20:56:3789 .get_matches_from_safe(vec!["", "-f"]);
Alexander Kuvaev7a2375b2015-09-06 20:08:1390 assert!(result.is_err());
91 let err = result.err().unwrap();
Kevin K7fc18e62016-01-21 05:18:5392 assert_eq!(err.kind, ErrorKind::MissingRequiredArgument);
Alexander Kuvaev7a2375b2015-09-06 20:08:1393}
94
95#[test]
96fn group_required_2() {
97 let m = App::new("group_required")
98 .arg(Arg::from_usage("-f, --flag 'some flag'"))
Kevin K7fc18e62016-01-21 05:18:5399 .group(ArgGroup::with_name("gr")
Alexander Kuvaev7a2375b2015-09-06 20:08:13100 .required(true)
Kevin K7fc18e62016-01-21 05:18:53101 .arg("some")
102 .arg("other"))
Alexander Kuvaev7a2375b2015-09-06 20:08:13103 .arg(Arg::from_usage("--some 'some arg'"))
104 .arg(Arg::from_usage("--other 'other arg'"))
Kevin Kf17e1502016-01-25 20:56:37105 .get_matches_from(vec!["", "-f", "--some"]);
Alexander Kuvaev7a2375b2015-09-06 20:08:13106 assert!(m.is_present("some"));
107 assert!(!m.is_present("other"));
108 assert!(m.is_present("flag"));
109}
110
111#[test]
112fn group_required_3() {
113 let m = App::new("group_required")
114 .arg(Arg::from_usage("-f, --flag 'some flag'"))
Kevin K7fc18e62016-01-21 05:18:53115 .group(ArgGroup::with_name("gr")
Alexander Kuvaev7a2375b2015-09-06 20:08:13116 .required(true)
Kevin K7fc18e62016-01-21 05:18:53117 .arg("some")
118 .arg("other"))
Alexander Kuvaev7a2375b2015-09-06 20:08:13119 .arg(Arg::from_usage("--some 'some arg'"))
120 .arg(Arg::from_usage("--other 'other arg'"))
Kevin Kf17e1502016-01-25 20:56:37121 .get_matches_from(vec!["", "-f", "--other"]);
Alexander Kuvaev7a2375b2015-09-06 20:08:13122 assert!(!m.is_present("some"));
123 assert!(m.is_present("other"));
124 assert!(m.is_present("flag"));
125}
126
127#[test]
128fn arg_require_group() {
129 let result = App::new("arg_require_group")
130 .arg(Arg::from_usage("-f, --flag 'some flag'")
131 .requires("gr"))
Kevin K7fc18e62016-01-21 05:18:53132 .group(ArgGroup::with_name("gr")
133 .arg("some")
134 .arg("other"))
Alexander Kuvaev7a2375b2015-09-06 20:08:13135 .arg(Arg::from_usage("--some 'some arg'"))
136 .arg(Arg::from_usage("--other 'other arg'"))
Kevin Kf17e1502016-01-25 20:56:37137 .get_matches_from_safe(vec!["", "-f"]);
Alexander Kuvaev7a2375b2015-09-06 20:08:13138 assert!(result.is_err());
139 let err = result.err().unwrap();
Kevin K7fc18e62016-01-21 05:18:53140 assert_eq!(err.kind, ErrorKind::MissingRequiredArgument);
Alexander Kuvaev7a2375b2015-09-06 20:08:13141}
142
143#[test]
144fn arg_require_group_2() {
145 let m = App::new("arg_require_group")
146 .arg(Arg::from_usage("-f, --flag 'some flag'")
147 .requires("gr"))
Kevin K7fc18e62016-01-21 05:18:53148 .group(ArgGroup::with_name("gr")
149 .arg("some")
150 .arg("other"))
Alexander Kuvaev7a2375b2015-09-06 20:08:13151 .arg(Arg::from_usage("--some 'some arg'"))
152 .arg(Arg::from_usage("--other 'other arg'"))
Kevin Kf17e1502016-01-25 20:56:37153 .get_matches_from(vec!["", "-f", "--some"]);
Alexander Kuvaev7a2375b2015-09-06 20:08:13154 assert!(m.is_present("some"));
155 assert!(!m.is_present("other"));
156 assert!(m.is_present("flag"));
157}
158
159#[test]
160fn arg_require_group_3() {
161 let m = App::new("arg_require_group")
162 .arg(Arg::from_usage("-f, --flag 'some flag'")
163 .requires("gr"))
Kevin K7fc18e62016-01-21 05:18:53164 .group(ArgGroup::with_name("gr")
165 .arg("some")
166 .arg("other"))
Alexander Kuvaev7a2375b2015-09-06 20:08:13167 .arg(Arg::from_usage("--some 'some arg'"))
168 .arg(Arg::from_usage("--other 'other arg'"))
Kevin Kf17e1502016-01-25 20:56:37169 .get_matches_from(vec!["", "-f", "--other"]);
Alexander Kuvaev7a2375b2015-09-06 20:08:13170 assert!(!m.is_present("some"));
171 assert!(m.is_present("other"));
172 assert!(m.is_present("flag"));
Kevin Kf17e1502016-01-25 20:56:37173}
Kevin K9fdad2e2016-05-02 18:12:57174
175// REQUIRED_UNLESS
176
177#[test]
178fn required_unless() {
179 let res = App::new("unlesstest")
180 .arg(Arg::with_name("cfg")
181 .required_unless("dbg")
182 .takes_value(true)
183 .long("config"))
184 .arg(Arg::with_name("dbg")
185 .long("debug"))
186 .get_matches_from_safe(vec![
187 "unlesstest", "--debug"
188 ]);
189
190 assert!(res.is_ok());
191 let m = res.unwrap();
192 assert!(m.is_present("dbg"));
193 assert!(!m.is_present("cfg"));
194}
195
196#[test]
197fn required_unless_err() {
198 let res = App::new("unlesstest")
199 .arg(Arg::with_name("cfg")
200 .required_unless("dbg")
201 .takes_value(true)
202 .long("config"))
203 .arg(Arg::with_name("dbg")
204 .long("debug"))
205 .get_matches_from_safe(vec![
206 "unlesstest"
207 ]);
208
209 assert!(res.is_err());
210 assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
211}
212
213// REQUIRED_UNLESS_ALL
214
215#[test]
216fn required_unless_all() {
217 let res = App::new("unlessall")
218 .arg(Arg::with_name("cfg")
219 .required_unless_all(&["dbg", "infile"])
220 .takes_value(true)
221 .long("config"))
222 .arg(Arg::with_name("dbg")
223 .long("debug"))
224 .arg(Arg::with_name("infile")
225 .short("i")
226 .takes_value(true))
227 .get_matches_from_safe(vec![
228 "unlessall", "--debug", "-i", "file"
229 ]);
230
231 assert!(res.is_ok());
232 let m = res.unwrap();
233 assert!(m.is_present("dbg"));
234 assert!(m.is_present("infile"));
235 assert!(!m.is_present("cfg"));
236}
237
238#[test]
239fn required_unless_all_err() {
240 let res = App::new("unlessall")
241 .arg(Arg::with_name("cfg")
242 .required_unless_all(&["dbg", "infile"])
243 .takes_value(true)
244 .long("config"))
245 .arg(Arg::with_name("dbg")
246 .long("debug"))
247 .arg(Arg::with_name("infile")
248 .short("i")
249 .takes_value(true))
250 .get_matches_from_safe(vec![
251 "unlessall", "--debug"
252 ]);
253
254 assert!(res.is_err());
255 assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
256}
257
258// REQUIRED_UNLESS_ONE
259
260#[test]
261fn required_unless_one() {
262 let res = App::new("unlessone")
263 .arg(Arg::with_name("cfg")
264 .required_unless_one(&["dbg", "infile"])
265 .takes_value(true)
266 .long("config"))
267 .arg(Arg::with_name("dbg")
268 .long("debug"))
269 .arg(Arg::with_name("infile")
270 .short("i")
271 .takes_value(true))
272 .get_matches_from_safe(vec![
273 "unlessone", "--debug"
274 ]);
275
276 assert!(res.is_ok());
277 let m = res.unwrap();
278 assert!(m.is_present("dbg"));
279 assert!(!m.is_present("cfg"));
280}
281
282#[test]
283fn required_unless_one_err() {
284 let res = App::new("unlessone")
285 .arg(Arg::with_name("cfg")
286 .required_unless_one(&["dbg", "infile"])
287 .takes_value(true)
288 .long("config"))
289 .arg(Arg::with_name("dbg")
290 .long("debug"))
291 .arg(Arg::with_name("infile")
292 .short("i")
293 .takes_value(true))
294 .get_matches_from_safe(vec![
295 "unlessone"
296 ]);
297
298 assert!(res.is_err());
299 assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
300}
Kevin K852e5812016-05-09 03:20:50301
302#[test]
303fn missing_required_output() {
Kevin Kb42ca0b2016-05-10 02:46:09304 test::check_err_output(test::complex_app(), "clap-test -F",
Kevin K852e5812016-05-09 03:20:50305"error: The following required arguments were not provided:
306 <positional2>
307 --long-option-2 <option2>
308
309USAGE:
310 clap-test <positional2> -F --long-option-2 <option2>
311
312For more information try --help", true)
313}