1 #include <ccan/tap/tap.h>
3 #include <ccan/opt/opt.c>
4 #include <ccan/opt/usage.c>
5 #include <ccan/opt/helpers.c>
6 #include <ccan/opt/parse.c>
9 int main(int argc, char *argv[])
11 const char *myname = argv[0];
15 /* Simple short arg.*/
16 opt_register_noarg("-a", test_noarg, NULL, "All");
17 ok1(parse_args(&argc, &argv, "-a", NULL));
19 ok1(argv[0] == myname);
21 ok1(test_cb_called == 1);
23 /* Simple long arg. */
24 opt_register_noarg("--aaa", test_noarg, NULL, "AAAAll");
25 ok1(parse_args(&argc, &argv, "--aaa", NULL));
27 ok1(argv[0] == myname);
29 ok1(test_cb_called == 2);
31 /* Both long and short args. */
32 opt_register_noarg("--aaa|-a", test_noarg, NULL, "AAAAAAll");
33 ok1(parse_args(&argc, &argv, "--aaa", "-a", NULL));
35 ok1(argv[0] == myname);
37 ok1(test_cb_called == 4);
39 /* Extra arguments preserved. */
40 ok1(parse_args(&argc, &argv, "--aaa", "-a", "extra", "args", NULL));
42 ok1(argv[0] == myname);
43 ok1(strcmp(argv[1], "extra") == 0);
44 ok1(strcmp(argv[2], "args") == 0);
45 ok1(test_cb_called == 6);
47 /* Malformed versions. */
48 ok1(!parse_args(&argc, &argv, "--aaa=arg", NULL));
49 ok1(strstr(err_output, ": --aaa: doesn't allow an argument"));
50 ok1(!parse_args(&argc, &argv, "--aa", NULL));
51 ok1(strstr(err_output, ": --aa: unrecognized option"));
52 ok1(!parse_args(&argc, &argv, "--aaargh", NULL));
53 ok1(strstr(err_output, ": --aaargh: unrecognized option"));
55 /* Argument variants. */
58 opt_register_arg("-a|--aaa", test_arg, NULL, "aaa", "AAAAAAll");
59 ok1(parse_args(&argc, &argv, "--aaa", "aaa", NULL));
61 ok1(argv[0] == myname);
62 ok1(test_cb_called == 1);
64 ok1(parse_args(&argc, &argv, "--aaa=aaa", NULL));
66 ok1(argv[0] == myname);
67 ok1(test_cb_called == 2);
69 ok1(parse_args(&argc, &argv, "-a", "aaa", NULL));
71 ok1(argv[0] == myname);
72 ok1(test_cb_called == 3);
74 /* Malformed versions. */
75 ok1(!parse_args(&argc, &argv, "-a", NULL));
76 ok1(strstr(err_output, ": -a: requires an argument"));
77 ok1(!parse_args(&argc, &argv, "--aaa", NULL));
78 ok1(strstr(err_output, ": --aaa: requires an argument"));
79 ok1(!parse_args(&argc, &argv, "--aa", NULL));
80 ok1(strstr(err_output, ": --aa: unrecognized option"));
81 ok1(!parse_args(&argc, &argv, "--aaargh", NULL));
82 ok1(strstr(err_output, ": --aaargh: unrecognized option"));
88 opt_register_table(short_table, NULL);
89 ok1(parse_args(&argc, &argv, "-a", NULL));
91 ok1(argv[0] == myname);
93 ok1(test_cb_called == 1);
94 /* This one needs an arg. */
95 ok1(parse_args(&argc, &argv, "-b", NULL) == false);
96 ok1(test_cb_called == 1);
97 ok1(parse_args(&argc, &argv, "-b", "b", NULL));
99 ok1(argv[0] == myname);
100 ok1(argv[1] == NULL);
101 ok1(test_cb_called == 2);
106 opt_register_table(long_table, NULL);
107 ok1(parse_args(&argc, &argv, "--ddd", NULL));
109 ok1(argv[0] == myname);
110 ok1(argv[1] == NULL);
111 ok1(test_cb_called == 1);
112 /* This one needs an arg. */
113 ok1(parse_args(&argc, &argv, "--eee", NULL) == false);
114 ok1(test_cb_called == 1);
115 ok1(parse_args(&argc, &argv, "--eee", "eee", NULL));
117 ok1(argv[0] == myname);
118 ok1(argv[1] == NULL);
119 ok1(test_cb_called == 2);
121 /* Short and long, both. */
124 opt_register_table(long_and_short_table, NULL);
125 ok1(parse_args(&argc, &argv, "-g", NULL));
127 ok1(argv[0] == myname);
128 ok1(argv[1] == NULL);
129 ok1(test_cb_called == 1);
130 ok1(parse_args(&argc, &argv, "--ggg", NULL));
132 ok1(argv[0] == myname);
133 ok1(argv[1] == NULL);
134 ok1(test_cb_called == 2);
135 /* This one needs an arg. */
136 ok1(parse_args(&argc, &argv, "-h", NULL) == false);
137 ok1(test_cb_called == 2);
138 ok1(parse_args(&argc, &argv, "-h", "hhh", NULL));
140 ok1(argv[0] == myname);
141 ok1(argv[1] == NULL);
142 ok1(test_cb_called == 3);
143 ok1(parse_args(&argc, &argv, "--hhh", NULL) == false);
144 ok1(test_cb_called == 3);
145 ok1(parse_args(&argc, &argv, "--hhh", "hhh", NULL));
147 ok1(argv[0] == myname);
148 ok1(argv[1] == NULL);
149 ok1(test_cb_called == 4);
151 /* Those will all work as tables. */
154 opt_register_table(subtables, NULL);
155 ok1(parse_args(&argc, &argv, "-a", NULL));
157 ok1(argv[0] == myname);
158 ok1(argv[1] == NULL);
159 ok1(test_cb_called == 1);
160 /* This one needs an arg. */
161 ok1(parse_args(&argc, &argv, "-b", NULL) == false);
162 ok1(test_cb_called == 1);
163 ok1(parse_args(&argc, &argv, "-b", "b", NULL));
165 ok1(argv[0] == myname);
166 ok1(argv[1] == NULL);
167 ok1(test_cb_called == 2);
169 ok1(parse_args(&argc, &argv, "--ddd", NULL));
171 ok1(argv[0] == myname);
172 ok1(argv[1] == NULL);
173 ok1(test_cb_called == 3);
174 /* This one needs an arg. */
175 ok1(parse_args(&argc, &argv, "--eee", NULL) == false);
176 ok1(test_cb_called == 3);
177 ok1(parse_args(&argc, &argv, "--eee", "eee", NULL));
179 ok1(argv[0] == myname);
180 ok1(argv[1] == NULL);
181 ok1(test_cb_called == 4);
183 /* Short and long, both. */
184 ok1(parse_args(&argc, &argv, "-g", NULL));
186 ok1(argv[0] == myname);
187 ok1(argv[1] == NULL);
188 ok1(test_cb_called == 5);
189 ok1(parse_args(&argc, &argv, "--ggg", NULL));
191 ok1(argv[0] == myname);
192 ok1(argv[1] == NULL);
193 ok1(test_cb_called == 6);
194 /* This one needs an arg. */
195 ok1(parse_args(&argc, &argv, "-h", NULL) == false);
196 ok1(test_cb_called == 6);
197 ok1(parse_args(&argc, &argv, "-h", "hhh", NULL));
199 ok1(argv[0] == myname);
200 ok1(argv[1] == NULL);
201 ok1(test_cb_called == 7);
202 ok1(parse_args(&argc, &argv, "--hhh", NULL) == false);
203 ok1(test_cb_called == 7);
204 ok1(parse_args(&argc, &argv, "--hhh", "hhh", NULL));
206 ok1(argv[0] == myname);
207 ok1(argv[1] == NULL);
208 ok1(test_cb_called == 8);
210 /* Now the tricky one: -? must not be confused with an unknown option */
214 /* glibc's getopt does not handle ? with arguments. */
215 opt_register_noarg("-?", test_noarg, NULL, "Help");
216 ok1(parse_args(&argc, &argv, "-?", NULL));
217 ok1(test_cb_called == 1);
218 ok1(parse_args(&argc, &argv, "-a", NULL) == false);
219 ok1(test_cb_called == 1);
220 ok1(strstr(err_output, ": -a: unrecognized option"));
221 ok1(parse_args(&argc, &argv, "--aaaa", NULL) == false);
222 ok1(test_cb_called == 1);
223 ok1(strstr(err_output, ": --aaaa: unrecognized option"));
228 /* Corner cases involving short arg parsing weirdness. */
229 opt_register_noarg("-a|--aaa", test_noarg, NULL, "a");
230 opt_register_arg("-b|--bbb", test_arg, NULL, "bbb", "b");
231 opt_register_arg("-c|--ccc", test_arg, NULL, "aaa", "c");
233 ok1(parse_args(&argc, &argv, "-aa", NULL));
234 ok1(test_cb_called == 2);
235 ok1(parse_args(&argc, &argv, "-aab", NULL) == false);
236 ok1(test_cb_called == 4);
237 ok1(strstr(err_output, ": -b: requires an argument"));
238 ok1(parse_args(&argc, &argv, "-bbbb", NULL));
239 ok1(test_cb_called == 5);
240 ok1(parse_args(&argc, &argv, "-aabbbb", NULL));
241 ok1(test_cb_called == 8);
242 ok1(parse_args(&argc, &argv, "-aabbbb", "-b", "bbb", NULL));
243 ok1(test_cb_called == 12);
244 ok1(parse_args(&argc, &argv, "-aabbbb", "--bbb", "bbb", NULL));
245 ok1(test_cb_called == 16);
246 ok1(parse_args(&argc, &argv, "-aabbbb", "--bbb=bbb", NULL));
247 ok1(test_cb_called == 20);
248 ok1(parse_args(&argc, &argv, "-aacaaa", NULL));
249 ok1(test_cb_called == 23);
250 ok1(parse_args(&argc, &argv, "-aacaaa", "-a", NULL));
251 ok1(test_cb_called == 27);
252 ok1(parse_args(&argc, &argv, "-aacaaa", "--bbb", "bbb", "-aacaaa",
254 ok1(test_cb_called == 34);
259 /* -- and POSIXLY_CORRECT */
260 opt_register_noarg("-a|--aaa", test_noarg, NULL, "a");
261 ok1(parse_args(&argc, &argv, "-a", "--", "-a", NULL));
262 ok1(test_cb_called == 1);
264 ok1(strcmp(argv[1], "-a") == 0);
267 unsetenv("POSIXLY_CORRECT");
268 ok1(parse_args(&argc, &argv, "-a", "somearg", "-a", "--", "-a", NULL));
269 ok1(test_cb_called == 3);
271 ok1(strcmp(argv[1], "somearg") == 0);
272 ok1(strcmp(argv[2], "-a") == 0);
275 setenv("POSIXLY_CORRECT", "1", 1);
276 ok1(parse_args(&argc, &argv, "-a", "somearg", "-a", "--", "-a", NULL));
277 ok1(test_cb_called == 4);
279 ok1(strcmp(argv[1], "somearg") == 0);
280 ok1(strcmp(argv[2], "-a") == 0);
281 ok1(strcmp(argv[3], "--") == 0);
282 ok1(strcmp(argv[4], "-a") == 0);
285 /* parse_args allocates argv */
287 return exit_status();