forked from clap-rs/clap
/
multiple_occurrences.rs
153 lines (134 loc) · 5.05 KB
/
multiple_occurrences.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
use clap::{arg, Arg, ArgAction, Command};
#[test]
fn multiple_occurrences_of_flags_long() {
let m = Command::new("mo_flags_long")
.args_override_self(true)
.arg(arg!(--multflag "allowed multiple flag").action(ArgAction::SetTrue))
.arg(arg!(--flag "disallowed multiple flag").action(ArgAction::SetTrue))
.try_get_matches_from(vec!["", "--multflag", "--flag", "--multflag"])
.unwrap();
assert!(m.contains_id("multflag"));
assert_eq!(m.get_one::<bool>("multflag").copied(), Some(true));
assert!(m.contains_id("flag"));
assert_eq!(m.get_one::<bool>("flag").copied(), Some(true));
}
#[test]
fn multiple_occurrences_of_flags_short() {
let m = Command::new("mo_flags_short")
.args_override_self(true)
.arg(arg!(-m --multflag "allowed multiple flag").action(ArgAction::SetTrue))
.arg(arg!(-f --flag "disallowed multiple flag").action(ArgAction::SetTrue))
.try_get_matches_from(vec!["", "-m", "-f", "-m"])
.unwrap();
assert!(m.contains_id("multflag"));
assert_eq!(m.get_one::<bool>("multflag").copied(), Some(true));
assert!(m.contains_id("flag"));
assert_eq!(m.get_one::<bool>("flag").copied(), Some(true));
}
#[test]
fn multiple_occurrences_of_positional() {
let cmd = Command::new("test").arg(Arg::new("multi").num_args(1..).action(ArgAction::Append));
let m = cmd
.clone()
.try_get_matches_from(&["test"])
.expect("zero occurrences work");
assert!(!m.contains_id("multi"));
assert!(m.get_many::<String>("multi").is_none());
let m = cmd
.clone()
.try_get_matches_from(&["test", "one"])
.expect("single occurrence work");
assert!(m.contains_id("multi"));
assert_eq!(
m.get_many::<String>("multi")
.unwrap()
.map(|v| v.as_str())
.collect::<Vec<_>>(),
["one"]
);
let m = cmd
.clone()
.try_get_matches_from(&["test", "one", "two", "three", "four"])
.expect("many occurrences work");
assert!(m.contains_id("multi"));
assert_eq!(
m.get_many::<String>("multi")
.unwrap()
.map(|v| v.as_str())
.collect::<Vec<_>>(),
["one", "two", "three", "four"]
);
}
#[test]
fn multiple_occurrences_of_flags_large_quantity() {
let cmd = Command::new("mo_flags_large_qty")
.arg(arg!(-m --multflag "allowed multiple flag").action(ArgAction::Count));
let args: Vec<&str> = vec![""]
.into_iter()
.chain(vec!["-m"; 200].into_iter())
.collect();
let m = cmd.clone().try_get_matches_from(args).unwrap();
assert!(m.contains_id("multflag"));
assert_eq!(m.get_one::<u8>("multflag").copied(), Some(200));
let args: Vec<&str> = vec![""]
.into_iter()
.chain(vec!["-m"; 500].into_iter())
.collect();
let m = cmd.try_get_matches_from(args).unwrap();
assert!(m.contains_id("multflag"));
assert_eq!(m.get_one::<u8>("multflag").copied(), Some(u8::MAX));
}
#[cfg(feature = "env")]
#[test]
fn multiple_occurrences_of_before_env() {
let cmd = Command::new("mo_before_env").arg(
Arg::new("verbose")
.env("VERBOSE")
.short('v')
.long("verbose")
.action(ArgAction::Count),
);
let m = cmd.clone().try_get_matches_from(vec![""]);
assert!(m.is_ok(), "{}", m.unwrap_err());
let m = m.unwrap();
assert_eq!(m.get_one::<u8>("verbose").copied(), Some(0));
let m = cmd.clone().try_get_matches_from(vec!["", "-v"]);
assert!(m.is_ok(), "{}", m.unwrap_err());
let m = m.unwrap();
assert_eq!(m.get_one::<u8>("verbose").copied(), Some(1));
let m = cmd.clone().try_get_matches_from(vec!["", "-vv"]);
assert!(m.is_ok(), "{}", m.unwrap_err());
let m = m.unwrap();
assert_eq!(m.get_one::<u8>("verbose").copied(), Some(2));
let m = cmd.clone().try_get_matches_from(vec!["", "-vvv"]);
assert!(m.is_ok(), "{}", m.unwrap_err());
let m = m.unwrap();
assert_eq!(m.get_one::<u8>("verbose").copied(), Some(3));
}
#[cfg(feature = "env")]
#[test]
fn multiple_occurrences_of_after_env() {
let cmd = Command::new("mo_after_env").arg(
Arg::new("verbose")
.short('v')
.long("verbose")
.action(ArgAction::Count)
.env("VERBOSE"),
);
let m = cmd.clone().try_get_matches_from(vec![""]);
assert!(m.is_ok(), "{}", m.unwrap_err());
let m = m.unwrap();
assert_eq!(m.get_one::<u8>("verbose").copied(), Some(0));
let m = cmd.clone().try_get_matches_from(vec!["", "-v"]);
assert!(m.is_ok(), "{}", m.unwrap_err());
let m = m.unwrap();
assert_eq!(m.get_one::<u8>("verbose").copied(), Some(1));
let m = cmd.clone().try_get_matches_from(vec!["", "-vv"]);
assert!(m.is_ok(), "{}", m.unwrap_err());
let m = m.unwrap();
assert_eq!(m.get_one::<u8>("verbose").copied(), Some(2));
let m = cmd.clone().try_get_matches_from(vec!["", "-vvv"]);
assert!(m.is_ok(), "{}", m.unwrap_err());
let m = m.unwrap();
assert_eq!(m.get_one::<u8>("verbose").copied(), Some(3));
}