#!/bin/bash
#
# Script for testing the correct results of parallel Hitmap and reference applications
#
# (c) 2015 Arturo Gonzalez-Escribano
#

# 1. EXPERIMENT INFORMATION
# 1.1. APP NAME AND DEFAULT EXECUTABLES LIST
APP_NAME="Solving equation system: LU factorization + Back substitution"
EXE_NAMES="luBack refMPIluBack"

# 1.2. APP/EXPERIMENT SPECIFIC PARAMETERS
PROCS="1 4 5 9 10 13 16 25"
SIZES="10 30"
BLOQS="1 2 3 5 7 10"

# 1.3. DIRECTORY WITH THE FILES CONTAINING THE EXPECTED RESULTS
RESULT_DIR=CorrectResults

# 1.3. NAME OF THE RESULTS FILE GENERATED BY THE EXECUTABLES
RESULT_FILE_A="A.dtxt"
RESULT_FILE_B="B.dtxt"
RESULT_FILE_LU="LU.dtxt"
RESULT_FILE_X="X.dtxt"
RESULT_FILES="$RESULT_FILE_A $RESULT_FILE_B $RESULT_FILE_LU $RESULT_FILE_X"

# 2. WRITE HEADER
echo
echo TESTING SCRIPT
echo --------------
echo "APPLICATION: $APP_NAME"

# 3. CHECK PARAMETERS
# 3.1. HELP
if [ $# -lt 1 ]
then
	echo
	echo -e "\tUsage: $0 all | <executable_names>"
	echo
	exit 1
fi

# 3.2. TEST SPECIFIC EXECUTABLES INSTEAD OF THE PREDEFINED LIST
if [ $1 != all ]
then
	EXE_NAMES=$@
fi
echo "EXECUTABLES: $EXE_NAMES"
echo

# 3.3. CHECK THAT EXECUTABLES HAVE BEEN GENERATED
for name in $EXE_NAMES
do
	OK=y
	if [ ! -x $name ]
	then
		echo "Error: Executable not found -- $name"
		OK=n
	fi
done
if [ $OK != y ]
then
	echo
	echo -e "\tBefore using this script generate the executables with:  $ make check"
	echo
	exit 1
fi

# 4. TESTING EXPERIMENT
function doTest() {
	echo -e -n "Test $2 $3 $4:\t"

	# EXECUTE PROGRAM
	rm -f $RESULT_FILES
	mpiexec -n $2 ./$1 $3 $4 >/dev/null 2>check.err

	# EXECUTION ERRORS, SKIP TESTING RESULT FILE
	if [ 0 != $? ]
	then
			echo ERROR EXECUTING: $(cat check.err)
			continue
	fi

	# IF THE RESULTS FILE HAS NOT BEEN GENERATED
	if [ ! -r $RESULT_FILE_LU ]
	then
		echo "Error: The executable \"$exe\" does no generate an ouput file. Try cleaning and recompiling with  $ make check"
		echo
		exit -1
	# CHECK THE CONTENTS OF THE RESULTS FILE
	else
		CHECK_A=""
		CHECK_B=""
		CHECK_LU=""
		CHECK_X=""
		diff $RESULT_FILE_A $RESULT_DIR/A.$3 >/dev/null || CHECK_A=A
		diff $RESULT_FILE_B $RESULT_DIR/B.$3 >/dev/null || CHECK_B=B
		diff $RESULT_FILE_LU $RESULT_DIR/LU.$3 >/dev/null || CHECK_LU=LU
		diff $RESULT_FILE_X $RESULT_DIR/X.$3 >/dev/null || CHECK_X=X
		if [ "$CHECK_A" != "" -o "$CHECK_B" != "" -o "$CHECK_LU" != "" -o "$CHECK_X" != "" ]
		then
			echo ERROR: $CHECK_A - $CHECK_B - $CHECK_LU - $CHECK_X
		else
			echo OK
		fi
	fi
}

# 5. LOOPS FOR TESTS
for exe in $EXE_NAMES
do
	echo
	echo "Testing: $exe"
	echo "------------------------"
	for size in $SIZES
	do
		for bloq in $BLOQS
		do
			for procs in $PROCS
			do
				doTest $exe $procs $size $bloq
			done
		done
	done
done

# 6. CLEAN
rm -f $RESULT_FILES
rm -f check.err
