#!/bin/bash
# //===--------------------------- testit ---------------------------------===//
# //
# //                     The LLVM Compiler Infrastructure
# //
# // This file is distributed under the University of Illinois Open Source
# // License. See LICENSE.TXT for details.
# //
# //===--------------------------------------------------------------------===//

currentpath=`pwd`
origpath=$currentpath
currentdir=`basename $currentpath`
while [ $currentdir != "test" ]; do
	if [ $currentdir == "/" ]
	then
		echo "current directory must be in or under \"test\"."
		exit 1
	fi
	cd ..
	currentpath=`pwd`
	currentdir=`basename $currentpath`
done

cd ..
LIBCXX_ROOT=`pwd`
cd $origpath

if [ -z "$CC" ]
then
	if which xcrun >/dev/null
	then
		CC="xcrun clang++"
	else
		CC=clang++
	fi
fi

if [ -z "$OPTIONS" ]
then
	OPTIONS="-std=c++0x -stdlib=libc++"
fi
OPTIONS="$OPTIONS -I$LIBCXX_ROOT/test/support"

if [ -z "$HEADER_INCLUDE" ]
then
       HEADER_INCLUDE="-I$LIBCXX_ROOT/include"
fi

if [ -z "$SOURCE_LIB" ]
then
       SOURCE_LIB="-L$LIBCXX_ROOT/lib"
fi

case $TRIPLE in
  *-*-mingw* | *-*-cygwin* | *-*-win*)
	TEST_EXE=test.exe
    ;;
  *)
    TEST_EXE=a.out
    ;;
esac

FAIL=0
PASS=0
UNIMPLEMENTED=0
IMPLEMENTED_FAIL=0
IMPLEMENTED_PASS=0

function afunc
{
	fail=0
	pass=0
	if (ls *.fail.cpp &> /dev/null)
	then
		for FILE in $(ls *.fail.cpp); do
			if $CC $OPTIONS $HEADER_INCLUDE $SOURCE_LIB $FILE $LIBS -o ./$TEST_EXE &> /dev/null
			then
				rm ./$TEST_EXE
				echo "$FILE should not compile"
				let "fail+=1"
			else
				let "pass+=1"
			fi
		done
	fi

	if (ls *.pass.cpp &> /dev/null)
	then
		for FILE in $(ls *.pass.cpp); do
			if $CC $OPTIONS $HEADER_INCLUDE $SOURCE_LIB $FILE $LIBS -o ./$TEST_EXE
			then
				if ./$TEST_EXE
				then
					rm ./$TEST_EXE
					let "pass+=1"
				else
					echo "`pwd`/$FILE failed at run time"
					echo "Compile line was:" $CC $OPTIONS $HEADER_INCLUDE $SOURCE_LIB $FILE $LIBS
					let "fail+=1"
					rm ./$TEST_EXE
				fi
			else
				echo "`pwd`/$FILE failed to compile"
				echo "Compile line was:" $CC $OPTIONS $HEADER_INCLUDE $SOURCE_LIB $FILE $LIBS
				let "fail+=1"
			fi
		done
	fi

	if [ $fail -gt 0 ]
	then
		echo "failed $fail tests in `pwd`"
		let "IMPLEMENTED_FAIL+=1"
	fi
	if [ $pass -gt 0 ]
	then
		echo "passed $pass tests in `pwd`"
		if [ $fail -eq 0 ]
		then
			let "IMPLEMENTED_PASS+=1"
		fi
	fi
	if [ $fail -eq 0 -a $pass -eq 0 ]
	then
		echo "not implemented:  `pwd`"
		let "UNIMPLEMENTED+=1"
	fi

	let "FAIL+=$fail"
	let "PASS+=$pass"

	for FILE in *
	do
		if [ -d "$FILE" ];
		then
			cd $FILE
			afunc
			cd ..
		fi
	done
}

afunc

echo "****************************************************"
echo "Results for `pwd`:"
echo "using `$CC --version`"
echo "with $OPTIONS $HEADER_INCLUDE $SOURCE_LIB"
echo "----------------------------------------------------"
echo "sections without tests   : $UNIMPLEMENTED"
echo "sections with failures   : $IMPLEMENTED_FAIL"
echo "sections without failures: $IMPLEMENTED_PASS"
echo "                       +   ----"
echo "total number of sections : $(($UNIMPLEMENTED+$IMPLEMENTED_FAIL+$IMPLEMENTED_PASS))"
echo "----------------------------------------------------"
echo "number of tests failed   : $FAIL"
echo "number of tests passed   : $PASS"
echo "                       +   ----"
echo "total number of tests    : $(($FAIL+$PASS))"
echo "****************************************************"

exit $FAIL
