1#!/bin/sh
2#
3# Copyright (c) 2007 Johannes Schindelin
4#
5
6test_description='our own option parser'
7
8. ./test-lib.sh
9
10cat > expect.err << EOF
11usage: test-parse-options <options>
12
13 -b, --boolean get a boolean
14 -4, --or4 bitwise-or boolean with ...0100
15
16 -i, --integer <n> get a integer
17 -j <n> get a integer, too
18 --set23 set integer to 23
19 -t <time> get timestamp of <time>
20 -L, --length <str> get length of <str>
21
22String options
23 -s, --string <string>
24 get a string
25 --string2 <str> get another string
26 --st <st> get another string (pervert ordering)
27 -o <str> get another string
28 --default-string set string to default
29
30Magic arguments
31 --quux means --quux
32
33Standard options
34 --abbrev[=<n>] use <n> digits to display SHA-1s
35 -v, --verbose be verbose
36 -n, --dry-run dry run
37 -q, --quiet be quiet
38
39EOF
40
41test_expect_success 'test help' '
42 test_must_fail test-parse-options -h > output 2> output.err &&
43 test ! -s output &&
44 test_cmp expect.err output.err
45'
46
47cat > expect << EOF
48boolean: 2
49integer: 1729
50string: 123
51abbrev: 7
52verbose: 2
53quiet: no
54dry run: yes
55EOF
56
57test_expect_success 'short options' '
58 test-parse-options -s123 -b -i 1729 -b -vv -n > output 2> output.err &&
59 test_cmp expect output &&
60 test ! -s output.err
61'
62
63cat > expect << EOF
64boolean: 2
65integer: 1729
66string: 321
67abbrev: 10
68verbose: 2
69quiet: no
70dry run: no
71EOF
72
73test_expect_success 'long options' '
74 test-parse-options --boolean --integer 1729 --boolean --string2=321 \
75 --verbose --verbose --no-dry-run --abbrev=10 \
76 > output 2> output.err &&
77 test ! -s output.err &&
78 test_cmp expect output
79'
80
81cat > expect << EOF
82boolean: 1
83integer: 13
84string: 123
85abbrev: 7
86verbose: 0
87quiet: no
88dry run: no
89arg 00: a1
90arg 01: b1
91arg 02: --boolean
92EOF
93
94test_expect_success 'intermingled arguments' '
95 test-parse-options a1 --string 123 b1 --boolean -j 13 -- --boolean \
96 > output 2> output.err &&
97 test ! -s output.err &&
98 test_cmp expect output
99'
100
101cat > expect << EOF
102boolean: 0
103integer: 2
104string: (not set)
105abbrev: 7
106verbose: 0
107quiet: no
108dry run: no
109EOF
110
111test_expect_success 'unambiguously abbreviated option' '
112 test-parse-options --int 2 --boolean --no-bo > output 2> output.err &&
113 test ! -s output.err &&
114 test_cmp expect output
115'
116
117test_expect_success 'unambiguously abbreviated option with "="' '
118 test-parse-options --int=2 > output 2> output.err &&
119 test ! -s output.err &&
120 test_cmp expect output
121'
122
123test_expect_success 'ambiguously abbreviated option' '
124 test-parse-options --strin 123;
125 test $? = 129
126'
127
128cat > expect << EOF
129boolean: 0
130integer: 0
131string: 123
132abbrev: 7
133verbose: 0
134quiet: no
135dry run: no
136EOF
137
138test_expect_success 'non ambiguous option (after two options it abbreviates)' '
139 test-parse-options --st 123 > output 2> output.err &&
140 test ! -s output.err &&
141 test_cmp expect output
142'
143
144cat > typo.err << EOF
145error: did you mean \`--boolean\` (with two dashes ?)
146EOF
147
148test_expect_success 'detect possible typos' '
149 test_must_fail test-parse-options -boolean > output 2> output.err &&
150 test ! -s output &&
151 test_cmp typo.err output.err
152'
153
154cat > expect <<EOF
155boolean: 0
156integer: 0
157string: (not set)
158abbrev: 7
159verbose: 0
160quiet: no
161dry run: no
162arg 00: --quux
163EOF
164
165test_expect_success 'keep some options as arguments' '
166 test-parse-options --quux > output 2> output.err &&
167 test ! -s output.err &&
168 test_cmp expect output
169'
170
171cat > expect <<EOF
172boolean: 0
173integer: 1
174string: default
175abbrev: 7
176verbose: 0
177quiet: yes
178dry run: no
179arg 00: foo
180EOF
181
182test_expect_success 'OPT_DATE() and OPT_SET_PTR() work' '
183 test-parse-options -t "1970-01-01 00:00:01 +0000" --default-string \
184 foo -q > output 2> output.err &&
185 test ! -s output.err &&
186 test_cmp expect output
187'
188
189cat > expect <<EOF
190Callback: "four", 0
191boolean: 5
192integer: 4
193string: (not set)
194abbrev: 7
195verbose: 0
196quiet: no
197dry run: no
198EOF
199
200test_expect_success 'OPT_CALLBACK() and OPT_BIT() work' '
201 test-parse-options --length=four -b -4 > output 2> output.err &&
202 test ! -s output.err &&
203 test_cmp expect output
204'
205
206cat > expect <<EOF
207Callback: "not set", 1
208EOF
209
210test_expect_success 'OPT_CALLBACK() and callback errors work' '
211 test_must_fail test-parse-options --no-length > output 2> output.err &&
212 test_cmp expect output &&
213 test_cmp expect.err output.err
214'
215
216cat > expect <<EOF
217boolean: 1
218integer: 23
219string: (not set)
220abbrev: 7
221verbose: 0
222quiet: no
223dry run: no
224EOF
225
226test_expect_success 'OPT_BIT() and OPT_SET_INT() work' '
227 test-parse-options --set23 -bbbbb --no-or4 > output 2> output.err &&
228 test ! -s output.err &&
229 test_cmp expect output
230'
231
232# --or4
233# --no-or4
234
235test_done