]> git.ozlabs.org Git - ccan/blob - ccan/opt/test/run.c
opt: list ccan/typesafe_cb as a dependency.
[ccan] / ccan / opt / test / run.c
1 #include <ccan/tap/tap.h>
2 #include <stdlib.h>
3 #include <ccan/opt/opt.c>
4 #include <ccan/opt/usage.c>
5 #include <ccan/opt/helpers.c>
6 #include "utils.h"
7
8 static void reset_options(void)
9 {
10         free(opt_table);
11         opt_table = NULL;
12         opt_count = opt_num_short = opt_num_short_arg = opt_num_long = 0;
13         free(err_output);
14         err_output = NULL;
15 }
16
17 int main(int argc, char *argv[])
18 {
19         const char *myname = argv[0];
20
21         plan_tests(148);
22
23         /* Simple short arg.*/
24         opt_register_noarg("-a", test_noarg, NULL, "All");
25         ok1(parse_args(&argc, &argv, "-a", NULL));
26         ok1(argc == 1);
27         ok1(argv[0] == myname);
28         ok1(argv[1] == NULL);
29         ok1(test_cb_called == 1);
30
31         /* Simple long arg. */
32         opt_register_noarg("--aaa", test_noarg, NULL, "AAAAll");
33         ok1(parse_args(&argc, &argv, "--aaa", NULL));
34         ok1(argc == 1);
35         ok1(argv[0] == myname);
36         ok1(argv[1] == NULL);
37         ok1(test_cb_called == 2);
38
39         /* Both long and short args. */
40         opt_register_noarg("--aaa/-a", test_noarg, NULL, "AAAAAAll");
41         ok1(parse_args(&argc, &argv, "--aaa", "-a", NULL));
42         ok1(argc == 1);
43         ok1(argv[0] == myname);
44         ok1(argv[1] == NULL);
45         ok1(test_cb_called == 4);
46
47         /* Extra arguments preserved. */
48         ok1(parse_args(&argc, &argv, "--aaa", "-a", "extra", "args", NULL));
49         ok1(argc == 3);
50         ok1(argv[0] == myname);
51         ok1(strcmp(argv[1], "extra") == 0);
52         ok1(strcmp(argv[2], "args") == 0);
53         ok1(test_cb_called == 6);
54
55         /* Argument variants. */
56         reset_options();
57         test_cb_called = 0;
58         opt_register_arg("-a/--aaa", test_arg, NULL, "aaa", "AAAAAAll");
59         ok1(parse_args(&argc, &argv, "--aaa", "aaa", NULL));
60         ok1(argc == 1);
61         ok1(argv[0] == myname);
62         ok1(test_cb_called == 1);
63
64         ok1(parse_args(&argc, &argv, "--aaa=aaa", NULL));
65         ok1(argc == 1);
66         ok1(argv[0] == myname);
67         ok1(test_cb_called == 2);
68
69         ok1(parse_args(&argc, &argv, "-a", "aaa", NULL));
70         ok1(argc == 1);
71         ok1(argv[0] == myname);
72         ok1(test_cb_called == 3);
73
74         /* Now, tables. */
75         /* Short table: */
76         reset_options();
77         test_cb_called = 0;
78         opt_register_table(short_table, NULL);
79         ok1(parse_args(&argc, &argv, "-a", NULL));
80         ok1(argc == 1);
81         ok1(argv[0] == myname);
82         ok1(argv[1] == NULL);
83         ok1(test_cb_called == 1);
84         /* This one needs an arg. */
85         ok1(parse_args(&argc, &argv, "-b", NULL) == false);
86         ok1(test_cb_called == 1);
87         ok1(parse_args(&argc, &argv, "-b", "b", NULL));
88         ok1(argc == 1);
89         ok1(argv[0] == myname);
90         ok1(argv[1] == NULL);
91         ok1(test_cb_called == 2);
92
93         /* Long table: */
94         reset_options();
95         test_cb_called = 0;
96         opt_register_table(long_table, NULL);
97         ok1(parse_args(&argc, &argv, "--ddd", NULL));
98         ok1(argc == 1);
99         ok1(argv[0] == myname);
100         ok1(argv[1] == NULL);
101         ok1(test_cb_called == 1);
102         /* This one needs an arg. */
103         ok1(parse_args(&argc, &argv, "--eee", NULL) == false);
104         ok1(test_cb_called == 1);
105         ok1(parse_args(&argc, &argv, "--eee", "eee", NULL));
106         ok1(argc == 1);
107         ok1(argv[0] == myname);
108         ok1(argv[1] == NULL);
109         ok1(test_cb_called == 2);
110
111         /* Short and long, both. */
112         reset_options();
113         test_cb_called = 0;
114         opt_register_table(long_and_short_table, NULL);
115         ok1(parse_args(&argc, &argv, "-g", NULL));
116         ok1(argc == 1);
117         ok1(argv[0] == myname);
118         ok1(argv[1] == NULL);
119         ok1(test_cb_called == 1);
120         ok1(parse_args(&argc, &argv, "--ggg", NULL));
121         ok1(argc == 1);
122         ok1(argv[0] == myname);
123         ok1(argv[1] == NULL);
124         ok1(test_cb_called == 2);
125         /* This one needs an arg. */
126         ok1(parse_args(&argc, &argv, "-h", NULL) == false);
127         ok1(test_cb_called == 2);
128         ok1(parse_args(&argc, &argv, "-h", "hhh", NULL));
129         ok1(argc == 1);
130         ok1(argv[0] == myname);
131         ok1(argv[1] == NULL);
132         ok1(test_cb_called == 3);
133         ok1(parse_args(&argc, &argv, "--hhh", NULL) == false);
134         ok1(test_cb_called == 3);
135         ok1(parse_args(&argc, &argv, "--hhh", "hhh", NULL));
136         ok1(argc == 1);
137         ok1(argv[0] == myname);
138         ok1(argv[1] == NULL);
139         ok1(test_cb_called == 4);
140
141         /* Those will all work as tables. */
142         test_cb_called = 0;
143         reset_options();
144         opt_register_table(subtables, NULL);
145         ok1(parse_args(&argc, &argv, "-a", NULL));
146         ok1(argc == 1);
147         ok1(argv[0] == myname);
148         ok1(argv[1] == NULL);
149         ok1(test_cb_called == 1);
150         /* This one needs an arg. */
151         ok1(parse_args(&argc, &argv, "-b", NULL) == false);
152         ok1(test_cb_called == 1);
153         ok1(parse_args(&argc, &argv, "-b", "b", NULL));
154         ok1(argc == 1);
155         ok1(argv[0] == myname);
156         ok1(argv[1] == NULL);
157         ok1(test_cb_called == 2);
158
159         ok1(parse_args(&argc, &argv, "--ddd", NULL));
160         ok1(argc == 1);
161         ok1(argv[0] == myname);
162         ok1(argv[1] == NULL);
163         ok1(test_cb_called == 3);
164         /* This one needs an arg. */
165         ok1(parse_args(&argc, &argv, "--eee", NULL) == false);
166         ok1(test_cb_called == 3);
167         ok1(parse_args(&argc, &argv, "--eee", "eee", NULL));
168         ok1(argc == 1);
169         ok1(argv[0] == myname);
170         ok1(argv[1] == NULL);
171         ok1(test_cb_called == 4);
172
173         /* Short and long, both. */
174         ok1(parse_args(&argc, &argv, "-g", NULL));
175         ok1(argc == 1);
176         ok1(argv[0] == myname);
177         ok1(argv[1] == NULL);
178         ok1(test_cb_called == 5);
179         ok1(parse_args(&argc, &argv, "--ggg", NULL));
180         ok1(argc == 1);
181         ok1(argv[0] == myname);
182         ok1(argv[1] == NULL);
183         ok1(test_cb_called == 6);
184         /* This one needs an arg. */
185         ok1(parse_args(&argc, &argv, "-h", NULL) == false);
186         ok1(test_cb_called == 6);
187         ok1(parse_args(&argc, &argv, "-h", "hhh", NULL));
188         ok1(argc == 1);
189         ok1(argv[0] == myname);
190         ok1(argv[1] == NULL);
191         ok1(test_cb_called == 7);
192         ok1(parse_args(&argc, &argv, "--hhh", NULL) == false);
193         ok1(test_cb_called == 7);
194         ok1(parse_args(&argc, &argv, "--hhh", "hhh", NULL));
195         ok1(argc == 1);
196         ok1(argv[0] == myname);
197         ok1(argv[1] == NULL);
198         ok1(test_cb_called == 8);
199
200         /* Now the tricky one: -? must not be confused with an unknown option */
201         test_cb_called = 0;
202         reset_options();
203
204         /* glibc's getopt does not handle ? with arguments. */
205         opt_register_noarg("-?", test_noarg, NULL, "Help");
206         ok1(parse_args(&argc, &argv, "-?", NULL));
207         ok1(test_cb_called == 1);
208         ok1(parse_args(&argc, &argv, "-a", NULL) == false);
209         ok1(test_cb_called == 1);
210         ok1(strstr(err_output, ": -a: unrecognized option"));
211         ok1(parse_args(&argc, &argv, "--aaaa", NULL) == false);
212         ok1(test_cb_called == 1);
213         ok1(strstr(err_output, ": --aaaa: unrecognized option"));
214
215         test_cb_called = 0;
216         reset_options();
217
218         return exit_status();
219 }