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

# $1 test dir suffix (debug / release)

source bash_multithread.sh

# ALGORITHM SETTINGS
TESTCASE_ITERATIONS=30
TESTCASE_TIMEOUT=10
LOGFILE="log_tests.txt"

# RANDOM TREE SETTINGS (./arand2 parameters)
# BEWARE, NOT ALL VALUES MAY WORK TOGETHER
NODES=100
HEIGHT=15
ALPHABET_SIZE=10

EXECUTABLES="aarbology2 acast2 atniceprint arand2 "
TESTS_DIR="`pwd`/examples2/tree"

RES_GOOD=
RES_FAIL=
RES_TIME=
RES_SEGV=
RES_UNKN=


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

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

JOBS=$2
if [ -z "$JOBS" ]; then
	JOBS=1
fi

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

# $1 = file path
# $2 = return code
# $3 = diff out
# $4 = RankedTree xml
# $5 = Naive output
# $6 = Advanced output
function log {
	echo "==========================================================" >> $LOGFILE
	echo "file: " $1 >> $LOGFILE
	echo "ret: " $2 >> $LOGFILE
	echo "problematic tree:" >> $LOGFILE
	cat $4 >> $LOGFILE
	ONE=$(mktemp)
	TWO=$(mktemp)
	echo "Naive : " >> $ONE
	echo "Yours : " >> $TWO
	cat $5 | ./atniceprint >> $ONE
	cat $6 | ./atniceprint >> $TWO
	paste $ONE $TWO | pr -t -e$(awk 'n<length {n=length} END {print n+1}' $ONE) >> $LOGFILE
	rm $ONE $TWO
}

# $1 = file path
# $2 = return code
# $3 = diff out
# $4 = RankedTree
# $5 = RankedTree -> Postfix -> RankedTree
function log2 {
	echo "==========================================================" >> $LOGFILE
	echo "file: " $1 >> $LOGFILE
	echo "ret: " $2 >> $LOGFILE
	ONE=$(mktemp)
	TWO=$(mktemp)
	echo "Simple : " >> $ONE
	echo "After conversions : " >> $TWO
	cat $4 >> $ONE
	cat $5 >> $TWO
	paste $ONE $TWO | pr -t -e$(awk 'n<length {n=length} END {print n+1}' $ONE) >> $LOGFILE
	rm $ONE $TWO
}

# $1 = TREE_FILE
function runPostfix2RankedAlgorithmTest {
	#compares RankedTree to RankedTree -> PostfixRankedTree -> RankedTree

	RANKED2POSTFIX2RANKED=$(mktemp)
	RANKED=$(mktemp)

	./acast2 -t RankedTree -i $1 | ./atniceprint > $RANKED
	./acast2 -t RankedTree -i $1 | ./acast2 -t PostfixRankedTree | ./acast2 -t RankedTree | ./atniceprint > $RANKED2POSTFIX2RANKED

	OUT=`timeout $TESTCASE_TIMEOUT bash -c "diff $RANKED $RANKED2POSTFIX2RANKED"`
	RET=$?

	if [ $RET != 0 ]; then # fail
		log2 "$1" $RET "$OUT" "$RANKED" "$RANKED2POSTFIX2RANKED"
	fi

	rm $1 $RANKED2POSTFIX2RANKED $RANKED

	if [ $RET == 124 ]; then # timeout
		registerResult 2
		return 2
	elif [ $RET -ge 124 ]; then #segv
		registerResult 3
		return 3
	elif [ $RET != 0 ]; then # fail
		registerResult 1
		return 1
	else
		registerResult 0
		return 0
	fi
}


function runNaivePostfixRepeatsTest {

	NAIVE_OUTPUT=$(mktemp)
	ADVANCED_OUTPUT=$(mktemp)

	./aarbology2 -s $1 -a exactSubtreeRepeatsNaive | ./aarbology2 -a normalizeTreeLabels > $NAIVE_OUTPUT
	./acast2 -t PostfixRankedTree -i  $1 | ./aarbology2 -a exactSubtreeRepeatsNaive | ./acast2 -t RankedTree | ./aarbology2 -a normalizeTreeLabels > $ADVANCED_OUTPUT

	OUT=`timeout $TESTCASE_TIMEOUT bash -c "diff $NAIVE_OUTPUT $ADVANCED_OUTPUT"`
	RET=$?

	if [ $RET != 0 ]; then # fail
		log "$1" $RET "$OUT" "$1" "$NAIVE_OUTPUT" "$ADVANCED_OUTPUT"
	fi

	rm $1 $NAIVE_OUTPUT $ADVANCED_OUTPUT

	if [ $RET == 124 ]; then # timeout
		registerResult 2
		return 2
	elif [ $RET -ge 124 ]; then #segv
		registerResult 3
		return 3
	elif [ $RET != 0 ]; then # fail
		registerResult 1
		return 1
	else
		registerResult 0
		return 0
	fi
}

# $1 = TREE_FILE
function runRepeatsAlgorithmTest {

	NAIVE_OUTPUT=$(mktemp)
	ADVANCED_OUTPUT=$(mktemp)

	./aarbology2 -s $1 -a exactSubtreeRepeatsNaive | ./aarbology2 -a normalizeTreeLabels > $NAIVE_OUTPUT
	./acast2 -t PostfixRankedTree -i  $1 | ./aarbology2 -a exactSubtreeRepeats | ./acast2 -t RankedTree | ./aarbology2 -a normalizeTreeLabels > $ADVANCED_OUTPUT

	OUT=`timeout $TESTCASE_TIMEOUT bash -c "diff $NAIVE_OUTPUT $ADVANCED_OUTPUT"`
	RET=$?

	if [ $RET != 0 ]; then # fail
		log "$1" $RET "$OUT" "$1" "$NAIVE_OUTPUT" "$ADVANCED_OUTPUT"
	fi

	rm $1 $NAIVE_OUTPUT $ADVANCED_OUTPUT

	if [ $RET == 124 ]; then # timeout
		registerResult 2
		return 2
	elif [ $RET -ge 124 ]; then #segv
		registerResult 3
		return 3
	elif [ $RET != 0 ]; then # fail
		registerResult 1
		return 1
	else
		registerResult 0
		return 0
	fi
}

function registerResult {
	case $1 in
		0)
			echo -n "."
			echo -n "+1" >> $RES_GOOD
			;;
		1)
			echo -n "x"
			echo -n "+1" >> $RES_FAIL
			;;
		2)
			echo -n "T"
			echo -n "+1" >> $RES_TIME
			;;
		3)
			echo -n "E"
			echo -n "+1" >> $RES_SEGV
			;;
		*)
			echo -n "?"
			echo -n "+1" >> $RES_UNKN
			;;
	esac
}

function initResults {
	RES_GOOD=$(mktemp)
	echo -n "0" > $RES_GOOD
	RES_FAIL=$(mktemp)
	echo -n "0" > $RES_FAIL
	RES_TIME=$(mktemp)
	echo -n "0" > $RES_TIME
	RES_SEGV=$(mktemp)
	echo -n "0" > $RES_SEGV
	RES_UNKN=$(mktemp)
	echo -n "0" > $RES_UNKN
}

function clearResults {
	rm $RES_GOOD
	rm $RES_FAIL
	rm $RES_TIME
	rm $RES_SEGV
	rm $RES_UNKN
}

function outputResults {
	echo "" >> $RES_GOOD
	echo "" >> $RES_FAIL
	echo "" >> $RES_TIME
	echo "" >> $RES_SEGV
	echo "" >> $RES_UNKN

	# summary
	echo -ne "\n\t"
	echo "RES: GOOD:" $(bc < $RES_GOOD) ", FAIL:" $(bc < $RES_FAIL) ", TIME:" $(bc < $RES_TIME) ", SEGV:" $(bc < $RES_SEGV), "UNKN:" $(bc < $RES_UNKN)
	echo ""
}

function subtreeRepeatsTest {
	initResults

	echo "subtreeRepeatsTest"

	echo "Testing on predefined trees"
	echo -ne "\t"

	for TREE_FILE in `ls $TESTS_DIR/repeats.test*.xml`; do
	  # echo "Testing tree $(basename $TREE_FILE) "
		TREE_COPY=$(mktemp)
		cat $TREE_FILE > $TREE_COPY
		bgxlimit ${JOBS} runRepeatsAlgorithmTest "$TREE_COPY"
	done
	wait

	outputResults
	clearResults

	initResults

	echo "Testing on randomly generated trees"
	echo -ne "\t"

	for i in $(seq 1 $TESTCASE_ITERATIONS); do
		# echo "Testing tree $(basename $TREE_FILE) "
		TREE_FILE=$(mktemp)
		./arand2 -t RT --nodes $NODES --terminals $(( $RANDOM % $ALPHABET_SIZE + 1 )) --height $HEIGHT > $TREE_FILE
		bgxlimit ${JOBS} runRepeatsAlgorithmTest "$TREE_FILE"
	done
	wait

	outputResults
	clearResults
}

function postfixToRankedTest {
	initResults

	echo "PostfixToRankedTest"

	echo "Testing on predefined trees"
	echo -ne "\t"

	for TREE_FILE in `ls $TESTS_DIR/repeats.test*.xml`; do
	  # echo "Testing tree $(basename $TREE_FILE) "
		TREE_COPY=$(mktemp)
		cat $TREE_FILE > $TREE_COPY
		bgxlimit ${JOBS} runPostfix2RankedAlgorithmTest "$TREE_COPY"
	done
	wait

	outputResults
	clearResults

	initResults

	echo "Testing on randomly generated trees"
	echo -ne "\t"

	for i in $(seq 1 $TESTCASE_ITERATIONS); do
		# echo "Testing tree $(basename $TREE_FILE) "
		TREE_FILE=$(mktemp)
		./arand2 -t RT --nodes $NODES --terminals $(( $RANDOM % $ALPHABET_SIZE + 1 )) --height $HEIGHT > $TREE_FILE
		bgxlimit ${JOBS} runPostfix2RankedAlgorithmTest "$TREE_FILE"
	done
	wait

	outputResults
	clearResults
}

function naivePostfixRepeatsTest {
	initResults

	echo "NaivePostfixRepeatsTest"

	echo "Testing on predefined trees"
	echo -ne "\t"

	for TREE_FILE in `ls $TESTS_DIR/repeats.test*.xml`; do
	  # echo "Testing tree $(basename $TREE_FILE) "
		TREE_COPY=$(mktemp)
		cat $TREE_FILE > $TREE_COPY
		bgxlimit ${JOBS} runNaivePostfixRepeatsTest "$TREE_COPY"
	done
	wait

	outputResults
	clearResults

	initResults

	echo "Testing on randomly generated trees"
	echo -ne "\t"

	for i in $(seq 1 $TESTCASE_ITERATIONS); do
		# echo "Testing tree $(basename $TREE_FILE) "
		TREE_FILE=$(mktemp)
		./arand2 -t RT --nodes $NODES --terminals $(( $RANDOM % $ALPHABET_SIZE + 1 )) --height $HEIGHT > $TREE_FILE
		bgxlimit ${JOBS} runNaivePostfixRepeatsTest "$TREE_FILE"
	done
	wait

	outputResults
	clearResults
}


subtreeRepeatsTest
postfixToRankedTest
naivePostfixRepeatsTest