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