run.c 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. /*
  2. * Copyright 2011 Rusty Russell
  3. *
  4. * This program is free software; you can redistribute it and/or modify it under
  5. * the terms of the GNU General Public License as published by the Free Software
  6. * Foundation; either version 2 of the License, or (at your option) any later
  7. * version. See LICENSE for more details.
  8. */
  9. #include <ccan/tap/tap.h>
  10. #include <stdlib.h>
  11. #include <ccan/opt/opt.c>
  12. #include <ccan/opt/usage.c>
  13. #include <ccan/opt/helpers.c>
  14. #include <ccan/opt/parse.c>
  15. #include "utils.h"
  16. static void reset_options(void)
  17. {
  18. free(opt_table);
  19. opt_table = NULL;
  20. opt_count = opt_num_short = opt_num_short_arg = opt_num_long = 0;
  21. free(err_output);
  22. err_output = NULL;
  23. }
  24. int main(int argc, char *argv[])
  25. {
  26. const char *myname = argv[0];
  27. plan_tests(215);
  28. /* Simple short arg.*/
  29. opt_register_noarg("-a", test_noarg, NULL, "All");
  30. ok1(parse_args(&argc, &argv, "-a", NULL));
  31. ok1(argc == 1);
  32. ok1(argv[0] == myname);
  33. ok1(argv[1] == NULL);
  34. ok1(test_cb_called == 1);
  35. /* Simple long arg. */
  36. opt_register_noarg("--aaa", test_noarg, NULL, "AAAAll");
  37. ok1(parse_args(&argc, &argv, "--aaa", NULL));
  38. ok1(argc == 1);
  39. ok1(argv[0] == myname);
  40. ok1(argv[1] == NULL);
  41. ok1(test_cb_called == 2);
  42. /* Both long and short args. */
  43. opt_register_noarg("--aaa|-a", test_noarg, NULL, "AAAAAAll");
  44. ok1(parse_args(&argc, &argv, "--aaa", "-a", NULL));
  45. ok1(argc == 1);
  46. ok1(argv[0] == myname);
  47. ok1(argv[1] == NULL);
  48. ok1(test_cb_called == 4);
  49. /* Extra arguments preserved. */
  50. ok1(parse_args(&argc, &argv, "--aaa", "-a", "extra", "args", NULL));
  51. ok1(argc == 3);
  52. ok1(argv[0] == myname);
  53. ok1(strcmp(argv[1], "extra") == 0);
  54. ok1(strcmp(argv[2], "args") == 0);
  55. ok1(test_cb_called == 6);
  56. /* Malformed versions. */
  57. ok1(!parse_args(&argc, &argv, "--aaa=arg", NULL));
  58. ok1(strstr(err_output, ": --aaa: doesn't allow an argument"));
  59. ok1(!parse_args(&argc, &argv, "--aa", NULL));
  60. ok1(strstr(err_output, ": --aa: unrecognized option"));
  61. ok1(!parse_args(&argc, &argv, "--aaargh", NULL));
  62. ok1(strstr(err_output, ": --aaargh: unrecognized option"));
  63. /* Argument variants. */
  64. reset_options();
  65. test_cb_called = 0;
  66. opt_register_arg("-a|--aaa", test_arg, NULL, "aaa", "AAAAAAll");
  67. ok1(parse_args(&argc, &argv, "--aaa", "aaa", NULL));
  68. ok1(argc == 1);
  69. ok1(argv[0] == myname);
  70. ok1(test_cb_called == 1);
  71. ok1(parse_args(&argc, &argv, "--aaa=aaa", NULL));
  72. ok1(argc == 1);
  73. ok1(argv[0] == myname);
  74. ok1(test_cb_called == 2);
  75. ok1(parse_args(&argc, &argv, "-a", "aaa", NULL));
  76. ok1(argc == 1);
  77. ok1(argv[0] == myname);
  78. ok1(test_cb_called == 3);
  79. /* Malformed versions. */
  80. ok1(!parse_args(&argc, &argv, "-a", NULL));
  81. ok1(strstr(err_output, ": -a: requires an argument"));
  82. ok1(!parse_args(&argc, &argv, "--aaa", NULL));
  83. ok1(strstr(err_output, ": --aaa: requires an argument"));
  84. ok1(!parse_args(&argc, &argv, "--aa", NULL));
  85. ok1(strstr(err_output, ": --aa: unrecognized option"));
  86. ok1(!parse_args(&argc, &argv, "--aaargh", NULL));
  87. ok1(strstr(err_output, ": --aaargh: unrecognized option"));
  88. /* Now, tables. */
  89. /* Short table: */
  90. reset_options();
  91. test_cb_called = 0;
  92. opt_register_table(short_table, NULL);
  93. ok1(parse_args(&argc, &argv, "-a", NULL));
  94. ok1(argc == 1);
  95. ok1(argv[0] == myname);
  96. ok1(argv[1] == NULL);
  97. ok1(test_cb_called == 1);
  98. /* This one needs an arg. */
  99. ok1(parse_args(&argc, &argv, "-b", NULL) == false);
  100. ok1(test_cb_called == 1);
  101. ok1(parse_args(&argc, &argv, "-b", "b", NULL));
  102. ok1(argc == 1);
  103. ok1(argv[0] == myname);
  104. ok1(argv[1] == NULL);
  105. ok1(test_cb_called == 2);
  106. /* Long table: */
  107. reset_options();
  108. test_cb_called = 0;
  109. opt_register_table(long_table, NULL);
  110. ok1(parse_args(&argc, &argv, "--ddd", NULL));
  111. ok1(argc == 1);
  112. ok1(argv[0] == myname);
  113. ok1(argv[1] == NULL);
  114. ok1(test_cb_called == 1);
  115. /* This one needs an arg. */
  116. ok1(parse_args(&argc, &argv, "--eee", NULL) == false);
  117. ok1(test_cb_called == 1);
  118. ok1(parse_args(&argc, &argv, "--eee", "eee", NULL));
  119. ok1(argc == 1);
  120. ok1(argv[0] == myname);
  121. ok1(argv[1] == NULL);
  122. ok1(test_cb_called == 2);
  123. /* Short and long, both. */
  124. reset_options();
  125. test_cb_called = 0;
  126. opt_register_table(long_and_short_table, NULL);
  127. ok1(parse_args(&argc, &argv, "-g", NULL));
  128. ok1(argc == 1);
  129. ok1(argv[0] == myname);
  130. ok1(argv[1] == NULL);
  131. ok1(test_cb_called == 1);
  132. ok1(parse_args(&argc, &argv, "--ggg", NULL));
  133. ok1(argc == 1);
  134. ok1(argv[0] == myname);
  135. ok1(argv[1] == NULL);
  136. ok1(test_cb_called == 2);
  137. /* This one needs an arg. */
  138. ok1(parse_args(&argc, &argv, "-h", NULL) == false);
  139. ok1(test_cb_called == 2);
  140. ok1(parse_args(&argc, &argv, "-h", "hhh", NULL));
  141. ok1(argc == 1);
  142. ok1(argv[0] == myname);
  143. ok1(argv[1] == NULL);
  144. ok1(test_cb_called == 3);
  145. ok1(parse_args(&argc, &argv, "--hhh", NULL) == false);
  146. ok1(test_cb_called == 3);
  147. ok1(parse_args(&argc, &argv, "--hhh", "hhh", NULL));
  148. ok1(argc == 1);
  149. ok1(argv[0] == myname);
  150. ok1(argv[1] == NULL);
  151. ok1(test_cb_called == 4);
  152. /* Those will all work as tables. */
  153. test_cb_called = 0;
  154. reset_options();
  155. opt_register_table(subtables, NULL);
  156. ok1(parse_args(&argc, &argv, "-a", NULL));
  157. ok1(argc == 1);
  158. ok1(argv[0] == myname);
  159. ok1(argv[1] == NULL);
  160. ok1(test_cb_called == 1);
  161. /* This one needs an arg. */
  162. ok1(parse_args(&argc, &argv, "-b", NULL) == false);
  163. ok1(test_cb_called == 1);
  164. ok1(parse_args(&argc, &argv, "-b", "b", NULL));
  165. ok1(argc == 1);
  166. ok1(argv[0] == myname);
  167. ok1(argv[1] == NULL);
  168. ok1(test_cb_called == 2);
  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. /* Short and long, both. */
  183. ok1(parse_args(&argc, &argv, "-g", NULL));
  184. ok1(argc == 1);
  185. ok1(argv[0] == myname);
  186. ok1(argv[1] == NULL);
  187. ok1(test_cb_called == 5);
  188. ok1(parse_args(&argc, &argv, "--ggg", NULL));
  189. ok1(argc == 1);
  190. ok1(argv[0] == myname);
  191. ok1(argv[1] == NULL);
  192. ok1(test_cb_called == 6);
  193. /* This one needs an arg. */
  194. ok1(parse_args(&argc, &argv, "-h", NULL) == false);
  195. ok1(test_cb_called == 6);
  196. ok1(parse_args(&argc, &argv, "-h", "hhh", NULL));
  197. ok1(argc == 1);
  198. ok1(argv[0] == myname);
  199. ok1(argv[1] == NULL);
  200. ok1(test_cb_called == 7);
  201. ok1(parse_args(&argc, &argv, "--hhh", NULL) == false);
  202. ok1(test_cb_called == 7);
  203. ok1(parse_args(&argc, &argv, "--hhh", "hhh", NULL));
  204. ok1(argc == 1);
  205. ok1(argv[0] == myname);
  206. ok1(argv[1] == NULL);
  207. ok1(test_cb_called == 8);
  208. /* Now the tricky one: -? must not be confused with an unknown option */
  209. test_cb_called = 0;
  210. reset_options();
  211. /* glibc's getopt does not handle ? with arguments. */
  212. opt_register_noarg("-?", test_noarg, NULL, "Help");
  213. ok1(parse_args(&argc, &argv, "-?", NULL));
  214. ok1(test_cb_called == 1);
  215. ok1(parse_args(&argc, &argv, "-a", NULL) == false);
  216. ok1(test_cb_called == 1);
  217. ok1(strstr(err_output, ": -a: unrecognized option"));
  218. ok1(parse_args(&argc, &argv, "--aaaa", NULL) == false);
  219. ok1(test_cb_called == 1);
  220. ok1(strstr(err_output, ": --aaaa: unrecognized option"));
  221. test_cb_called = 0;
  222. reset_options();
  223. /* Corner cases involving short arg parsing weirdness. */
  224. opt_register_noarg("-a|--aaa", test_noarg, NULL, "a");
  225. opt_register_arg("-b|--bbb", test_arg, NULL, "bbb", "b");
  226. opt_register_arg("-c|--ccc", test_arg, NULL, "aaa", "c");
  227. /* -aa == -a -a */
  228. ok1(parse_args(&argc, &argv, "-aa", NULL));
  229. ok1(test_cb_called == 2);
  230. ok1(parse_args(&argc, &argv, "-aab", NULL) == false);
  231. ok1(test_cb_called == 4);
  232. ok1(strstr(err_output, ": -b: requires an argument"));
  233. ok1(parse_args(&argc, &argv, "-bbbb", NULL));
  234. ok1(test_cb_called == 5);
  235. ok1(parse_args(&argc, &argv, "-aabbbb", NULL));
  236. ok1(test_cb_called == 8);
  237. ok1(parse_args(&argc, &argv, "-aabbbb", "-b", "bbb", NULL));
  238. ok1(test_cb_called == 12);
  239. ok1(parse_args(&argc, &argv, "-aabbbb", "--bbb", "bbb", NULL));
  240. ok1(test_cb_called == 16);
  241. ok1(parse_args(&argc, &argv, "-aabbbb", "--bbb=bbb", NULL));
  242. ok1(test_cb_called == 20);
  243. ok1(parse_args(&argc, &argv, "-aacaaa", NULL));
  244. ok1(test_cb_called == 23);
  245. ok1(parse_args(&argc, &argv, "-aacaaa", "-a", NULL));
  246. ok1(test_cb_called == 27);
  247. ok1(parse_args(&argc, &argv, "-aacaaa", "--bbb", "bbb", "-aacaaa",
  248. NULL));
  249. ok1(test_cb_called == 34);
  250. test_cb_called = 0;
  251. reset_options();
  252. /* -- and POSIXLY_CORRECT */
  253. opt_register_noarg("-a|--aaa", test_noarg, NULL, "a");
  254. ok1(parse_args(&argc, &argv, "-a", "--", "-a", NULL));
  255. ok1(test_cb_called == 1);
  256. ok1(argc == 2);
  257. ok1(strcmp(argv[1], "-a") == 0);
  258. ok1(!argv[2]);
  259. unsetenv("POSIXLY_CORRECT");
  260. ok1(parse_args(&argc, &argv, "-a", "somearg", "-a", "--", "-a", NULL));
  261. ok1(test_cb_called == 3);
  262. ok1(argc == 3);
  263. ok1(strcmp(argv[1], "somearg") == 0);
  264. ok1(strcmp(argv[2], "-a") == 0);
  265. ok1(!argv[3]);
  266. setenv("POSIXLY_CORRECT", "1", 1);
  267. ok1(parse_args(&argc, &argv, "-a", "somearg", "-a", "--", "-a", NULL));
  268. ok1(test_cb_called == 4);
  269. ok1(argc == 5);
  270. ok1(strcmp(argv[1], "somearg") == 0);
  271. ok1(strcmp(argv[2], "-a") == 0);
  272. ok1(strcmp(argv[3], "--") == 0);
  273. ok1(strcmp(argv[4], "-a") == 0);
  274. ok1(!argv[5]);
  275. /* parse_args allocates argv */
  276. free(argv);
  277. return exit_status();
  278. }