Commit | Line | Data |
---|---|---|
beb47437 JS |
1 | #!/bin/sh |
2 | # | |
3 | # Copyright (c) 2007 Johannes Schindelin | |
4 | # | |
5 | ||
6 | test_description='our own option parser' | |
7 | ||
8 | . ./test-lib.sh | |
9 | ||
9c7304e3 | 10 | cat > expect << EOF |
beb47437 JS |
11 | usage: test-parse-options <options> |
12 | ||
13 | -b, --boolean get a boolean | |
010a2dac | 14 | -4, --or4 bitwise-or boolean with ...0100 |
2f4b97f9 | 15 | --neg-or4 same as --no-or4 |
010a2dac | 16 | |
beb47437 JS |
17 | -i, --integer <n> get a integer |
18 | -j <n> get a integer, too | |
010a2dac SB |
19 | --set23 set integer to 23 |
20 | -t <time> get timestamp of <time> | |
21 | -L, --length <str> get length of <str> | |
41dbcd45 | 22 | -F, --file <file> set file to <file> |
beb47437 | 23 | |
010a2dac | 24 | String options |
beb47437 JS |
25 | -s, --string <string> |
26 | get a string | |
27 | --string2 <str> get another string | |
243e0614 | 28 | --st <st> get another string (pervert ordering) |
3a9f0f41 | 29 | -o <str> get another string |
010a2dac | 30 | --default-string set string to default |
c8ba1639 | 31 | --list <str> add str to list |
beb47437 | 32 | |
010a2dac | 33 | Magic arguments |
580d5bff | 34 | --quux means --quux |
e0319ff5 | 35 | -NUM set integer to NUM |
51a9949e | 36 | + same as -b |
6bbfd1fa AS |
37 | --ambiguous positive ambiguity |
38 | --no-ambiguous negative ambiguity | |
580d5bff | 39 | |
010a2dac SB |
40 | Standard options |
41 | --abbrev[=<n>] use <n> digits to display SHA-1s | |
42 | -v, --verbose be verbose | |
43 | -n, --dry-run dry run | |
44 | -q, --quiet be quiet | |
45 | ||
beb47437 JS |
46 | EOF |
47 | ||
48 | test_expect_success 'test help' ' | |
010a2dac | 49 | test_must_fail test-parse-options -h > output 2> output.err && |
9c7304e3 GS |
50 | test ! -s output.err && |
51 | test_cmp expect output | |
beb47437 JS |
52 | ' |
53 | ||
9c7304e3 GS |
54 | mv expect expect.err |
55 | ||
beb47437 JS |
56 | cat > expect << EOF |
57 | boolean: 2 | |
58 | integer: 1729 | |
c4aca9cc | 59 | timestamp: 0 |
beb47437 | 60 | string: 123 |
010a2dac SB |
61 | abbrev: 7 |
62 | verbose: 2 | |
63 | quiet: no | |
64 | dry run: yes | |
df217ed6 | 65 | file: prefix/my.file |
beb47437 JS |
66 | EOF |
67 | ||
68 | test_expect_success 'short options' ' | |
df217ed6 SB |
69 | test-parse-options -s123 -b -i 1729 -b -vv -n -F my.file \ |
70 | > output 2> output.err && | |
3af82863 | 71 | test_cmp expect output && |
beb47437 JS |
72 | test ! -s output.err |
73 | ' | |
010a2dac | 74 | |
beb47437 JS |
75 | cat > expect << EOF |
76 | boolean: 2 | |
77 | integer: 1729 | |
c4aca9cc | 78 | timestamp: 0 |
beb47437 | 79 | string: 321 |
010a2dac SB |
80 | abbrev: 10 |
81 | verbose: 2 | |
82 | quiet: no | |
83 | dry run: no | |
df217ed6 | 84 | file: prefix/fi.le |
beb47437 JS |
85 | EOF |
86 | ||
87 | test_expect_success 'long options' ' | |
88 | test-parse-options --boolean --integer 1729 --boolean --string2=321 \ | |
df217ed6 | 89 | --verbose --verbose --no-dry-run --abbrev=10 --file fi.le\ |
beb47437 JS |
90 | > output 2> output.err && |
91 | test ! -s output.err && | |
3af82863 | 92 | test_cmp expect output |
beb47437 JS |
93 | ' |
94 | ||
d5d745f9 OM |
95 | test_expect_success 'missing required value' ' |
96 | test-parse-options -s; | |
97 | test $? = 129 && | |
98 | test-parse-options --string; | |
df217ed6 SB |
99 | test $? = 129 && |
100 | test-parse-options --file; | |
d5d745f9 OM |
101 | test $? = 129 |
102 | ' | |
103 | ||
beb47437 JS |
104 | cat > expect << EOF |
105 | boolean: 1 | |
106 | integer: 13 | |
c4aca9cc | 107 | timestamp: 0 |
beb47437 | 108 | string: 123 |
010a2dac SB |
109 | abbrev: 7 |
110 | verbose: 0 | |
111 | quiet: no | |
112 | dry run: no | |
df217ed6 | 113 | file: (not set) |
beb47437 JS |
114 | arg 00: a1 |
115 | arg 01: b1 | |
116 | arg 02: --boolean | |
117 | EOF | |
118 | ||
119 | test_expect_success 'intermingled arguments' ' | |
120 | test-parse-options a1 --string 123 b1 --boolean -j 13 -- --boolean \ | |
121 | > output 2> output.err && | |
122 | test ! -s output.err && | |
3af82863 | 123 | test_cmp expect output |
beb47437 JS |
124 | ' |
125 | ||
7f275b91 JS |
126 | cat > expect << EOF |
127 | boolean: 0 | |
128 | integer: 2 | |
c4aca9cc | 129 | timestamp: 0 |
7f275b91 | 130 | string: (not set) |
010a2dac SB |
131 | abbrev: 7 |
132 | verbose: 0 | |
133 | quiet: no | |
134 | dry run: no | |
df217ed6 | 135 | file: (not set) |
7f275b91 JS |
136 | EOF |
137 | ||
138 | test_expect_success 'unambiguously abbreviated option' ' | |
139 | test-parse-options --int 2 --boolean --no-bo > output 2> output.err && | |
140 | test ! -s output.err && | |
3af82863 | 141 | test_cmp expect output |
7f275b91 JS |
142 | ' |
143 | ||
144 | test_expect_success 'unambiguously abbreviated option with "="' ' | |
145 | test-parse-options --int=2 > output 2> output.err && | |
146 | test ! -s output.err && | |
3af82863 | 147 | test_cmp expect output |
7f275b91 JS |
148 | ' |
149 | ||
41ac414e | 150 | test_expect_success 'ambiguously abbreviated option' ' |
7f275b91 | 151 | test-parse-options --strin 123; |
41ac414e | 152 | test $? = 129 |
7f275b91 JS |
153 | ' |
154 | ||
243e0614 JS |
155 | cat > expect << EOF |
156 | boolean: 0 | |
157 | integer: 0 | |
c4aca9cc | 158 | timestamp: 0 |
243e0614 | 159 | string: 123 |
010a2dac SB |
160 | abbrev: 7 |
161 | verbose: 0 | |
162 | quiet: no | |
163 | dry run: no | |
df217ed6 | 164 | file: (not set) |
243e0614 JS |
165 | EOF |
166 | ||
167 | test_expect_success 'non ambiguous option (after two options it abbreviates)' ' | |
168 | test-parse-options --st 123 > output 2> output.err && | |
169 | test ! -s output.err && | |
3af82863 | 170 | test_cmp expect output |
243e0614 JS |
171 | ' |
172 | ||
010a2dac | 173 | cat > typo.err << EOF |
3a9f0f41 PH |
174 | error: did you mean \`--boolean\` (with two dashes ?) |
175 | EOF | |
176 | ||
177 | test_expect_success 'detect possible typos' ' | |
010a2dac | 178 | test_must_fail test-parse-options -boolean > output 2> output.err && |
3a9f0f41 | 179 | test ! -s output && |
010a2dac | 180 | test_cmp typo.err output.err |
3a9f0f41 PH |
181 | ' |
182 | ||
580d5bff PH |
183 | cat > expect <<EOF |
184 | boolean: 0 | |
185 | integer: 0 | |
c4aca9cc | 186 | timestamp: 0 |
580d5bff | 187 | string: (not set) |
010a2dac SB |
188 | abbrev: 7 |
189 | verbose: 0 | |
190 | quiet: no | |
191 | dry run: no | |
df217ed6 | 192 | file: (not set) |
580d5bff PH |
193 | arg 00: --quux |
194 | EOF | |
195 | ||
196 | test_expect_success 'keep some options as arguments' ' | |
197 | test-parse-options --quux > output 2> output.err && | |
198 | test ! -s output.err && | |
3af82863 | 199 | test_cmp expect output |
580d5bff PH |
200 | ' |
201 | ||
010a2dac SB |
202 | cat > expect <<EOF |
203 | boolean: 0 | |
c4aca9cc JH |
204 | integer: 0 |
205 | timestamp: 1 | |
010a2dac SB |
206 | string: default |
207 | abbrev: 7 | |
208 | verbose: 0 | |
209 | quiet: yes | |
210 | dry run: no | |
df217ed6 | 211 | file: (not set) |
010a2dac SB |
212 | arg 00: foo |
213 | EOF | |
214 | ||
215 | test_expect_success 'OPT_DATE() and OPT_SET_PTR() work' ' | |
216 | test-parse-options -t "1970-01-01 00:00:01 +0000" --default-string \ | |
217 | foo -q > output 2> output.err && | |
218 | test ! -s output.err && | |
219 | test_cmp expect output | |
220 | ' | |
221 | ||
222 | cat > expect <<EOF | |
223 | Callback: "four", 0 | |
224 | boolean: 5 | |
225 | integer: 4 | |
c4aca9cc | 226 | timestamp: 0 |
010a2dac SB |
227 | string: (not set) |
228 | abbrev: 7 | |
229 | verbose: 0 | |
230 | quiet: no | |
231 | dry run: no | |
df217ed6 | 232 | file: (not set) |
010a2dac SB |
233 | EOF |
234 | ||
235 | test_expect_success 'OPT_CALLBACK() and OPT_BIT() work' ' | |
236 | test-parse-options --length=four -b -4 > output 2> output.err && | |
237 | test ! -s output.err && | |
238 | test_cmp expect output | |
239 | ' | |
240 | ||
241 | cat > expect <<EOF | |
242 | Callback: "not set", 1 | |
243 | EOF | |
244 | ||
245 | test_expect_success 'OPT_CALLBACK() and callback errors work' ' | |
246 | test_must_fail test-parse-options --no-length > output 2> output.err && | |
247 | test_cmp expect output && | |
248 | test_cmp expect.err output.err | |
249 | ' | |
250 | ||
251 | cat > expect <<EOF | |
252 | boolean: 1 | |
253 | integer: 23 | |
c4aca9cc | 254 | timestamp: 0 |
010a2dac SB |
255 | string: (not set) |
256 | abbrev: 7 | |
257 | verbose: 0 | |
258 | quiet: no | |
259 | dry run: no | |
df217ed6 | 260 | file: (not set) |
010a2dac SB |
261 | EOF |
262 | ||
263 | test_expect_success 'OPT_BIT() and OPT_SET_INT() work' ' | |
264 | test-parse-options --set23 -bbbbb --no-or4 > output 2> output.err && | |
265 | test ! -s output.err && | |
266 | test_cmp expect output | |
267 | ' | |
268 | ||
2f4b97f9 RS |
269 | test_expect_success 'OPT_NEGBIT() and OPT_SET_INT() work' ' |
270 | test-parse-options --set23 -bbbbb --neg-or4 > output 2> output.err && | |
271 | test ! -s output.err && | |
272 | test_cmp expect output | |
273 | ' | |
274 | ||
275 | cat > expect <<EOF | |
276 | boolean: 6 | |
277 | integer: 0 | |
278 | timestamp: 0 | |
279 | string: (not set) | |
280 | abbrev: 7 | |
281 | verbose: 0 | |
282 | quiet: no | |
283 | dry run: no | |
df217ed6 | 284 | file: (not set) |
2f4b97f9 RS |
285 | EOF |
286 | ||
287 | test_expect_success 'OPT_BIT() works' ' | |
288 | test-parse-options -bb --or4 > output 2> output.err && | |
289 | test ! -s output.err && | |
290 | test_cmp expect output | |
291 | ' | |
292 | ||
293 | test_expect_success 'OPT_NEGBIT() works' ' | |
294 | test-parse-options -bb --no-neg-or4 > output 2> output.err && | |
295 | test ! -s output.err && | |
296 | test_cmp expect output | |
297 | ' | |
010a2dac | 298 | |
51a9949e RS |
299 | test_expect_success 'OPT_BOOLEAN() with PARSE_OPT_NODASH works' ' |
300 | test-parse-options + + + + + + > output 2> output.err && | |
301 | test ! -s output.err && | |
302 | test_cmp expect output | |
303 | ' | |
304 | ||
e0319ff5 RS |
305 | cat > expect <<EOF |
306 | boolean: 0 | |
307 | integer: 12345 | |
308 | timestamp: 0 | |
309 | string: (not set) | |
310 | abbrev: 7 | |
311 | verbose: 0 | |
312 | quiet: no | |
313 | dry run: no | |
df217ed6 | 314 | file: (not set) |
e0319ff5 RS |
315 | EOF |
316 | ||
317 | test_expect_success 'OPT_NUMBER_CALLBACK() works' ' | |
318 | test-parse-options -12345 > output 2> output.err && | |
319 | test ! -s output.err && | |
320 | test_cmp expect output | |
321 | ' | |
322 | ||
6bbfd1fa AS |
323 | cat >expect <<EOF |
324 | boolean: 0 | |
325 | integer: 0 | |
326 | timestamp: 0 | |
327 | string: (not set) | |
328 | abbrev: 7 | |
329 | verbose: 0 | |
330 | quiet: no | |
331 | dry run: no | |
332 | file: (not set) | |
333 | EOF | |
334 | ||
335 | test_expect_success 'negation of OPT_NONEG flags is not ambiguous' ' | |
336 | test-parse-options --no-ambig >output 2>output.err && | |
337 | test ! -s output.err && | |
338 | test_cmp expect output | |
339 | ' | |
340 | ||
c8ba1639 JK |
341 | cat >>expect <<'EOF' |
342 | list: foo | |
343 | list: bar | |
344 | list: baz | |
345 | EOF | |
346 | test_expect_success '--list keeps list of strings' ' | |
347 | test-parse-options --list foo --list=bar --list=baz >output && | |
348 | test_cmp expect output | |
349 | ' | |
350 | ||
351 | test_expect_success '--no-list resets list' ' | |
352 | test-parse-options --list=other --list=irrelevant --list=options \ | |
353 | --no-list --list=foo --list=bar --list=baz >output && | |
354 | test_cmp expect output | |
355 | ' | |
356 | ||
beb47437 | 357 | test_done |