Jari Aalto | 95732b4 | 2005-12-07 14:08:12 +0000 | [diff] [blame] | 1 | # Usage: $SHELL ifs.sh |
| 2 | # |
| 3 | # This script generates 6856 tests for the set(1) and read(1) |
| 4 | # builtins w.r.t. IFS whitespace and non-whitespace characters. |
| 5 | # Each failed test produces one line on the standard output that |
| 6 | # contains the test along with the expected and actual results. |
| 7 | # The last output line contains the test result counts. ordered>0 |
| 8 | # are the number of tests where IFS=": " produced different results |
| 9 | # than IFS=" :". If a test fails the same way for IFS=": " and |
| 10 | # IFS=" :" then the second output line is suppressed. |
| 11 | |
| 12 | TESTS=6856 |
| 13 | |
| 14 | ksh_read=0 |
| 15 | echo 1 | read ksh_read |
| 16 | ksh_arith=0 |
| 17 | eval '((ksh_arith+=1))' 2>/dev/null |
| 18 | |
| 19 | failed=0 |
| 20 | ordered=0 |
| 21 | passed=0 |
| 22 | |
| 23 | split() |
| 24 | { |
| 25 | i=$1 s=$2 r=$3 S='' R='' |
| 26 | for ifs in ': ' ' :' |
| 27 | do IFS=$ifs |
| 28 | set x $i |
| 29 | shift |
| 30 | IFS=' ' |
| 31 | g="[$#]" |
| 32 | while : |
| 33 | do case $# in |
| 34 | 0) break ;; |
| 35 | esac |
| 36 | g="$g($1)" |
| 37 | shift |
| 38 | done |
| 39 | case $g in |
| 40 | "$s") case $ksh_arith in |
| 41 | 1) ((passed+=1)) ;; |
| 42 | *) passed=`expr $passed + 1` ;; |
| 43 | esac |
| 44 | case $S in |
| 45 | '') S=$g |
| 46 | ;; |
| 47 | "$g") ;; |
| 48 | *) case $ksh_arith in |
| 49 | 1) ((ordered+=1)) ;; |
| 50 | *) ordered=`expr $ordered + 1` ;; |
| 51 | esac |
| 52 | ;; |
| 53 | esac |
| 54 | ;; |
| 55 | "$S") case $ksh_arith in |
| 56 | 1) ((failed+=1)) ;; |
| 57 | *) failed=`expr $failed + 1` ;; |
| 58 | esac |
| 59 | ;; |
| 60 | *) case $ksh_arith in |
| 61 | 1) ((failed+=1)) ;; |
| 62 | *) failed=`expr $failed + 1` ;; |
| 63 | esac |
| 64 | case $s in |
| 65 | "$S") ;; |
| 66 | ?0*) echo "IFS=\"$ifs\"; x=\"$i\"; set x \$x; shift; echo \"[\$#]\" # expected \"$s\" got \"$g\"" ;; |
| 67 | ?1*) echo "IFS=\"$ifs\"; x=\"$i\"; set x \$x; shift; echo \"[\$#](\$1)\" # expected \"$s\" got \"$g\"" ;; |
| 68 | ?2*) echo "IFS=\"$ifs\"; x=\"$i\"; set x \$x; shift; echo \"[\$#](\$1)(\$2)\" # expected \"$s\" got \"$g\"" ;; |
| 69 | ?3*) echo "IFS=\"$ifs\"; x=\"$i\"; set x \$x; shift; echo \"[\$#](\$1)(\$2)(\$3)\" # expected \"$s\" got \"$g\"" ;; |
| 70 | *) echo TEST ERROR i="'$i'" s="'$s'" ;; |
| 71 | esac |
| 72 | case $S in |
| 73 | '') S=$g |
| 74 | ;; |
| 75 | "$g") ;; |
| 76 | *) case $ksh_arith in |
| 77 | 1) ((ordered+=1)) ;; |
| 78 | *) ordered=`expr $ordered + 1` ;; |
| 79 | esac |
| 80 | ;; |
| 81 | esac |
| 82 | esac |
| 83 | case $ksh_read in |
| 84 | 1) echo "$i" | IFS=$ifs read x y; g="($x)($y)" ;; |
| 85 | *) g=`export ifs; echo "$i" | ( IFS=$ifs; read x y; echo "($x)($y)" )` ;; |
| 86 | esac |
| 87 | case $g in |
| 88 | "$r") case $ksh_arith in |
| 89 | 1) ((passed+=1)) ;; |
| 90 | *) passed=`expr $passed + 1` ;; |
| 91 | esac |
| 92 | case $R in |
| 93 | '') R=$g |
| 94 | ;; |
| 95 | "$g") ;; |
| 96 | *) case $ksh_arith in |
| 97 | 1) ((ordered+=1)) ;; |
| 98 | *) ordered=`expr $ordered + 1` ;; |
| 99 | esac |
| 100 | ;; |
| 101 | esac |
| 102 | ;; |
| 103 | "$R") case $ksh_arith in |
| 104 | 1) ((failed+=1)) ;; |
| 105 | *) failed=`expr $failed + 1` ;; |
| 106 | esac |
| 107 | ;; |
| 108 | *) case $ksh_arith in |
| 109 | 1) ((failed+=1)) ;; |
| 110 | *) failed=`expr $failed + 1` ;; |
| 111 | esac |
| 112 | case $r in |
| 113 | "$R") ;; |
| 114 | *) echo "echo \"$i\" | ( IFS=\"$ifs\" read x y; echo \"(\$x)(\$y)\" ) # expected \"$r\" got \"$g\"" ;; |
| 115 | esac |
| 116 | case $R in |
| 117 | '') R=$g |
| 118 | ;; |
| 119 | "$g") ;; |
| 120 | *) case $ksh_arith in |
| 121 | 1) ((ordered+=1)) ;; |
| 122 | *) ordered=`expr $ordered + 1` ;; |
| 123 | esac |
| 124 | ;; |
| 125 | esac |
| 126 | ;; |
| 127 | esac |
| 128 | done |
| 129 | } |
| 130 | |
| 131 | for str in \ |
| 132 | '-' \ |
| 133 | 'a' \ |
| 134 | '- -' \ |
| 135 | '- a' \ |
| 136 | 'a -' \ |
| 137 | 'a b' \ |
| 138 | '- - -' \ |
| 139 | '- - a' \ |
| 140 | '- a -' \ |
| 141 | '- a b' \ |
| 142 | 'a - -' \ |
| 143 | 'a - b' \ |
| 144 | 'a b -' \ |
| 145 | 'a b c' \ |
| 146 | |
| 147 | do |
| 148 | IFS=' ' |
| 149 | set x $str |
| 150 | |
| 151 | shift |
| 152 | case $# in |
| 153 | 0) continue ;; |
| 154 | esac |
| 155 | |
| 156 | f1=$1 |
| 157 | case $f1 in |
| 158 | '-') f1='' ;; |
| 159 | esac |
| 160 | |
| 161 | shift |
| 162 | case $# in |
| 163 | 0) for d0 in '' ' ' |
| 164 | do |
| 165 | for d1 in '' ' ' ':' ' :' ': ' ' : ' |
| 166 | do |
| 167 | case $f1$d1 in |
| 168 | '') split "$d0$f1$d1" "[0]" "()()" ;; |
| 169 | ' ') ;; |
| 170 | *) split "$d0$f1$d1" "[1]($f1)" "($f1)()" ;; |
| 171 | esac |
| 172 | done |
| 173 | done |
| 174 | continue |
| 175 | ;; |
| 176 | esac |
| 177 | f2=$1 |
| 178 | case $f2 in |
| 179 | '-') f2='' ;; |
| 180 | esac |
| 181 | |
| 182 | shift |
| 183 | case $# in |
| 184 | 0) for d0 in '' ' ' |
| 185 | do |
| 186 | for d1 in ' ' ':' ' :' ': ' ' : ' |
| 187 | do |
| 188 | case ' ' in |
| 189 | $f1$d1|$d1$f2) continue ;; |
| 190 | esac |
| 191 | for d2 in '' ' ' ':' ' :' ': ' ' : ' |
| 192 | do |
| 193 | case $f2$d2 in |
| 194 | '') split "$d0$f1$d1$f2$d2" "[1]($f1)" "($f1)()" ;; |
| 195 | ' ') ;; |
| 196 | *) split "$d0$f1$d1$f2$d2" "[2]($f1)($f2)" "($f1)($f2)" ;; |
| 197 | esac |
| 198 | done |
| 199 | done |
| 200 | done |
| 201 | continue |
| 202 | ;; |
| 203 | esac |
| 204 | f3=$1 |
| 205 | case $f3 in |
| 206 | '-') f3='' ;; |
| 207 | esac |
| 208 | |
| 209 | shift |
| 210 | case $# in |
| 211 | 0) for d0 in '' ' ' |
| 212 | do |
| 213 | for d1 in ':' ' :' ': ' ' : ' |
| 214 | do |
| 215 | case ' ' in |
| 216 | $f1$d1|$d1$f2) continue ;; |
| 217 | esac |
| 218 | for d2 in ' ' ':' ' :' ': ' ' : ' |
| 219 | do |
| 220 | case $f2$d2 in |
| 221 | ' ') continue ;; |
| 222 | esac |
| 223 | case ' ' in |
| 224 | $f2$d2|$d2$f3) continue ;; |
| 225 | esac |
| 226 | for d3 in '' ' ' ':' ' :' ': ' ' : ' |
| 227 | do |
| 228 | case $f3$d3 in |
| 229 | '') split "$d0$f1$d1$f2$d2$f3$d3" "[2]($f1)($f2)" "($f1)($f2)" ;; |
| 230 | ' ') ;; |
| 231 | *) x=$f2$d2$f3$d3 |
| 232 | x=${x#' '} |
| 233 | x=${x%' '} |
| 234 | split "$d0$f1$d1$f2$d2$f3$d3" "[3]($f1)($f2)($f3)" "($f1)($x)" |
| 235 | ;; |
| 236 | esac |
| 237 | done |
| 238 | done |
| 239 | done |
| 240 | done |
| 241 | continue |
| 242 | ;; |
| 243 | esac |
| 244 | done |
| 245 | case $ksh_arith in |
| 246 | 1) ((tests=passed+failed)) ;; |
| 247 | *) tests=`expr $passed + $failed` ;; |
| 248 | esac |
| 249 | case $ordered in |
| 250 | 0) ordered="" ;; |
| 251 | *) ordered=" ordered $ordered" ;; |
| 252 | esac |
| 253 | case $tests in |
| 254 | $TESTS) fatal="" ;; |
| 255 | *) fatal=" -- fundamental IFS error -- $TESTS tests expected" |
| 256 | esac |
| 257 | echo "# tests $tests passed $passed failed $failed$ordered$fatal" |