#!/bin/bash
#
# return values of this script are:
#   0  success
# 128  a test failed
#  >0  the number of timed-out tests

set -e

ret=0
TEST_CFLAGS=""

if [ "$#" == "1" ]
then
  MAKE_OPTIONS=$1
fi

_die()
{
  echo "error $2 while $1"
  if [ "$2" != "124" ]
  then
    exit 128
  else
    echo "assuming timeout while running test - continue"
    ret=$(( $ret + 1 ))
  fi
}

_runtest()
{
  echo -ne " Compile $1 $2"
  make clean > /dev/null
  CC="$1" CFLAGS="$2 $TEST_CFLAGS" make test_standalone $MAKE_OPTIONS > /dev/null 2>test_errors.txt
  echo -e "\rRun test $1 $2"
  timeout --foreground 120 ./test > test_$(echo ${1}${2}  | tr ' ' '_').txt || _die "running tests" $?
}

compilers=( $COMPILERS clang gcc )

echo "uname="$(uname -a)

for i in "${compilers[@]}"
do
  if [ -z "$(which $i)" ]
  then
    continue
  fi
  compiler_version=$(echo "$i="$($i -dumpversion))
  if [ "$compiler_version" == "clang=4.2.1" ]
  then
    # one of my versions of clang complains about some stuff in stdio.h and stdarg.h ...
    TEST_CFLAGS="-Wno-typedef-redefinition"
  else
    TEST_CFLAGS=""
  fi
  echo $compiler_version
  _runtest "$i" ""
  _runtest "$i" "-DMP_8BIT"
  _runtest "$i" "-DMP_16BIT"
  _runtest "$i" "-DMP_32BIT"
  _runtest "$i -m32" ""
  _runtest "$i -m32" "-DMP_8BIT"
  _runtest "$i -m32" "-DMP_16BIT"
  _runtest "$i -m32" "-DMP_32BIT"
  if [ "$i" != "clang" ]
  then
    _runtest "$i -mx32" ""
    _runtest "$i -mx32" "-DMP_8BIT"
    _runtest "$i -mx32" "-DMP_16BIT"
    _runtest "$i -mx32" "-DMP_32BIT"
  fi
done

if [ "$ret" == "0" ]
then
  echo "Tests successful"
else
  echo "$ret tests timed out"
fi

exit $ret
