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 #include <ccan/opt/helpers.c>
17 #include <ccan/opt/opt.c>
18 #include <ccan/opt/usage.c>
20 static void reset_options(void)
24 opt_count = opt_num_short = opt_num_short_arg = opt_num_long = 0;
27 static char *output = NULL;
29 static int saved_printf(const char *fmt, ...)
36 ret = vasprintf(&p, fmt, ap);
40 output = realloc(output, strlen(output) + strlen(p) + 1);
50 int main(int argc, char *argv[])
58 opt_register_noarg("-a", opt_set_bool, &arg, "");
59 ok1(parse_args(&argc, &argv, "-a", NULL));
61 opt_register_arg("-b", opt_set_bool_arg, NULL, &arg, "");
62 ok1(parse_args(&argc, &argv, "-b", "no", NULL));
64 ok1(parse_args(&argc, &argv, "-b", "yes", NULL));
66 ok1(parse_args(&argc, &argv, "-b", "false", NULL));
68 ok1(parse_args(&argc, &argv, "-b", "true", NULL));
70 ok1(!parse_args(&argc, &argv, "-b", "unknown", NULL));
72 ok1(strstr(err_output, ": -b: Invalid argument 'unknown'"));
78 opt_register_noarg("-a", opt_set_invbool, &arg, "");
79 ok1(parse_args(&argc, &argv, "-a", NULL));
81 opt_register_arg("-b", opt_set_invbool_arg, NULL,
83 ok1(parse_args(&argc, &argv, "-b", "no", NULL));
85 ok1(parse_args(&argc, &argv, "-b", "yes", NULL));
87 ok1(parse_args(&argc, &argv, "-b", "false", NULL));
89 ok1(parse_args(&argc, &argv, "-b", "true", NULL));
91 ok1(!parse_args(&argc, &argv, "-b", "unknown", NULL));
93 ok1(strstr(err_output, ": -b: Invalid argument 'unknown'"));
97 char *arg = (char *)"wrong";
99 opt_register_arg("-a", opt_set_charp, NULL, &arg, "All");
100 ok1(parse_args(&argc, &argv, "-a", "string", NULL));
101 ok1(strcmp(arg, "string") == 0);
107 opt_register_arg("-a", opt_set_intval, NULL, &arg, "All");
108 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
110 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
112 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
114 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
115 if (sizeof(int) == 4)
116 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
118 fail("Handle other int sizes");
120 /* opt_set_uintval */
122 unsigned int arg = 1000;
124 opt_register_arg("-a", opt_set_uintval, NULL, &arg, "All");
125 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
127 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
128 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
130 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
131 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
132 if (ULONG_MAX == UINT_MAX) {
133 pass("Can't test overflow");
134 pass("Can't test error message");
137 sprintf(buf, "%lu", ULONG_MAX);
138 ok1(!parse_args(&argc, &argv, "-a", buf, NULL));
139 ok1(strstr(err_output, ": -a: value '")
140 && strstr(err_output, buf)
141 && strstr(err_output, "' does not fit into an integer"));
144 /* opt_set_longval */
148 opt_register_arg("-a", opt_set_longval, NULL, &arg, "All");
149 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
151 ok1(parse_args(&argc, &argv, "-a", "-9999", NULL));
153 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
155 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
156 if (sizeof(long) == 4)
157 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
158 else if (sizeof(long)== 8)
159 ok1(!parse_args(&argc, &argv, "-a", "18446744073709551616", NULL));
161 fail("FIXME: Handle other long sizes");
163 /* opt_set_ulongval */
165 unsigned long int arg = 1000;
167 opt_register_arg("-a", opt_set_ulongval, NULL, &arg, "All");
168 ok1(parse_args(&argc, &argv, "-a", "9999", NULL));
170 ok1(!parse_args(&argc, &argv, "-a", "-9999", NULL));
171 ok1(parse_args(&argc, &argv, "-a", "0", NULL));
173 ok1(!parse_args(&argc, &argv, "-a", "100crap", NULL));
174 if (sizeof(long) == 4)
175 ok1(!parse_args(&argc, &argv, "-a", "4294967296", NULL));
176 else if (sizeof(long)== 8)
177 ok1(!parse_args(&argc, &argv, "-a", "18446744073709551616", NULL));
179 fail("FIXME: Handle other long sizes");
185 opt_register_noarg("-a", opt_inc_intval, &arg, "");
186 ok1(parse_args(&argc, &argv, "-a", NULL));
188 ok1(parse_args(&argc, &argv, "-a", "-a", NULL));
190 ok1(parse_args(&argc, &argv, "-aa", NULL));
194 /* opt_show_version_and_exit. */
198 opt_register_noarg("-a",
199 opt_version_and_exit, "1.2.3", "");
200 exitval = setjmp(exited);
202 parse_args(&argc, &argv, "-a", NULL);
203 fail("opt_show_version_and_exit returned?");
205 ok1(exitval - 1 == 0);
207 ok1(strcmp(output, "1.2.3\n") == 0);
212 /* opt_usage_and_exit. */
216 opt_register_noarg("-a",
217 opt_usage_and_exit, "[args]", "");
218 exitval = setjmp(exited);
220 parse_args(&argc, &argv, "-a", NULL);
221 fail("opt_usage_and_exit returned?");
223 ok1(exitval - 1 == 0);
225 ok1(strstr(output, "[args]"));
226 ok1(strstr(output, argv[0]));
227 ok1(strstr(output, "[-a]"));
235 char buf[OPT_SHOW_LEN+2] = { 0 };
236 buf[OPT_SHOW_LEN] = '!';
239 opt_show_bool(buf, &b);
240 ok1(strcmp(buf, "true") == 0);
241 ok1(buf[OPT_SHOW_LEN] == '!');
244 opt_show_bool(buf, &b);
245 ok1(strcmp(buf, "false") == 0);
246 ok1(buf[OPT_SHOW_LEN] == '!');
249 /* opt_show_invbool */
252 char buf[OPT_SHOW_LEN+2] = { 0 };
253 buf[OPT_SHOW_LEN] = '!';
256 opt_show_invbool(buf, &b);
257 ok1(strcmp(buf, "false") == 0);
258 ok1(buf[OPT_SHOW_LEN] == '!');
261 opt_show_invbool(buf, &b);
262 ok1(strcmp(buf, "true") == 0);
263 ok1(buf[OPT_SHOW_LEN] == '!');
268 char str[OPT_SHOW_LEN*2], *p;
269 char buf[OPT_SHOW_LEN+2] = { 0 };
270 buf[OPT_SHOW_LEN] = '!';
275 opt_show_charp(buf, &p);
276 ok1(strcmp(buf, "\"short\"") == 0);
277 ok1(buf[OPT_SHOW_LEN] == '!');
280 memset(p, 'x', OPT_SHOW_LEN*2);
281 p[OPT_SHOW_LEN*2-1] = '\0';
282 opt_show_charp(buf, &p);
284 ok1(buf[OPT_SHOW_LEN-1] == '"');
285 ok1(buf[OPT_SHOW_LEN] == '!');
286 ok1(strspn(buf+1, "x") == OPT_SHOW_LEN-2);
289 /* opt_show_intval */
292 char buf[OPT_SHOW_LEN+2] = { 0 };
293 buf[OPT_SHOW_LEN] = '!';
296 opt_show_intval(buf, &i);
297 ok1(strcmp(buf, "-77") == 0);
298 ok1(buf[OPT_SHOW_LEN] == '!');
301 opt_show_intval(buf, &i);
302 ok1(strcmp(buf, "77") == 0);
303 ok1(buf[OPT_SHOW_LEN] == '!');
306 /* opt_show_uintval */
309 char buf[OPT_SHOW_LEN+2] = { 0 };
310 buf[OPT_SHOW_LEN] = '!';
313 opt_show_uintval(buf, &ui);
314 ok1(strcmp(buf, "4294967295") == 0);
315 ok1(buf[OPT_SHOW_LEN] == '!');
318 /* opt_show_longval */
321 char buf[OPT_SHOW_LEN+2] = { 0 };
322 buf[OPT_SHOW_LEN] = '!';
325 opt_show_longval(buf, &l);
326 ok1(strcmp(buf, "1234567890") == 0);
327 ok1(buf[OPT_SHOW_LEN] == '!');
330 /* opt_show_ulongval */
333 char buf[OPT_SHOW_LEN+2] = { 0 };
334 buf[OPT_SHOW_LEN] = '!';
337 opt_show_ulongval(buf, &ul);
338 ok1(strcmp(buf, "4294967295") == 0);
339 ok1(buf[OPT_SHOW_LEN] == '!');
342 return exit_status();