#!/bin/bash

# $Id$

shopt -s nullglob

# script de test

compilo=../compiler/heptc.byte
coption=

# compilateurs utilises pour les tests de gen. de code

CAMLC=ocamlc
JAVAC=javac
LUSTREC=lustre
CC=gcc
MLC=mlc
VHDLC=ghdl

# par defaut : pas de test de generation de code

caml=0
java=0
lustre=0
c=0
cold=0
minils=0
vhdl=0

score=0
max=0
verbose=0

for d in good bad; do
  rm -f -r $d/*.obc $d/*_java $d/*_c $d/*_c-old\
           $d/*.mci $d/*.mls $d/*.epci\
           $d/*.lus $d/*.ml $d/*.cmi $d/*.cmo;
done

#rm -f inline/good/*.ml inline/good/*.cmi inline/good/*.cmo \
#      inline/good/*.dcc inline/good/*.lci inline/good/a.out
#../util/split sujet1/bad/bad.split
#../util/split sujet1/good/good.split

compile () {
if [[ $verbose != 0 ]]; then
  echo Compile -i $coption $1 $2
  $compilo $coption -I good $1 $2;
else
  $compilo $coption -I good $1 $2 > /dev/null 2>&1;
fi;
}

launch_check () {

score=0
max=0

echo "Test"

# les mauvais
echo -n "mauvais "
for f in bad/*.ept ; do
    echo -n ".";
    max=`expr $max + 1`;
    if compile $f; then
        echo
        echo "ECHEC sur "$f" (devrait echouer)";
    else
        score=`expr $score + 1`;
    fi
done
echo

echo -n "bons"
for f in good/*.ept; do
    echec=0
    echo -n ".";
    max=`expr $max + 1`;
    base_f=`basename $f .ept`
    if compile $f; then
      echec=0
    else
      echec=1
    fi
    # Compil. minils ?
    if [[ ($echec == 0) && ($minils == 1) ]]; then
      if $MLC good/${base_f}.mls > /dev/null 2>&1; then
        echec=0
      else
        echec=2
      fi
    fi
    # Compil. caml ?
    if [[ ($echec == 0) && ($caml == 1) ]]; then
      if $CAMLC -i good/${base_f}.ml > /dev/null; then
        echec=0
      else
        echec=2
      fi
    fi
    # Compil. java ?
    if [[ ($echec == 0) && ($java == 1) ]]; then
      pushd "good/${base_f}" > /dev/null
      for java_file in *.java ; do
        if $JAVAC -warn:-unused -sourcepath .:..:../t1 ${java_file} > /dev/null; then
          echec=${echec}
        else
          echec=3
        fi
      done
      popd > /dev/null
    fi
    # Compil. lustre ?
    if [[ ($echec == 0) && ($lustre == 1) ]]; then
      if $LUSTREC good/${base_f}.lus > /dev/null; then
        echec=0
      else
        echec=4
      fi
    fi
    # Compil. c ?
    if [[ ($echec == 0) && ($c == 1) ]]; then
      pushd "good/${base_f}_c" > /dev/null
      for c_file in *.c ; do
        if $CC -I ../t1_c -c ${c_file} > /dev/null 2>&1; then
          echec=${echec}
        else
          echec=5
        fi
      done
      popd > /dev/null
    fi
    # Compil. c-old ?
    if [[ ($echec == 0) && ($cold == 1) ]]; then
      pushd "good/${base_f}_c-old" > /dev/null
      for c_file in *.c ; do
        if $CC -I ../t1_c-ng -c ${c_file} > /dev/null 2>&1; then
          echec=${echec}
        else
          echec=6
        fi
      done
      popd > /dev/null
    fi
    if [[ ($echec == 0) && ($vhdl == 1) ]]; then
      pushd "good/${base_f}_vhdl" > /dev/null
      for vhdl_file in *.vhd; do
        if $VHDLC -a ${vhdl_file} && $VHDLC -e ${vhdl_file} > /dev/null 2>&1
        then
          echec=${echec}
        else
          echec=7
        fi
      done
    fi

    if [[ $echec == 0 ]]; then
        score=`expr $score + 1`;
    else
        echo
        echo "ECHEC sur "$f" (devrait reussir)";
        case $echec in
            1 )
                echo "Echec de la compil. vers code objet";;
            2 )
                echo "Echec de la compil. caml";;
            3 )
                echo "Echec de la compil. java";;
            4 )
                echo "Echec de la compil. lustre";;
            5 )
                echo "Echec de la compil. c";;
            6 )
                echo "Echec de la compil. c-ng";;
            7 )
                echo "Echec de la compil. VHDL";;
        esac
    fi
done
echo

percent=`expr 100 \* $score / $max`;

echo -n "Test: $score/$max : $percent%";

}

activate_minils () {
    minils=1
}

activate_caml () {
    caml=1
    coption="$coption -target caml"
}

activate_java () {
    java=1
    coption="$coption -target java"
}

activate_lustre () {
    lustre=1
    coption="$coption -target lustre"
}

activate_c () {
    c=1
    coption="$coption -target c"
}

activate_cold () {
    cng=1
    coption="$coption -target c-old"
}

activate_vhdl () {
    vhdl=1
    coption="$coption -target vhdl"
}

activate_tomato () {
    coption="$coption -tomato"
}

activate_cse () {
    coption="$coption -cse"
}

activate_inter () {
    coption="$coption -inter"
}

activate_boolean () {
    coption="$coption -bool"
}

activate_deadcode () {
    coption="$coption -deadcode"
}

activate_all () {
    activate_caml
    activate_java
    activate_lustre
    activate_c
    activate_cold
    activate_vhdl
    activate_boolean
    activate_deadcode
    activate_cse
    activate_inter
    activate_tomato
}

# -1, -2, -3, -v1, -v2, -v3 kept for backward compatibility
# (to be suppressed)
while [ $# -gt 0 ]; do
    case $1 in
  "-1" )
      shift;;
  "-2" )
      activate_minils
      shift;;
  "-3" )
      activate_minils
      shift;;
  "-v" )
      verbose=1;
      shift;;
  "-all" )
      activate_all
      shift;;
  "-caml" )
      activate_caml
      shift;;
  "-java" )
      activate_java
      shift;;
  "-lustre" )
      activate_lustre
      shift;;
  "-tomato" )
      activate_tomato
      shift;;
  "-cse" )
      activate_cse
      shift;;
  "-inter" )
      activate_inter
      shift;;
  "-c" )
      activate_c
      shift;;
  "-c-old" )
      activate_cold
      shift;;
  "-vhdl" )
      activate_vhdl
      shift;;
  "-mls" )
      activate_minils
      shift;;
  "-bool" )
      activate_boolean
      shift;;
  "-deadcode" )
      activate_deadcode
      shift;;
  "-v1" )
      verbose=1;
      shift;;
  "-v2" )
      verbose=1;
      activate_minils
      shift;;
  "-v3" )
      verbose=1;
      shift;;
  "-h" )
      echo "usage : $0 <options> <compilo>"
      echo "options : "
      echo "-caml     : test of code generation (caml code)"
      echo "-java     : test of code generation (java code)"
      echo "-lustre   : test of code generation (lustre code)"
      echo "-c        : test of code generation (c code)"
      echo "-c-old     : test of code generation (c code, old backend)"
      echo "-vhdl     : test of code generation (vhdl)"
      echo "-bool     : test of boolean translation"
      echo "-deadcode : test of deadcode removal"
      echo "-inter    : test of intermediate equations removal"
      echo "-tomato   : test of automata minimization"
      echo "-cse      : test of common sub-expression elimination"
      echo "-all      : test all"
      echo "-v        : verbose"
      exit 0;;
  * )
      compilo=$1
      shift
      coption="$coption $*"
      break
    esac
done
launch_check
echo