1 use super::utils;
2
3 use std::str;
4
5 use clap::{Arg, ArgAction, Command};
6
7 #[test]
no_derive_order()8 fn no_derive_order() {
9 static NO_DERIVE_ORDER: &str = "\
10 Usage: test [OPTIONS]
11
12 Options:
13 --flag_a second flag
14 --flag_b first flag
15 -h, --help Print help
16 --option_a <option_a> second option
17 --option_b <option_b> first option
18 -V, --version Print version
19 ";
20
21 let cmd = Command::new("test")
22 .version("1.2")
23 .next_display_order(None)
24 .args([
25 Arg::new("flag_b")
26 .long("flag_b")
27 .help("first flag")
28 .action(ArgAction::SetTrue),
29 Arg::new("option_b")
30 .long("option_b")
31 .action(ArgAction::Set)
32 .help("first option"),
33 Arg::new("flag_a")
34 .long("flag_a")
35 .help("second flag")
36 .action(ArgAction::SetTrue),
37 Arg::new("option_a")
38 .long("option_a")
39 .action(ArgAction::Set)
40 .help("second option"),
41 ]);
42
43 utils::assert_output(cmd, "test --help", NO_DERIVE_ORDER, false);
44 }
45
46 #[test]
derive_order()47 fn derive_order() {
48 static UNIFIED_HELP_AND_DERIVE: &str = "\
49 Usage: test [OPTIONS]
50
51 Options:
52 --flag_b first flag
53 --option_b <option_b> first option
54 --flag_a second flag
55 --option_a <option_a> second option
56 -h, --help Print help
57 -V, --version Print version
58 ";
59
60 let cmd = Command::new("test").version("1.2").args([
61 Arg::new("flag_b")
62 .long("flag_b")
63 .help("first flag")
64 .action(ArgAction::SetTrue),
65 Arg::new("option_b")
66 .long("option_b")
67 .action(ArgAction::Set)
68 .help("first option"),
69 Arg::new("flag_a")
70 .long("flag_a")
71 .help("second flag")
72 .action(ArgAction::SetTrue),
73 Arg::new("option_a")
74 .long("option_a")
75 .action(ArgAction::Set)
76 .help("second option"),
77 ]);
78
79 utils::assert_output(cmd, "test --help", UNIFIED_HELP_AND_DERIVE, false);
80 }
81
82 #[test]
derive_order_next_order()83 fn derive_order_next_order() {
84 static HELP: &str = "\
85 Usage: test [OPTIONS]
86
87 Options:
88 --flag_b first flag
89 --option_b <option_b> first option
90 -h, --help Print help
91 -V, --version Print version
92 --flag_a second flag
93 --option_a <option_a> second option
94 ";
95
96 let cmd = Command::new("test")
97 .version("1.2")
98 .next_display_order(10000)
99 .arg(
100 Arg::new("flag_a")
101 .long("flag_a")
102 .help("second flag")
103 .action(ArgAction::SetTrue),
104 )
105 .arg(
106 Arg::new("option_a")
107 .long("option_a")
108 .action(ArgAction::Set)
109 .help("second option"),
110 )
111 .next_display_order(10)
112 .arg(
113 Arg::new("flag_b")
114 .long("flag_b")
115 .help("first flag")
116 .action(ArgAction::SetTrue),
117 )
118 .arg(
119 Arg::new("option_b")
120 .long("option_b")
121 .action(ArgAction::Set)
122 .help("first option"),
123 );
124
125 utils::assert_output(cmd, "test --help", HELP, false);
126 }
127
128 #[test]
derive_order_no_next_order()129 fn derive_order_no_next_order() {
130 static HELP: &str = "\
131 Usage: test [OPTIONS]
132
133 Options:
134 --flag_a first flag
135 --flag_b second flag
136 -h, --help Print help
137 --option_a <option_a> first option
138 --option_b <option_b> second option
139 -V, --version Print version
140 ";
141
142 let cmd = Command::new("test")
143 .version("1.2")
144 .next_display_order(None)
145 .arg(
146 Arg::new("flag_a")
147 .long("flag_a")
148 .help("first flag")
149 .action(ArgAction::SetTrue),
150 )
151 .arg(
152 Arg::new("option_a")
153 .long("option_a")
154 .action(ArgAction::Set)
155 .help("first option"),
156 )
157 .arg(
158 Arg::new("flag_b")
159 .long("flag_b")
160 .help("second flag")
161 .action(ArgAction::SetTrue),
162 )
163 .arg(
164 Arg::new("option_b")
165 .long("option_b")
166 .action(ArgAction::Set)
167 .help("second option"),
168 );
169
170 utils::assert_output(cmd, "test --help", HELP, false);
171 }
172
173 #[test]
derive_order_subcommand_propagate()174 fn derive_order_subcommand_propagate() {
175 static UNIFIED_DERIVE_SC_PROP: &str = "\
176 Usage: test sub [OPTIONS]
177
178 Options:
179 --flag_b first flag
180 --option_b <option_b> first option
181 --flag_a second flag
182 --option_a <option_a> second option
183 -h, --help Print help
184 -V, --version Print version
185 ";
186
187 let cmd = Command::new("test").subcommand(
188 Command::new("sub").version("1.2").args([
189 Arg::new("flag_b")
190 .long("flag_b")
191 .help("first flag")
192 .action(ArgAction::SetTrue),
193 Arg::new("option_b")
194 .long("option_b")
195 .action(ArgAction::Set)
196 .help("first option"),
197 Arg::new("flag_a")
198 .long("flag_a")
199 .help("second flag")
200 .action(ArgAction::SetTrue),
201 Arg::new("option_a")
202 .long("option_a")
203 .action(ArgAction::Set)
204 .help("second option"),
205 ]),
206 );
207
208 utils::assert_output(cmd, "test sub --help", UNIFIED_DERIVE_SC_PROP, false);
209 }
210
211 #[test]
derive_order_subcommand_propagate_with_explicit_display_order()212 fn derive_order_subcommand_propagate_with_explicit_display_order() {
213 static UNIFIED_DERIVE_SC_PROP_EXPLICIT_ORDER: &str = "\
214 Usage: test sub [OPTIONS]
215
216 Options:
217 --flag_a second flag
218 --flag_b first flag
219 --option_b <option_b> first option
220 --option_a <option_a> second option
221 -h, --help Print help
222 -V, --version Print version
223 ";
224
225 let cmd = Command::new("test").subcommand(
226 Command::new("sub").version("1.2").args([
227 Arg::new("flag_b")
228 .long("flag_b")
229 .help("first flag")
230 .action(ArgAction::SetTrue),
231 Arg::new("option_b")
232 .long("option_b")
233 .action(ArgAction::Set)
234 .help("first option"),
235 Arg::new("flag_a")
236 .long("flag_a")
237 .help("second flag")
238 .display_order(0)
239 .action(ArgAction::SetTrue),
240 Arg::new("option_a")
241 .long("option_a")
242 .action(ArgAction::Set)
243 .help("second option"),
244 ]),
245 );
246
247 utils::assert_output(
248 cmd,
249 "test sub --help",
250 UNIFIED_DERIVE_SC_PROP_EXPLICIT_ORDER,
251 false,
252 );
253 }
254
255 #[test]
subcommand_sorted_display_order()256 fn subcommand_sorted_display_order() {
257 static SUBCMD_ALPHA_ORDER: &str = "\
258 Usage: test [COMMAND]
259
260 Commands:
261 a1 blah a1
262 b1 blah b1
263 help Print this message or the help of the given subcommand(s)
264
265 Options:
266 -h, --help Print help
267 -V, --version Print version
268 ";
269
270 let app_subcmd_alpha_order = Command::new("test")
271 .version("1")
272 .next_display_order(None)
273 .subcommands(vec![
274 Command::new("b1")
275 .about("blah b1")
276 .arg(Arg::new("test").short('t').action(ArgAction::SetTrue)),
277 Command::new("a1")
278 .about("blah a1")
279 .arg(Arg::new("roster").short('r').action(ArgAction::SetTrue)),
280 ]);
281
282 utils::assert_output(
283 app_subcmd_alpha_order,
284 "test --help",
285 SUBCMD_ALPHA_ORDER,
286 false,
287 );
288 }
289
290 #[test]
subcommand_derived_display_order()291 fn subcommand_derived_display_order() {
292 static SUBCMD_DECL_ORDER: &str = "\
293 Usage: test [COMMAND]
294
295 Commands:
296 b1 blah b1
297 a1 blah a1
298 help Print this message or the help of the given subcommand(s)
299
300 Options:
301 -h, --help Print help
302 -V, --version Print version
303 ";
304
305 let app_subcmd_decl_order = Command::new("test").version("1").subcommands(vec![
306 Command::new("b1")
307 .about("blah b1")
308 .arg(Arg::new("test").short('t').action(ArgAction::SetTrue)),
309 Command::new("a1")
310 .about("blah a1")
311 .arg(Arg::new("roster").short('r').action(ArgAction::SetTrue)),
312 ]);
313
314 utils::assert_output(
315 app_subcmd_decl_order,
316 "test --help",
317 SUBCMD_DECL_ORDER,
318 false,
319 );
320 }
321