@matheusbsbs / matheus-bagliano / commits / 010a2dacc1
Fork 0

Extend parse-options test suite

This patch serves two purposes: 1. test-parse-option.c should be a more complete example for the parse-options API, and 2. there have been no tests for OPT_CALLBACK, OPT_DATE, OPT_BIT, OPT_SET_INT and OPT_SET_PTR before. Signed-off-by: Stephan Beyer <s-beyer@gmx.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Stephan Beyer committed Jun 22, 2008 at 17:04 UTC 010a2dacc1acf3305e399ef1eb2e620110b95d5e
2 files changed +144 -11
t/t0040-parse-options.sh
+109 -7
@@ -11,23 +11,35 @@ cat > expect.err << EOF
11 usage: 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
17 -string options
22 +String 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
24 -magic arguments
30 +Magic arguments
31 --quux means --quux
32
33 +Standard 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 +
39 EOF
40
41 test_expect_success 'test help' '
30 - ! test-parse-options -h > output 2> output.err &&
42 + test_must_fail test-parse-options -h > output 2> output.err &&
43 test ! -s output &&
44 test_cmp expect.err output.err
45 '
@@ -36,21 +48,31 @@ cat > expect << EOF
48 boolean: 2
49 integer: 1729
50 string: 123
51 +abbrev: 7
52 +verbose: 2
53 +quiet: no
54 +dry run: yes
55 EOF
56
57 test_expect_success 'short options' '
42 - test-parse-options -s123 -b -i 1729 -b > output 2> output.err &&
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 +
63 cat > expect << EOF
64 boolean: 2
65 integer: 1729
66 string: 321
67 +abbrev: 10
68 +verbose: 2
69 +quiet: no
70 +dry run: no
71 EOF
72
73 test_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
@@ -60,6 +82,10 @@ cat > expect << EOF
82 boolean: 1
83 integer: 13
84 string: 123
85 +abbrev: 7
86 +verbose: 0
87 +quiet: no
88 +dry run: no
89 arg 00: a1
90 arg 01: b1
91 arg 02: --boolean
@@ -76,6 +102,10 @@ cat > expect << EOF
102 boolean: 0
103 integer: 2
104 string: (not set)
105 +abbrev: 7
106 +verbose: 0
107 +quiet: no
108 +dry run: no
109 EOF
110
111 test_expect_success 'unambiguously abbreviated option' '
@@ -99,6 +129,10 @@ cat > expect << EOF
129 boolean: 0
130 integer: 0
131 string: 123
132 +abbrev: 7
133 +verbose: 0
134 +quiet: no
135 +dry run: no
136 EOF
137
138 test_expect_success 'non ambiguous option (after two options it abbreviates)' '
@@ -107,20 +141,24 @@ test_expect_success 'non ambiguous option (after two options it abbreviates)' '
141 test_cmp expect output
142 '
143
110 -cat > expect.err << EOF
144 +cat > typo.err << EOF
145 error: did you mean \`--boolean\` (with two dashes ?)
146 EOF
147
148 test_expect_success 'detect possible typos' '
115 - ! test-parse-options -boolean > output 2> output.err &&
149 + test_must_fail test-parse-options -boolean > output 2> output.err &&
150 test ! -s output &&
117 - test_cmp expect.err output.err
151 + test_cmp typo.err output.err
152 '
153
154 cat > expect <<EOF
155 boolean: 0
156 integer: 0
157 string: (not set)
158 +abbrev: 7
159 +verbose: 0
160 +quiet: no
161 +dry run: no
162 arg 00: --quux
163 EOF
164
@@ -130,4 +168,68 @@ test_expect_success 'keep some options as arguments' '
168 test_cmp expect output
169 '
170
171 +cat > expect <<EOF
172 +boolean: 0
173 +integer: 1
174 +string: default
175 +abbrev: 7
176 +verbose: 0
177 +quiet: yes
178 +dry run: no
179 +arg 00: foo
180 +EOF
181 +
182 +test_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 +
189 +cat > expect <<EOF
190 +Callback: "four", 0
191 +boolean: 5
192 +integer: 4
193 +string: (not set)
194 +abbrev: 7
195 +verbose: 0
196 +quiet: no
197 +dry run: no
198 +EOF
199 +
200 +test_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 +
206 +cat > expect <<EOF
207 +Callback: "not set", 1
208 +EOF
209 +
210 +test_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 +
216 +cat > expect <<EOF
217 +boolean: 1
218 +integer: 23
219 +string: (not set)
220 +abbrev: 7
221 +verbose: 0
222 +quiet: no
223 +dry run: no
224 +EOF
225 +
226 +test_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 +
235 test_done
test-parse-options.c
+35 -4
@@ -2,9 +2,22 @@
2 #include "parse-options.h"
3
4 static int boolean = 0;
5 -static int integer = 0;
5 +static unsigned long integer = 0;
6 +static int abbrev = 7;
7 +static int verbose = 0, dry_run = 0, quiet = 0;
8 static char *string = NULL;
9
10 +int length_callback(const struct option *opt, const char *arg, int unset)
11 +{
12 + printf("Callback: \"%s\", %d\n",
13 + (arg ? arg : "not set"), unset);
14 + if (unset)
15 + return 1; /* do not support unset */
16 +
17 + *(unsigned long *)opt->value = strlen(arg);
18 + return 0;
19 +}
20 +
21 int main(int argc, const char **argv)
22 {
23 const char *usage[] = {
@@ -13,15 +26,29 @@ int main(int argc, const char **argv)
26 };
27 struct option options[] = {
28 OPT_BOOLEAN('b', "boolean", &boolean, "get a boolean"),
29 + OPT_BIT('4', "or4", &boolean,
30 + "bitwise-or boolean with ...0100", 4),
31 + OPT_GROUP(""),
32 OPT_INTEGER('i', "integer", &integer, "get a integer"),
33 OPT_INTEGER('j', NULL, &integer, "get a integer, too"),
18 - OPT_GROUP("string options"),
34 + OPT_SET_INT(0, "set23", &integer, "set integer to 23", 23),
35 + OPT_DATE('t', NULL, &integer, "get timestamp of <time>"),
36 + OPT_CALLBACK('L', "length", &integer, "str",
37 + "get length of <str>", length_callback),
38 + OPT_GROUP("String options"),
39 OPT_STRING('s', "string", &string, "string", "get a string"),
40 OPT_STRING(0, "string2", &string, "str", "get another string"),
41 OPT_STRING(0, "st", &string, "st", "get another string (pervert ordering)"),
42 OPT_STRING('o', NULL, &string, "str", "get another string"),
23 - OPT_GROUP("magic arguments"),
43 + OPT_SET_PTR(0, "default-string", &string,
44 + "set string to default", (unsigned long)"default"),
45 + OPT_GROUP("Magic arguments"),
46 OPT_ARGUMENT("quux", "means --quux"),
47 + OPT_GROUP("Standard options"),
48 + OPT__ABBREV(&abbrev),
49 + OPT__VERBOSE(&verbose),
50 + OPT__DRY_RUN(&dry_run),
51 + OPT__QUIET(&quiet),
52 OPT_END(),
53 };
54 int i;
@@ -29,8 +56,12 @@ int main(int argc, const char **argv)
56 argc = parse_options(argc, argv, options, usage, 0);
57
58 printf("boolean: %d\n", boolean);
32 - printf("integer: %d\n", integer);
59 + printf("integer: %lu\n", integer);
60 printf("string: %s\n", string ? string : "(not set)");
61 + printf("abbrev: %d\n", abbrev);
62 + printf("verbose: %d\n", verbose);
63 + printf("quiet: %s\n", quiet ? "yes" : "no");
64 + printf("dry run: %s\n", dry_run ? "yes" : "no");
65
66 for (i = 0; i < argc; i++)
67 printf("arg %02d: %s\n", i, argv[i]);