]> git.ipfire.org Git - thirdparty/bash.git/blob - tests/posix2.tests
bash-4.3-beta overlay
[thirdparty/bash.git] / tests / posix2.tests
1 #! /bin/sh
2 # posix-2.sh - Simple identification tests for POSIX.2 features
3 # commonly missing or incorrectly implemented.
4 # Time-stamp: <96/04/10 16:43:48 gildea>
5 # By Stephen Gildea <gildea@x.org> March 1995
6 #
7 # Copyright (c) 1995 Stephen Gildea
8 # Permission is hereby granted to deal in this Software without restriction.
9 # THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND.
10 #
11 # MODIFIED BY chet@po.cwru.edu to make part of the bash test suite.
12 # last change: Wed Jun 19 12:24:24 EDT 1996
13 #
14 # some of the tests:
15 #
16 # shell functions (do we care?)
17 # var=${var:-val}
18 # unset
19 # set --
20 # IFS parsing
21 ## not exiting with -e and failed "if", the way Ultrix does (Ultrix 4.2?)
22 # "$@" expands to zero arguments if passed zero arguments
23 # $SHELL -c 'echo $1' bad good
24 # test -x
25 # positional parameters greater than 9
26 # arithmetic expansion $(( ... ))
27 # getopts
28
29 # For some tests we must run a sub-shell; $TESTSHELL says what to use.
30 # If set, TESTSHELL must be an absolute pathname.
31 # For example, on HP-UX 9, /bin/posix/sh is the supposedly-compliant shell.
32 TESTSHELL=${THIS_SH:-$PWD/../bash}
33
34 # these tests create temp files with names $TMPDIR/conf*
35 : ${TMPDIR:=/tmp}
36
37 exitval=0
38 numtests=0
39
40 echo "Testing for POSIX.2 conformance"
41
42 newtest()
43 {
44 numtests=$(($numtests + 1))
45 }
46
47 testfail()
48 {
49 echo "$1 test failed"
50 exitval=$(($exitval + 1))
51 }
52
53 newtest
54 empty=""
55 test "${empty:-ok}" = ok || testfail "empty var colon"
56 newtest
57 test "${empty-bad}" = "" || testfail "got \"${empty-bad}\": empty var nocolon"
58 newtest
59 test "${unsetvar-ok}" = ok || testfail "unset var"
60 newtest
61 unset empty
62 test "${empty-ok}" = ok || testfail "unset"
63
64 newtest
65 set -- -Z
66 test "x$1" = x-Z || testfail '\"set -- arg\"'
67 # this should empty the argument list
68 newtest
69 set --
70 test $# = 0 || testfail "still $# args: \"set --\""
71
72 # IFS parsing:
73 newtest
74 names=one/good/three
75 saved_ifs="$IFS"
76 IFS=/
77 set $names lose
78 test "$2" = good || testfail "got \"$2\": IFS parsing"
79 IFS="$saved_ifs"
80
81 # "$@" with 0 arguments should expand to 0 arguments
82 newtest
83 cat > $TMPDIR/conftest1 << EOF
84 $TMPDIR/conftest2 "\$@"
85 EOF
86 cat > $TMPDIR/conftest2 << "EOF"
87 #! /bin/sh
88 echo $#
89 EOF
90 chmod +x $TMPDIR/conftest1 $TMPDIR/conftest2
91 numargs=$($TESTSHELL $TMPDIR/conftest1)
92 if [ "$?" != 0 ]; then
93 testfail 'running $@'
94 else
95 test "$numargs" = 0 || testfail '"$@" got '"$numargs args: expansion w 0 args"
96 fi
97 rm -f $TMPDIR/conftest1 $TMPDIR/conftest2
98
99 newtest
100 val=$("$TESTSHELL" -c 'echo $1' csh good)
101 test "$val" = good || testfail "got \"$val\": sh -c"
102
103 newtest
104 # do these tests in a sub-shell because failure will exit
105 val=$("$TESTSHELL" -c 'echo ${10}' 0 1 2 3 4 5 6 7 8 9 ten 11 2> /dev/null)
106 test "$val" = ten || testfail "accessing more than 9 positional params"
107
108 a=abc_def_ghi
109 export a
110 newtest; val=`"$TESTSHELL" -c 'echo "${a%_*}"' 2> /dev/null`
111 test "$val" = abc_def || testfail "parameter % op"
112 newtest; val=`"$TESTSHELL" -c 'echo "${a%%_*}"' 2> /dev/null`
113 test "$val" = abc || testfail "parameter %% op"
114 newtest; val=`"$TESTSHELL" -c 'echo "${a#*_}"' 2> /dev/null`
115 test "$val" = def_ghi || testfail "parameter # op"
116 newtest; val=`"$TESTSHELL" -c 'echo "${a##*_}"' 2> /dev/null`
117 test "$val" = ghi || testfail "parameter ## op"
118
119 newtest
120 "$TESTSHELL" -c 'export a=value' 2> /dev/null || testfail "export with value"
121
122 newtest
123 a=5; test "$(( ($a+1)/2 ))" = 3 || testfail "arithmetic expansion"
124
125 # does "test" support the -x switch?
126 newtest
127 touch $TMPDIR/conftest
128 chmod -x $TMPDIR/conftest
129 test -x $TMPDIR/conftest && testfail "negative test -x"
130 chmod +x $TMPDIR/conftest
131 test -x $TMPDIR/conftest || testfail "positive test -x"
132 rm -f $TMPDIR/conftest
133
134 newtest
135 test "$OPTIND" = 1 || testfail "OPTIND initial value"
136
137 newtest
138 getopts a: store -a aoptval
139 if [ "$OPTIND" != 3 ] || [ "$store" != a ] || [ "$OPTARG" != aoptval ]; then
140 testfail "getopts"
141 fi
142
143 # if I change the default quoting style for variable values, these
144 # next four must change
145
146 newtest
147 SQUOTE="'"
148 val1=$(set | sed -n 's:^SQUOTE=::p')
149 if [ "$val1" != "\'" ]; then
150 testfail "variable quoting 1"
151 fi
152
153 newtest
154 VTILDE='~'
155 val1=$(set | sed -n 's:^VTILDE=::p')
156 if [ "$val1" != "'~'" ]; then
157 testfail "variable quoting 2"
158 fi
159
160 newtest
161 VHASH=ab#cd
162 val1=$(set | sed -n 's:^VHASH=::p')
163 if [ "$val1" != "ab#cd" ]; then
164 testfail "variable quoting 3"
165 fi
166
167 newtest
168 VHASH2=#abcd
169 val1=$(set | sed -n 's:^VHASH2=::p')
170 if [ "$val1" != "'#abcd'" ]; then
171 testfail "variable quoting 4"
172 fi
173
174 if [ $exitval = 0 ]; then
175 echo "All tests passed"
176 else
177 echo "$exitval of $numtests tests failed"
178 fi
179 exit $exitval