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