#! /bin/sh

# This is a script for the CGAL test suite. Such a script must obey
# the following rules:
#
# - the name of the script is cgal_test
# - for every target two one line messages are written to the file 'error.txt'
#     the first one indicates if the compilation was successful
#     the second one indicates if the execution was successful
#   if one of the two was not successful, the line should start with 'ERROR:'
# - running the script should not require any user interaction
# - the script should clean up object files and executables

ERRORFILE=error.txt
DO_RUN=y
if [ -z "${MAKE_CMD}" ]; then
    MAKE_CMD=make
fi

#---------------------------------------------------------------------#
#                    compile_and_run <target>
#---------------------------------------------------------------------#


#---------------------------------------------------------------------#
#                    configure
#---------------------------------------------------------------------#

configure()
{
  echo "Configuring... "

  rm CMakeCache.txt
  if [ -f "$INIT_FILE" ]
  then
      if eval 'cmake --no-warn-unused-cli ${INIT_FILE:+"-C${INIT_FILE}"} -DRUNNING_CGAL_AUTO_TEST=TRUE  \
                                       -DCGAL_DIR="$CGAL_DIR" \
                                       -DCGAL_CXX_FLAGS:STRING="$CGAL_CXX_FLAGS $TESTSUITE_CXXFLAGS" \
                                       -DCGAL_EXE_LINKER_FLAGS="$CGAL_EXE_LINKER_FLAGS $TESTSUITE_LDFLAGS" \
                                       .' ; then
          echo "   successful configuration" >> $ERRORFILE
      else
          echo "   ERROR:    configuration" >> $ERRORFILE
      fi
  else
      if eval 'cmake --no-warn-unused-cli ${INIT_FILE:+"-C${INIT_FILE}"} -DRUNNING_CGAL_AUTO_TEST=TRUE  \
                                         -DCGAL_DIR="$CGAL_DIR" \
                                         -DCGAL_CXX_FLAGS:STRING="$TESTSUITE_CXXFLAGS" \
                                         -DCGAL_EXE_LINKER_FLAGS="$TESTSUITE_LDFLAGS" \
                                         -DCMAKE_BUILD_TYPE=NOTFOUND \
                                         .' ; then

          echo "   successful configuration" >> $ERRORFILE
      else
          echo "   ERROR:    configuration" >> $ERRORFILE
      fi
  fi
}

compile()
{
  EXTRA_FLAGS="-DCGAL_ARR_TEST_POINT_LOCATION=$2 -DCGAL_ARR_TEST_TRAITS=$3 \
    $EXTRA_FLAGS "
  export EXTRA_FLAGS

  echo "Compiling $1 with point location $2 and traits $3... "
  if [ "${TEST_WITH_CMAKE}" != "FALSE" ]; then
      export TESTSUITE_CXXFLAGS="-DCGAL_ARR_TEST_POINT_LOCATION=$2 -DCGAL_ARR_TEST_TRAITS=$3 "
      configure
      eval '${MAKE_CMD} VERBOSE=1 -f Makefile  \
            $1'
  else
      eval '${MAKE_CMD} CGAL_MAKEFILE=$CGAL_MAKEFILE \
        TESTSUITE_CXXFLAGS="$TESTSUITE_CXXFLAGS" \
        TESTSUITE_LDFLAGS="$TESTSUITE_LDFLAGS" $1'
  fi
}

compile_and_run()
{
  echo "---$1---"

  # running general test
  if compile $1 $2 $3 ; then
    echo "   compilation of $1 succeeded" >> $ERRORFILE
    SUBCURVES=""
    run $1 $2 $3 $4
    SUBCURVES="subcurves"
    run $1 $2 $3 $4
  else
    echo "   ERROR: compilation of $1 failed" >> $ERRORFILE
  fi

  eval "2>&1 ${MAKE_CMD} CGAL_MAKEFILE=$CGAL_MAKEFILE clean > /dev/null "
}

clean_tests()
{
    if [ "${TEST_WITH_CMAKE}" != "FALSE" ]; then
    #
    # The clean target generated by CMake under cygwin
    # always fails for some reason
    #
	if ! ( uname | grep -q "CYGWIN" ) ; then
	    "${MAKE_CMD}" -f Makefile clean
	fi
    else
	eval "${MAKE_CMD} clean > /dev/null 2>&1"
    fi
}

compile_and_run_sweep()
{
  echo "---$1---"

  # running general test
  if compile $1 $2 $3 ; then
    echo "   compilation of $1 succeeded" >> $ERRORFILE
    run $1 $2 $3 $4
  else
    echo "   ERROR: compilation of $1 failed" >> $ERRORFILE
  fi

  clean_tests
}


run()
{
  datafiles="$4/*"

  for DATAFILE in ${datafiles}
  do
    if [ -d $DATAFILE ]; then
        echo  "$DATEFILE is a directory"
        continue
    fi

    if [ -f $1 ] ; then
        DATANAME=`basename $DATAFILE`
	if [ $SUBCURVES="subcurves" ] ; then
	    OUTPUTFILE=ProgramOutput.$3.$1.$DATANAME.$SUBCURVES.$PLATFORM.$2
        else
	    OUTPUTFILE=ProgramOutput.$3.$1.$DATANAME.$PLATFORM.$2
	fi
	rm -f $OUTPUTFILE
	COMMAND="./$1 $DATAFILE $SUBCURVES"
	echo "Executing $1 $DATANAME $SUBCURVES ... "
	echo
	if eval $COMMAND > $OUTPUTFILE 2>&1 ; then
	echo "   execution of $1 $DATAFILE $SUBCURVES succeeded" >> $ERRORFILE
	else
	echo "   ERROR: execution of $1 $DATAFILE $SUBCURVES failed" >> $ERRORFILE
	fi
    else
	echo "   ERROR: could not execute $1 $DATAFILE $SUBCURVES" >> $ERRORFILE
    fi
  done
}

run_io()
{
  datafiles="$4/*"

  if [ $3 -eq $CGAL_SEGMENT_TRAITS ] ; then
    iofiles="DATA/IO/segments/exact_io/"
    SUFFIO="exact_io"
  elif [ $3 -eq $CGAL_SEGMENT_LEDA_TRAITS ] ; then
    iofiles="DATA/IO/segments/leda_io/"
    SUFFIO="leda_io"
  elif [ $3 -eq $CGAL_POLYLINE_TRAITS ]; then
    iofiles="DATA/IO/polylines/exact_io/"
    SUFFIO="exact_io"
  fi

  for DATAFILE in ${datafiles}
  do

    if [ -d $DATAFILE ]; then
        echo  "$DATEFILE is a directory"
        continue
    fi

    IOFILE="${iofiles}`basename ${DATAFILE}`_${SUFFIO}"
    echo $IOFILE

    if [ -f $1 ] ; then
        rm -f arr.txt

        DATANAME=`basename $DATAFILE`
        IONAME=`basename $IOFILE`
        OUTPUTFILE=ProgramOutput.$3.$1.$DATANAME.$PLATFORM.$2

	rm -f $OUTPUTFILE
	COMMAND="./$1 $IOFILE $DATAFILE"
	echo "Executing $1 $IONAME $DATANAME  ... "
	echo
	if eval $COMMAND > $OUTPUTFILE 2>&1 ; then
	echo "   execution of $1 $DATAFILE succeeded" >> $ERRORFILE
	else
	echo "   ERROR: execution of $1 $DATAFILE  failed" >> $ERRORFILE
	fi
    else
	echo "   ERROR: could not execute $1 $DATAFILE " >> $ERRORFILE
    fi
  done

}


#---------------------------------------------------------------------#
#                    remove the previous error file
#---------------------------------------------------------------------#

rm -f $ERRORFILE
touch $ERRORFILE

#---------------------------------------------------------------------#
#                    compile and run the tests
#---------------------------------------------------------------------#

if [ $# -ne 0 ] ; then
    case $1 in
	-cmake) TEST_WITH_CMAKE="TRUE" ;;
	*)TEST_WITH_CMAKE="FALSE" ;;
    esac
else
    TEST_WITH_CMAKE="FALSE"
fi

echo "Run all tests."

if [ "${TEST_WITH_CMAKE}" != "FALSE" ]; then
    configure
fi

CGAL_SEGMENT_TRAITS=1
CGAL_SEGMENT_LEDA_TRAITS=2
CGAL_POLYLINE_TRAITS=11
CGAL_CONIC_TRAITS=21

TRAP=1  # Trapezoidal decomposition
NAIVE=2
WALK=3

#run the test for new sweep
(compile_and_run_sweep test_sweep $NAIVE $CGAL_SEGMENT_TRAITS "DATA/segments_tight")
(compile_and_run_sweep test_sweep_conic $NAIVE $CGAL_CONIC_TRAITS "DATA/conics")
(compile_and_run_sweep test_sweep $NAIVE $CGAL_POLYLINE_TRAITS "DATA/polylines
