opt: add OPT_EARLY and opt_early_parse.
[ccan] / ccan / opt / test / run-early.c
1 /* With errlog == NULL, we never get a "failure". */
2 #include <ccan/tap/tap.h>
3 #include <stdlib.h>
4 #include <ccan/opt/opt.c>
5 #include <ccan/opt/usage.c>
6 #include <ccan/opt/helpers.c>
7 #include <ccan/opt/parse.c>
8 #include "utils.h"
9
10 struct opt_table some_early_table[] = {
11         OPT_EARLY_WITHOUT_ARG("--verbose|-v", test_noarg,
12                               "vvv", "Description of verbose"),
13         OPT_EARLY_WITH_ARG("--debug|-d", test_arg, show_arg,
14                               "ddd", "Description of debug"),
15         OPT_WITHOUT_ARG("-h|--hhh", test_noarg, "hhh", "Description of hhh"),
16         OPT_ENDTABLE
17 };
18
19 int main(int argc, char *argv[])
20 {
21         const char *myname = argv[0];
22
23         plan_tests(37);
24
25         /* Simple short arg.*/
26         opt_register_noarg("-a", test_noarg, NULL, "All");
27         opt_register_early_noarg("-b", test_noarg, NULL, "All");
28
29         /* Early parsing doesn't mangle. */
30         ok1(parse_early_args(&argc, &argv, "-a", NULL));
31         ok1(argc == 2);
32         ok1(argv[0] == myname);
33         ok1(strcmp(argv[1], "-a") == 0);
34         ok1(argv[2] == NULL);
35         ok1(test_cb_called == 0);
36
37         /* ... even if it processes arg. */
38         ok1(parse_early_args(&argc, &argv, "-b", NULL));
39         ok1(argc == 2);
40         ok1(argv[0] == myname);
41         ok1(strcmp(argv[1], "-b") == 0);
42         ok1(argv[2] == NULL);
43         ok1(test_cb_called == 1);
44
45         ok1(parse_early_args(&argc, &argv, "-ab", NULL));
46         ok1(argc == 2);
47         ok1(argv[0] == myname);
48         ok1(strcmp(argv[1], "-ab") == 0);
49         ok1(argv[2] == NULL);
50         ok1(test_cb_called == 2);
51
52         ok1(parse_args(&argc, &argv, "-ab", NULL));
53         ok1(argc == 1);
54         ok1(argv[0] == myname);
55         ok1(argv[1] == NULL);
56         ok1(test_cb_called == 3);
57
58         opt_register_table(some_early_table, "Some early args");
59         ok1(parse_early_args(&argc, &argv, "--verbose", "-dddd", "-h", NULL));
60         ok1(argc == 4);
61         ok1(argv[0] == myname);
62         ok1(strcmp(argv[1], "--verbose") == 0);
63         ok1(strcmp(argv[2], "-dddd") == 0);
64         ok1(strcmp(argv[3], "-h") == 0);
65         ok1(argv[4] == NULL);
66         ok1(test_cb_called == 5);
67
68         ok1(parse_args(&argc, &argv, "--verbose", "-d", "ddd", "-h", NULL));
69         ok1(argc == 1);
70         ok1(argv[0] == myname);
71         ok1(argv[1] == NULL);
72         ok1(test_cb_called == 6);
73
74         /* parse_args allocates argv */
75         free(argv);
76         return exit_status();
77 }