Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 1 | extern crate clap; |
Kevin K | b42ca0b | 2016-05-10 02:46:09 | [diff] [blame] | 2 | extern crate regex; |
| 3 | |
| 4 | include!("../clap-test.rs"); |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 5 | |
Kevin K | 7fc18e6 | 2016-01-21 05:18:53 | [diff] [blame] | 6 | use clap::{App, Arg, ErrorKind, ArgGroup}; |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 7 | |
Kevin K | f967235 | 2017-01-03 04:05:23 | [diff] [blame] | 8 | static MISSING_REQ: &'static str = "error: The following required arguments were not provided: |
| 9 | <positional2> |
| 10 | --long-option-2 <option2> |
| 11 | |
| 12 | USAGE: |
| 13 | clap-test <positional2> -F --long-option-2 <option2> |
| 14 | |
| 15 | For more information try --help"; |
| 16 | |
Kevin K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 17 | static COND_REQ_IN_USAGE: &'static str = "error: The following required arguments were not provided: |
| 18 | --output <output> |
| 19 | |
| 20 | USAGE: |
| 21 | test --target <target> --input <input> --output <output> |
| 22 | |
| 23 | For more information try --help"; |
| 24 | |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 25 | #[test] |
| 26 | fn flag_required() { |
| 27 | let result = App::new("flag_required") |
Kevin K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 28 | .arg(Arg::from_usage("-f, --flag 'some flag'").requires("color")) |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 29 | .arg(Arg::from_usage("-c, --color 'third flag'")) |
Kevin K | f17e150 | 2016-01-25 20:56:37 | [diff] [blame] | 30 | .get_matches_from_safe(vec!["", "-f"]); |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 31 | assert!(result.is_err()); |
| 32 | let err = result.err().unwrap(); |
Kevin K | 7fc18e6 | 2016-01-21 05:18:53 | [diff] [blame] | 33 | assert_eq!(err.kind, ErrorKind::MissingRequiredArgument); |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 34 | } |
| 35 | |
| 36 | #[test] |
| 37 | fn flag_required_2() { |
| 38 | let m = App::new("flag_required") |
Kevin K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 39 | .arg(Arg::from_usage("-f, --flag 'some flag'").requires("color")) |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 40 | .arg(Arg::from_usage("-c, --color 'third flag'")) |
Kevin K | f17e150 | 2016-01-25 20:56:37 | [diff] [blame] | 41 | .get_matches_from(vec!["", "-f", "-c"]); |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 42 | assert!(m.is_present("color")); |
| 43 | assert!(m.is_present("flag")); |
| 44 | } |
| 45 | |
| 46 | #[test] |
| 47 | fn option_required() { |
| 48 | let result = App::new("option_required") |
Kevin K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 49 | .arg(Arg::from_usage("-f [flag] 'some flag'").requires("color")) |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 50 | .arg(Arg::from_usage("-c [color] 'third flag'")) |
Kevin K | f17e150 | 2016-01-25 20:56:37 | [diff] [blame] | 51 | .get_matches_from_safe(vec!["", "-f", "val"]); |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 52 | assert!(result.is_err()); |
| 53 | let err = result.err().unwrap(); |
Kevin K | 7fc18e6 | 2016-01-21 05:18:53 | [diff] [blame] | 54 | assert_eq!(err.kind, ErrorKind::MissingRequiredArgument); |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 55 | } |
| 56 | |
| 57 | #[test] |
| 58 | fn option_required_2() { |
| 59 | let m = App::new("option_required") |
Kevin K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 60 | .arg(Arg::from_usage("-f [flag] 'some flag'").requires("c")) |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 61 | .arg(Arg::from_usage("-c [color] 'third flag'")) |
Kevin K | f17e150 | 2016-01-25 20:56:37 | [diff] [blame] | 62 | .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 Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 67 | } |
| 68 | |
| 69 | #[test] |
| 70 | fn 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 K | 7fc18e6 | 2016-01-21 05:18:53 | [diff] [blame] | 78 | assert_eq!(err.kind, ErrorKind::MissingRequiredArgument); |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 79 | } |
| 80 | |
| 81 | #[test] |
| 82 | fn positional_required_2() { |
| 83 | let m = App::new("positional_required") |
| 84 | .arg(Arg::with_name("flag") |
| 85 | .index(1) |
| 86 | .required(true)) |
Kevin K | f17e150 | 2016-01-25 20:56:37 | [diff] [blame] | 87 | .get_matches_from(vec!["", "someval"]); |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 88 | assert!(m.is_present("flag")); |
| 89 | assert_eq!(m.value_of("flag").unwrap(), "someval"); |
| 90 | } |
| 91 | |
| 92 | #[test] |
| 93 | fn group_required() { |
| 94 | let result = App::new("group_required") |
| 95 | .arg(Arg::from_usage("-f, --flag 'some flag'")) |
Kevin K | 7fc18e6 | 2016-01-21 05:18:53 | [diff] [blame] | 96 | .group(ArgGroup::with_name("gr") |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 97 | .required(true) |
Kevin K | 7fc18e6 | 2016-01-21 05:18:53 | [diff] [blame] | 98 | .arg("some") |
| 99 | .arg("other")) |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 100 | .arg(Arg::from_usage("--some 'some arg'")) |
| 101 | .arg(Arg::from_usage("--other 'other arg'")) |
Kevin K | f17e150 | 2016-01-25 20:56:37 | [diff] [blame] | 102 | .get_matches_from_safe(vec!["", "-f"]); |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 103 | assert!(result.is_err()); |
| 104 | let err = result.err().unwrap(); |
Kevin K | 7fc18e6 | 2016-01-21 05:18:53 | [diff] [blame] | 105 | assert_eq!(err.kind, ErrorKind::MissingRequiredArgument); |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 106 | } |
| 107 | |
| 108 | #[test] |
| 109 | fn group_required_2() { |
| 110 | let m = App::new("group_required") |
| 111 | .arg(Arg::from_usage("-f, --flag 'some flag'")) |
Kevin K | 7fc18e6 | 2016-01-21 05:18:53 | [diff] [blame] | 112 | .group(ArgGroup::with_name("gr") |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 113 | .required(true) |
Kevin K | 7fc18e6 | 2016-01-21 05:18:53 | [diff] [blame] | 114 | .arg("some") |
| 115 | .arg("other")) |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 116 | .arg(Arg::from_usage("--some 'some arg'")) |
| 117 | .arg(Arg::from_usage("--other 'other arg'")) |
Kevin K | f17e150 | 2016-01-25 20:56:37 | [diff] [blame] | 118 | .get_matches_from(vec!["", "-f", "--some"]); |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 119 | assert!(m.is_present("some")); |
| 120 | assert!(!m.is_present("other")); |
| 121 | assert!(m.is_present("flag")); |
| 122 | } |
| 123 | |
| 124 | #[test] |
| 125 | fn group_required_3() { |
| 126 | let m = App::new("group_required") |
| 127 | .arg(Arg::from_usage("-f, --flag 'some flag'")) |
Kevin K | 7fc18e6 | 2016-01-21 05:18:53 | [diff] [blame] | 128 | .group(ArgGroup::with_name("gr") |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 129 | .required(true) |
Kevin K | 7fc18e6 | 2016-01-21 05:18:53 | [diff] [blame] | 130 | .arg("some") |
| 131 | .arg("other")) |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 132 | .arg(Arg::from_usage("--some 'some arg'")) |
| 133 | .arg(Arg::from_usage("--other 'other arg'")) |
Kevin K | f17e150 | 2016-01-25 20:56:37 | [diff] [blame] | 134 | .get_matches_from(vec!["", "-f", "--other"]); |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 135 | assert!(!m.is_present("some")); |
| 136 | assert!(m.is_present("other")); |
| 137 | assert!(m.is_present("flag")); |
| 138 | } |
| 139 | |
| 140 | #[test] |
| 141 | fn arg_require_group() { |
| 142 | let result = App::new("arg_require_group") |
Kevin K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 143 | .arg(Arg::from_usage("-f, --flag 'some flag'").requires("gr")) |
Kevin K | 7fc18e6 | 2016-01-21 05:18:53 | [diff] [blame] | 144 | .group(ArgGroup::with_name("gr") |
| 145 | .arg("some") |
| 146 | .arg("other")) |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 147 | .arg(Arg::from_usage("--some 'some arg'")) |
| 148 | .arg(Arg::from_usage("--other 'other arg'")) |
Kevin K | f17e150 | 2016-01-25 20:56:37 | [diff] [blame] | 149 | .get_matches_from_safe(vec!["", "-f"]); |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 150 | assert!(result.is_err()); |
| 151 | let err = result.err().unwrap(); |
Kevin K | 7fc18e6 | 2016-01-21 05:18:53 | [diff] [blame] | 152 | assert_eq!(err.kind, ErrorKind::MissingRequiredArgument); |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 153 | } |
| 154 | |
| 155 | #[test] |
| 156 | fn arg_require_group_2() { |
| 157 | let m = App::new("arg_require_group") |
Kevin K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 158 | .arg(Arg::from_usage("-f, --flag 'some flag'").requires("gr")) |
Kevin K | 7fc18e6 | 2016-01-21 05:18:53 | [diff] [blame] | 159 | .group(ArgGroup::with_name("gr") |
| 160 | .arg("some") |
| 161 | .arg("other")) |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 162 | .arg(Arg::from_usage("--some 'some arg'")) |
| 163 | .arg(Arg::from_usage("--other 'other arg'")) |
Kevin K | f17e150 | 2016-01-25 20:56:37 | [diff] [blame] | 164 | .get_matches_from(vec!["", "-f", "--some"]); |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 165 | assert!(m.is_present("some")); |
| 166 | assert!(!m.is_present("other")); |
| 167 | assert!(m.is_present("flag")); |
| 168 | } |
| 169 | |
| 170 | #[test] |
| 171 | fn arg_require_group_3() { |
| 172 | let m = App::new("arg_require_group") |
Kevin K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 173 | .arg(Arg::from_usage("-f, --flag 'some flag'").requires("gr")) |
Kevin K | 7fc18e6 | 2016-01-21 05:18:53 | [diff] [blame] | 174 | .group(ArgGroup::with_name("gr") |
| 175 | .arg("some") |
| 176 | .arg("other")) |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 177 | .arg(Arg::from_usage("--some 'some arg'")) |
| 178 | .arg(Arg::from_usage("--other 'other arg'")) |
Kevin K | f17e150 | 2016-01-25 20:56:37 | [diff] [blame] | 179 | .get_matches_from(vec!["", "-f", "--other"]); |
Alexander Kuvaev | 7a2375b | 2015-09-06 20:08:13 | [diff] [blame] | 180 | assert!(!m.is_present("some")); |
| 181 | assert!(m.is_present("other")); |
| 182 | assert!(m.is_present("flag")); |
Kevin K | f17e150 | 2016-01-25 20:56:37 | [diff] [blame] | 183 | } |
Kevin K | 9fdad2e | 2016-05-02 18:12:57 | [diff] [blame] | 184 | |
| 185 | // REQUIRED_UNLESS |
| 186 | |
| 187 | #[test] |
Kevin K | d20331b | 2016-11-20 14:48:16 | [diff] [blame] | 188 | fn 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 K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 201 | assert!(m.is_ok()); |
Kevin K | d20331b | 2016-11-20 14:48:16 | [diff] [blame] | 202 | } |
| 203 | |
| 204 | #[test] |
Kevin K | 9fdad2e | 2016-05-02 18:12:57 | [diff] [blame] | 205 | fn 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 K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 211 | .arg(Arg::with_name("dbg").long("debug")) |
| 212 | .get_matches_from_safe(vec!["unlesstest", "--debug"]); |
Kevin K | 9fdad2e | 2016-05-02 18:12:57 | [diff] [blame] | 213 | |
| 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] |
| 221 | fn 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 K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 227 | .arg(Arg::with_name("dbg").long("debug")) |
| 228 | .get_matches_from_safe(vec!["unlesstest"]); |
Kevin K | 9fdad2e | 2016-05-02 18:12:57 | [diff] [blame] | 229 | |
| 230 | assert!(res.is_err()); |
| 231 | assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument); |
| 232 | } |
| 233 | |
| 234 | // REQUIRED_UNLESS_ALL |
| 235 | |
| 236 | #[test] |
| 237 | fn 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 K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 243 | .arg(Arg::with_name("dbg").long("debug")) |
Kevin K | 9fdad2e | 2016-05-02 18:12:57 | [diff] [blame] | 244 | .arg(Arg::with_name("infile") |
| 245 | .short("i") |
| 246 | .takes_value(true)) |
Kevin K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 247 | .get_matches_from_safe(vec!["unlessall", "--debug", "-i", "file"]); |
Kevin K | 9fdad2e | 2016-05-02 18:12:57 | [diff] [blame] | 248 | |
| 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] |
| 257 | fn 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 K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 263 | .arg(Arg::with_name("dbg").long("debug")) |
Kevin K | 9fdad2e | 2016-05-02 18:12:57 | [diff] [blame] | 264 | .arg(Arg::with_name("infile") |
| 265 | .short("i") |
| 266 | .takes_value(true)) |
Kevin K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 267 | .get_matches_from_safe(vec!["unlessall", "--debug"]); |
Kevin K | 9fdad2e | 2016-05-02 18:12:57 | [diff] [blame] | 268 | |
| 269 | assert!(res.is_err()); |
| 270 | assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument); |
| 271 | } |
| 272 | |
| 273 | // REQUIRED_UNLESS_ONE |
| 274 | |
| 275 | #[test] |
| 276 | fn 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 K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 282 | .arg(Arg::with_name("dbg").long("debug")) |
Kevin K | 9fdad2e | 2016-05-02 18:12:57 | [diff] [blame] | 283 | .arg(Arg::with_name("infile") |
| 284 | .short("i") |
| 285 | .takes_value(true)) |
Kevin K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 286 | .get_matches_from_safe(vec!["unlessone", "--debug"]); |
Kevin K | 9fdad2e | 2016-05-02 18:12:57 | [diff] [blame] | 287 | |
| 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 Field | 1b99091 | 2016-07-23 17:43:22 | [diff] [blame] | 295 | fn 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 K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 303 | .arg(Arg::with_name("dbg").long("debug")) |
Christopher Field | 1b99091 | 2016-07-23 17:43:22 | [diff] [blame] | 304 | .arg(Arg::with_name("infile") |
| 305 | .short("i") |
| 306 | .takes_value(true)) |
Kevin K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 307 | .get_matches_from_safe(vec!["unlessone", "-i", "file"]); |
Christopher Field | 1b99091 | 2016-07-23 17:43:22 | [diff] [blame] | 308 | |
| 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 K | 625cbbc | 2016-07-23 21:22:14 | [diff] [blame] | 316 | fn 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 K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 322 | .arg(Arg::with_name("dbg").long("debug")) |
Kevin K | 625cbbc | 2016-07-23 21:22:14 | [diff] [blame] | 323 | .arg(Arg::with_name("infile") |
| 324 | .short("i") |
| 325 | .takes_value(true)) |
Kevin K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 326 | .get_matches_from_safe(vec!["unlessone", "--debug"]); |
Kevin K | 625cbbc | 2016-07-23 21:22:14 | [diff] [blame] | 327 | |
| 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 K | 9fdad2e | 2016-05-02 18:12:57 | [diff] [blame] | 336 | fn 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 K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 342 | .arg(Arg::with_name("dbg").long("debug")) |
Kevin K | 9fdad2e | 2016-05-02 18:12:57 | [diff] [blame] | 343 | .arg(Arg::with_name("infile") |
| 344 | .short("i") |
| 345 | .takes_value(true)) |
Kevin K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 346 | .get_matches_from_safe(vec!["unlessone"]); |
Kevin K | 9fdad2e | 2016-05-02 18:12:57 | [diff] [blame] | 347 | |
| 348 | assert!(res.is_err()); |
| 349 | assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument); |
| 350 | } |
Kevin K | 852e581 | 2016-05-09 03:20:50 | [diff] [blame] | 351 | |
| 352 | #[test] |
| 353 | fn missing_required_output() { |
Kevin K | f967235 | 2017-01-03 04:05:23 | [diff] [blame] | 354 | assert!(test::compare_output(test::complex_app(), "clap-test -F", MISSING_REQ, true)); |
Kevin K | 852e581 | 2016-05-09 03:20:50 | [diff] [blame] | 355 | } |
Kevin K | eca6091 | 2016-12-14 16:41:21 | [diff] [blame] | 356 | |
| 357 | // Conditional external requirements |
| 358 | |
| 359 | #[test] |
| 360 | fn 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 K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 366 | .arg(Arg::with_name("extra").long("extra")) |
| 367 | .get_matches_from_safe(vec!["unlessone", "--config=my.cfg"]); |
Kevin K | eca6091 | 2016-12-14 16:41:21 | [diff] [blame] | 368 | |
| 369 | assert!(res.is_err()); |
| 370 | assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument); |
| 371 | } |
| 372 | |
| 373 | #[test] |
| 374 | fn requires_if_present_mult() { |
| 375 | let res = App::new("unlessone") |
| 376 | .arg(Arg::with_name("cfg") |
Kevin K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 377 | .requires_ifs(&[("my.cfg", "extra"), ("other.cfg", "other")]) |
Kevin K | eca6091 | 2016-12-14 16:41:21 | [diff] [blame] | 378 | .takes_value(true) |
| 379 | .long("config")) |
Kevin K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 380 | .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 K | eca6091 | 2016-12-14 16:41:21 | [diff] [blame] | 383 | |
| 384 | assert!(res.is_err()); |
| 385 | assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument); |
| 386 | } |
| 387 | |
| 388 | #[test] |
| 389 | fn requires_if_present_mult_pass() { |
| 390 | let res = App::new("unlessone") |
| 391 | .arg(Arg::with_name("cfg") |
Kevin K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 392 | .requires_ifs(&[("my.cfg", "extra"), ("other.cfg", "other")]) |
Kevin K | eca6091 | 2016-12-14 16:41:21 | [diff] [blame] | 393 | .takes_value(true) |
| 394 | .long("config")) |
Kevin K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 395 | .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 K | eca6091 | 2016-12-14 16:41:21 | [diff] [blame] | 398 | |
| 399 | assert!(res.is_ok()); |
| 400 | // assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument); |
| 401 | } |
| 402 | |
| 403 | #[test] |
| 404 | fn 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 K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 410 | .arg(Arg::with_name("extra").long("extra")) |
| 411 | .get_matches_from_safe(vec!["unlessone"]); |
Kevin K | eca6091 | 2016-12-14 16:41:21 | [diff] [blame] | 412 | |
| 413 | assert!(res.is_ok()); |
Kevin K | 60e1a3a | 2016-12-29 01:35:34 | [diff] [blame] | 414 | } |
| 415 | |
| 416 | // Conditionally required |
| 417 | |
| 418 | #[test] |
| 419 | fn 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 K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 428 | .get_matches_from_safe(vec!["ri", "--extra", "val", "--config", "my.cfg"]); |
Kevin K | 60e1a3a | 2016-12-29 01:35:34 | [diff] [blame] | 429 | |
| 430 | assert!(res.is_ok()); |
Kevin K | 60e1a3a | 2016-12-29 01:35:34 | [diff] [blame] | 431 | } |
| 432 | |
| 433 | #[test] |
| 434 | fn 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 K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 443 | .get_matches_from_safe(vec!["ri", "--extra", "val"]); |
Kevin K | 60e1a3a | 2016-12-29 01:35:34 | [diff] [blame] | 444 | |
| 445 | assert!(res.is_err()); |
| 446 | assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument); |
| 447 | } |
| 448 | |
| 449 | #[test] |
Kevin K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 450 | fn 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 K | 60e1a3a | 2016-12-29 01:35:34 | [diff] [blame] | 476 | fn 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 K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 485 | .get_matches_from_safe(vec!["ri", "--extra", "other"]); |
Kevin K | 60e1a3a | 2016-12-29 01:35:34 | [diff] [blame] | 486 | |
| 487 | assert!(res.is_ok()); |
| 488 | } |
| 489 | |
| 490 | #[test] |
| 491 | fn required_ifs_val_present_pass() { |
| 492 | let res = App::new("ri") |
| 493 | .arg(Arg::with_name("cfg") |
Kevin K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 494 | .required_ifs(&[("extra", "val"), ("option", "spec")]) |
Kevin K | 60e1a3a | 2016-12-29 01:35:34 | [diff] [blame] | 495 | .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 K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 503 | .get_matches_from_safe(vec!["ri", "--option", "spec", "--config", "my.cfg"]); |
Kevin K | 60e1a3a | 2016-12-29 01:35:34 | [diff] [blame] | 504 | |
| 505 | assert!(res.is_ok()); |
| 506 | // assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument); |
| 507 | } |
| 508 | |
| 509 | #[test] |
| 510 | fn required_ifs_val_present_fail() { |
| 511 | let res = App::new("ri") |
| 512 | .arg(Arg::with_name("cfg") |
Kevin K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 513 | .required_ifs(&[("extra", "val"), ("option", "spec")]) |
Kevin K | 60e1a3a | 2016-12-29 01:35:34 | [diff] [blame] | 514 | .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 K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 522 | .get_matches_from_safe(vec!["ri", "--option", "spec"]); |
Kevin K | 60e1a3a | 2016-12-29 01:35:34 | [diff] [blame] | 523 | |
| 524 | assert!(res.is_err()); |
| 525 | assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument); |
| 526 | } |
| 527 | |
| 528 | #[test] |
| 529 | fn required_ifs_wrong_val() { |
| 530 | let res = App::new("ri") |
| 531 | .arg(Arg::with_name("cfg") |
Kevin K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 532 | .required_ifs(&[("extra", "val"), ("option", "spec")]) |
Kevin K | 60e1a3a | 2016-12-29 01:35:34 | [diff] [blame] | 533 | .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 K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 541 | .get_matches_from_safe(vec!["ri", "--option", "other"]); |
Kevin K | 60e1a3a | 2016-12-29 01:35:34 | [diff] [blame] | 542 | |
| 543 | assert!(res.is_ok()); |
| 544 | } |
| 545 | |
| 546 | #[test] |
| 547 | fn required_ifs_wrong_val_mult_fail() { |
| 548 | let res = App::new("ri") |
| 549 | .arg(Arg::with_name("cfg") |
Kevin K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 550 | .required_ifs(&[("extra", "val"), ("option", "spec")]) |
Kevin K | 60e1a3a | 2016-12-29 01:35:34 | [diff] [blame] | 551 | .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 K | 92919f5 | 2017-02-03 22:43:49 | [diff] [blame^] | 559 | .get_matches_from_safe(vec!["ri", "--extra", "other", "--option", "spec"]); |
Kevin K | 60e1a3a | 2016-12-29 01:35:34 | [diff] [blame] | 560 | |
| 561 | assert!(res.is_err()); |
| 562 | assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument); |
Kevin K | eca6091 | 2016-12-14 16:41:21 | [diff] [blame] | 563 | } |