Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
tests.aconversion.sh 4.71 KiB
#!/usr/bin/env bash

# SETTINGS
TESTCASE_ITERATIONS=100
TESTCASE_TIMEOUT=10
LOGFILE="log_tests.txt"

RAND_STATES=18
RAND_DENSITY="2.5"
RAND_ALPHABET=4

EXECUTABLES="arand2 aepsilon2 atrim2 adeterminize2 aminimize2 anormalize2 adiff2 aconversions2"
TESTS_DIR="../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/$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

# ----------------------------

# $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
	echo "$3" >> $LOGFILE
	echo "command out:" >> $LOGFILE
	echo "$4" >> $LOGFILE
}

function generateNFA {
	./arand2 -d $RAND_DENSITY -n $(( $RANDOM % $RAND_STATES + 1 )) -a $(( $RANDOM % $RAND_ALPHABET + 1 )) 2>/dev/null
}

# $1 = command for conversion. Output of such command must be (eps-)NFA !!
# $2 = automaton
function runTest2 {
	MDFA="./aepsilon2 | ./atrim2 | ./adeterminize2 -t FSM | ./atrim2 | ./aminimize2 | ./anormalize2"

	TMPNFA="nfa.xml"
	echo "$2" > $TMPNFA

	OUT=`timeout $TESTCASE_TIMEOUT bash -c "./adiff2 <(cat $TMPNFA | $1 | $MDFA ) <(cat $TMPNFA | $MDFA)"`
	RET=$?

	if [ $RET == 0 ]; then # ok
		rm $TMPNFA
		return 0
	fi

	log "$1" $RET "$(cat $TMPNFA)" "$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/aconversion.test*`; do
		runTest2 "$1" "$(cat $FILE)"
		registerResult $?
	done

	echo -n " | "

	# random tests
	for i in $(seq 1 $TESTCASE_ITERATIONS );
	do
		runTest2 "$1" "$(generateNFA)"
		registerResult $?
   done

   outputResults
}

# FA -> RG -> FA
# covers: FA -> LRG, FA -> RRG, RRG <-> LRG, RRG -> FA, LRG -> FA
runTest "./aconversions2 -t RRG | ./aconversions2 -t LRG | ./aconversions2 -t FA"
runTest "./aconversions2 -t LRG | ./aconversions2 -t RRG | ./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 RRG -a brzozowski | ./aconversions2 -t LRG | ./aconversions2 -t FA"
runTest "./aconversions2 -t RE -a algebraic | ./aconversions2 -t RRG -a glushkov | ./aconversions2 -t LRG | ./aconversions2 -t FA"
runTest "./aconversions2 -t RE -a elimination | ./aconversions2 -t RRG -a brzozowski | ./aconversions2 -t LRG | ./aconversions2 -t FA"
runTest "./aconversions2 -t RE -a elimination | ./aconversions2 -t RRG -a glushkov | ./aconversions2 -t LRG | ./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 RRG | ./aconversions2 -t RE | ./aconversions2 -t FA -a brzozowski"
runTest "./aconversions2 -t LRG | ./aconversions2 -t RE | ./aconversions2 -t FA -a brzozowski"
runTest "./aconversions2 -t RRG | ./aconversions2 -t RE | ./aconversions2 -t FA -a thompson"
runTest "./aconversions2 -t LRG | ./aconversions2 -t RE | ./aconversions2 -t FA -a thompson"
runTest "./aconversions2 -t RRG | ./aconversions2 -t RE | ./aconversions2 -t FA -a glushkov"
runTest "./aconversions2 -t LRG | ./aconversions2 -t RE | ./aconversions2 -t FA -a glushkov"