diff --git a/tests.repeats.sh b/tests.repeats.sh new file mode 100755 index 0000000000000000000000000000000000000000..d81f92f20bbb9f118fac5ec1746ce2acef137377 --- /dev/null +++ b/tests.repeats.sh @@ -0,0 +1,287 @@ +#!/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 +} + +# $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 +} + +subtreeRepeatsTest +postfixToRankedTest