t0040,t1502: Demonstrate parse_options bugs
When the option spec contains no switches or only hidden switches, parse_options will emit an extra blank line at the end of help output so that the help text will end in two blank lines instead of one. When parse_options produces internal help output after an error has occurred it will emit blank lines within the usage string to stdout instead of stderr. Update t/helper/test-parse-options.c to have a description body in the usage string to exercise this second bug and mark tests as failing in t0040. Add tests to t1502 to demonstrate both of these problems. Signed-off-by: Brandon Casey <drafnel@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Brandon Casey committed
Sep 24, 2017 at 21:08 UTC
c97ee171a6b5a7e41234d46341b496146fa08bf1
3 files changed
+107
-3
t/helper/test-parse-options.c
+2
@@ -99,6 +99,8 @@ int cmd_main(int argc, const char **argv)
99
const char *prefix = "prefix/";
100
const char *usage[] = {
101
"test-parse-options <options>",
102
+ "",
103
+ "A helper function for the parse-options API.",
104
NULL
105
};
106
struct string_list expect = STRING_LIST_INIT_NODUP;
t/t0040-parse-options.sh
+5
-3
@@ -10,6 +10,8 @@ test_description='our own option parser'
10
cat >expect <<\EOF
11
usage: test-parse-options <options>
12
13
+ A helper function for the parse-options API.
14
+
15
--yes get a boolean
16
-D, --no-doubt begins with 'no-'
17
-B, --no-fear be brave
@@ -90,8 +92,8 @@ test_expect_success 'OPT_BOOL() is idempotent #2' 'check boolean: 1 -DB'
92
test_expect_success 'OPT_BOOL() negation #1' 'check boolean: 0 -D --no-yes'
93
test_expect_success 'OPT_BOOL() negation #2' 'check boolean: 0 -D --no-no-doubt'
94
93
-test_expect_success 'OPT_BOOL() no negation #1' 'check_unknown_i18n --fear'
94
-test_expect_success 'OPT_BOOL() no negation #2' 'check_unknown_i18n --no-no-fear'
95
+test_expect_failure 'OPT_BOOL() no negation #1' 'check_unknown_i18n --fear'
96
+test_expect_failure 'OPT_BOOL() no negation #2' 'check_unknown_i18n --no-no-fear'
97
98
test_expect_success 'OPT_BOOL() positivation' 'check boolean: 0 -D --doubt'
99
@@ -286,7 +288,7 @@ test_expect_success 'OPT_CALLBACK() and OPT_BIT() work' '
288
289
>expect
290
289
-test_expect_success 'OPT_CALLBACK() and callback errors work' '
291
+test_expect_failure 'OPT_CALLBACK() and callback errors work' '
292
test_must_fail test-parse-options --no-length >output 2>output.err &&
293
test_i18ncmp expect output &&
294
test_i18ncmp expect.err output.err
t/t1502-rev-parse-parseopt.sh
+100
@@ -38,6 +38,25 @@ test_expect_success 'setup optionspec' '
38
EOF
39
'
40
41
+test_expect_success 'setup optionspec-no-switches' '
42
+ sed -e "s/^|//" >optionspec_no_switches <<\EOF
43
+|some-command [options] <args>...
44
+|
45
+|some-command does foo and bar!
46
+|--
47
+EOF
48
+'
49
+
50
+test_expect_success 'setup optionspec-only-hidden-switches' '
51
+ sed -e "s/^|//" >optionspec_only_hidden_switches <<\EOF
52
+|some-command [options] <args>...
53
+|
54
+|some-command does foo and bar!
55
+|--
56
+|hidden1* A hidden switch
57
+EOF
58
+'
59
+
60
test_expect_success 'test --parseopt help output' '
61
sed -e "s/^|//" >expect <<\END_EXPECT &&
62
|cat <<\EOF
@@ -79,6 +98,87 @@ END_EXPECT
98
test_i18ncmp expect output
99
'
100
101
+test_expect_failure 'test --parseopt help output no switches' '
102
+ sed -e "s/^|//" >expect <<\END_EXPECT &&
103
+|cat <<\EOF
104
+|usage: some-command [options] <args>...
105
+|
106
+| some-command does foo and bar!
107
+|
108
+|EOF
109
+END_EXPECT
110
+ test_expect_code 129 git rev-parse --parseopt -- -h > output < optionspec_no_switches &&
111
+ test_i18ncmp expect output
112
+'
113
+
114
+test_expect_failure 'test --parseopt help output hidden switches' '
115
+ sed -e "s/^|//" >expect <<\END_EXPECT &&
116
+|cat <<\EOF
117
+|usage: some-command [options] <args>...
118
+|
119
+| some-command does foo and bar!
120
+|
121
+|EOF
122
+END_EXPECT
123
+ test_expect_code 129 git rev-parse --parseopt -- -h > output < optionspec_only_hidden_switches &&
124
+ test_i18ncmp expect output
125
+'
126
+
127
+test_expect_success 'test --parseopt help-all output hidden switches' '
128
+ sed -e "s/^|//" >expect <<\END_EXPECT &&
129
+|cat <<\EOF
130
+|usage: some-command [options] <args>...
131
+|
132
+| some-command does foo and bar!
133
+|
134
+| --hidden1 A hidden switch
135
+|
136
+|EOF
137
+END_EXPECT
138
+ test_expect_code 129 git rev-parse --parseopt -- --help-all > output < optionspec_only_hidden_switches &&
139
+ test_i18ncmp expect output
140
+'
141
+
142
+test_expect_failure 'test --parseopt invalid switch help output' '
143
+ sed -e "s/^|//" >expect <<\END_EXPECT &&
144
+|error: unknown option `does-not-exist'\''
145
+|usage: some-command [options] <args>...
146
+|
147
+| some-command does foo and bar!
148
+|
149
+| -h, --help show the help
150
+| --foo some nifty option --foo
151
+| --bar ... some cool option --bar with an argument
152
+| -b, --baz a short and long option
153
+|
154
+|An option group Header
155
+| -C[...] option C with an optional argument
156
+| -d, --data[=...] short and long option with an optional argument
157
+|
158
+|Argument hints
159
+| -B <arg> short option required argument
160
+| --bar2 <arg> long option required argument
161
+| -e, --fuz <with-space>
162
+| short and long option required argument
163
+| -s[<some>] short option optional argument
164
+| --long[=<data>] long option optional argument
165
+| -g, --fluf[=<path>] short and long option optional argument
166
+| --longest <very-long-argument-hint>
167
+| a very long argument hint
168
+| --pair <key=value> with an equals sign in the hint
169
+| --aswitch help te=t contains? fl*g characters!`
170
+| --bswitch <hint> hint has trailing tab character
171
+| --cswitch switch has trailing tab character
172
+| --short-hint <a> with a one symbol hint
173
+|
174
+|Extras
175
+| --extra1 line above used to cause a segfault but no longer does
176
+|
177
+END_EXPECT
178
+ test_expect_code 129 git rev-parse --parseopt -- --does-not-exist 1>/dev/null 2>output < optionspec &&
179
+ test_i18ncmp expect output
180
+'
181
+
182
test_expect_success 'setup expect.1' "
183
cat > expect <<EOF
184
set -- --foo --bar 'ham' -b --aswitch -- 'arg'