#!/bin/bash # TODO: rewrite in OCaml or something better than sh shopt -s nullglob # script de test compilo=../heptc coption= # compilateurs utilises pour les tests de gen. de code CAMLC=ocamlc JAVAC=javac LUSTREC=lustre CC="gcc -std=c99" # par defaut : pas de test de generation de code java=0 c=0 score=0 max=0 verbose=0 for d in good bad; do rm -f -r $d/*.obc $d/*_java $d/*_c $d/*.mci $d/*.mls $d/*.epci done compile () { args_comp="" assert_node=$(eval grep CHECK $1 | awk '{ print $3 }') if [ -n "$assert_node" ]; then args_comp="-assert $assert_node" fi if [ $verbose != 0 ]; then args_comp="$args_comp -v" fi if grep "node main()" $1 >/dev/null; then args_comp="$args_comp -s main" fi if [ $verbose != 0 ]; then echo "" echo "****************************************" echo Compile -i $coption $args_comp $1 $compilo $coption -I good $args_comp $1 >$1.log 2>&1 else if [ $2 == 1 ]; then $compilo $coption -I good $args_comp $1 >/dev/null 2>&1 else $compilo $coption -I good $args_comp $1 2>&1 fi fi failed=$? return $failed } launch_check () { score=0 max=0 echo "Test" # les mauvais echo -n "bad " for f in bad/*.ept ; do if [ $verbose = 0 ]; then echo -n "." fi max=`expr $max + 1`; if compile $f 1; then echo echo "ERROR on "$f" (should fail to compile)"; else score=`expr $score + 1`; fi done echo echo -n "bons" for f in good/*.ept; do echec=0 if [ $verbose = 0 ]; then echo -n "." fi max=`expr $max + 1`; base_f=`basename $f .ept` if compile $f 0; then echec=0 else echec=1 fi # Compil. minils ? if [[ ($echec == 0) && ($minils == 1) ]]; then if $MLC ${base_f}.mls > /dev/null 2>&1; then echec=0 else echec=2 fi fi # Compil. java ? if [[ ($echec == 0) && ($java == 1) ]]; then pushd "${base_f}" > /dev/null for java_file in *.java ; do if $JAVAC -warn:-unused -sourcepath .:..:../t1 ${java_file} > /dev/null then echec=0 else echec=3 fi done popd > /dev/null fi # Compil. c ? if [[ ($echec == 0) && ($c == 1) ]]; then pushd ${base_f}_c >/dev/null for cf in *.c; do if $CC -c $cf >/dev/null 2>&1; then echec=0 else echec=5 fi done if [ $echec != 5 ]; then if egrep "(node main\(\))|(CHECK)" ../${base_f}.ept >/dev/null 2>&1 then if $CC *.o -o ${base_f} 2>&1; then echec=0 else echec=6 fi if [ $echec != 6 ]; then step_count=`grep CHECK ../$base_f.ept | awk '{ print $4 }'` if [ -n "$step_count" ]; then if ./${base_f} $step_count >/dev/null 2>&1; then echec=0 else echec=7 fi fi fi fi fi popd >/dev/null fi if [[ $echec == 0 ]]; then score=`expr $score + 1`; else echo echo "ERROR on \"$f\" (should compile)"; case $echec in 1 ) echo "Compilation failed.";; 3 ) echo "Java compilation failed.";; 5 ) echo "C compilation failed.";; 6 ) echo "Link failure.";; 7 ) echo "Run-time assertion failure.";; esac fi done echo percent=`expr 100 \* $score / $max`; echo -n "Test: $score/$max : $percent%"; } activate_minils () { minils=1 } activate_java () { java=1 coption="$coption -target java" } activate_c () { c=1 coption="$coption -target c" } activate_all () { activate_java activate_c } # -1, -2, -3, -v1, -v2, -v3 kept for backward compatibility # (to be suppressed) while [ $# -gt 0 ]; do case $1 in "-v" ) verbose=1; shift;; "-all" ) activate_all shift;; "-java" ) activate_java shift;; "-c" ) activate_c shift;; "-mls" ) activate_minils shift;; "-h" ) echo "usage : $0 " echo "options : " echo "-java : test of code generation (java code)" echo "-c : test of code generation (c code)" echo "-all : test all" echo "-v : verbose" exit 0;; * ) compilo=$1 shift coption="$coption $*" break esac done launch_check echo