# 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"
