Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
#!/bin/bash
shopt -s nullglob
# script de test pour le projet de compilation
option=$1
compilo=$2
score=0
max=0
verbose=0
echo "Test de $2"
echo
# rm -f syntax/bad/testfile-*.arr
# rm -f syntax/good/testfile-*.arr
# rm -f typing/bad/testfile-*.arr
# rm -f typing/good/testfile-*.arr
# ocamllex split.mll
# ocaml split.ml syntax/bad/bad.split
# ocaml split.ml syntax/good/good.split
# ocaml split.ml typing/bad/bad.split
# ocaml split.ml typing/good/good.split
PYRET="pyret -y -q -e none"
# tous les tests passent avec Pyret
test_pyret() {
for f in typing/bad/*.arr; do
if $PYRET $f > /dev/null 2>&1 ; then
echo "succès de pyret sur $f"; exit 1
fi
done
for f in typing/good/*.arr; do
$PYRET $f > /dev/null ||
(echo "echec de pyret sur $f"; exit 1)
done
for f in exec/*.arr; do
$PYRET $f > /dev/null ||
(echo "echec de pyret sur $f"; exit 1)
done
for f in exec-fail/*.arr; do
if $PYRET $f > /dev/null 2>&1 ; then
echo "succès de pyret sur $f"; exit 1
fi
done
}
compile () {
if [[ $verbose != 0 ]]; then
echo Compile $1 $2
$compilo $1 $2;
else
$compilo $1 $2 > /dev/null 2>&1;
fi;
}
##############################################################################
# partie 1 : tests d'analyse syntaxique
##############################################################################
partie1 () {
score=0
max=0
echo "Partie 1"
# les mauvais
echo -n "mauvais "
for f in syntax/bad/*.arr; do
echo -n ".";
max=`expr $max + 1`;
compile --parse-only $f;
case $? in
"0")
echo
echo "ECHEC sur "$f" (devrait échouer)";;
"1") score=`expr $score + 1`;;
*)
echo
echo "ECHEC sur "$f" (pour une mauvaise raison)";;
esac
done
echo
# les bons
echo -n "bons "
for f in syntax/good/*.arr typing/bad/*.arr typing/good/*.arr exec/*.arr exec-fail/*.arr; do
echo -n ".";
max=`expr $max + 1`;
compile --parse-only $f;
case $? in
"1")
echo
echo "ECHEC sur "$f" (devrait reussir)";;
"0") score=`expr $score + 1`;;
*)
echo
echo "ECHEC sur "$f" (pour une mauvaise raison)";;
esac
done
echo
percent=`expr 100 \* $score / $max`;
echo -n "Parsing: $score/$max : $percent%"; }
##############################################################################
# partie 2 : tests d'analyse sémantique
##############################################################################
partie2 () {
echo
echo "Partie 2"
score=0
max=0
# les mauvais
echo -n "mauvais "
for f in typing/bad/*.arr; do
echo -n ".";
max=`expr $max + 1`;
compile --type-only $f;
case $? in
"0")
echo
echo "ECHEC sur "$f" (devrait échouer)";;
"1") score=`expr $score + 1`;;
*)
echo
echo "ECHEC sur "$f" (pour une mauvaise raison)";;
esac
done
echo
# les bons
echo -n "bons "
for f in typing/good/*.arr exec/*.arr exec-fail/*.arr; do
echo -n ".";
max=`expr $max + 1`;
compile --type-only $f;
case $? in
"1")
echo
echo "ECHEC sur "$f" (devrait reussir)";;
"0") score=`expr $score + 1`;;
*)
echo
echo "ECHEC sur "$f" (pour une mauvaise raison)";;
esac
done
echo
percent=`expr 100 \* $score / $max`;
echo "Typage: $score/$max : $percent%";
}
##############################################################################
# partie 3 : tests d'exécution
##############################################################################
partie3 () {
score_comp=0
score_out=0
score_test=0
max=0
echo
echo "Partie 3"
echo "Execution normale"
echo "-----------------"
timeout="why3-cpulimit 30 0 -h"
for f in exec/*.arr; do
rm -f *.s exec/*.s
echo -n "."
asm=exec/`basename $f .arr`.s
rm -f $asm
expected=exec/`basename $f .arr`.out
max=`expr $max + 1`;
if compile $f; then
rm -f out
score_comp=`expr $score_comp + 1`;
if gcc -no-pie $asm && ./a.out > out; then
score_out=`expr $score_out + 1`;
if cmp --quiet out $expected; then
score_test=`expr $score_test + 1`;
else
echo
echo "ECHEC : mauvaise sortie pour $f"
fi
else
echo
echo "ECHEC du code produit pour $f"
fi
else
echo
echo "ECHEC de la compilation sur $f (devrait réussir)"
fi
done
echo
echo "Execution conduisant à un échec"
echo "-------------------------------"
for f in exec-fail/*.arr; do
echo -n "."
asm=exec-fail/`basename $f .arr`.s
rm -f $asm
max=`expr $max + 1`;
if compile $f && gcc -no-pie $asm; then
score_comp=`expr $score_comp + 1`;
if ./a.out > out; then
echo
echo "ECHEC : devrait échouer sur $f"
else
score_test=`expr $score_test + 1`;
score_out=`expr $score_out + 1`;
fi
else
echo
echo "ECHEC de la compilation sur $f (devrait réussir)"
fi
done
echo
percent=`expr 100 \* $score / $max`;
echo "Partie 3:";
percent=`expr 100 \* $score_comp / $max`;
echo "Compilation : $score_comp/$max : $percent%";
percent=`expr 100 \* $score_out / $max`;
echo "Code produit : $score_out/$max : $percent%";
percent=`expr 100 \* $score_test / $max`;
echo "Comportement du code : $score_test/$max : $percent%";}
##############################################################################
interp () {
score_test=0
max=0
echo
echo "Interprète"
echo "Execution normale"
echo "-----------------"
timeout="why3-cpulimit 30 0 -h"
for f in exec/*.arr; do
echo -n "."
expected=exec/`basename $f .arr`.out
max=`expr $max + 1`;
rm -f out
if $compilo $f > out; then
if cmp --quiet out $expected; then
score_test=`expr $score_test + 1`;
else
echo
echo "ECHEC : mauvaise sortie pour $f"
fi
else
echo
echo "ECHEC de l'interprétation sur $f"
fi
done
echo
echo "Execution conduisant à un échec"
echo "-------------------------------"
for f in exec-fail/*.arr; do
echo -n "."
max=`expr $max + 1`;
if $compilo $f > /dev/null 2>&1; then
echo
echo "ECHEC : le code $f devrait échouer"
else
score_test=`expr $score_test + 1`;
fi
done
echo
percent=`expr 100 \* $score / $max`;
echo "Interprète:";
percent=`expr 100 \* $score_test / $max`;
echo "Comportement du code : $score_test/$max : $percent%";}
case $option in
"-1" )
partie1;;
"-2" )
partie2;;
"-3" )
partie3;;
"-v1" )
verbose=1;
partie1;;
"-v2" )
verbose=1;
partie2;;
"-v3" )
verbose=1;
partie3;;
"-all" )
partie1;
partie2;
partie3;;
"-pyret" )
test_pyret;;
"-i" )
interp;;
* )
echo "usage : $0