opt: get rid of last remnant of getopt.
[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 <ccan/opt/parse.c>
7 #include "utils.h"
8
9 int main(int argc, char *argv[])
10 {
11         const char *myname = argv[0];
12
13         plan_tests(215);
14
15         /* Simple short arg.*/
16         opt_register_noarg("-a", test_noarg, NULL, "All");
17         ok1(parse_args(&argc, &argv, "-a", NULL));
18         ok1(argc == 1);
19         ok1(argv[0] == myname);
20         ok1(argv[1] == NULL);
21         ok1(test_cb_called == 1);
22
23         /* Simple long arg. */
24         opt_register_noarg("--aaa", test_noarg, NULL, "AAAAll");
25         ok1(parse_args(&argc, &argv, "--aaa", NULL));
26         ok1(argc == 1);
27         ok1(argv[0] == myname);
28         ok1(argv[1] == NULL);
29         ok1(test_cb_called == 2);
30
31         /* Both long and short args. */
32         opt_register_noarg("--aaa|-a", test_noarg, NULL, "AAAAAAll");
33         ok1(parse_args(&argc, &argv, "--aaa", "-a", NULL));
34         ok1(argc == 1);
35         ok1(argv[0] == myname);
36         ok1(argv[1] == NULL);
37         ok1(test_cb_called == 4);
38
39         /* Extra arguments preserved. */
40         ok1(parse_args(&argc, &argv, "--aaa", "-a", "extra", "args", NULL));
41         ok1(argc == 3);
42         ok1(argv[0] == myname);
43         ok1(strcmp(argv[1], "extra") == 0);
44         ok1(strcmp(argv[2], "args") == 0);
45         ok1(test_cb_called == 6);
46
47         /* Malformed versions. */
48         ok1(!parse_args(&argc, &argv, "--aaa=arg", NULL));
49         ok1(strstr(err_output, ": --aaa: doesn't allow an argument"));
50         ok1(!parse_args(&argc, &argv, "--aa", NULL));
51         ok1(strstr(err_output, ": --aa: unrecognized option"));
52         ok1(!parse_args(&argc, &argv, "--aaargh", NULL));
53         ok1(strstr(err_output, ": --aaargh: unrecognized option"));
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         /* Malformed versions. */
75         ok1(!parse_args(&argc, &argv, "-a", NULL));
76         ok1(strstr(err_output, ": -a: requires an argument"));
77         ok1(!parse_args(&argc, &argv, "--aaa", NULL));
78         ok1(strstr(err_output, ": --aaa: requires an argument"));
79         ok1(!parse_args(&argc, &argv, "--aa", NULL));
80         ok1(strstr(err_output, ": --aa: unrecognized option"));
81         ok1(!parse_args(&argc, &argv, "--aaargh", NULL));
82         ok1(strstr(err_output, ": --aaargh: unrecognized option"));
83
84         /* Now, tables. */
85         /* Short table: */
86         reset_options();
87         test_cb_called = 0;
88         opt_register_table(short_table, NULL);
89         ok1(parse_args(&argc, &argv, "-a", NULL));
90         ok1(argc == 1);
91         ok1(argv[0] == myname);
92         ok1(argv[1] == NULL);
93         ok1(test_cb_called == 1);
94         /* This one needs an arg. */
95         ok1(parse_args(&argc, &argv, "-b", NULL) == false);
96         ok1(test_cb_called == 1);
97         ok1(parse_args(&argc, &argv, "-b", "b", NULL));
98         ok1(argc == 1);
99         ok1(argv[0] == myname);
100         ok1(argv[1] == NULL);
101         ok1(test_cb_called == 2);
102
103         /* Long table: */
104         reset_options();
105         test_cb_called = 0;
106         opt_register_table(long_table, NULL);
107         ok1(parse_args(&argc, &argv, "--ddd", NULL));
108         ok1(argc == 1);
109         ok1(argv[0] == myname);
110         ok1(argv[1] == NULL);
111         ok1(test_cb_called == 1);
112         /* This one needs an arg. */
113         ok1(parse_args(&argc, &argv, "--eee", NULL) == false);
114         ok1(test_cb_called == 1);
115         ok1(parse_args(&argc, &argv, "--eee", "eee", NULL));
116         ok1(argc == 1);
117         ok1(argv[0] == myname);
118         ok1(argv[1] == NULL);
119         ok1(test_cb_called == 2);
120
121         /* Short and long, both. */
122         reset_options();
123         test_cb_called = 0;
124         opt_register_table(long_and_short_table, NULL);
125         ok1(parse_args(&argc, &argv, "-g", NULL));
126         ok1(argc == 1);
127         ok1(argv[0] == myname);
128         ok1(argv[1] == NULL);
129         ok1(test_cb_called == 1);
130         ok1(parse_args(&argc, &argv, "--ggg", NULL));
131         ok1(argc == 1);
132         ok1(argv[0] == myname);
133         ok1(argv[1] == NULL);
134         ok1(test_cb_called == 2);
135         /* This one needs an arg. */
136         ok1(parse_args(&argc, &argv, "-h", NULL) == false);
137         ok1(test_cb_called == 2);
138         ok1(parse_args(&argc, &argv, "-h", "hhh", NULL));
139         ok1(argc == 1);
140         ok1(argv[0] == myname);
141         ok1(argv[1] == NULL);
142         ok1(test_cb_called == 3);
143         ok1(parse_args(&argc, &argv, "--hhh", NULL) == false);
144         ok1(test_cb_called == 3);
145         ok1(parse_args(&argc, &argv, "--hhh", "hhh", NULL));
146         ok1(argc == 1);
147         ok1(argv[0] == myname);
148         ok1(argv[1] == NULL);
149         ok1(test_cb_called == 4);
150
151         /* Those will all work as tables. */
152         test_cb_called = 0;
153         reset_options();
154         opt_register_table(subtables, NULL);
155         ok1(parse_args(&argc, &argv, "-a", NULL));
156         ok1(argc == 1);
157         ok1(argv[0] == myname);
158         ok1(argv[1] == NULL);
159         ok1(test_cb_called == 1);
160         /* This one needs an arg. */
161         ok1(parse_args(&argc, &argv, "-b", NULL) == false);
162         ok1(test_cb_called == 1);
163         ok1(parse_args(&argc, &argv, "-b", "b", NULL));
164         ok1(argc == 1);
165         ok1(argv[0] == myname);
166         ok1(argv[1] == NULL);
167         ok1(test_cb_called == 2);
168
169         ok1(parse_args(&argc, &argv, "--ddd", NULL));
170         ok1(argc == 1);
171         ok1(argv[0] == myname);
172         ok1(argv[1] == NULL);
173         ok1(test_cb_called == 3);
174         /* This one needs an arg. */
175         ok1(parse_args(&argc, &argv, "--eee", NULL) == false);
176         ok1(test_cb_called == 3);
177         ok1(parse_args(&argc, &argv, "--eee", "eee", NULL));
178         ok1(argc == 1);
179         ok1(argv[0] == myname);
180         ok1(argv[1] == NULL);
181         ok1(test_cb_called == 4);
182
183         /* Short and long, both. */
184         ok1(parse_args(&argc, &argv, "-g", NULL));
185         ok1(argc == 1);
186         ok1(argv[0] == myname);
187         ok1(argv[1] == NULL);
188         ok1(test_cb_called == 5);
189         ok1(parse_args(&argc, &argv, "--ggg", NULL));
190         ok1(argc == 1);
191         ok1(argv[0] == myname);
192         ok1(argv[1] == NULL);
193         ok1(test_cb_called == 6);
194         /* This one needs an arg. */
195         ok1(parse_args(&argc, &argv, "-h", NULL) == false);
196         ok1(test_cb_called == 6);
197         ok1(parse_args(&argc, &argv, "-h", "hhh", NULL));
198         ok1(argc == 1);
199         ok1(argv[0] == myname);
200         ok1(argv[1] == NULL);
201         ok1(test_cb_called == 7);
202         ok1(parse_args(&argc, &argv, "--hhh", NULL) == false);
203         ok1(test_cb_called == 7);
204         ok1(parse_args(&argc, &argv, "--hhh", "hhh", NULL));
205         ok1(argc == 1);
206         ok1(argv[0] == myname);
207         ok1(argv[1] == NULL);
208         ok1(test_cb_called == 8);
209
210         /* Now the tricky one: -? must not be confused with an unknown option */
211         test_cb_called = 0;
212         reset_options();
213
214         /* glibc's getopt does not handle ? with arguments. */
215         opt_register_noarg("-?", test_noarg, NULL, "Help");
216         ok1(parse_args(&argc, &argv, "-?", NULL));
217         ok1(test_cb_called == 1);
218         ok1(parse_args(&argc, &argv, "-a", NULL) == false);
219         ok1(test_cb_called == 1);
220         ok1(strstr(err_output, ": -a: unrecognized option"));
221         ok1(parse_args(&argc, &argv, "--aaaa", NULL) == false);
222         ok1(test_cb_called == 1);
223         ok1(strstr(err_output, ": --aaaa: unrecognized option"));
224
225         test_cb_called = 0;
226         reset_options();
227
228         /* Corner cases involving short arg parsing weirdness. */
229         opt_register_noarg("-a|--aaa", test_noarg, NULL, "a");
230         opt_register_arg("-b|--bbb", test_arg, NULL, "bbb", "b");
231         opt_register_arg("-c|--ccc", test_arg, NULL, "aaa", "c");
232         /* -aa == -a -a */
233         ok1(parse_args(&argc, &argv, "-aa", NULL));
234         ok1(test_cb_called == 2);
235         ok1(parse_args(&argc, &argv, "-aab", NULL) == false);
236         ok1(test_cb_called == 4);
237         ok1(strstr(err_output, ": -b: requires an argument"));
238         ok1(parse_args(&argc, &argv, "-bbbb", NULL));
239         ok1(test_cb_called == 5);
240         ok1(parse_args(&argc, &argv, "-aabbbb", NULL));
241         ok1(test_cb_called == 8);
242         ok1(parse_args(&argc, &argv, "-aabbbb", "-b", "bbb", NULL));
243         ok1(test_cb_called == 12);
244         ok1(parse_args(&argc, &argv, "-aabbbb", "--bbb", "bbb", NULL));
245         ok1(test_cb_called == 16);
246         ok1(parse_args(&argc, &argv, "-aabbbb", "--bbb=bbb", NULL));
247         ok1(test_cb_called == 20);
248         ok1(parse_args(&argc, &argv, "-aacaaa", NULL));
249         ok1(test_cb_called == 23);
250         ok1(parse_args(&argc, &argv, "-aacaaa", "-a", NULL));
251         ok1(test_cb_called == 27);
252         ok1(parse_args(&argc, &argv, "-aacaaa", "--bbb", "bbb", "-aacaaa",
253                        NULL));
254         ok1(test_cb_called == 34);
255
256         test_cb_called = 0;
257         reset_options();
258
259         /* -- and POSIXLY_CORRECT */
260         opt_register_noarg("-a|--aaa", test_noarg, NULL, "a");
261         ok1(parse_args(&argc, &argv, "-a", "--", "-a", NULL));
262         ok1(test_cb_called == 1);
263         ok1(argc == 2);
264         ok1(strcmp(argv[1], "-a") == 0);
265         ok1(!argv[2]);
266
267         unsetenv("POSIXLY_CORRECT");
268         ok1(parse_args(&argc, &argv, "-a", "somearg", "-a", "--", "-a", NULL));
269         ok1(test_cb_called == 3);
270         ok1(argc == 3);
271         ok1(strcmp(argv[1], "somearg") == 0);
272         ok1(strcmp(argv[2], "-a") == 0);
273         ok1(!argv[3]);
274
275         setenv("POSIXLY_CORRECT", "1", 1);
276         ok1(parse_args(&argc, &argv, "-a", "somearg", "-a", "--", "-a", NULL));
277         ok1(test_cb_called == 4);
278         ok1(argc == 5);
279         ok1(strcmp(argv[1], "somearg") == 0);
280         ok1(strcmp(argv[2], "-a") == 0);
281         ok1(strcmp(argv[3], "--") == 0);
282         ok1(strcmp(argv[4], "-a") == 0);
283         ok1(!argv[5]);
284
285         /* parse_args allocates argv */
286         free(argv);
287         return exit_status();
288 }