tizen 2.3.1 release
[external/bash.git] / tests / ifs-posix.tests
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"