Skip to content
Snippets Groups Projects
tests.aconversion.sh 4.21 KiB
Newer Older
  • Learn to ignore specific revisions
  • #!/usr/bin/env bash
    
    
    TESTCASE_ITERATIONS=200
    TESTCASE_TIMEOUT=5
    
    LOGFILE="log_tests.txt"
    
    
    RAND_STATES=18
    RAND_DENSITY="2.5"
    RAND_ALPHABET=4
    
    
    EXECUTABLES="arand aepsilon atrim adeterminize aminimize anormalize adiff.automaton aconversion"
    
    # ----------------------------
    
    for FILE in $EXECUTABLES; do
    	if [ ! -f bin/$FILE ]; then
    		echo "Executable" $FILE "is required for testing. Make sure it is in bin folder."
    		exit 1
    	fi
    done
    
    cd bin/
    rm -f $LOGFILE
    
    # ----------------------------
    
    function mDFA {
    	echo "$1" | ./aepsilon | ./atrim | ./adeterminize -t FSM | ./aminimize | ./anormalize
    }
    
    function compare {
    	echo "$1" > tmp1.xml
    	echo "$2" > tmp2.xml
    
    	# relies on ret code by adiff.automaton
    	./adiff.automaton tmp1.xml tmp2.xml
    	RET=$?
    	rm tmp1.xml tmp2.xml
    
    	return $RET
    }
    
    # $1 = command for conversion. Output of such command must be (eps-)NFA !!
    function runTest2 {
    	TMPNFA="nfa.xml"
    
    
    	./arand -d $RAND_DENSITY -n $(( $RANDOM % $RAND_STATES + 1 )) -a $(( $RANDOM % $RAND_ALPHABET + 1 )) > $TMPNFA
    
    
    	TMP=$(timeout $TESTCASE_TIMEOUT bash -c "cat $TMPNFA | $1")
    	RETTMP=$?
    	if [ $RETTMP -ge 123 ]; then
    		return 2
    	fi
    	
    	mDFA1=$(mDFA "$(cat $TMPNFA)")
    	mDFA2=$(mDFA "$TMP")
    
    	CMP=$(compare "$mDFA1" "$mDFA2")
    	if [ $? == 0 ]; then 
    		rm nfa.xml
    		return 0
    	else
    		echo "-----------------------------------------" >> $LOGFILE
    		echo "$1" >> $LOGFILE
    		echo "$CMP" >> $LOGFILE
    		echo $(cat nfa.xml) >> $LOGFILE 
    		rm nfa.xml
    		return 1
    	fi
    }
    
    function runTest {
    	ITERS=$TESTCASE_ITERATIONS
    	RES_GOOD=0
    	RES_BAD=0
    	RES_TIMEOUT=0
    
    	if [ $# == 0 ] || [ $# -gt 2 ]; then
    		echo "Invalid runTest call."
    		exit
    	elif [ $# == 2 ]; then
    		ITERS=$2
    	fi
    
    
    	echo $1
    	echo -ne "\t"
    	for i in $(seq 1 $ITERS );
    	do
    
    		runTest2 "$1"
    		RETTEST=$?
    
    		if [ $RETTEST == 0 ]; then
    			echo -n "."
    			RES_GOOD=$((RES_GOOD + 1))
    		elif [ $RETTEST == 1 ]; then
    			echo -n "x"
    			RES_BAD=$((RES_BAD + 1))
    		elif [ $RETTEST == 2 ]; then
    			echo -n "T"
    			RES_TIMEOUT=$((RES_TIMEOUT + 1))
    		elif [ $RETTEST == 3 ]; then
    			echo -n "F"
    			RES_BAD=$((RES_BAD + 1))
    		else
    			echo -n "?"
    		fi
    	done
    
    	echo -ne "\n\t"
    	echo "RES: GOOD:" $RES_GOOD ", BAD:" $RES_BAD ", TIMEOUT:" $RES_TIMEOUT
    	echo ""
    }
    
    # FA -> RG -> FA
    
    # covers: FA -> LRG, FA -> RRG, RRG <-> LRG, RRG -> FA, LRG -> FA
    runTest "./aconversion -t RRG | ./aconversion -t LRG | ./aconversion -t FA" 
    runTest "./aconversion -t LRG | ./aconversion -t RRG | ./aconversion -t FA"
    
    
    # FA -> RE -> FA
    
    # covers: FA -> RE (Brzozowski algebraic, elimination), RE -> FA (Brzozowski derivation, Thompson, Glushkov)
    
    runTest "./aconversion -t RE -a algebraic | ./aconversion -t FA -a brzozowski"
    runTest "./aconversion -t RE -a algebraic | ./aconversion -t FA -a thompson"
    runTest "./aconversion -t RE -a algebraic | ./aconversion -t FA -a glushkov "
    runTest "./aconversion -t RE -a elimination | ./aconversion -t FA -a brzozowski"
    runTest "./aconversion -t RE -a elimination | ./aconversion -t FA -a thompson"
    runTest "./aconversion -t RE -a elimination | ./aconversion -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 "./aconversion -t RE -a algebraic | ./aconversion -t RRG -a brzozowski | ./aconversion -t LRG | ./aconversion -t FA"
    runTest "./aconversion -t RE -a algebraic | ./aconversion -t RRG -a glushkov | ./aconversion -t LRG | ./aconversion -t FA"
    runTest "./aconversion -t RE -a elimination | ./aconversion -t RRG -a brzozowski | ./aconversion -t LRG | ./aconversion -t FA"
    runTest "./aconversion -t RE -a elimination | ./aconversion -t RRG -a glushkov | ./aconversion -t LRG | ./aconversion -t FA"
    
    # FA -> RRG -> RE -> FA
    
    # covers: FA -> RRG, FA -> LRG, RRG -> RE, LRG -> RE, RE -> FA (Brz. derivation, Thompson, Glushkov)
    
    Tomáš Pecka's avatar
    Tomáš Pecka committed
    runTest "./aconversion -t RRG | ./aconversion -t RE | ./aconversion -t FA -a brzozowski"
    runTest "./aconversion -t LRG | ./aconversion -t RE | ./aconversion -t FA -a brzozowski"
    runTest "./aconversion -t RRG | ./aconversion -t RE | ./aconversion -t FA -a thompson"
    runTest "./aconversion -t LRG | ./aconversion -t RE | ./aconversion -t FA -a thompson"
    runTest "./aconversion -t RRG | ./aconversion -t RE | ./aconversion -t FA -a glushkov"
    runTest "./aconversion -t LRG | ./aconversion -t RE | ./aconversion -t FA -a glushkov"