]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/netbsd-tests/bin/sh/t_option.sh
MFC r305358,r305449,r305451,r306367,r306397,r309474:
[FreeBSD/stable/10.git] / contrib / netbsd-tests / bin / sh / t_option.sh
1 # $NetBSD: t_option.sh,v 1.3 2016/03/08 14:19:28 christos Exp $
2 #
3 # Copyright (c) 2016 The NetBSD Foundation, Inc.
4 # All rights reserved.
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
9 # 1. Redistributions of source code must retain the above copyright
10 #    notice, this list of conditions and the following disclaimer.
11 # 2. Redistributions in binary form must reproduce the above copyright
12 #    notice, this list of conditions and the following disclaimer in the
13 #    documentation and/or other materials provided with the distribution.
14 #
15 # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16 # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17 # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18 # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 # POSSIBILITY OF SUCH DAMAGE.
26 #
27 # the implementation of "sh" to test
28 : ${TEST_SH:="/bin/sh"}
29
30 # The standard
31 # http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html
32 # says:
33 #       ...[lots]
34
35 test_option_on_off()
36 {
37         atf_require_prog tr
38
39         for opt
40         do
41                                 # t is needed, as inside $()` $- appears to lose
42                                 # the 'e' option if it happened to already be
43                                 # set.  Must check if that is what should
44                                 # happen, but that is a different issue.
45
46                 test -z "${opt}" && continue
47
48                 # if we are playing with more that one option at a
49                 # time, the code below requires that we start with no
50                 # options set, or it will mis-diagnose the situation
51                 CLEAR=''
52                 test "${#opt}" -gt 1 &&
53   CLEAR='xx="$-" && xx=$(echo "$xx" | tr -d cs) && test -n "$xx" && set +"$xx";'
54
55                 atf_check -s exit:0 -o empty -e empty ${TEST_SH} -c \
56                         "opt=${opt}"'
57                         x() {
58                                 echo "ERROR: Unable to $1 option $2" >&2
59                                 exit 1
60                         }
61                         s() {
62                                 set -"$1"
63                                 t="$-"
64                                 x=$(echo "$t" | tr -d "$1")
65                                 test "$t" = "$x" && x set "$1"
66                                 return 0
67                         }
68                         c() {
69                                 set +"$1"
70                                 t="$-"
71                                 x=$(echo "$t" | tr -d "$1")
72                                 test "$t" != "$x" && x clear "$1"
73                                 return 0
74                         }
75                         '"${CLEAR}"'
76
77                         # if we do not do this, -x tracing splatters stderr
78                         # for some shells, -v does as well (is that correct?)
79                         case "${opt}" in
80                         (*[xv]*)        exec 2>/dev/null;;
81                         esac
82
83                         o="$-"
84                         x=$(echo "$o" | tr -d "$opt")
85
86                         if [ "$o" = "$x" ]; then        # option was off
87                                 s "${opt}"
88                                 c "${opt}"
89                         else
90                                 c "${opt}"
91                                 s "${opt}"
92                         fi
93                 '
94         done
95 }
96
97 test_optional_on_off()
98 {
99         RET=0
100         OPTS=
101         for opt
102         do
103                 test "${opt}" = n && continue
104                 ${TEST_SH} -c "set -${opt}" 2>/dev/null  &&
105                         OPTS="${OPTS} ${opt}" || RET=1
106         done
107
108         test -n "${OPTS}" && test_option_on_off ${OPTS}
109
110         return "${RET}"
111 }
112
113 atf_test_case set_a
114 set_a_head() {
115         atf_set "descr" "Tests that 'set -a' turns on all var export " \
116                         "and that it behaves as defined by the standard"
117 }
118 set_a_body() {
119         atf_require_prog env
120         atf_require_prog grep
121
122         test_option_on_off a
123
124         # without -a, new variables should not be exported (so grep "fails")
125         atf_check -s exit:1 -o empty -e empty ${TEST_SH} -ce \
126                 'unset VAR; set +a; VAR=value; env | grep "^VAR="'
127
128         # with -a, they should be
129         atf_check -s exit:0 -o match:VAR=value -e empty ${TEST_SH} -ce \
130                 'unset VAR; set -a; VAR=value; env | grep "^VAR="'
131 }
132
133 atf_test_case set_C
134 set_C_head() {
135         atf_set "descr" "Tests that 'set -C' turns on no clobber mode " \
136                         "and that it behaves as defined by the standard"
137 }
138 set_C_body() {
139         atf_require_prog ls
140
141         test_option_on_off C
142
143         # Check that the environment to use for the tests is sane ...
144         # we assume current dir is a new tempory directory & is empty
145
146         test -z "$(ls)" || atf_skip "Test execution directory not clean"
147         test -c "/dev/null" || atf_skip "Problem with /dev/null"
148
149         echo Dummy_Content > Junk_File
150         echo Precious_Content > Important_File
151
152         # Check that we can redirect onto file when -C is not set
153         atf_check -s exit:0 -o empty -e empty ${TEST_SH} -c \
154                 '
155                 D=$(ls -l Junk_File) || exit 1
156                 set +C
157                 echo "Overwrite it now" > Junk_File
158                 A=$(ls -l Junk_File) || exit 1
159                 test "${A}" != "${D}"
160                 '
161
162         # Check that we cannot redirect onto file when -C is set
163         atf_check -s exit:0 -o empty -e not-empty ${TEST_SH} -c \
164                 '
165                 D=$(ls -l Important_File) || exit 1
166                 set -C
167                 echo "Fail to Overwrite it now" > Important_File
168                 A=$(ls -l Important_File) || exit 1
169                 test "${A}" = "${D}"
170                 '
171
172         # Check that we can append to file, even when -C is set
173         atf_check -s exit:0 -o empty -e empty ${TEST_SH} -c \
174                 '
175                 D=$(ls -l Junk_File) || exit 1
176                 set -C
177                 echo "Append to it now" >> Junk_File
178                 A=$(ls -l Junk_File) || exit 1
179                 test "${A}" != "${D}"
180                 '
181
182         # Check that we abort on attempt to redirect onto file when -Ce is set
183         atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \
184                 '
185                 set -Ce
186                 echo "Fail to Overwrite it now" > Important_File
187                 echo "Should not reach this point"
188                 '
189
190         # Last check that we can override -C for when we really need to
191         atf_check -s exit:0 -o empty -e empty ${TEST_SH} -c \
192                 '
193                 D=$(ls -l Junk_File) || exit 1
194                 set -C
195                 echo "Change the poor bugger again" >| Junk_File
196                 A=$(ls -l Junk_File) || exit 1
197                 test "${A}" != "${D}"
198                 '
199 }
200
201 atf_test_case set_e
202 set_e_head() {
203         atf_set "descr" "Tests that 'set -e' turns on error detection " \
204                 "and that a simple case behaves as defined by the standard"
205 }
206 set_e_body() {
207         test_option_on_off e
208
209         # Check that -e does nothing if no commands fail
210         atf_check -s exit:0 -o match:I_am_OK -e empty \
211             ${TEST_SH} -c \
212                 'false; printf "%s" I_am; set -e; true; printf "%s\n" _OK'
213
214         # and that it (silently, but with exit status) aborts if cmd fails
215         atf_check -s not-exit:0 -o match:I_am -o not-match:Broken -e empty \
216             ${TEST_SH} -c \
217                 'false; printf "%s" I_am; set -e; false; printf "%s\n" _Broken'
218
219         # same, except -e this time is on from the beginning
220         atf_check -s not-exit:0 -o match:I_am -o not-match:Broken -e empty \
221             ${TEST_SH} -ec 'printf "%s" I_am; false; printf "%s\n" _Broken'
222
223         # More checking of -e in other places, there is lots to deal with.
224 }
225
226 atf_test_case set_f
227 set_f_head() {
228         atf_set "descr" "Tests that 'set -f' turns off pathname expansion " \
229                         "and that it behaves as defined by the standard"
230 }
231 set_f_body() {
232         atf_require_prog ls
233
234         test_option_on_off f
235
236         # Check that the environment to use for the tests is sane ...
237         # we assume current dir is a new tempory directory & is empty
238
239         test -z "$(ls)" || atf_skip "Test execution directory not clean"
240
241         # we will assume that atf will clean up this junk directory
242         # when we are done.   But for testing pathname expansion
243         # we need files
244
245         for f in a b c d e f aa ab ac ad ae aaa aab aac aad aba abc bbb ccc
246         do
247                 echo "$f" > "$f"
248         done
249
250         atf_check -s exit:0 -o empty -e empty ${TEST_SH} -ec \
251             'X=$(echo b*); Y=$(echo b*); test "${X}" != "a*";
252                 test "${X}" = "${Y}"'
253
254         # now test expansion is different when -f is set
255         atf_check -s exit:0 -o empty -e empty ${TEST_SH} -ec \
256            'X=$(echo b*); Y=$(set -f; echo b*); test "${X}" != "${Y}"'
257 }
258
259 atf_test_case set_n
260 set_n_head() {
261         atf_set "descr" "Tests that 'set -n' supresses command execution " \
262                         "and that it behaves as defined by the standard"
263 }
264 set_n_body() {
265         # pointless to test this, if it turns on, it stays on...
266         # test_option_on_off n
267         # so just allow the tests below to verify it can be turned on
268
269         # nothing should be executed, hence no output...
270         atf_check -s exit:0 -o empty -e empty \
271                 ${TEST_SH} -enc 'echo ABANDON HOPE; echo ALL YE; echo ...'
272
273         # this is true even when the "commands" do not exist
274         atf_check -s exit:0 -o empty -e empty \
275                 ${TEST_SH} -enc 'ERR; FAIL; ABANDON HOPE'
276
277         # but if there is a syntax error, it should be detected (w or w/o -e)
278         atf_check -s not-exit:0 -o empty -e not-empty \
279                 ${TEST_SH} -enc 'echo JUMP; for frogs swim; echo in puddles'
280         atf_check -s not-exit:0 -o empty -e not-empty \
281                 ${TEST_SH} -nc 'echo ABANDON HOPE; echo "ALL YE; echo ...'
282         atf_check -s not-exit:0 -o empty -e not-empty \
283                 ${TEST_SH} -enc 'echo ABANDON HOPE;; echo ALL YE; echo ...'
284         atf_check -s not-exit:0 -o empty -e not-empty \
285                 ${TEST_SH} -nc 'do YOU ABANDON HOPE; for all eternity?'
286
287         # now test enabling -n in the middle of a script
288         # note that once turned on, it cannot be turned off again.
289         #
290         # omit more complex cases, as those can send some shells
291         # into infinite loops, and believe it or not, that might be OK!
292
293         atf_check -s exit:0 -o match:first -o not-match:second -e empty \
294                 ${TEST_SH} -c 'echo first; set -n; echo second'
295         atf_check -s exit:0 -o match:first -o not-match:third -e empty \
296             ${TEST_SH} -c 'echo first; set -n; echo second; set +n; echo third'
297         atf_check -s exit:0 -o inline:'a\nb\n' -e empty \
298             ${TEST_SH} -c 'for x in a b c d
299                            do
300                                 case "$x" in
301                                      a);; b);; c) set -n;; d);;
302                                 esac
303                                 printf "%s\n" "$x"
304                            done'
305
306         # This last one is a bit more complex to explain, so I will not try
307
308         # First, we need to know what signal number is used for SIGUSR1 on
309         # the local (testing) system (signal number is $(( $XIT - 128 )) )
310
311         # this will take slightly over 1 second elapsed time (the sleep 1)
312         # The "10" for the first sleep just needs to be something big enough
313         # that the rest of the commands have time to complete, even on
314         # very slow testing systems.  10 should be enough.  Otherwise irrelevant
315
316         # The shell will usually blather to stderr about the sleep 10 being
317         # killed, but it affects nothing, so just allow it to cry.
318
319         (sleep 10 & sleep 1; kill -USR1 $!; wait $!)
320         XIT="$?"
321
322         # The exit value should be an integer > 128 and < 256 (often 158)
323         # If it is not just skip the test
324
325         # If we do run the test, it should take (slightly over) either 1 or 2
326         # seconds to complete, depending upon the shell being tested.
327
328         case "${XIT}" in
329         ( 129 | 1[3-9][0-9] | 2[0-4][0-9] | 25[0-5] )
330
331                 # The script below should exit with the same code - no output
332
333                 # Or that is the result that seems best explanable.
334                 # "set -n" in uses like this is not exactly well defined...
335
336                 # This script comes from a member of the austin group
337                 # (they author changes to the posix shell spec - and more.)
338                 # The author is also an (occasional?) NetBSD user.
339                 atf_check -s exit:${XIT} -o empty -e empty ${TEST_SH} -c '
340                         trap "set -n" USR1
341                         { sleep 1; kill -USR1 $$; sleep 1; } &
342                         false
343                         wait && echo t || echo f
344                         wait
345                         echo foo
346                 '
347                 ;;
348         esac
349 }
350
351 atf_test_case set_u
352 set_u_head() {
353         atf_set "descr" "Tests that 'set -u' turns on unset var detection " \
354                         "and that it behaves as defined by the standard"
355 }
356 set_u_body() {
357         test_option_on_off u
358
359         # first make sure it is OK to unset an unset variable
360         atf_check -s exit:0 -o match:OK -e empty ${TEST_SH} -ce \
361                 'unset _UNSET_VARIABLE_; echo OK'
362         # even if -u is set
363         atf_check -s exit:0 -o match:OK -e empty ${TEST_SH} -cue \
364                 'unset _UNSET_VARIABLE_; echo OK'
365
366         # and that without -u accessing an unset variable is harmless
367         atf_check -s exit:0 -o match:OK -e empty ${TEST_SH} -ce \
368                 'unset X; echo ${X}; echo OK'
369         # and that the unset variable test expansion works properly
370         atf_check -s exit:0 -o match:OKOK -e empty ${TEST_SH} -ce \
371                 'unset X; printf "%s" ${X-OK}; echo OK'
372
373         # Next test that with -u set, the shell aborts on access to unset var
374         # do not use -e, want to make sure it is -u that causes abort
375         atf_check -s not-exit:0 -o not-match:ERR -e not-empty ${TEST_SH} -c \
376                 'unset X; set -u; echo ${X}; echo ERR'
377         # quoting should make no difference...
378         atf_check -s not-exit:0 -o not-match:ERR -e not-empty ${TEST_SH} -c \
379                 'unset X; set -u; echo "${X}"; echo ERR'
380
381         # Now a bunch of accesses to unset vars, with -u, in ways that are OK
382         atf_check -s exit:0 -o match:OK -e empty ${TEST_SH} -ce \
383                 'unset X; set -u; echo ${X-GOOD}; echo OK'
384         atf_check -s exit:0 -o match:OK -e empty ${TEST_SH} -ce \
385                 'unset X; set -u; echo ${X-OK}'
386         atf_check -s exit:0 -o not-match:ERR -o match:OK -e empty \
387                 ${TEST_SH} -ce 'unset X; set -u; echo ${X+ERR}; echo OK'
388
389         # and some more ways that are not OK
390         atf_check -s not-exit:0 -o not-match:ERR -e not-empty ${TEST_SH} -c \
391                 'unset X; set -u; echo ${X#foo}; echo ERR'
392         atf_check -s not-exit:0 -o not-match:ERR -e not-empty ${TEST_SH} -c \
393                 'unset X; set -u; echo ${X%%bar}; echo ERR'
394
395         # lastly, just while we are checking unset vars, test aborts w/o -u
396         atf_check -s not-exit:0 -o not-match:ERR -e not-empty ${TEST_SH} -c \
397                 'unset X; echo ${X?}; echo ERR'
398         atf_check -s not-exit:0 -o not-match:ERR -e match:X_NOT_SET \
399                 ${TEST_SH} -c 'unset X; echo ${X?X_NOT_SET}; echo ERR'
400 }
401
402 atf_test_case set_v
403 set_v_head() {
404         atf_set "descr" "Tests that 'set -v' turns on input read echoing " \
405                         "and that it behaves as defined by the standard"
406 }
407 set_v_body() {
408         test_option_on_off v
409
410         # check that -v does nothing if no later input line is read
411         atf_check -s exit:0 \
412                         -o match:OKOK -o not-match:echo -o not-match:printf \
413                         -e empty \
414                 ${TEST_SH} -ec 'printf "%s" OK; set -v; echo OK; exit 0'
415
416         # but that it does when there are multiple lines
417         cat <<- 'EOF' |
418                 set -v
419                 printf %s OK
420                 echo OK
421                 exit 0
422         EOF
423         atf_check -s exit:0 \
424                         -o match:OKOK -o not-match:echo -o not-match:printf \
425                         -e match:printf -e match:OK -e match:echo \
426                         -e not-match:set ${TEST_SH}
427
428         # and that it can be disabled again
429         cat <<- 'EOF' |
430                 set -v
431                 printf %s OK
432                 set +v
433                 echo OK
434                 exit 0
435         EOF
436         atf_check -s exit:0 \
437                         -o match:OKOK -o not-match:echo -o not-match:printf \
438                         -e match:printf -e match:OK -e not-match:echo \
439                                 ${TEST_SH}
440
441         # and lastly, that shell keywords do get output when "read"
442         cat <<- 'EOF' |
443                 set -v
444                 for i in 111 222 333
445                 do
446                         printf %s $i
447                 done
448                 exit 0
449         EOF
450         atf_check -s exit:0 \
451                         -o match:111222333 -o not-match:printf \
452                         -o not-match:for -o not-match:do -o not-match:done \
453                         -e match:printf -e match:111 -e not-match:111222 \
454                         -e match:for -e match:do -e match:done \
455                                 ${TEST_SH}
456 }
457
458 atf_test_case set_x
459 set_x_head() {
460         atf_set "descr" "Tests that 'set -x' turns on command exec logging " \
461                         "and that it behaves as defined by the standard"
462 }
463 set_x_body() {
464         test_option_on_off x
465
466         # check that cmd output appears after -x is enabled
467         atf_check -s exit:0 \
468                         -o match:OKOK -o not-match:echo -o not-match:printf \
469                         -e not-match:printf -e match:OK -e match:echo \
470                 ${TEST_SH} -ec 'printf "%s" OK; set -x; echo OK; exit 0'
471
472         # and that it stops again afer -x is disabled
473         atf_check -s exit:0 \
474                         -o match:OKOK -o not-match:echo -o not-match:printf \
475                         -e match:printf -e match:OK -e not-match:echo \
476             ${TEST_SH} -ec 'set -x; printf "%s" OK; set +x; echo OK; exit 0'
477
478         # also check that PS4 is output correctly
479         atf_check -s exit:0 \
480                         -o match:OK -o not-match:echo \
481                         -e match:OK -e match:Run:echo \
482                 ${TEST_SH} -ec 'PS4=Run:; set -x; echo OK; exit 0'
483
484         return 0
485
486         # This one seems controversial... I suspect it is NetBSD's sh
487         # that is wrong to not output "for" "while" "if" ... etc
488
489         # and lastly, that shell keywords do not get output when "executed"
490         atf_check -s exit:0 \
491                         -o match:111222333 -o not-match:printf \
492                         -o not-match:for \
493                         -e match:printf -e match:111 -e not-match:111222 \
494                         -e not-match:for -e not-match:do -e not-match:done \
495                 ${TEST_SH} -ec \
496            'set -x; for i in 111 222 333; do printf "%s" $i; done; echo; exit 0'
497 }
498
499 opt_test_setup()
500 {
501         test -n "$1" || { echo >&2 "Internal error"; exit 1; }
502
503         cat > "$1" << 'END_OF_FUNCTIONS'
504 local_opt_check()
505 {
506         local -
507 }
508
509 instr()
510 {
511         expr "$2" : "\(.*$1\)" >/dev/null
512 }
513
514 save_opts()
515 {
516         local -
517
518         set -e
519         set -u
520
521         instr e "$-" && instr u "$-" && return 0
522         echo ERR
523 }
524
525 fiddle_opts()
526 {
527         set -e
528         set -u
529
530         instr e "$-" && instr u "$-" && return 0
531         echo ERR
532 }
533
534 local_test()
535 {
536         set +eu
537
538         save_opts
539         instr '[eu]' "$-" || printf %s "OK"
540
541         fiddle_opts
542         instr e "$-" && instr u "$-" && printf %s "OK"
543
544         set +eu
545 }
546 END_OF_FUNCTIONS
547 }
548
549 atf_test_case restore_local_opts
550 restore_local_opts_head() {
551         atf_set "descr" "Tests that 'local -' saves and restores options.  " \
552                         "Note that "local" is a local shell addition"
553 }
554 restore_local_opts_body() {
555         atf_require_prog cat
556         atf_require_prog expr
557
558         FN="test-funcs.$$"
559         opt_test_setup "${FN}" || atf_skip "Cannot setup test environment"
560
561         ${TEST_SH} -ec ". './${FN}'; local_opt_check" 2>/dev/null ||
562                 atf_skip "sh extension 'local -' not supported by ${TEST_SH}"
563
564         atf_check -s exit:0 -o match:OKOK -o not-match:ERR -e empty \
565                 ${TEST_SH} -ec ". './${FN}'; local_test"
566 }
567
568 atf_test_case vi_emacs_VE_toggle
569 vi_emacs_VE_toggle_head() {
570         atf_set "descr" "Tests enabling vi disables emacs (and v.v - but why?)"\
571                         "  Note that -V and -E are local shell additions"
572 }
573 vi_emacs_VE_toggle_body() {
574
575         test_optional_on_off V E ||
576           atf_skip "One or both V & E opts unsupported by ${TEST_SH}"
577
578         atf_check -s exit:0 -o empty -e empty ${TEST_SH} -c '
579                 q() {
580                         eval "case \"$-\" in
581                         (*${2}*)        return 1;;
582                         (*${1}*)        return 0;;
583                         esac"
584                         return 1
585                 }
586                 x() {
587                         echo >&2 "Option set or toggle failure:" \
588                                         " on=$1 off=$2 set=$-"
589                         exit 1
590                 }
591                 set -V; q V E || x V E
592                 set -E; q E V || x E V
593                 set -V; q V E || x V E
594                 set +EV; q "" "[VE]" || x "" VE
595                 exit 0
596         '
597 }
598
599 atf_test_case xx_bogus
600 xx_bogus_head() {
601         atf_set "descr" "Tests that attempting to set a nonsense option fails."
602 }
603 xx_bogus_body() {
604         # Biggest problem here is picking a "nonsense option" that is
605         # not implemented by any shell, anywhere.  Hopefully this will do.
606
607         # 'set' is a special builtin, so a conforming shell should exit
608         # on an arg error, and the ERR should not be printed.
609         atf_check -s not-exit:0 -o empty -e not-empty \
610                 ${TEST_SH} -c 'set -% ; echo ERR'
611 }
612
613 atf_test_case Option_switching
614 Option_switching_head() {
615         atf_set "descr" "options can be enabled and disabled"
616 }
617 Option_switching_body() {
618
619         # Cannot test -m, setting it causes test shell to fail...
620         # (test shell gets SIGKILL!)  Wonder why ... something related to atf
621         # That is, it works if just run as "sh -c 'echo $-; set -m; echo $-'"
622
623         # Don't bother testing toggling -n, once on, it stays on...
624         # (and because the test fn refuses to allow us to try)
625
626         # Cannot test -o or -c here, or the extension -s
627         # they can only be used, not switched
628
629         # these are the posix options, that all shells should implement
630         test_option_on_off a b C e f h u v x      # m
631
632         # and these are extensions that might not exist (non-fatal to test)
633         # -i and -s (and -c) are posix options, but are not required to
634         # be accessable via the "set" command, just the command line.
635         # We allow for -i to work with set, as that makes some sense,
636         # -c and -s do not.
637         test_optional_on_off E i I p q V || true
638
639         # Also test (some) option combinations ...
640         # only testing posix options here, because it is easier...
641         test_option_on_off aeu vx Ca aCefux
642 }
643
644 atf_init_test_cases() {
645         # tests are run in order sort of names produces, so choose names wisely
646
647         # this one tests turning on/off all the mandatory. and extra flags
648         atf_add_test_case Option_switching
649         # and this tests the NetBSD "local -" functionality in functions.
650         atf_add_test_case restore_local_opts
651
652         # no tests for  -m (no idea how to do that one)
653         #               -I (no easy way to generate the EOF it ignores)
654         #               -i (not sure how to test that one at the minute)
655         #               -p (because we aren't going to run tests setuid)
656         #               -V/-E (too much effort, and a real test would be huge)
657         #               -c (because almost all the other tests test it anyway)
658         #               -q (because, for now, I am lazy)
659         #               -s (coming soon, hopefully)
660         #               -o (really +o: again, hopefully soon)
661         #               -o longname (again, just laziness, don't wait...)
662         #               -h/-b (because NetBSD doesn't implement them)
663         atf_add_test_case set_a
664         atf_add_test_case set_C
665         atf_add_test_case set_e
666         atf_add_test_case set_f
667         atf_add_test_case set_n
668         atf_add_test_case set_u
669         atf_add_test_case set_v
670         atf_add_test_case set_x
671
672         atf_add_test_case vi_emacs_VE_toggle
673         atf_add_test_case xx_bogus
674 }