1 #include <ccan/tap/tap.h>
3 #include <ccan/opt/opt.c>
4 #include <ccan/opt/usage.c>
5 #include <ccan/opt/helpers.c>
8 static void reset_options(void)
12 opt_count = opt_num_short = opt_num_short_arg = opt_num_long = 0;
17 int main(int argc, char *argv[])
19 const char *myname = argv[0];
23 /* Simple short arg.*/
24 opt_register_noarg("-a", test_noarg, NULL, "All");
25 ok1(parse_args(&argc, &argv, "-a", NULL));
27 ok1(argv[0] == myname);
29 ok1(test_cb_called == 1);
31 /* Simple long arg. */
32 opt_register_noarg("--aaa", test_noarg, NULL, "AAAAll");
33 ok1(parse_args(&argc, &argv, "--aaa", NULL));
35 ok1(argv[0] == myname);
37 ok1(test_cb_called == 2);
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));
43 ok1(argv[0] == myname);
45 ok1(test_cb_called == 4);
47 /* Extra arguments preserved. */
48 ok1(parse_args(&argc, &argv, "--aaa", "-a", "extra", "args", NULL));
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);
55 /* Argument variants. */
58 opt_register_arg("-a|--aaa", test_arg, NULL, "aaa", "AAAAAAll");
59 ok1(parse_args(&argc, &argv, "--aaa", "aaa", NULL));
61 ok1(argv[0] == myname);
62 ok1(test_cb_called == 1);
64 ok1(parse_args(&argc, &argv, "--aaa=aaa", NULL));
66 ok1(argv[0] == myname);
67 ok1(test_cb_called == 2);
69 ok1(parse_args(&argc, &argv, "-a", "aaa", NULL));
71 ok1(argv[0] == myname);
72 ok1(test_cb_called == 3);
78 opt_register_table(short_table, NULL);
79 ok1(parse_args(&argc, &argv, "-a", NULL));
81 ok1(argv[0] == myname);
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));
89 ok1(argv[0] == myname);
91 ok1(test_cb_called == 2);
96 opt_register_table(long_table, NULL);
97 ok1(parse_args(&argc, &argv, "--ddd", NULL));
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));
107 ok1(argv[0] == myname);
108 ok1(argv[1] == NULL);
109 ok1(test_cb_called == 2);
111 /* Short and long, both. */
114 opt_register_table(long_and_short_table, NULL);
115 ok1(parse_args(&argc, &argv, "-g", NULL));
117 ok1(argv[0] == myname);
118 ok1(argv[1] == NULL);
119 ok1(test_cb_called == 1);
120 ok1(parse_args(&argc, &argv, "--ggg", NULL));
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));
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));
137 ok1(argv[0] == myname);
138 ok1(argv[1] == NULL);
139 ok1(test_cb_called == 4);
141 /* Those will all work as tables. */
144 opt_register_table(subtables, NULL);
145 ok1(parse_args(&argc, &argv, "-a", NULL));
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));
155 ok1(argv[0] == myname);
156 ok1(argv[1] == NULL);
157 ok1(test_cb_called == 2);
159 ok1(parse_args(&argc, &argv, "--ddd", NULL));
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));
169 ok1(argv[0] == myname);
170 ok1(argv[1] == NULL);
171 ok1(test_cb_called == 4);
173 /* Short and long, both. */
174 ok1(parse_args(&argc, &argv, "-g", NULL));
176 ok1(argv[0] == myname);
177 ok1(argv[1] == NULL);
178 ok1(test_cb_called == 5);
179 ok1(parse_args(&argc, &argv, "--ggg", NULL));
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));
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));
196 ok1(argv[0] == myname);
197 ok1(argv[1] == NULL);
198 ok1(test_cb_called == 8);
200 /* Now the tricky one: -? must not be confused with an unknown option */
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"));
218 return exit_status();