-
Jan Trávníček authoredJan Trávníček authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
tests.anormalize.sh 2.68 KiB
#!/usr/bin/env bash
# $1 test dir suffix (debug / release)
# SETTINGS
TESTCASE_ITERATIONS=100
TESTCASE_TIMEOUT=10
LOGFILE="log_tests.txt"
RAND_NONTERMINALS=2
RAND_DENSITY="50"
RAND_TERMINALS=4
STRING_LENGHTS=6
EXECUTABLES="arand2 atrim2 anormalize2 agenerate2 aepsilon2"
TESTS_DIR="../examples2/grammar"
RES_GOOD=0
RES_FAIL=0
RES_TIME=0
RES_SEGV=0
RES_UNKN=0
# ----------------------------
for FILE in $EXECUTABLES; do
if [ ! -f bin-$1/$FILE ]; then
echo "Executable $FILE is required for testing. Make sure it is in bin-$1 folder."
exit 1
fi
done
cd bin-$1/
rm -f $LOGFILE
# ----------------------------
# $1 = conv command
# $2 = return code
# $3 = input automaton
# $4 = output of conversion
function log {
echo "----------------------------------------------------------" >> $LOGFILE
echo "conv: " $1 >> $LOGFILE
echo "ret: " $2 >> $LOGFILE
echo "input automaton:" >> $LOGFILE
cat "$3" >> $LOGFILE
echo "command out:" >> $LOGFILE
echo "$4" >> $LOGFILE
}
function generateCFG {
./arand2 -t CFG --density $RAND_DENSITY --nonterminals $(( $RANDOM % $RAND_NONTERMINALS + 1 )) --terminals $(( $RANDOM % $RAND_TERMINALS + 1 )) 2>/dev/null | ./aepsilon2
}
# $1 = command for conversion. Output of such command must be a grammar !!
# $2 = original grammar
function runTest2 {
GENERATED_STRINGS="./agenerate2 --upto $STRING_LENGHTS"
OUT=`timeout $TESTCASE_TIMEOUT bash -c "diff <(cat $2 | $1 | $GENERATED_STRINGS ) <(cat $2 | $GENERATED_STRINGS)"`
RET=$?
if [ $RET == 0 ]; then # ok
return 0
fi
log "$1" $RET "$2" "$OUT"
if [ $RET == 124 ]; then # timeout
return 2
elif [ $RET -ge 124 ]; then #segv
return 3
else
return 1
fi
}
function registerResult {
case $1 in
0)
echo -n "."
((RES_GOOD++))
;;
1)
echo -n "x"
((RES_FAIL++))
;;
2)
echo -n "T"
((RES_TIME++))
;;
3)
echo -n "E"
((RES_SEGV++))
;;
*)
echo -n "?"
((RES_UNKN++))
;;
esac
}
function clearResults {
RES_GOOD=0
RES_FAIL=0
RES_TIME=0
RES_SEGV=0
RES_UNKN=0
}
function outputResults {
# summary
echo -ne "\n\t"
echo "RES: GOOD:" $RES_GOOD ", FAIL:" $RES_FAIL ", TIME:" $RES_TIME ", SEGV:" $RES_SEGV, "UNKN:" $RES_UNKN
echo ""
}
# $1 - aconversions2 sequence
function runTest {
echo $1
echo -ne "\t"
clearResults
# predefined tests first
for FILE in `ls $TESTS_DIR/anormalization.test*`; do
runTest2 "$1" "$FILE"
registerResult $?
done
echo -n " | "
# random tests
CFG_FILE=cfg.xml
for i in $(seq 1 $TESTCASE_ITERATIONS );
do
cat <(generateCFG) > $CFG_FILE
runTest2 "$1" "$CFG_FILE"
registerResult $?
done
rm $CFG_FILE
outputResults
}
# Chomsky normal form and Greibach normal form
runTest "./anormalize2 -f GNF"
runTest "./anormalize2 -f CNF"