37static char argstr [4096];
41#define MAXCALLBACKS 32
50static int exit_status;
53static int current_line;
59pargs (
char *
buf,
const char *funcname,
int argc,
char *argv [])
63 char* next =
buf + strlen (
buf);
72 next += sprintf (next,
"%s(%d,{", funcname, argc);
74 next += sprintf (next,
"%d,{", argc);
76 for (
int i = 0;
i < argc; ++
i) {
79 next += sprintf (next,
"\"%s\"", argv [
i]);
81 strcpy (next,
"(null)");
82 next += strlen (next);
100 return retvals [ncalls];
106callback_imp (
const char *cbname,
int argc,
char *argv[])
108 const int status = pargs (argstr, cbname, argc, argv);
117foo (
int argc,
char *argv[])
119 return callback_imp (
"foo", argc, argv);
124bar (
int argc,
char *argv[])
126 return callback_imp (
"bar", argc, argv);
130err (
int argc,
char *argv[])
132 return callback_imp (
"ERR", argc, argv);
139static int opt_counts [4];
156test_opts (
const char *expect,
174 if (set_res != set_exp) {
182 { f0 }, {
f1 }, {
f2 }, {
f3 }
186 "line %d: rw_setopts (\"%s\", %p, %p, %p, %p) == %d, got %d\n",
187 current_line, argspec,
188 uptr [0].pvoid, uptr [1].pvoid, uptr [2].pvoid, uptr [3].pvoid,
198 for (; argv [argc]; ++argc);
204 memset (opt_counts, 0,
sizeof opt_counts);
208 if (get_res != get_exp) {
210 static char tmp [4096];
213 pargs (
tmp, 0, argc, argv);
216 "line %d: rw_runopts (%s) == %d, got %d\n",
217 current_line,
tmp, get_exp, get_res);
222 if (strchr (expect,
'#')) {
228 if (f0 == cntptrs [0].
pfun) {
229 sprintf (argstr + strlen (argstr),
230 "%s%d", *argstr ?
"; #" :
"#", opt_counts [0]);
232 if (
f1 == cntptrs [1].
pfun) {
233 sprintf (argstr + strlen (argstr),
234 ",%d", opt_counts [1]);
236 if (
f2 == cntptrs [2].
pfun) {
237 sprintf (argstr + strlen (argstr),
238 ",%d", opt_counts [2]);
240 if (
f3 == cntptrs [3].
pfun) {
241 sprintf (argstr + strlen (argstr),
242 ",%d", opt_counts [3]);
249 if (strcmp (argstr, expect)) {
251 "line %d: \"%s\" != \"%s\"\n",
252 current_line, argstr, expect);
261mkargv (
const char *
s0,
272 static char argbuf [10][1024];
273 static char* argv [10];
275 argv [0] =
s0 ? strcpy (argbuf [0],
s0) : 0;
276 argv [1] =
s1 ? strcpy (argbuf [1],
s1) : 0;
277 argv [2] =
s2 ? strcpy (argbuf [2],
s2) : 0;
278 argv [3] =
s3 ? strcpy (argbuf [3],
s3) : 0;
279 argv [4] = s4 ? strcpy (argbuf [4], s4) : 0;
280 argv [5] = s5 ? strcpy (argbuf [5], s5) : 0;
281 argv [6] = s6 ? strcpy (argbuf [6], s6) : 0;
282 argv [7] = s7 ? strcpy (argbuf [7], s7) : 0;
283 argv [8] = s8 ? strcpy (argbuf [8], s8) : 0;
284 argv [9] = s9 ? strcpy (argbuf [9], s9) : 0;
297#define C0 cntptrs [0].pfun
298#define C1 cntptrs [1].pfun
299#define C2 cntptrs [2].pfun
300#define C3 cntptrs [3].pfun
301#define N(n) make_arg (n)
302#define T (current_line = __LINE__), test_opts
307test_unknown_options ()
318 T (
"", 0,
A (
""), 0,
"", 0);
321 T (
"", 0,
A (
""), 1,
"-", 0);
322 T (
"", 0,
A (
""), 1,
"-",
E);
325 T (
"ERR(1,{\"-x\"})", 0,
A (
"-x"), 2,
"- f",
E,
F);
326 T (
"ERR(2,{\"-x\",\"-y\"});"
327 "foo(1,{\"-y\"})", 0,
A (
"-x",
"-y"), 2,
"- y",
E,
F);
330 T (
"ERR(2,{\"-x\",\"-y\"})", 1,
A (
"-x",
"-y"), 2,
"- y",
E,
F);
334 T (
"foo(2,{\"-x\",\"-y\"});"
335 "ERR(1,{\"-y\"})", 2,
A (
"-x",
"-y"), 2,
"- x",
E,
F);
336 T (
"foo(3,{\"-x\",\"-y\",\"-x\"});"
337 "ERR(2,{\"-y\",\"-x\"})", 2,
A (
"-x",
"-y",
"-x"), 2,
"- x",
E,
F);
344test_counted_options ()
347 T (
"#1", 0,
A (
"-b"), 1,
"b#",
C0);
348 T (
"#1", 0,
A (
"--cc"), 1,
"|-cc#",
C0);
349 T (
"#2", 0,
A (
"-d",
"-d"), 1,
"d#",
C0);
350 T (
"#2", 0,
A (
"-e",
"--ee"), 1,
"e|-ee#",
C0);
351 T (
"#3", 0,
A (
"-e",
"-e",
"-e"), 1,
"e#",
C0);
352 T (
"#1,2", 0,
A (
"-f",
"-g",
"-g"), 2,
"f# g#",
C0,
C1);
355 T (
"#0", 0,
A (
"--n=0"), 1,
"|-n#",
C0);
356 T (
"#1", 0,
A (
"--n=1"), 1,
"|-n#",
C0);
357 T (
"#1", 0,
A (
"--n=+1"), 1,
"|-n#",
C0);
358 T (
"#-1", 0,
A (
"--n=-1"), 1,
"|-n#",
C0);
359 T (
"#2", 0,
A (
"--n=+2"), 1,
"|-n#",
C0);
360 T (
"#-2", 0,
A (
"--n=-2"), 1,
"|-n#",
C0);
361 T (
"#12345", 0,
A (
"--n=+12345"), 1,
"|-n#",
C0);
362 T (
"#-12346", 0,
A (
"--n=-12346"), 1,
"|-n#",
C0);
365 T (
"#0", 0,
A (
"--n=0"), 1,
"|-n#0",
C0);
366 T (
"#1", 0,
A (
"--n=1"), 1,
"|-n#0",
C0);
367 T (
"#1", 0,
A (
"--n=1"), 1,
"|-n#1",
C0);
368 T (
"#2", 0,
A (
"--n=2"), 1,
"|-n#1",
C0);
369 T (
"#1", 0,
A (
"--n=+1"), 1,
"|-n#+1",
C0);
370 T (
"#-1", 0,
A (
"--n=-1"), 1,
"|-n#-1",
C0);
371 T (
"#0", 0,
A (
"--n=0"), 1,
"|-n#-1",
C0);
372 T (
"#1", 0,
A (
"--n=1"), 1,
"|-n#-1",
C0);
373 T (
"#123", 0,
A (
"--n=+123"), 1,
"|-n#+123",
C0);
374 T (
"#124", 0,
A (
"--n=+124"), 1,
"|-n#+123",
C0);
375 T (
"#-125", 0,
A (
"--n=-125"), 1,
"|-n#-125",
C0);
376 T (
"#-126", 0,
A (
"--n=-126"), 1,
"|-n#-127",
C0);
378 T (
"#0", 0,
A (
"--n=0"), 1,
"|-n#0-1",
C0);
379 T (
"#1", 0,
A (
"--n=1"), 1,
"|-n#0-1",
C0);
381 T (
"#0", 0,
A (
"--n=0"), 1,
"|-n#-1-0",
C0);
384 T (
"", 1,
A (
"--n=1"), 1,
"|-n#-1-0",
C0);
385 T (
"", 1,
A (
"--n=-1"), 1,
"|-n#0",
C0);
386 T (
"", 1,
A (
"--n=0"), 1,
"|-n#1",
C0);
387 T (
"", 1,
A (
"--n=1"), 1,
"|-n#2",
C0);
388 T (
"", 1,
A (
"--n=+2"), 1,
"|-n#+3",
C0);
390 T (
"", 1,
A (
"--n=-1"), 1,
"|-n#0-1",
C0);
391 T (
"", 1,
A (
"--n=+2"), 1,
"|-n#0-1",
C0);
392 T (
"", 1,
A (
"--n=-11"), 1,
"|-n#-10--5",
C0);
393 T (
"", 1,
A (
"--n=-4"), 1,
"|-n#-10--5",
C0);
394 T (
"", 1,
A (
"--n=-11"), 1,
"|-n#-1-1",
C0);
395 T (
"", 1,
A (
"--n=-1"), 1,
"|-n#0-32",
C0);
396 T (
"", 1,
A (
"--n=33"), 1,
"|-n#0-32",
C0);
412 T (
"#1", 0,
A (
"--enable-foo"), 1,
"|-foo~",
C0);
413 T (
"#1", 0,
A (
"--use-foo"), 1,
"|-foo~",
C0);
414 T (
"#1", 0,
A (
"--with-foo"), 1,
"|-foo~",
C0);
415 T (
"#-1", 0,
A (
"--disable-foo"), 1,
"|-foo~",
C0);
416 T (
"#-1", 0,
A (
"--no-foo"), 1,
"|-foo~",
C0);
417 T (
"#-1", 0,
A (
"--without-foo"), 1,
"|-foo~",
C0);
420 T (
"#1", 0,
A (
"--enable-foo",
"--use-foo"), 1,
"|-foo~",
C0);
421 T (
"#-1", 0,
A (
"--no-foo",
"--without-foo"), 1,
"|-foo~",
C0);
424 T (
"#-1", 0,
A (
"--use-foo",
"--no-foo"), 1,
"|-foo~",
C0);
425 T (
"#1", 0,
A (
"--no-foo",
"--use-foo"), 1,
"|-foo~",
C0);
430 T (
"#1", 0,
A (
"--enable-foo"), 1,
"|-foo~:0",
C0);
431 T (
"#1", 0,
A (
"--enable-foo"), 1,
"|-foo~:1",
C0);
432 T (
"#2", 0,
A (
"--enable-foo"), 1,
"|-foo~:2",
C0);
433 T (
"#3", 0,
A (
"--enable-foo"), 1,
"|-foo~:3",
C0);
434 T (
"#4", 0,
A (
"--enable-foo"), 1,
"|-foo~:4",
C0);
437 T (
"#-2", 0,
A (
"--disable-foo"), 1,
"|-foo~:1",
C0);
438 T (
"#-3", 0,
A (
"--disable-foo"), 1,
"|-foo~:2",
C0);
439 T (
"#-4", 0,
A (
"--disable-foo"), 1,
"|-foo~:3",
C0);
440 T (
"#-5", 0,
A (
"--disable-foo"), 1,
"|-foo~:4",
C0);
443 T (
"#0,1", 0,
A (
"--enable-bar"), 1,
"|-bar~32:0",
C0,
C1);
444 T (
"#0,1", 0,
A (
"--enable-bar"), 1,
"|-bar~32:1",
C0,
C1);
445 T (
"#0,2", 0,
A (
"--enable-bar"), 1,
"|-bar~32:2",
C0,
C1);
446 T (
"#0,3", 0,
A (
"--enable-bar"), 1,
"|-bar~32:3",
C0,
C1);
447 T (
"#0,4", 0,
A (
"--enable-bar"), 1,
"|-bar~32:4",
C0,
C1);
450 T (
"#1", 0,
A (
"--with-0"), 4,
"|-0~0 |-1~1 |-2~2 |-3~3",
C0,
C0,
C0,
C0);
451 T (
"#2", 0,
A (
"--with-1"), 4,
"|-0~0 |-1~1 |-2~2 |-3~3",
C0,
C0,
C0,
C0);
452 T (
"#4", 0,
A (
"--with-2"), 4,
"|-0~0 |-1~1 |-2~2 |-3~3",
C0,
C0,
C0,
C0);
453 T (
"#8", 0,
A (
"--with-3"), 4,
"|-0~0 |-1~1 |-2~2 |-3~3",
C0,
C0,
C0,
C0);
456 T (
"#3", 0,
A (
"--with-0",
"--with-1"),
457 4,
"|-0~0 |-1~1 |-2~2 |-3~3",
C0,
C0,
C0,
C0);
459 T (
"#7", 0,
A (
"--with-0",
"--with-1",
"--with-2"),
460 4,
"|-0~0 |-1~1 |-2~2 |-3~3",
C0,
C0,
C0,
C0);
462 T (
"#15", 0,
A (
"--with-0",
"--with-1",
"--with-2",
"--with-3"),
463 4,
"|-0~0 |-1~1 |-2~2 |-3~3",
C0,
C0,
C0,
C0);
466 T (
"#1", 0,
A (
"--with-0"),
467 4,
"|-0~0:1 |-1~1:1 |-2~2:1 |-3~3:1",
C0,
C0,
C0,
C0);
469 T (
"#2", 0,
A (
"--with-1"),
470 4,
"|-0~0:1 |-1~1:1 |-2~2:1 |-3~3:1",
C0,
C0,
C0,
C0);
472 T (
"#4", 0,
A (
"--with-2"),
473 4,
"|-0~0:1 |-1~1:1 |-2~2:1 |-3~3:1",
C0,
C0,
C0,
C0);
475 T (
"#8", 0,
A (
"--with-3"),
476 4,
"|-0~0:1 |-1~1:1 |-2~2:1 |-3~3:1",
C0,
C0,
C0,
C0);
478 T (
"#3", 0,
A (
"--with-0",
"--with-1"),
479 4,
"|-0~0:1 |-1~1:1 |-2~2:1 |-3~3:1",
C0,
C0,
C0,
C0);
481 T (
"#7", 0,
A (
"--with-0",
"--with-1",
"--with-2"),
482 4,
"|-0~0:1 |-1~1:1 |-2~2:1 |-3~3:1",
C0,
C0,
C0,
C0);
484 T (
"#15", 0,
A (
"--with-0",
"--with-1",
"--with-2",
"--with-3"),
485 4,
"|-0~0:1 |-1~1:1 |-2~2:1 |-3~3:1",
C0,
C0,
C0,
C0);
488 0,
A (
"--enable-f30"),
489 3,
"|-f30~30:3 |-f28~28:2 |-f26~26:2",
C0,
C0,
C0);
492 0,
A (
"--enable-f30"),
493 3,
"|-f30~30:2 |-f28~28:2 |-f26~26:2",
C0,
C0,
C0);
496 0,
A (
"--enable-f30",
"--enable-f28"),
497 3,
"|-f30~30:2 |-f28~28:2 |-f26~26:2",
C0,
C0,
C0);
500 0,
A (
"--enable-f30",
"--enable-f28",
"--enable-f26"),
501 3,
"|-f30~30:2 |-f28~28:2 |-f26~26:2",
C0,
C0,
C0);
507test_optional_argument ()
510 T (
"foo(1,{\"-a\"})", 0,
A (
"-a"), 1,
"a:",
F);
511 T (
"foo(1,{\"-a\"})", 0,
A (
"-a"), 1,
"a:",
F);
512 T (
"foo(2,{\"-a\",\"x\"})", 0,
A (
"-a",
"x"), 1,
"a:",
F);
513 T (
"foo(1,{\"-ay\"})", 0,
A (
"-ay"), 1,
"a:",
F);
514 T (
"foo(1,{\"-axyz\"})", 0,
A (
"-axyz"), 1,
"a:",
F);
515 T (
"foo(1,{\"--a\"})", 0,
A (
"--a"), 1,
"|-a:",
F);
516 T (
"ERR(1,{\"--ab\"})", 0,
A (
"--ab"), 2,
"- |-a:",
E,
F);
519 T (
"foo(2,{\"-a\",\"-b\"});"
521 0,
A (
"-a",
"-b"), 2,
"a: b",
F,
B);
523 T (
"foo(3,{\"-a\",\"x\",\"-b\"});"
525 0,
A (
"-a",
"x",
"-b"), 2,
"a: b",
F,
B);
528 T (
"foo(2,{\"-n\",\"0\"})", 0,
A (
"-n",
"0"), 1,
"n:0",
F);
529 T (
"foo(2,{\"-n\",\"+1\"})", 0,
A (
"-n",
"+1"), 1,
"n:1",
F);
530 T (
"foo(2,{\"-n\",\"+2\"})", 0,
A (
"-n",
"+2"), 1,
"n:+2",
F);
531 T (
"foo(2,{\"-n\",\"\\-2\"})", 0,
A (
"-n",
"\\-2"), 1,
"n:-3",
F);
532 T (
"foo(2,{\"-n\",\"\\-0\"})", 0,
A (
"-n",
"\\-0"), 1,
"n:-3-0",
F);
538test_required_argument ()
543 T (
"ERR(1,{\"--a\"})", 0,
A (
"--a"), 2,
"- |-a=",
E,
F);
546 T (
"foo(1,{\"--a=\"})", 0,
A (
"--a="), 1,
"|-a=",
F);
549 T (
"foo(1,{\"--a=1\"})", 0,
A (
"--a=1"), 1,
"|-a=",
F);
550 T (
"foo(1,{\"--b=1-\"})", 0,
A (
"--b=1-"), 1,
"|-b=",
F);
551 T (
"foo(1,{\"--c=-2\"})", 0,
A (
"--c=-2"), 1,
"|-c=",
F);
552 T (
"foo(1,{\"--d=1-2\"})", 0,
A (
"--d=1-2"), 1,
"|-d=",
F);
553 T (
"foo(1,{\"--e=-1=2\"})", 0,
A (
"--e=-1=2"), 1,
"|-e=",
F);
554 T (
"foo(1,{\"--f=-1=-2\"})", 0,
A (
"--f=-1=-2"), 1,
"|-f=",
F);
555 T (
"foo(1,{\"--g=2,3\"})", 0,
A (
"--g=2,3"), 1,
"|-g=",
F);
556 T (
"foo(1,{\"--h=3:4\"})", 0,
A (
"--h=3:4"), 1,
"|-h=",
F);
557 T (
"foo(1,{\"--i=\"j\"\"})", 0,
A (
"--i=\"j\""), 1,
"|-i=",
F);
560 T (
"foo(1,{\"--a=1\"})", 0,
A (
"--a=1"), 1,
"|-a=0",
F);
561 T (
"foo(1,{\"--a=1\"})", 0,
A (
"--a=1"), 1,
"|-a=1",
F);
562 T (
"foo(1,{\"--a=2\"})", 0,
A (
"--a=2"), 1,
"|-a=2",
F);
563 T (
"foo(1,{\"--a=3\"})", 0,
A (
"--a=3"), 1,
"|-a=3-4",
F);
564 T (
"foo(1,{\"--a=5\"})", 0,
A (
"--a=5"), 1,
"|-a=4-5",
F);
566 T (
"", 1,
A (
"--a=1"), 1,
"|-a=2",
F);
567 T (
"", 1,
A (
"--a=2"), 1,
"|-a=0-1",
F);
568 T (
"", 1,
A (
"--a=-1"), 1,
"|-a=1-2",
F);
569 T (
"", 1,
A (
"--a=+123"), 1,
"|-a=+2-3",
F);
576test_repeated_options ()
582 T (
"foo(2,{\"-a\",\"-a\"})", 0,
A (
"-a",
"-a"), 1,
"a",
F);
585 T (
"foo(2,{\"-a\",\"-a\"});"
587 0,
A (
"-a",
"-a"), 1,
"a@*",
F);
590 T (
"", 0,
A (
"-a"), 1,
"a@0",
F);
591 T (
"", 0,
A (
"-a",
"-a"), 1,
"a@0",
F);
593 T (
"bar(1,{\"-b\"})", 0,
A (
"-a",
"-a",
"-b"), 2,
"a@0 b",
F,
B);
594 T (
"bar(2,{\"-b\",\"-a\"})", 0,
A (
"-a",
"-b",
"-a"), 2,
"a@0 b",
F,
B);
596 T (
"bar(3,{\"-b\",\"-a\",\"-b\"})",
597 0,
A (
"-b",
"-a",
"-b"), 2,
"b a@0",
B,
F);
599 T (
"bar(4,{\"-b\",\"-a\",\"-b\",\"-a\"})",
600 0,
A (
"-b",
"-a",
"-b",
"-a"), 2,
"b a@0",
B,
F);
603 T (
"foo(2,{\"-a\",\"-a\"})", 0,
A (
"-a",
"-a"), 1,
"a@1",
F);
604 T (
"foo(2,{\"-a\",\"-a\"})", 0,
A (
"-a",
"-a"), 1,
"a@1",
F);
607 T (
"foo(2,{\"-a\",\"-a\"});"
609 0,
A (
"-a",
"-a"), 1,
"a@2",
F);
611 T (
"foo(3,{\"-a\",\"-a\",\"-a\"});"
612 "foo(2,{\"-a\",\"-a\"})",
613 0,
A (
"-a",
"-a",
"-a"), 1,
"a@2",
F);
616 T (
"", 0,
A (
"-i"), 1,
"i!",
F);
617 T (
"foo(0,{})", 0,
A (
""), 1,
"i!",
F);
618 T (
"", 0,
A (
"--j"), 1,
"i|-j!",
F);
620 T (
"foo(1,{\"-k\"});"
621 "foo(0,{})", 0,
A (
"-k"), 2,
"k l!",
F,
F);
637 T (
"", 0,
A (
""), 0,
"", 0);
638 T (
"", 0,
A (
"a"), 0,
"", 0);
639 T (
"", 0,
A (
"a",
"b"), 0,
"", 0);
640 T (
"", 0,
A (
"a",
"b"), 0,
"", 0);
642 T (
"", 0,
A (
""), 1,
"f",
F);
643 T (
"", 0,
A (
"a"), 1,
"f",
F);
644 T (
"", 0,
A (
"a",
"b"), 1,
"f",
F);
645 T (
"", 0,
A (
"a",
"b"), 1,
"f",
F);
646 T (
"", 0,
A (
"a",
"f"), 1,
"f",
F);
647 T (
"", 0,
A (
"f",
"f"), 1,
"f",
F);
650 T (
"foo(1,{\"-a\"})", 0,
A (
"-a"), 1,
"a",
F);
651 T (
"foo(1,{\"--a\"})", 0,
A (
"--a"), 1,
"|-a",
F);
652 T (
"foo(1,{\"-a\"})", 0,
A (
"-a"), 1,
"a|-a",
F);
653 T (
"foo(1,{\"--a\"})", 0,
A (
"--a"), 1,
"a|-a",
F);
656 test_unknown_options ();
660 test_counted_options ();
663 test_optional_argument ();
669 test_required_argument ();
672 test_repeated_options ();
676 T (
"foo(2,{\"-a\",\"-b\"})",
677 retvals [0],
A (
"-a",
"-b"), 2,
"a b",
F,
B);
682 T (
"foo(3,{\"-a\",\"-b\",\"-c\"});"
683 "bar(2,{\"-b\",\"-c\"})",
684 retvals [1],
A (
"-a",
"-b",
"-c"), 3,
"a b c",
F,
B,
E);
int() cbfun_t(int, char *[])
#define _RWSTD_ASSERT(ignore)
_TEST_EXPORT int rw_setopts(const char *optspec,...)
_TEST_EXPORT int rw_runopts(int argc, char *argv[])