+ /* Corner cases involving short arg parsing weirdness. */
+ opt_register_noarg("-a|--aaa", test_noarg, NULL, "a");
+ opt_register_arg("-b|--bbb", test_arg, NULL, "bbb", "b");
+ opt_register_arg("-c|--ccc", test_arg, NULL, "aaa", "c");
+ /* -aa == -a -a */
+ ok1(parse_args(&argc, &argv, "-aa", NULL));
+ ok1(test_cb_called == 2);
+ ok1(parse_args(&argc, &argv, "-aab", NULL) == false);
+ ok1(test_cb_called == 4);
+ ok1(strstr(err_output, ": -b: requires an argument"));
+ ok1(parse_args(&argc, &argv, "-bbbb", NULL));
+ ok1(test_cb_called == 5);
+ ok1(parse_args(&argc, &argv, "-aabbbb", NULL));
+ ok1(test_cb_called == 8);
+ ok1(parse_args(&argc, &argv, "-aabbbb", "-b", "bbb", NULL));
+ ok1(test_cb_called == 12);
+ ok1(parse_args(&argc, &argv, "-aabbbb", "--bbb", "bbb", NULL));
+ ok1(test_cb_called == 16);
+ ok1(parse_args(&argc, &argv, "-aabbbb", "--bbb=bbb", NULL));
+ ok1(test_cb_called == 20);
+ ok1(parse_args(&argc, &argv, "-aacaaa", NULL));
+ ok1(test_cb_called == 23);
+ ok1(parse_args(&argc, &argv, "-aacaaa", "-a", NULL));
+ ok1(test_cb_called == 27);
+ ok1(parse_args(&argc, &argv, "-aacaaa", "--bbb", "bbb", "-aacaaa",
+ NULL));
+ ok1(test_cb_called == 34);
+
+ test_cb_called = 0;
+ reset_options();
+
+ /* -- and POSIXLY_CORRECT */
+ opt_register_noarg("-a|--aaa", test_noarg, NULL, "a");
+ ok1(parse_args(&argc, &argv, "-a", "--", "-a", NULL));
+ ok1(test_cb_called == 1);
+ ok1(argc == 2);
+ ok1(strcmp(argv[1], "-a") == 0);
+ ok1(!argv[2]);
+
+ unsetenv("POSIXLY_CORRECT");
+ ok1(parse_args(&argc, &argv, "-a", "somearg", "-a", "--", "-a", NULL));
+ ok1(test_cb_called == 3);
+ ok1(argc == 3);
+ ok1(strcmp(argv[1], "somearg") == 0);
+ ok1(strcmp(argv[2], "-a") == 0);
+ ok1(!argv[3]);
+
+ setenv("POSIXLY_CORRECT", "1", 1);
+ ok1(parse_args(&argc, &argv, "-a", "somearg", "-a", "--", "-a", NULL));
+ ok1(test_cb_called == 4);
+ ok1(argc == 5);
+ ok1(strcmp(argv[1], "somearg") == 0);
+ ok1(strcmp(argv[2], "-a") == 0);
+ ok1(strcmp(argv[3], "--") == 0);
+ ok1(strcmp(argv[4], "-a") == 0);
+ ok1(!argv[5]);
+