# This program runs ksh regression tests
# shtests [ name=value ... ] [ --all | --compile ] [ --time ] [ a.sh b.sh ... ]

timesensitive='*@(options|sigchld|subshell).sh'

unset DISPLAY ENV FIGNORE HISTFILE
LANG=C
LC_ALL=C
compile=1
script=1
time=1
vmalloc_options=abort
while	:
do	case $1 in
	-a|--a*)compile=2
		script=2
		;;
	-c|--c*)compile=2
		script=
		;;
	-s|--s*)compile=
		script=2
		;;
	-t|--not*)time=
		;;
	-v|--nov*)vmalloc_options=
		;;
	-*)	echo $0: $1: invalid option >&2
		exit 2
		;;
	*=*)	n=${1%%=*}
		v=${1#*=}
		eval $n=\'$v\'
		export $n
		;;
	*)	break
		;;
	esac
	shift
done
if	[[ $VMALLOC_OPTIONS ]]
then	vmalloc_options=$VMALLOC_OPTIONS
else	VMALLOC_OPTIONS=$vmalloc_options
fi
[[ $VMALLOC_OPTIONS ]] || timesensitive=.
export LANG LC_ALL PATH PWD SHELL VMALLOC_OPTIONS
PWD=`pwd`
SHELL=${SHELL-ksh}
case $0 in
/*)	d=`dirname $0`;;
*/*)	d=$PWD/`dirname $0`;;
*)	d=$PWD;;
esac
case $SHELL in
/*)	;;
*/*)	SHELL=$d/$SHELL;;
*)	SHELL=$(whence $SHELL);;
esac
PATH=/bin:/usr/bin
if	[[ -d /usr/ucb ]]
then	PATH=$PATH:/usr/ucb
fi
PATH=$PATH:$d
if	[[ $INSTALLROOT && -r $INSTALLROOT/bin/.paths ]]
then	PATH=$INSTALLROOT/bin:$PATH
fi
if	[[ $compile ]]
then	SHCOMP=${SHCOMP:-shcomp}
	if	whence $SHCOMP > /dev/null
	then	tmp=$(mktemp -dt) || { echo mktemp -dt failed >&2; exit 1; }
		trap "cd /; rm -rf $tmp" EXIT
	elif	[[ $compile != 1 ]]
	then	echo $0: --compile: $SHCOMP not found >&2
		exit 1
	else	compile=
	fi
fi
typeset -A tests
for i in ${*-*.sh}
do	if	[[ ! -r $i ]]
	then	echo $0: $i: not found >&2
		continue
	fi
	t=$(grep -c err_exit $i)
	if	(( $t > 2 ))
	then	(( t = $t - 2 ))
	fi
	tests[$i]=$t
	T=test
	if	(( $t != 1 ))
	then	T=${T}s
	fi
	E=error
	if	[[ $script ]]
	then	echo test $i begins ${time:+"at $(date +%Y-%m-%d+%H:%M:%S)"}
		if	[[ $i == $timesensitive ]]
		then	VMALLOC_OPTIONS=
		fi
		if	$SHELL $i
		then	echo test $i passed ${time:+"at $(date +%Y-%m-%d+%H:%M:%S)"} "[ $t $T 0 ${E}s ]"
		else	e=$?
			if	(( e > 256 ))
			then	e=1
				E=signal
			fi
			if	(( $e != 1 ))
			then	E=${E}s
			fi
			echo test $i failed ${time:+"at $(date +%Y-%m-%d+%H:%M:%S)"} with exit code $e "[ $t $T $e $E ]"
		fi
		if	[[ $i == $timesensitive ]]
		then	VMALLOC_OPTIONS=$vmalloc_options
		fi
	fi
done
if	[[ $compile ]]
then	for i in ${*-*.sh}
	do	if	[[ ! -r $i ]]
		then	continue
		fi
		t=${tests[$i]}
		T=test
		if	(( $t != 1 ))
		then	T=${T}s
		fi
		o=${i##*/}
		o=shcomp-${o%.sh}.ksh
		echo test $o begins ${time:+"at $(date +%Y-%m-%d+%H:%M:%S)"}
		E=error
		if	$SHCOMP $i > $tmp/$o
		then	if	[[ $i == $timesensitive ]]
			then	VMALLOC_OPTIONS=
			fi
			if	$SHELL $tmp/$o
			then	echo test $o passed ${time:+"at $(date +%Y-%m-%d+%H:%M:%S)"} "[ $t $T 0 ${E}s ]"
			else	e=$?
				if	(( e > 256 ))
				then	e=1
					E=signal
				fi
				if	(( $e != 1 ))
				then	E=${E}s
				fi
				echo test $o failed ${time:+"at $(date +%Y-%m-%d+%H:%M:%S)"} with exit code $e "[ $t $T $e $E ]"
			fi
			if	[[ $i == $timesensitive ]]
			then	VMALLOC_OPTIONS=$vmalloc_options
			fi
		else	e=$?
			t=1
			T=test
			echo test $o failed to compile ${time:+"at $(date +%Y-%m-%d+%H:%M:%S)"} with exit code $e "[ $t $T 1 $E ]"
		fi
	done
fi