1 #include <ccan/tap/tap.h>
3 #include <ccan/opt/opt.c>
4 #include <ccan/opt/usage.c>
7 static void reset_options(void)
16 int main(int argc, char *argv[])
18 const char *myname = argv[0];
22 /* Simple short arg.*/
23 opt_register_noarg(NULL, 'a', test_noarg, NULL, NULL);
24 ok1(parse_args(&argc, &argv, "-a", NULL));
26 ok1(argv[0] == myname);
28 ok1(test_cb_called == 1);
30 /* Simple long arg. */
31 opt_register_noarg("aaa", 0, test_noarg, NULL, NULL);
32 ok1(parse_args(&argc, &argv, "--aaa", NULL));
34 ok1(argv[0] == myname);
36 ok1(test_cb_called == 2);
38 /* Both long and short args. */
39 opt_register_noarg("aaa", 'a', test_noarg, NULL, NULL);
40 ok1(parse_args(&argc, &argv, "--aaa", "-a", NULL));
42 ok1(argv[0] == myname);
44 ok1(test_cb_called == 4);
46 /* Extra arguments preserved. */
47 ok1(parse_args(&argc, &argv, "--aaa", "-a", "extra", "args", NULL));
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);
54 /* Argument variants. */
57 opt_register_arg("aaa", 'a', test_arg, NULL, "aaa", NULL);
58 ok1(parse_args(&argc, &argv, "--aaa", "aaa", NULL));
60 ok1(argv[0] == myname);
61 ok1(test_cb_called == 1);
63 ok1(parse_args(&argc, &argv, "--aaa=aaa", NULL));
65 ok1(argv[0] == myname);
66 ok1(test_cb_called == 2);
68 ok1(parse_args(&argc, &argv, "-a", "aaa", NULL));
70 ok1(argv[0] == myname);
71 ok1(test_cb_called == 3);
77 opt_register_table(short_table, NULL);
78 ok1(parse_args(&argc, &argv, "-a", NULL));
80 ok1(argv[0] == myname);
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));
88 ok1(argv[0] == myname);
90 ok1(test_cb_called == 2);
95 opt_register_table(long_table, NULL);
96 ok1(parse_args(&argc, &argv, "--ddd", NULL));
98 ok1(argv[0] == myname);
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));
106 ok1(argv[0] == myname);
107 ok1(argv[1] == NULL);
108 ok1(test_cb_called == 2);
110 /* Short and long, both. */
113 opt_register_table(long_and_short_table, NULL);
114 ok1(parse_args(&argc, &argv, "-g", NULL));
116 ok1(argv[0] == myname);
117 ok1(argv[1] == NULL);
118 ok1(test_cb_called == 1);
119 ok1(parse_args(&argc, &argv, "--ggg", NULL));
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));
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));
136 ok1(argv[0] == myname);
137 ok1(argv[1] == NULL);
138 ok1(test_cb_called == 4);
140 /* Those will all work as tables. */
143 opt_register_table(subtables, NULL);
144 ok1(parse_args(&argc, &argv, "-a", NULL));
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));
154 ok1(argv[0] == myname);
155 ok1(argv[1] == NULL);
156 ok1(test_cb_called == 2);
158 ok1(parse_args(&argc, &argv, "--ddd", NULL));
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));
168 ok1(argv[0] == myname);
169 ok1(argv[1] == NULL);
170 ok1(test_cb_called == 4);
172 /* Short and long, both. */
173 ok1(parse_args(&argc, &argv, "-g", NULL));
175 ok1(argv[0] == myname);
176 ok1(argv[1] == NULL);
177 ok1(test_cb_called == 5);
178 ok1(parse_args(&argc, &argv, "--ggg", NULL));
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));
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));
195 ok1(argv[0] == myname);
196 ok1(argv[1] == NULL);
197 ok1(test_cb_called == 8);
199 /* Now the tricky one: -? must not be confused with an unknown option */
203 /* glibc's getopt does not handle ? with arguments. */
204 opt_register_noarg(NULL, '?', test_noarg, NULL, NULL);
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"));
217 return exit_status();