#!/usr/bin/env bash

TARGETDIR=localResults
BASEDIR=baseResults
EXE=../build/install/bin/glslangValidator
HASERROR=0
mkdir -p localResults

#
# configuration file tests
#
echo running configuration file test
$EXE -c > $TARGETDIR/test.conf
diff -b $BASEDIR/test.conf $TARGETDIR/test.conf || HASERROR=1
$EXE -i -l $TARGETDIR/test.conf specExamples.vert > $TARGETDIR/specExamples.vert.out
diff -b $BASEDIR/specExamples.vert.out $TARGETDIR || HASERROR=1
$EXE -l 100Limits.vert 100.conf >  $TARGETDIR/100LimitsConf.vert.out
diff -b $BASEDIR/100LimitsConf.vert.out $TARGETDIR/100LimitsConf.vert.out || HASERROR=1

#
# isolated compilation tests
#
while read t; do
    echo Running $t...
    b=`basename $t`
    $EXE -i -l $t > $TARGETDIR/$b.out
    diff -b $BASEDIR/$b.out $TARGETDIR/$b.out || HASERROR=1
done < testlist

if [ -a localtestlist ]
  then
    while read t; do
        echo Running $t...
        b=`basename $t`
        $EXE -i -l $t > $TARGETDIR/$b.out
        diff -b $BASEDIR/$b.out $TARGETDIR/$b.out || HASERROR=1
    done < localtestlist
fi

#
# SPIR-V code generation tests
#
while read t; do
  case $t in
    \#*)
      # Skip comment lines in the test list file.
      ;;
    *)
      echo Running SPIR-V $t...
      b=`basename $t`
      $EXE -H $t > $TARGETDIR/$b.out
      diff -b $BASEDIR/$b.out $TARGETDIR/$b.out || HASERROR=1
      ;;
  esac
done < test-spirv-list
rm -f comp.spv frag.spv geom.spv tesc.spv tese.spv vert.spv

#
# HLSL -> SPIR-V code generation tests
#
while read t; do
  case $t in
    \#*)
      # Skip comment lines in the test list file.
      ;;
    *)
      echo Running HLSL-to-SPIR-V $t...
      b=`basename $t`
      $EXE -D -e PixelShaderFunction -H -i $t > $TARGETDIR/$b.out
      diff -b $BASEDIR/$b.out $TARGETDIR/$b.out || HASERROR=1
      ;;
  esac
done < test-hlsl-spirv-list
rm -f comp.spv frag.spv geom.spv tesc.spv tese.spv vert.spv

#
# Preprocessor tests
#
while read t; do
    echo Running Preprocessor $t...
    b=`basename $t`
    $EXE -E $t > $TARGETDIR/$b.out 2> $TARGETDIR/$b.err
    diff -b $BASEDIR/$b.out $TARGETDIR/$b.out || HASERROR=1
    diff -b $BASEDIR/$b.err $TARGETDIR/$b.err || HASERROR=1
done < test-preprocessor-list

#
# grouped shaders for bulk (faster) tests
#
function runBulkTest {
    echo Running $*...
    $EXE -i -l -t $* > $TARGETDIR/$1.out
    diff -b $BASEDIR/$1.out $TARGETDIR/$1.out || HASERROR=1
}

runBulkTest mains1.frag mains2.frag noMain1.geom noMain2.geom
runBulkTest noMain.vert mains.frag
runBulkTest link1.frag link2.frag link3.frag
runBulkTest es-link1.frag es-link2.frag
runBulkTest recurse1.vert recurse1.frag recurse2.frag
runBulkTest 300link.frag
runBulkTest 300link2.frag
runBulkTest 300link3.frag
runBulkTest empty.frag empty2.frag empty3.frag
runBulkTest 150.tesc 150.tese 400.tesc 400.tese 410.tesc 420.tesc 420.tese
runBulkTest max_vertices_0.geom

#
# reflection tests
#
echo Running reflection...
$EXE -l -q reflection.vert > $TARGETDIR/reflection.vert.out
diff -b $BASEDIR/reflection.vert.out $TARGETDIR/reflection.vert.out || HASERROR=1

#
# multi-threaded test
#
echo Comparing single thread to multithread for all tests in current directory...
$EXE -i *.vert *.geom *.frag *.tes* *.comp > singleThread.out
$EXE -i *.vert *.geom *.frag *.tes* *.comp -t > multiThread.out
diff singleThread.out multiThread.out || HASERROR=1

if [ $HASERROR -eq 0 ]
then
    echo Tests Succeeded.
else
    echo Tests Failed.
fi

exit $HASERROR
