shell: add 6856 $IFS tests to testsuites
authorDenys Vlasenko <vda.linux@googlemail.com>
Wed, 11 Apr 2018 18:24:58 +0000 (20:24 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 11 Apr 2018 18:24:58 +0000 (20:24 +0200)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/ash_test/ash-z_slow/many_ifs.right [new file with mode: 0644]
shell/ash_test/ash-z_slow/many_ifs.tests [new file with mode: 0755]
shell/hush_test/hush-z_slow/many_ifs.right [new file with mode: 0644]
shell/hush_test/hush-z_slow/many_ifs.tests [new file with mode: 0755]

diff --git a/shell/ash_test/ash-z_slow/many_ifs.right b/shell/ash_test/ash-z_slow/many_ifs.right
new file mode 100644 (file)
index 0000000..f3bdccc
--- /dev/null
@@ -0,0 +1 @@
+# tests 6856 passed 6856 failed 0
diff --git a/shell/ash_test/ash-z_slow/many_ifs.tests b/shell/ash_test/ash-z_slow/many_ifs.tests
new file mode 100755 (executable)
index 0000000..1f5b1b3
--- /dev/null
@@ -0,0 +1,257 @@
+# Usage: $SHELL ifs.sh
+#
+# This script generates 6856 tests for the set(1) and read(1)
+# builtins w.r.t. IFS whitespace and non-whitespace characters.
+# Each failed test produces one line on the standard output that
+# contains the test along with the expected and actual results.
+# The last output line contains the test result counts.  ordered>0
+# are the number of tests where IFS=": " produced different results
+# than IFS=" :".  If a test fails the same way for IFS=": " and
+# IFS=" :" then the second output line is suppressed.
+
+TESTS=6856
+
+ksh_read=0
+echo 1 | read ksh_read
+ksh_arith=0
+eval '((ksh_arith+=1))' 2>/dev/null
+
+failed=0
+ordered=0
+passed=0
+
+split()
+{
+       i=$1 s=$2 r=$3 S='' R=''
+       for ifs in ': ' ' :'
+       do      IFS=$ifs
+               set x $i
+               shift
+               IFS=' '
+               g="[$#]"
+               while   :
+               do      case $# in
+                       0)      break ;;
+                       esac
+                       g="$g($1)"
+                       shift
+               done
+               case $g in
+               "$s")   case $ksh_arith in
+                       1)      ((passed+=1)) ;;
+                       *)      passed=`expr $passed + 1` ;;
+                       esac
+                       case $S in
+                       '')     S=$g
+                               ;;
+                       "$g")   ;;
+                       *)      case $ksh_arith in
+                               1)      ((ordered+=1)) ;;
+                               *)      ordered=`expr $ordered + 1` ;;
+                               esac
+                               ;;
+                       esac
+                       ;;
+               "$S")   case $ksh_arith in
+                       1)      ((failed+=1)) ;;
+                       *)      failed=`expr $failed + 1` ;;
+                       esac
+                       ;;
+               *)      case $ksh_arith in
+                       1)      ((failed+=1)) ;;
+                       *)      failed=`expr $failed + 1` ;;
+                       esac
+                       case $s in
+                       "$S")   ;;
+                       ?0*)    echo "IFS=\"$ifs\"; x=\"$i\"; set x \$x; shift; echo \"[\$#]\" # expected \"$s\" got \"$g\"" ;;
+                       ?1*)    echo "IFS=\"$ifs\"; x=\"$i\"; set x \$x; shift; echo \"[\$#](\$1)\" # expected \"$s\" got \"$g\"" ;;
+                       ?2*)    echo "IFS=\"$ifs\"; x=\"$i\"; set x \$x; shift; echo \"[\$#](\$1)(\$2)\" # expected \"$s\" got \"$g\"" ;;
+                       ?3*)    echo "IFS=\"$ifs\"; x=\"$i\"; set x \$x; shift; echo \"[\$#](\$1)(\$2)(\$3)\" # expected \"$s\" got \"$g\"" ;;
+                       *)      echo TEST ERROR i="'$i'" s="'$s'" ;;
+                       esac
+                       case $S in
+                       '')     S=$g
+                               ;;
+                       "$g")   ;;
+                       *)      case $ksh_arith in
+                               1)      ((ordered+=1)) ;;
+                               *)      ordered=`expr $ordered + 1` ;;
+                               esac
+                               ;;
+                       esac
+               esac
+               case $ksh_read in
+               1)      echo "$i" | IFS=$ifs read x y; g="($x)($y)" ;;
+               *)      g=`export ifs; echo "$i" | ( IFS=$ifs; read x y; echo "($x)($y)" )` ;;
+               esac
+               case $g in
+               "$r")   case $ksh_arith in
+                       1)      ((passed+=1)) ;;
+                       *)      passed=`expr $passed + 1` ;;
+                       esac
+                       case $R in
+                       '')     R=$g
+                               ;;
+                       "$g")   ;;
+                       *)      case $ksh_arith in
+                               1)      ((ordered+=1)) ;;
+                               *)      ordered=`expr $ordered + 1` ;;
+                               esac
+                               ;;
+                       esac
+                       ;;
+               "$R")   case $ksh_arith in
+                       1)      ((failed+=1)) ;;
+                       *)      failed=`expr $failed + 1` ;;
+                       esac
+                       ;;
+               *)      case $ksh_arith in
+                       1)      ((failed+=1)) ;;
+                       *)      failed=`expr $failed + 1` ;;
+                       esac
+                       case $r in
+                       "$R")   ;;
+                       *)      echo "echo \"$i\" | ( IFS=\"$ifs\" read x y; echo \"(\$x)(\$y)\" ) # expected \"$r\" got \"$g\"" ;;
+                       esac
+                       case $R in
+                       '')     R=$g
+                               ;;
+                       "$g")   ;;
+                       *)      case $ksh_arith in
+                               1)      ((ordered+=1)) ;;
+                               *)      ordered=`expr $ordered + 1` ;;
+                               esac
+                               ;;
+                       esac
+                       ;;
+               esac
+       done
+}
+
+for str in     \
+       '-'     \
+       'a'     \
+       '- -'   \
+       '- a'   \
+       'a -'   \
+       'a b'   \
+       '- - -' \
+       '- - a' \
+       '- a -' \
+       '- a b' \
+       'a - -' \
+       'a - b' \
+       'a b -' \
+       'a b c' \
+
+do
+       IFS=' '
+       set x $str
+
+       shift
+       case $# in
+       0)      continue ;;
+       esac
+
+       f1=$1
+       case $f1 in
+       '-')    f1='' ;;
+       esac
+
+       shift
+       case $# in
+       0)      for d0 in '' ' '
+               do
+                       for d1 in '' ' ' ':' ' :' ': ' ' : '
+                       do
+                               case $f1$d1 in
+                               '')     split "$d0$f1$d1" "[0]" "()()" ;;
+                               ' ')    ;;
+                               *)      split "$d0$f1$d1" "[1]($f1)" "($f1)()" ;;
+                               esac
+                       done
+               done
+               continue
+               ;;
+       esac
+       f2=$1
+       case $f2 in
+       '-')    f2='' ;;
+       esac
+
+       shift
+       case $# in
+       0)      for d0 in '' ' '
+               do
+                       for d1 in ' ' ':' ' :' ': ' ' : '
+                       do
+                               case ' ' in
+                               $f1$d1|$d1$f2)  continue ;;
+                               esac
+                               for d2 in '' ' ' ':' ' :' ': ' ' : '
+                               do
+                                       case $f2$d2 in
+                                       '')     split "$d0$f1$d1$f2$d2" "[1]($f1)" "($f1)()" ;;
+                                       ' ')    ;;
+                                       *)      split "$d0$f1$d1$f2$d2" "[2]($f1)($f2)" "($f1)($f2)" ;;
+                                       esac
+                               done
+                       done
+               done
+               continue
+               ;;
+       esac
+       f3=$1
+       case $f3 in
+       '-')    f3='' ;;
+       esac
+
+       shift
+       case $# in
+       0)      for d0 in '' ' '
+               do
+                       for d1 in ':' ' :' ': ' ' : '
+                       do
+                               case ' ' in
+                               $f1$d1|$d1$f2)  continue ;;
+                               esac
+                               for d2 in ' ' ':' ' :' ': ' ' : '
+                               do
+                                       case $f2$d2 in
+                                       ' ')    continue ;;
+                                       esac
+                                       case ' ' in
+                                       $f2$d2|$d2$f3)  continue ;;
+                                       esac
+                                       for d3 in '' ' ' ':' ' :' ': ' ' : '
+                                       do
+                                               case $f3$d3 in
+                                               '')     split "$d0$f1$d1$f2$d2$f3$d3" "[2]($f1)($f2)" "($f1)($f2)" ;;
+                                               ' ')    ;;
+                                               *)      x=$f2$d2$f3$d3
+                                                       x=${x# } #was x=${x#' '} hush needs fixing for this to work
+                                                       x=${x% } #was x=${x%' '}
+                                                       split "$d0$f1$d1$f2$d2$f3$d3" "[3]($f1)($f2)($f3)" "($f1)($x)"
+                                                       ;;
+                                               esac
+                                       done
+                               done
+                       done
+               done
+               continue
+               ;;
+       esac
+done
+case $ksh_arith in
+1)     ((tests=passed+failed)) ;;
+*)     tests=`expr $passed + $failed` ;;
+esac
+case $ordered in
+0)     ordered="" ;;
+*)     ordered=" ordered $ordered" ;;
+esac
+case $tests in
+$TESTS)        fatal="" ;;
+*)     fatal=" -- fundamental IFS error -- $TESTS tests expected"
+esac
+echo "# tests $tests passed $passed failed $failed$ordered$fatal"
diff --git a/shell/hush_test/hush-z_slow/many_ifs.right b/shell/hush_test/hush-z_slow/many_ifs.right
new file mode 100644 (file)
index 0000000..f3bdccc
--- /dev/null
@@ -0,0 +1 @@
+# tests 6856 passed 6856 failed 0
diff --git a/shell/hush_test/hush-z_slow/many_ifs.tests b/shell/hush_test/hush-z_slow/many_ifs.tests
new file mode 100755 (executable)
index 0000000..1f5b1b3
--- /dev/null
@@ -0,0 +1,257 @@
+# Usage: $SHELL ifs.sh
+#
+# This script generates 6856 tests for the set(1) and read(1)
+# builtins w.r.t. IFS whitespace and non-whitespace characters.
+# Each failed test produces one line on the standard output that
+# contains the test along with the expected and actual results.
+# The last output line contains the test result counts.  ordered>0
+# are the number of tests where IFS=": " produced different results
+# than IFS=" :".  If a test fails the same way for IFS=": " and
+# IFS=" :" then the second output line is suppressed.
+
+TESTS=6856
+
+ksh_read=0
+echo 1 | read ksh_read
+ksh_arith=0
+eval '((ksh_arith+=1))' 2>/dev/null
+
+failed=0
+ordered=0
+passed=0
+
+split()
+{
+       i=$1 s=$2 r=$3 S='' R=''
+       for ifs in ': ' ' :'
+       do      IFS=$ifs
+               set x $i
+               shift
+               IFS=' '
+               g="[$#]"
+               while   :
+               do      case $# in
+                       0)      break ;;
+                       esac
+                       g="$g($1)"
+                       shift
+               done
+               case $g in
+               "$s")   case $ksh_arith in
+                       1)      ((passed+=1)) ;;
+                       *)      passed=`expr $passed + 1` ;;
+                       esac
+                       case $S in
+                       '')     S=$g
+                               ;;
+                       "$g")   ;;
+                       *)      case $ksh_arith in
+                               1)      ((ordered+=1)) ;;
+                               *)      ordered=`expr $ordered + 1` ;;
+                               esac
+                               ;;
+                       esac
+                       ;;
+               "$S")   case $ksh_arith in
+                       1)      ((failed+=1)) ;;
+                       *)      failed=`expr $failed + 1` ;;
+                       esac
+                       ;;
+               *)      case $ksh_arith in
+                       1)      ((failed+=1)) ;;
+                       *)      failed=`expr $failed + 1` ;;
+                       esac
+                       case $s in
+                       "$S")   ;;
+                       ?0*)    echo "IFS=\"$ifs\"; x=\"$i\"; set x \$x; shift; echo \"[\$#]\" # expected \"$s\" got \"$g\"" ;;
+                       ?1*)    echo "IFS=\"$ifs\"; x=\"$i\"; set x \$x; shift; echo \"[\$#](\$1)\" # expected \"$s\" got \"$g\"" ;;
+                       ?2*)    echo "IFS=\"$ifs\"; x=\"$i\"; set x \$x; shift; echo \"[\$#](\$1)(\$2)\" # expected \"$s\" got \"$g\"" ;;
+                       ?3*)    echo "IFS=\"$ifs\"; x=\"$i\"; set x \$x; shift; echo \"[\$#](\$1)(\$2)(\$3)\" # expected \"$s\" got \"$g\"" ;;
+                       *)      echo TEST ERROR i="'$i'" s="'$s'" ;;
+                       esac
+                       case $S in
+                       '')     S=$g
+                               ;;
+                       "$g")   ;;
+                       *)      case $ksh_arith in
+                               1)      ((ordered+=1)) ;;
+                               *)      ordered=`expr $ordered + 1` ;;
+                               esac
+                               ;;
+                       esac
+               esac
+               case $ksh_read in
+               1)      echo "$i" | IFS=$ifs read x y; g="($x)($y)" ;;
+               *)      g=`export ifs; echo "$i" | ( IFS=$ifs; read x y; echo "($x)($y)" )` ;;
+               esac
+               case $g in
+               "$r")   case $ksh_arith in
+                       1)      ((passed+=1)) ;;
+                       *)      passed=`expr $passed + 1` ;;
+                       esac
+                       case $R in
+                       '')     R=$g
+                               ;;
+                       "$g")   ;;
+                       *)      case $ksh_arith in
+                               1)      ((ordered+=1)) ;;
+                               *)      ordered=`expr $ordered + 1` ;;
+                               esac
+                               ;;
+                       esac
+                       ;;
+               "$R")   case $ksh_arith in
+                       1)      ((failed+=1)) ;;
+                       *)      failed=`expr $failed + 1` ;;
+                       esac
+                       ;;
+               *)      case $ksh_arith in
+                       1)      ((failed+=1)) ;;
+                       *)      failed=`expr $failed + 1` ;;
+                       esac
+                       case $r in
+                       "$R")   ;;
+                       *)      echo "echo \"$i\" | ( IFS=\"$ifs\" read x y; echo \"(\$x)(\$y)\" ) # expected \"$r\" got \"$g\"" ;;
+                       esac
+                       case $R in
+                       '')     R=$g
+                               ;;
+                       "$g")   ;;
+                       *)      case $ksh_arith in
+                               1)      ((ordered+=1)) ;;
+                               *)      ordered=`expr $ordered + 1` ;;
+                               esac
+                               ;;
+                       esac
+                       ;;
+               esac
+       done
+}
+
+for str in     \
+       '-'     \
+       'a'     \
+       '- -'   \
+       '- a'   \
+       'a -'   \
+       'a b'   \
+       '- - -' \
+       '- - a' \
+       '- a -' \
+       '- a b' \
+       'a - -' \
+       'a - b' \
+       'a b -' \
+       'a b c' \
+
+do
+       IFS=' '
+       set x $str
+
+       shift
+       case $# in
+       0)      continue ;;
+       esac
+
+       f1=$1
+       case $f1 in
+       '-')    f1='' ;;
+       esac
+
+       shift
+       case $# in
+       0)      for d0 in '' ' '
+               do
+                       for d1 in '' ' ' ':' ' :' ': ' ' : '
+                       do
+                               case $f1$d1 in
+                               '')     split "$d0$f1$d1" "[0]" "()()" ;;
+                               ' ')    ;;
+                               *)      split "$d0$f1$d1" "[1]($f1)" "($f1)()" ;;
+                               esac
+                       done
+               done
+               continue
+               ;;
+       esac
+       f2=$1
+       case $f2 in
+       '-')    f2='' ;;
+       esac
+
+       shift
+       case $# in
+       0)      for d0 in '' ' '
+               do
+                       for d1 in ' ' ':' ' :' ': ' ' : '
+                       do
+                               case ' ' in
+                               $f1$d1|$d1$f2)  continue ;;
+                               esac
+                               for d2 in '' ' ' ':' ' :' ': ' ' : '
+                               do
+                                       case $f2$d2 in
+                                       '')     split "$d0$f1$d1$f2$d2" "[1]($f1)" "($f1)()" ;;
+                                       ' ')    ;;
+                                       *)      split "$d0$f1$d1$f2$d2" "[2]($f1)($f2)" "($f1)($f2)" ;;
+                                       esac
+                               done
+                       done
+               done
+               continue
+               ;;
+       esac
+       f3=$1
+       case $f3 in
+       '-')    f3='' ;;
+       esac
+
+       shift
+       case $# in
+       0)      for d0 in '' ' '
+               do
+                       for d1 in ':' ' :' ': ' ' : '
+                       do
+                               case ' ' in
+                               $f1$d1|$d1$f2)  continue ;;
+                               esac
+                               for d2 in ' ' ':' ' :' ': ' ' : '
+                               do
+                                       case $f2$d2 in
+                                       ' ')    continue ;;
+                                       esac
+                                       case ' ' in
+                                       $f2$d2|$d2$f3)  continue ;;
+                                       esac
+                                       for d3 in '' ' ' ':' ' :' ': ' ' : '
+                                       do
+                                               case $f3$d3 in
+                                               '')     split "$d0$f1$d1$f2$d2$f3$d3" "[2]($f1)($f2)" "($f1)($f2)" ;;
+                                               ' ')    ;;
+                                               *)      x=$f2$d2$f3$d3
+                                                       x=${x# } #was x=${x#' '} hush needs fixing for this to work
+                                                       x=${x% } #was x=${x%' '}
+                                                       split "$d0$f1$d1$f2$d2$f3$d3" "[3]($f1)($f2)($f3)" "($f1)($x)"
+                                                       ;;
+                                               esac
+                                       done
+                               done
+                       done
+               done
+               continue
+               ;;
+       esac
+done
+case $ksh_arith in
+1)     ((tests=passed+failed)) ;;
+*)     tests=`expr $passed + $failed` ;;
+esac
+case $ordered in
+0)     ordered="" ;;
+*)     ordered=" ordered $ordered" ;;
+esac
+case $tests in
+$TESTS)        fatal="" ;;
+*)     fatal=" -- fundamental IFS error -- $TESTS tests expected"
+esac
+echo "# tests $tests passed $passed failed $failed$ordered$fatal"