#!/bin/bash

VERBOSE=0
EXITCODE=0
COLOR=0
PASSCOLOR=''
FAILCOLOR=''
NOCOLOR=''
ECHOFLAGS=''

if [ -z "$JAVA" ] ; then
	JAVA=../../../src/cacao/cacao
fi

if [ -z "$TIMEOUT" ] ; then
	TIMEOUT=20
fi

if [ -n "$TIMEOUTPROG" ] ; then
	if [ -x "$TIMEOUTPROG" ] ; then
		echo "$0: using timeout program: $TIMEOUTPROG"
		echo "$0: timeout value [s]    : $TIMEOUT"
		TIMEOUTRUN="$TIMEOUTPROG $TIMEOUT"
	else
		echo >&2 "$0: warning: timeout program not executable: $TIMEOUTPROG"
	fi
fi

if [ -z "$TIMEOUTRUN" ] ; then
	echo >&2 "$0: warning: running without timeout"
fi

if [ "$1" = "--verbose" ] ; then
	shift
	VERBOSE=1
fi

if [ "$1" = "--color" ] ; then
	shift
	COLOR=1
	PASSCOLOR='\033[1;32m'
	FAILCOLOR='\033[1;31m'
	NOCOLOR='\033[0m'
	ECHOFLAGS='-e'
fi

if [ -z "$JASMIN_JAR" ] ; then
	JASMIN_JAR=/usr/share/java/jasmin-sable.jar
fi

if [ ! -r "$JASMIN_JAR" ] ; then
	echo >&2 "$0: warning: jasmin .jar is not available at $JASMIN_JAR"
	exit 0
fi

JASMIN="$JAVA $JAVAFLAGS -cp $JASMIN_JAR jasmin.Main"

echo "java command: $JAVA $JAVAFLAGS"
echo "jasmin command: $JASMIN"

while [ -n "$1" ]
do
    TEST="$1"
    TESTBASENAME=$(basename "$TEST" .j)

    TESTOUT="TESTOUT"
    TESTEXPECT="TESTEXPECT"
    TESTLOG="TESTLOG"
    TESTERR="TESTERR"
	TESTSIA="TESTSIA"

	EXPECTSTATUS=0
	CHECKICMD=0

	# compile the test

    $JASMIN "$TEST" || exit 2

	if grep 'ERROR:' "$TEST" >/dev/null ; then
		EXPECTSTATUS=1
		EXPECTERROR=$(grep 'ERROR:.*' "$TEST" | sed 's,.*ERROR:[ \t]*,,')
	fi

	if grep 'ICMD:' "$TEST" >/dev/null ; then
		CHECKICMD=1
		EXPECTICMD=$(grep 'ICMD:.*' "$TEST" | sed 's,.*ICMD:[ \t]*,,')
	fi

	# run the test

    $TIMEOUTRUN $JAVA $JAVAFLAGS "$TESTBASENAME" >"$TESTOUT" 2>"$TESTERR"
	TESTSTATUS=$?

	if [ $TESTSTATUS -ne $EXPECTSTATUS ] ; then
		echo $ECHOFLAGS "${FAILCOLOR}FAIL: $TESTBASENAME - expected status $EXPECTSTATUS, but got $TESTSTATUS${NOCOLOR}"
		EXITCODE=1
	fi

	if [ $EXPECTSTATUS -eq 0 ] ; then
		grep 'OUTPUT:' "$TEST" | sed 's,.*OUTPUT:[ \t]*,,' >"$TESTEXPECT"

		if diff -u "$TESTEXPECT" "$TESTOUT" ; then
			if [ $TESTSTATUS -eq 0 ] ; then
				echo $ECHOFLAGS "${PASSCOLOR}PASS: $TESTBASENAME${NOCOLOR}"
			fi
		else
			echo $ECHOFLAGS "${FAILCOLOR}FAIL: $TESTBASENAME - wrong output${NOCOLOR}"
			EXITCODE=1
		fi

		if [ "$VERBOSE" -eq "1" ] ; then
			$JAVA $JAVAFLAGS -sia "$TESTBASENAME" >"$TESTLOG" || exit 2
			./show "$TESTLOG"
		fi
	else
		if grep "$EXPECTERROR" "$TESTERR" >/dev/null ; then
			echo $ECHOFLAGS "${PASSCOLOR}PASS: $TESTBASENAME - got expected error: $EXPECTERROR${NOCOLOR}"
		else
			echo $ECHOFLAGS "${FAILCOLOR}FAIL: $TESTBASENAME - did not get expected error: $EXPECTERROR${NOCOLOR}"
			EXITCODE=1
		fi
	fi

	if [ "$CHECKICMD" -ne 0 ] ; then
		rm -f "$TESTSIA"
		touch "$TESTSIA"
		$JAVA $JAVAFLAGS -sia "$TESTBASENAME" >"$TESTSIA" 2>/dev/null
		cat "$TESTSIA" | sed -n '/^'"$TESTBASENAME"'\.main/,$p' | sed '/^=====.*flags: -1/,$d' | grep "$EXPECTICMD"
	fi

    shift
done

rm -f "$TESTOUT" "$TESTEXPECT" "$TESTLOG" "$TESTERR"

exit $EXITCODE

