3 #include <ccan/tap/tap.h>
9 /* We don't actually want it to exit... */
10 static jmp_buf exited;
11 #define exit(status) longjmp(exited, (status) + 1)
13 #define printf saved_printf
14 static int saved_printf(const char *fmt, ...);
16 #define fprintf saved_fprintf
17 static int saved_fprintf(FILE *ignored, const char *fmt, ...);
19 #define vfprintf(f, fmt, ap) saved_vprintf(fmt, ap)
20 static int saved_vprintf(const char *fmt, va_list ap);
22 #include <ccan/opt/helpers.c>
23 #include <ccan/opt/opt.c>
24 #include <ccan/opt/usage.c>
25 #include <ccan/opt/parse.c>
27 static void reset_options(void)
31 opt_count = opt_num_short = opt_num_short_arg = opt_num_long = 0;
34 static char *output = NULL;
36 static int saved_vprintf(const char *fmt, va_list ap)
39 int ret = vasprintf(&p, fmt, ap);
42 output = realloc(output, strlen(output) + strlen(p) + 1);
50 static int saved_printf(const char *fmt, ...)
56 ret = saved_vprintf(fmt, ap);
61 static int saved_fprintf(FILE *ignored, const char *fmt, ...)
67 ret = saved_vprintf(fmt, ap);
73 int main(int argc, char *argv[])
81 opt_register_noarg("-a", opt_set_bool, &arg, "");
82 ok1(parse_args(&argc, &argv, "-a", NULL));
84 opt_register_arg("-b", opt_set_bool_arg, NULL, &arg, "");
85 ok1(parse_args(&argc, &argv, "-b", "no", NULL));
87 ok1(parse_args(&argc, &argv, "-b", "yes", NULL));
89 ok1(parse_args(&argc, &argv, "-b", "false", NULL));
91 ok1(parse_args(&argc, &argv, "-b", "true", NULL));
93 ok1(!parse_args(&argc, &argv, "-b", "unknown", NULL));
95 ok1(strstr(err_output, ": -b: Invalid argument 'unknown'"));
101 opt_register_noarg("-a", opt_set_invbool, &arg, "");
102 ok1(parse_args(&argc, &argv, "-a", NULL));
104 opt_register_arg("-b", opt_set_invbool_arg, NULL,
106 ok1(parse_args(&argc, &argv, "-b", "no", NULL));
108 ok1(parse_args(&argc, &argv, "-b", "yes", NULL));
110 ok1(parse_args(&argc, &argv, "-b", "false", NULL));
112 ok1(parse_args(&argc, &argv, "-b", "true", NULL));
114 ok1(!parse_args(&argc, &argv, "-b", "unknown", NULL));
116 ok1(strstr(err_output, ": -b: Invalid argument 'unknown'"));
120 char *arg = (char *)"wrong";
122 opt_register_arg("-a", opt_set_charp, NULL, &arg, "All");
123 ok1(parse_args(&argc, &argv, "-a", "string", NULL));
124 ok1(strcmp(arg, "string") == 0);
130 opt_register_arg("-a", opt_set_intval, NULL, &arg, "All");
131 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
133 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
135 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
137 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
138 if (sizeof(int) == 4)
139 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
141 fail("Handle other int sizes");
143 /* opt_set_uintval */
145 unsigned int arg = 1000;
147 opt_register_arg("-a", opt_set_uintval, NULL, &arg, "All");
148 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
150 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
151 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
153 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
154 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
155 if (ULONG_MAX == UINT_MAX) {
156 pass("Can't test overflow");
157 pass("Can't test error message");
160 sprintf(buf, "%lu", ULONG_MAX);
161 ok1(!parse_args(&argc, &argv, "-a", buf, NULL));
162 ok1(strstr(err_output, ": -a: value '")
163 && strstr(err_output, buf)
164 && strstr(err_output, "' does not fit into an integer"));
167 /* opt_set_longval */
171 opt_register_arg("-a", opt_set_longval, NULL, &arg, "All");
172 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
174 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
176 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
178 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
179 if (sizeof(long) == 4)
180 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
181 else if (sizeof(long)== 8)
182 ok1(!parse_args(&argc, &argv, "-a", "18446744073709551616", NULL));
184 fail("FIXME: Handle other long sizes");
186 /* opt_set_ulongval */
188 unsigned long int arg = 1000;
190 opt_register_arg("-a", opt_set_ulongval, NULL, &arg, "All");
191 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
193 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
194 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
196 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
197 if (sizeof(long) == 4)
198 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
199 else if (sizeof(long)== 8)
200 ok1(!parse_args(&argc, &argv, "-a", "18446744073709551616", NULL));
202 fail("FIXME: Handle other long sizes");
208 opt_register_noarg("-a", opt_inc_intval, &arg, "");
209 ok1(parse_args(&argc, &argv, "-a", NULL));
211 ok1(parse_args(&argc, &argv, "-a", "-a", NULL));
213 ok1(parse_args(&argc, &argv, "-aa", NULL));
217 /* opt_show_version_and_exit. */
221 opt_register_noarg("-a",
222 opt_version_and_exit, "1.2.3", "");
223 exitval = setjmp(exited);
225 parse_args(&argc, &argv, "-a", NULL);
226 fail("opt_show_version_and_exit returned?");
228 ok1(exitval - 1 == 0);
230 ok1(strcmp(output, "1.2.3\n") == 0);
235 /* opt_usage_and_exit. */
239 opt_register_noarg("-a",
240 opt_usage_and_exit, "[args]", "");
241 exitval = setjmp(exited);
243 parse_args(&argc, &argv, "-a", NULL);
244 fail("opt_usage_and_exit returned?");
246 ok1(exitval - 1 == 0);
248 ok1(strstr(output, "[args]"));
249 ok1(strstr(output, argv[0]));
250 ok1(strstr(output, "[-a]"));
258 char buf[OPT_SHOW_LEN+2] = { 0 };
259 buf[OPT_SHOW_LEN] = '!';
262 opt_show_bool(buf, &b);
263 ok1(strcmp(buf, "true") == 0);
264 ok1(buf[OPT_SHOW_LEN] == '!');
267 opt_show_bool(buf, &b);
268 ok1(strcmp(buf, "false") == 0);
269 ok1(buf[OPT_SHOW_LEN] == '!');
272 /* opt_show_invbool */
275 char buf[OPT_SHOW_LEN+2] = { 0 };
276 buf[OPT_SHOW_LEN] = '!';
279 opt_show_invbool(buf, &b);
280 ok1(strcmp(buf, "false") == 0);
281 ok1(buf[OPT_SHOW_LEN] == '!');
284 opt_show_invbool(buf, &b);
285 ok1(strcmp(buf, "true") == 0);
286 ok1(buf[OPT_SHOW_LEN] == '!');
291 char str[OPT_SHOW_LEN*2], *p;
292 char buf[OPT_SHOW_LEN+2] = { 0 };
293 buf[OPT_SHOW_LEN] = '!';
298 opt_show_charp(buf, &p);
299 ok1(strcmp(buf, "\"short\"") == 0);
300 ok1(buf[OPT_SHOW_LEN] == '!');
303 memset(p, 'x', OPT_SHOW_LEN*2);
304 p[OPT_SHOW_LEN*2-1] = '\0';
305 opt_show_charp(buf, &p);
307 ok1(buf[OPT_SHOW_LEN-1] == '"');
308 ok1(buf[OPT_SHOW_LEN] == '!');
309 ok1(strspn(buf+1, "x") == OPT_SHOW_LEN-2);
312 /* opt_show_intval */
315 char buf[OPT_SHOW_LEN+2] = { 0 };
316 buf[OPT_SHOW_LEN] = '!';
319 opt_show_intval(buf, &i);
320 ok1(strcmp(buf, "-77") == 0);
321 ok1(buf[OPT_SHOW_LEN] == '!');
324 opt_show_intval(buf, &i);
325 ok1(strcmp(buf, "77") == 0);
326 ok1(buf[OPT_SHOW_LEN] == '!');
329 /* opt_show_uintval */
332 char buf[OPT_SHOW_LEN+2] = { 0 };
333 buf[OPT_SHOW_LEN] = '!';
336 opt_show_uintval(buf, &ui);
337 ok1(strcmp(buf, "4294967295") == 0);
338 ok1(buf[OPT_SHOW_LEN] == '!');
341 /* opt_show_longval */
344 char buf[OPT_SHOW_LEN+2] = { 0 };
345 buf[OPT_SHOW_LEN] = '!';
348 opt_show_longval(buf, &l);
349 ok1(strcmp(buf, "1234567890") == 0);
350 ok1(buf[OPT_SHOW_LEN] == '!');
353 /* opt_show_ulongval */
356 char buf[OPT_SHOW_LEN+2] = { 0 };
357 buf[OPT_SHOW_LEN] = '!';
360 opt_show_ulongval(buf, &ul);
361 ok1(strcmp(buf, "4294967295") == 0);
362 ok1(buf[OPT_SHOW_LEN] == '!');
365 /* opt_log_stderr. */
368 opt_register_noarg("-a",
369 opt_usage_and_exit, "[args]", "");
372 argv = malloc(sizeof(argv[0]) * 3);
373 argv[0] = "thisprog";
374 argv[1] = "--garbage";
376 ok1(!opt_parse(&argc, argv, opt_log_stderr));
378 "thisprog: --garbage: unrecognized option\n"));
383 /* opt_log_stderr_exit. */
387 opt_register_noarg("-a",
388 opt_usage_and_exit, "[args]", "");
389 exitval = setjmp(exited);
392 argv = malloc(sizeof(argv[0]) * 3);
393 argv[0] = "thisprog";
394 argv[1] = "--garbage";
396 opt_parse(&argc, argv, opt_log_stderr_exit);
397 fail("opt_log_stderr_exit returned?");
399 ok1(exitval - 1 == 1);
402 "thisprog: --garbage: unrecognized option\n"));
407 return exit_status();