Skip to content
Snippets Groups Projects
tests.aconversion.sh 4.9 KiB
Newer Older
  • Learn to ignore specific revisions
  • #!/usr/bin/env bash
    
    
    # $1 test dir suffix (debug / release)
    
    
    # SETTINGS
    
    TESTCASE_ITERATIONS=100
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    TESTCASE_TIMEOUT=10
    
    LOGFILE="log_tests.txt"
    
    
    RAND_STATES=18
    RAND_DENSITY="2.5"
    RAND_ALPHABET=4
    
    
    EXECUTABLES="arand2 aepsilon2 atrim2 adeterminize2 aminimize2 anormalize2 acompare2 aconversions2"
    
    TESTS_DIR="`pwd`/examples2/automaton"
    
    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."
    
    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
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    	cat  "$3" >> $LOGFILE
    
    	echo "command out:" >> $LOGFILE
    	echo "$4" >> $LOGFILE
    
    function generateNFA {
    
    	./arand2 -t FSM --density $RAND_DENSITY --states $(( $RANDOM % $RAND_STATES + 1 )) --terminals $(( $RANDOM % $RAND_ALPHABET + 1 )) 2>/dev/null
    
    # $1 = command for conversion. Output of such command must be (eps-)NFA !!
    
    function runTest2 {
    
    	MDFA="./aepsilon2 -e | ./adeterminize2 | ./atrim2 -e | ./aminimize2 | ./anormalize2 --labels automaton"
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    	OUT=`timeout $TESTCASE_TIMEOUT bash -c "./acompare2 <(cat $2 | $1 | $MDFA ) <(cat $2 | $MDFA)"`
    
    	if [ $RET == 0 ]; then # ok
    		return 0
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    	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_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"
    
    	# predefined tests first
    	for FILE in `ls $TESTS_DIR/aconversion.test*`; do
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    		runTest2 "$1" "$FILE"
    
    		registerResult $?
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    	NFA_FILE=nfa.xml
    
    	for i in $(seq 1 $TESTCASE_ITERATIONS );
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    		cat <(generateNFA) > $NFA_FILE
    
    		runTest2 "$1" "$NFA_FILE"
    
    		registerResult $?
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    	rm $NFA_FILE
    
    
    # FA -> RG -> FA
    # covers: FA -> LRG, FA -> RRG, RRG <-> LRG, RRG -> FA, LRG -> FA
    
    runTest "./aconversions2 -t rg -a outgoing  | ./anormalize2 --form leftRG  | ./aconversions2 -t fa"
    
    runTest "./aconversions2 -t rg -a incoming | ./anormalize2 --form rightRG | ./aconversions2 -t fa"
    
    
    # FA -> RE -> FA
    # covers: FA -> RE (Brzozowski algebraic, elimination), RE -> FA (Brzozowski derivation, Thompson, Glushkov)
    
    runTest "./aconversions2 -t re -a algebraic   | ./aconversions2 -t fa -a brzozowski"
    runTest "./aconversions2 -t re -a algebraic   | ./aconversions2 -t fa -a thompson"
    runTest "./aconversions2 -t re -a algebraic   | ./aconversions2 -t fa -a glushkov "
    runTest "./aconversions2 -t re -a elimination | ./aconversions2 -t fa -a brzozowski"
    runTest "./aconversions2 -t re -a elimination | ./aconversions2 -t fa -a thompson"
    runTest "./aconversions2 -t re -a elimination | ./aconversions2 -t fa -a glushkov"
    
    
    # FA -> RE -> RRG -> LRG -> FA
    # covers: FA -> RE (Brz. algebraic, elimination), RE -> RRG ( Brz. derivation, Glushkov), RRG -> LRG, LRG -> FA
    
    runTest "./aconversions2 -t re -a algebraic   | ./aconversions2 -t rg -a brzozowski | ./anormalize2 --form leftRG | ./aconversions2 -t fa"
    runTest "./aconversions2 -t re -a algebraic   | ./aconversions2 -t rg -a glushkov   | ./anormalize2 --form leftRG | ./aconversions2 -t fa"
    runTest "./aconversions2 -t re -a elimination | ./aconversions2 -t rg -a brzozowski | ./anormalize2 --form leftRG | ./aconversions2 -t fa"
    runTest "./aconversions2 -t re -a elimination | ./aconversions2 -t rg -a glushkov   | ./anormalize2 --form leftRG | ./aconversions2 -t fa"
    
    
    # FA -> RRG -> RE -> FA
    
    # covers: FA -> RRG, FA -> LRG, RRG -> RE, LRG -> RE, RE -> FA (Brz. derivation, Thompson, Glushkov)
    
    runTest "./aconversions2 -t rg -a outgoing  | ./aconversions2 -t re | ./aconversions2 -t fa -a brzozowski"
    
    runTest "./aconversions2 -t rg -a incoming | ./aconversions2 -t re | ./aconversions2 -t fa -a brzozowski"
    
    runTest "./aconversions2 -t rg -a outgoing  | ./aconversions2 -t re | ./aconversions2 -t fa -a thompson"
    
    runTest "./aconversions2 -t rg -a incoming | ./aconversions2 -t re | ./aconversions2 -t fa -a thompson"
    
    runTest "./aconversions2 -t rg -a outgoing  | ./aconversions2 -t re | ./aconversions2 -t fa -a glushkov"
    
    runTest "./aconversions2 -t rg -a incoming | ./aconversions2 -t re | ./aconversions2 -t fa -a glushkov"