#! /bin/sh

if [ "$1" != "v" ] && [ "$1" != "p" ]
  then
    echo ""
    echo "tst - Run functional verification or performance testcases for awk2c"
    echo "USAGE:       tst v|p [testcases]"
    echo "Parameters:  v = Functional verification tests"
    echo "             p = Performance tests"
    echo "Options:     testcases = Particular testcase filenames to run"
    echo "                         (have to be in one directory)"
    echo ""
    exit
fi


if [ -z "$2" ]
  then
    if [ "$1" = "v" ]
      then  TESTCASES=./test/fvt/test.*.awk
      else  TESTCASES=./test/performance/perftest.*.awk
    fi
  else
    for ttc in $2
      do
        if [ ! -e "${ttc}" ]
          then
            echo "ERROR: Testcase "${ttc}" does not exist"
            exit 2
        fi
      done
    TESTCASES=$(ls $@ 2>/dev/null)
fi

TESTDIR=$(echo ${TESTCASES} | awk '
BEGIN  {
  i = 0;
}
{
  if ( i != 99 )  {
    nn=split($1,fnn,"/");
    if ( nn == 1 )
      print "./";
    else  {
      for (i=1;i<=nn-1;i++)
        printf(fnn[i] "/");
      printf("\n");
    } 
  }
  i = 99;
}')
   

# Compile 'awk2c' translator
echo ""
echo "Building the 'awk2c' translator..."
make awk2c >./test/awk2c.build.log 2>&1
if [ "$?" != "0" ]
  then
    echo "ERROR: awk2c failed to build"
    echo "(log in ./test/awk2c.build.log)"
    exit 1
  else
    rm -f ./test/awk2c.build.log
fi
echo "awk2c built successfully"


if [ "$1" = "v" ]
then

echo ""
echo "=============================================================================="
echo "awk2c - Functional verification tests"
echo "=============================================================================="
echo ""
# Convert each testcase to C and build it, and compare
# it's output to GAWK interpreter's output 
for tc in $(ls ${TESTCASES})
  do
    tcname=$(echo ${tc} | awk '{gsub(/\.awk$/,"");print}')

    awk2c -f ${tc} | indent -npcs > ./awk2c_cprogram.c
    cp -f ./awk2c_cprogram.c ${tcname}.c

    make driver >${tcname}.c.build.log 2>&1

    if [ "$?" != "0" ]
      then
        echo "ERROR: Testcase "${tcname}".c failed to build..."
        echo "(log in "${tcname}".c.build.log)"
      else
        rm -f ${tcname}.c.build.log
        awk -f ${tc} ${tcname}.in > ${tcname}.awk_out
        driver ${tcname}.in > ${tcname}.c_out

        diff ${tcname}.awk_out ${tcname}.c_out > ${tcname}.out.diff 2>&1
        if [ "$?" != "0" ]
          then 
            echo "Testcase "${tc}": Verification FAILED"
            echo "  (output diff in "${tcname}".out.diff)"
          else
            echo "Testcase "${tc}": Verification passed"
            rm -f ${tcname}.out.diff
        fi
    fi
  done


else

echo ""
echo "=============================================================================="
echo "awk2c - Performance tests"
echo "=============================================================================="
echo ""
echo ""

echo 1 | awk '
{ 
  printf("%-17s %-12s %-15s %-15s\n", "Testcase", "Compiled", "Interpreted",
         "Relative Speed");
  printf("-------------------------------------------------------------\n");
}'
 
for tc in $(ls ${TESTCASES}) 
  do
    
    tcname=$(echo ${tc} | awk '{gsub(/\.awk$/,"");print}')

    awk2c -f ${tc} | indent -npcs > ./awk2c_cprogram.c
    cp -f ./awk2c_cprogram.c ${tcname}.c

    make driver >${tcname}.c.build.log 2>&1

    if [ "$?" != "0" ]
      then
        echo "ERROR: Testcase "${tcname}".c failed to build..."
        echo "(log in "${tcname}".c.build.log)"
      else
        rm -f ${tcname}.c.build.log
        # Run each one once before to get into filesystem cache
        awk -f ${tc} ${tcname}.in > /dev/null
        time awk -f ${tc} ${tcname}.in > /dev/null 2> ${tcname}.awk_perf
        driver ${tcname}.in > /dev/null
        time driver ${tcname}.in > /dev/null 2> ${tcname}.c_perf
        
        (
         echo ${tcname}.c_perf; cat ${tcname}.c_perf;
         echo "__________";
         echo ${tcname}.awk_perf; cat ${tcname}.awk_perf
        ) | awk '

BEGIN  {
  READING_CPERF = 1;
}

$1 == "__________"  {
  READING_CPERF = 0;
}

READING_CPERF  {
  if ( $1 ~ /\.c_perf$/ )  {
    nn=split($1,fnm,"/");
    gsub(/\.c_perf$/,"",fnm[nn]);
    tc = fnm[nn] ".awk";
  }
  if ( $3 ~ /elapsed$/ )  {
    gsub(/elapsed$/,"",$3);
    perf_c =$3;
  }
}

!READING_CPERF  {
  if ( $3 ~ /elapsed$/ )  {
    gsub(/elapsed$/,"",$3);
    perf_awk=$3;
  }
}

END  {
  split(perf_c, gg, ":");
  t1min = gg[1];
  t1sec = gg[2];
  split(perf_awk, gg, ":");
  t2min = gg[1];
  t2sec = gg[2];
  printf("%-17s %-12s %-15s %-10.2f\n", tc, perf_c, perf_awk,
         (t2min*60 + t2sec)/(t1min*60 + t1sec));
}
'
        
        
    fi
  done

fi


rm -f ./awk2c_cprogram.*
echo ""
