#!/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="GenericStencil"
EXE_NAMES="../../build/ParallelStencilSkeleton/ParallelStencilSkeleton"

# 1.2. APP/EXPERIMENT SPECIFIC PARAMETERS
PROCS="1 2 3 4 5"
SIZES="100"
ITERATIONS="1 10 100"
STENCILS="1dc2 1dnc4 2d4 2d9 2dnc9 2df5 3d27"

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

# 1.4. NAME OF THE RESULTS FILE GENERATED BY THE EXECUTABLES
RESULT_FILE="Result.out.dtxt"

# 1.5. MPI RUN COMMAND
if [ -z "$MPI_RUN" ]
then
	MPI_RUN="srun --gres=gpu:4 -Q --exclusive -t 1"
fi


# 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 [ $# -gt 0 ] && [ $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"
	echo
	exit 1
fi

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

	# EXECUTE PROGRAM
	rm -f $RESULT_FILE
	dims=$(echo $5 | cut -c1)
	if [ $dims == "1" ]
	then
		$MPI_RUN -n $2 ./$1 $5 $3 $4 >/dev/null 2>check.err
		#echo ""; $MPI_RUN -n $2 ./$1 $5 $3 $4 2>check.err
	elif [ $dims == "2" ]
	then
		$MPI_RUN -n $2 ./$1 $5 $3 $3 $4 >/dev/null 2>check.err
		#echo ""; $MPI_RUN -n $2 ./$1 $5 $3 $3 $4 2>check.err
	elif [ $dims == "3" ]
	then
		$MPI_RUN -n $2 ./$1 $5 $3 $3 $3 $4 >/dev/null 2>check.err
		#echo ""; $MPI_RUN -n $2 ./$1 $5 $3 $3 $3 $4 2>check.err
	fi

	# 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"
		echo
		exit -1
	# CHECK THE CONTENTS OF THE RESULTS FILE
	else
		CHECK=""
		diff $RESULT_FILE $RESULT_DIR/Result.$5.$3.$4 >/dev/null || CHECK=Result
		if [ "$CHECK" != "" ]
		then
			echo ERROR: $CHECK
		else
			echo OK
		fi
	fi
}

# EXTRA. UNCOMPRESS TEST RESULTS
tar Jxf CorrectResults.tgz

# 5. LOOPS FOR TESTS
for exe in $EXE_NAMES
do
	echo
	echo "Testing: $exe"
	echo "------------------------"
	for size in $SIZES
	do
		for procs in $PROCS
		do
			for iter in $ITERATIONS
			do
				for stencil in $STENCILS
				do
					doTest $exe $procs $size $iter $stencil
				done
			done
		done
	done
done

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

