#!/bin/sh -a

# limit core dump size
ulimit -c 0

# set the path
PATH=/usr/bin:/bin
jasmin=/w/class.01/cs/cs132/cs132ta/risc/jasmin-1.06/bin/jasmin

tmpOutFile=$0.$$

numTests=0
score=0

# do an individual test
#
# return 0 on failure
#        1 on success
#        2 on incomplete test case files
#
doTest ()
{
  testName=$1
  src3File=${testName}.src3
  jasminFile=${testName}.j
  inputFile=${testName}.input
  outputFile=${testName}.output

  if [ ! -f $src3File ]; then
    return 2
  fi

  if [ ! -f $outputFile ]; then
    return 2
  fi

  # get src3 compile to generate jasmin code
  ./parse < $src3File > $jasminFile 2>/dev/null

  # echo "doing jasmin"

  # compile into java class
  output=`$jasmin $jasminFile` 2> /dev/null
  if [ $? -ne 0 ]; then
    return 0
  fi

  # find the output class name
  classFile=`echo $output | cut -d: -f2 | cut -d. -f1`

  # echo "run java"

  # run java code
  if [ -f $inputFile ]; then
    java -cp . $classFile < $inputFile > $tmpOutFile 2> /dev/null
  else
    java -cp . $classFile > $tmpOutFile 2> /dev/null
  fi

  # echo "diff output"

  # check if the output match
  diff $tmpOutFile $outputFile
  diffResult=$?

  if [ $diffResult -ne 0 ]; then
    return 0
  fi

  return 1
}

keepScore ()
{
  testName=$1
  doTest $testName
  result=$?

  case $result in
  0)  echo $testName failed
      numTests=`expr $numTests + 1`
  ;;
  1)  echo $testName successed
      numTests=`expr $numTests + 1`
      score=`expr $score + 1`
  ;;
  2)  echo ignoring $testName
  ;;
  esac
}

report ()
{
  if [ $numTests -gt 0 ]; then
    echo "score = $score/$numTests = " `expr $score '*' 100 / $numTests`
  fi
}

usage ()
{
  cat << EOM
This script expects .src3 files and .output files.
Usage:
$0 -a			# test all the src3 programs in the directory
$0 <filename> ...	# test specific src3 programs (w/o .src3 extension)
EOM
}

# the main
#
if [ $# -eq 0 ]; then
  usage
  exit 0
fi

# check if the executable exists
if [ ! -x ./parse ]; then
  echo "Please name your executable as ./parse"
fi

if [ "$1" = "-a" ]; then
  echo "searching current directory for src3 programs"
  for file in *.src3; do
    file=`echo $file | cut -d. -f1`
    keepScore $file
  done
else
  echo "doing the tests given"
  testName=
  while [ "$#" -gt 0 ]; do
    keepScore `echo $1 | cut -d. -f1`
    shift
  done
fi

report
rm -f $tmpOutFile
