#!/bin/bash

VERSION="0.1.2"

TABLIX="tablix"
TABLIX_OUTPUT="tablix_output"

IDID='$Id: tablix_test,v 1.6 2005/06/07 18:46:05 avian Exp $'

CMD=`basename $0`

cat >&2 <<END
TABLIX testing framework $VERSION, Copyright (C) 2002-2004 Tomaz Solc
$IDID

END

function syntax {
	cat <<END
Following tests are supported:

$CMD --file "OPTIONS" FILE

	Execute a single Tablix run using OPTIONS and verify the output.

$CMD --dir "OPTIONS" DIRECTORY

	Execute a single Tablix run using OPTIONS for each file in the 
	specified directory and verify the output.

$CMD --multi-file N "OPTIONS" FILE

	Execute N Tablix runs using OPTIONS and verify the output.

$CMD --multi-dir N "OPTIONS" DIRECTORY

	Execute N Tablix runs using OPTIONS for each file in the 
	specified directory and verify the output.
END
}

function test_pvm {
	if ! ps aux | grep -v grep | grep pvmd > /dev/null; then
		echo "PVM not running" >&2
		exit 1
	fi
}

function show_config {
	echo "using binary : `which $TABLIX`" >&2
	echo "using binary : `which $TABLIX_OUTPUT`" >&2
	echo "repeats      : $RUNS" >&2
	echo "parameters   : $PARAMETERS" >&2

	if echo $PARAMETERS | grep -- -o; then
		echo "Do not add your own \"-o\" parameter in OPTIONS"
		exit 1
	fi
}

function test_run {
	if ! $TABLIX -o _ttf__ $PARAMETERS $TESTFILE &> /dev/null; then
		return 1
	fi

	RESULT=`tempfile`
		
	for RESULTFILE in _ttf__result*.xml; do
		$TABLIX_OUTPUT -s $TESTFILE ttf $RESULTFILE &> $RESULT
		if [ $? != "0" ]; then
			cat $RESULT | grep 'Error:'
			rm -f _ttf__result*.xml
			rm -f _ttf__conv*.txt
			rm -f _ttf__save*.txt
			rm -f $RESULT
			return 2
		fi
		if cat $RESULT | grep 'test number .* failed'; then
			cat $RESULT | grep 'debug'
			rm -f _ttf__result*.xml
			rm -f _ttf__conv*.txt
			rm -f _ttf__save*.txt
			rm -f $RESULT
			return 3
		fi
	done

	rm -f _ttf__result*.xml
	rm -f _ttf__conv*.txt
	rm -f _ttf__save*.txt
	rm -f $RESULT
	return 0
}

function multi_test_run {
	BASEFILE=`basename $TESTFILE .xml`

	printf "%20s : " $BASEFILE

	N=1
	while [ $N -le $RUNS ]; do
		test_run

		case $? in
			0)
				;;
			1)
				echo "*** FAILED (tablix crashed) ***"
				return 1;
				;;
			2)
				echo "*** FAILED (most likely scheme syntax error) ***"
				return 2;
				;;
			3)
				echo "*** FAILED (ttf test failed) ***"
				return 3;
				;;
			*)
				echo "*** FAILED (unknown error) ***"
				return 0;
		esac
		N=$(($N+1))
	done

	echo "passed"
	return 0
}

if [ $# -lt 1 ]; then 
	syntax
	exit 1
fi

test_pvm

case "$1" in
	--file)
		RUNS="1"
		PARAMETERS="$2"
		TESTFILE="$3"
		show_config

		if [ ! -f $TESTFILE ]; then
			echo "file $TESTFILE not found"
			exit 1;
		fi

		echo "test file    : $TESTFILE" >&2
		echo

		multi_test_run
		;;
	--multi-file)
		RUNS="$2"
		PARAMETERS="$3"
		TESTFILE="$4"
		show_config

		if [ ! -f $TESTFILE ]; then
			echo "file $TESTFILE not found"
			exit 1;
		fi

		echo "test file    : $TESTFILE" >&2
		echo

		multi_test_run
		;;
	--dir)
		RUNS="1"
		PARAMETERS="$2"
		TESTDIR="$3"
		show_config

		if [ ! -d $TESTDIR ]; then
			echo "directory $TESTDIR not found"
			exit 1;
		fi

		echo "test dir     : $TESTDIR" >&2
		echo

		for TESTFILE in $TESTDIR/*.xml; do
			multi_test_run
		done
		;;
	--multi-dir)
		RUNS="$2"
		PARAMETERS="$3"
		TESTDIR="$4"
		show_config

		if [ ! -d $TESTDIR ]; then
			echo "directory $TESTDIR not found"
			exit 1;
		fi

		echo "test dir     : $TESTDIR" >&2
		echo

		for TESTFILE in $TESTDIR/*.xml; do
			multi_test_run
		done
		;;
	*)
		syntax
		exit 1
esac
