#! /bin/sh
#
# Perform a standard set of test on the Kaffe system.  This script should
# be built up as we add more test and so, hopefully, avoid re-releasing
# bugs which have been fixed.
#
# Copyright (c) 1996-2000
#	Transvirtual Technologies, Inc.  All rights reserved.
#
# See the file "license.terms" for information on usage and redistribution 
# of this file. 

JAVA="../../cacao -classpath . -log /dev/null -ieee"
JAVAC="../../cacao -classpath . -log /dev/null -ieee sun.tools.javac.Main"

overallerror=0
error=0

if test -n "${VERBOSE+set}"; then
  VERBOSE=echo
else
  VERBOSE=:
fi

# Don't let these variables mess up the order of `sort'
if test -n "${LC_ALL+set}"; then
  LC_ALL=C; export LC_ALL
fi
if test -n "${LANG+set}"; then
  LANG=C; export LANG
fi

$VERBOSE $0 ${1+"$@"}

mybasename () {
    echo "$1" | sed 's%.*/%%'
}

compile()
{
	echo ERROR > ${RESULT}
	JAVAC_FLAGS=`cat ${1+"$@"} | sed 's/\/\/ javac flags://p;d'`
	$VERBOSE ${JAVAC} -d . ${JAVAC_FLAGS} ${1+"$@"}
	eval ${JAVAC} -d . ${JAVAC_FLAGS} ${1+"$@"} > ${RESULT} 2>&1
	if echo " $JAVAC_FLAGS" | grep " -nowarn" >/dev/null; then
		OUTPUT=`cat ${RESULT} | sed '/warning/d; /caution/d'`
	else
		OUTPUT=`cat ${RESULT}`
	fi
	if test "${OUTPUT}" != "" ; then
		echo "error compiling:"
		cat ${RESULT}
		error=1
	fi
	rm -f ${RESULT}
}

#
# Run a test, optionally sorted
#
run()
{
	RESULT="$1.fail"
	TMPRESULT="$1.tmp"
	$VERBOSE $JAVA $*
	$JAVA $* >$TMPRESULT 2>&1
	error=$?
	if test "x$SORT" = "xyes"; then
	    # grep will take care of stripping \r from DOS-like output
	    sort $TMPRESULT | grep '.*' > $RESULT
	else
	    # grep will take care of stripping \r from DOS-like output
	    grep '.*' $TMPRESULT > "$RESULT"
	fi
	rm -f $TMPRESULT
	if test ! -f "$1.out"; then
		if test "$error" = 0 || test "$error" = 77; then
		    mv "$RESULT" "$1.out"
		    $VERBOSE output preserved in "$1.out"
		else
		    $VERBOSE output preserved in "$1.fail"
		fi
	elif cmp -s "$RESULT" "$1.out" ; then
	        $VERBOSE got expected output in "$1.out"
		rm -f "$RESULT"
	else
	        $VERBOSE output differs from "$1.out", saving in "$1.fail"
		error=1
	fi
	if test -f core; then
		$VERBOSE saving core in "$1.core"
		mv core "$1.core"
	fi
}

runtest()
{
	error=0
	basename=`mybasename "$1" | sed 's/\.java$//'`
	RESULT=$basename.fail
	JAVA_SRCS=${1+"$@"}
	EXTRA_SRCS=`sed 's/\/\/ [Ss]ources://p;d' < "$1"`
	for SRC in $EXTRA_SRCS; do
	    SRC=`dirname "$1"`/$SRC
	    JAVA_SRCS="$JAVA_SRCS $SRC"
	done
	$VERBOSE JAVA_SRCS="$JAVA_SRCS"
	compile $JAVA_SRCS
	if grep '// [Ss]kip [Rr]un' < "$1" > /dev/null; then
	    error=0
	elif test $error = 0 ; then
	    if grep '// [Ss]ort [Oo]utput' < "$1" >/dev/null; then
		SORT="yes"
	    else
		SORT="no"
	    fi
	    sed '/^\/\* [Ee]xpected [Oo]utput:/,/\*\//p; d' < "$1" |
	      sed '1d;$d' > $basename.out
	    cmp -s $basename.out /dev/null && rm -f $basename.out
	    JAVA_FLAGS=`sed 's/\/\/ java args://p;d' < "$1"`
	    test -n "$JAVA_FLAGS" || JAVA_FLAGS='$basename'
	    eval run $JAVA_FLAGS
	fi
	if test $error != 0 && test $overallerror != 1; then
	    overallerror=$error
	fi
}

ignoretest()
{
	error=0
	echo "$1 ... ignored" 1>&2
}

for src in ${1+"$@"}; do
    $VERBOSE testing $src
    case "$src" in
    *.class.save)
	cp "$src" `mybasename "$src" | sed 's/\.save$//'`
	run `mybasename "$src" | sed 's/\.class\.save$//'`
	;;
    *.class)
	run `mybasename "$src" | sed 's/\.class$//'`
	;;
    *.java)
	runtest "$src"
	;;
    *)
	run "$src"
	;;
    esac
done

# All done okay
exit $overallerror
