pushd $(dirname "$(readlink -f "$0")") >/dev/null
source ./utils
setup trap cleanup EXIT
HERE=$PWD
for i in "$@"; do
[[ "$i" =~ [0-9]+ ]] && [ -z $ONE_TEST ] && printf -v ONE_TEST "%02d" $i
done
N=0 let PASSES=0
let TOTAL=0
test() {
[ ! -f $1 ] && echo "No such test file" && return
local recfile=$HERE/tmp/$N.rec
local expfile=$HERE/tmp/$N.exp
local difffile=$HERE/failed/$N.diff
save() {
eval "$@" >$recfile
}
source $1 &>/dev/null
local EX_START=0
while read -r line; do
[ $EX_START = 1 ] && echo "${line:2}" >>$expfile
[[ $line = *"------------------------------"* ]] && EX_START=1
done <$1
local title=$(get_test_title $1) && local testfile=${1##$HERE/}
local rc=0 [ ! -f $recfile ] && not_found $testfile $N.rec && rc=1
[ ! -f $expfile ] && not_found $testfile $N.exp && rc=1
[ $rc = 1 ] && return 1
diff -y -W 70 $recfile $expfile >$difffile
rc=$?
if [[ $rc == 0 ]]; then
pass $testfile "$title"
rm -f $difffile
else
fail $testfile "$title"
fi
return $rc
}
wrap_test() {
let TOTAL++
assert $PWD $HERE && N=$(get_test_id $1)
tmp_dir=$HERE/tmp/$N && mkdir -p $tmp_dir
cd $tmp_dir && test "$1" &
pids+=("$!")
}
main() {
cargo build --quiet || exit 1
if ! command -v gitnu >/dev/null; then
echo 'gitnu not found. Aborting.' && exit 1
fi
pids=()
if [ $ONE_TEST ]; then
wrap_test $HERE/cases/$ONE_TEST.sh wait $pid
echo '[ final output ] ───────────────'
cat $HERE/tmp/$ONE_TEST.rec
echo '────────────────────────────────'
else
for t in $HERE/cases/*; do wrap_test $t
done
fi
[ -z $ONE_TEST ] && for pid in ${pids[@]}; do
wait $pid
[[ $? == 0 ]] && let PASSES++
done
printf "\n $PASSES/$TOTAL tests passed\n"
[ $PASSES = $TOTAL ] && [ $TOTAL -gt 0 ]
}
log_results() {
assert $PWD $HERE
local file=$HERE/log/$(date +'%Y-%m-%d-%H:%M:%S').txt
local ENR="echo '% < received | expected >'"
rm -f $file
ls failed | xargs -I % sh -c \
"$ENR && cat failed/% && printf '\n-----\n\n'" \
>$file >latest.log
printf "\n ${HERE/$HOME/~}/latest.log\n\n"
}
main
ec=$?
[[ $ec = 1 ]] && log_results
exit $ec