#!/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="Stencil Code, Jacobi2D"
EXE_NAMES="jacobi2D refMPIJacobi2D.v2.1"

# 1.2. APP/EXPERIMENT SPECIFIC PARAMETERS
PROCS="1 4 5 9 10 13 16 25"
SIZES="10 100"
ITERATIONS="1 10 100"

# 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="Result.out.dtxt"


# 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_FILE
	mpiexec -n $2 ./$1 $3 $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 ]
	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=""
		diff $RESULT_FILE $RESULT_DIR/Result.$3.$4 >/dev/null || CHECK=Result
		if [ "$CHECK" != "" ]
		then
			echo ERROR: $CHECK
		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 iter in $ITERATIONS
		do
			for procs in $PROCS
			do
				doTest $exe $procs $size $iter
			done
		done
	done
done

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