#!/bin/sh pass=0 fail=0 skip=0 show_passes=false if [ "$1" = "-a" ]; then show_passes=true shift fi skipglob="$1" skip() { printf '\033[33mSKIP\033[0m %s (%s)\n' "$testname" "$1" skip=$((skip + 1)) } for testfile in tests/*.bth; do outfile=${testfile%.bth}.out testname=${testfile#tests/} testname=${testname%.bth} if [ ! -f "$outfile" ]; then skip "no output file" continue fi case "$testname" in $skipglob) skip "matches skip glob $skipglob" continue ;; esac output="$(./bth "$testfile" 2>&1)" echo "$output" | diff "$outfile" - >/dev/null diff_res=$? case $diff_res in 0) if $show_passes; then printf '\033[32m\033[1mPASS\033[0m %s\n' "$testname" fi pass=$((pass + 1)) ;; 1) printf '\033[31m\033[1mFAIL\033[0m %s\n' "$testname" printf "\tgot output: %s\n" "$(echo "$output" | head -n4)" printf "\texpected: " cat "$outfile" fail=$((fail + 1)) ;; esac done echo pnum () { if [ "$1" -eq 0 ]; then printf "0 %s; " "$2" else printf "\033[3%dm%d\033[0m %s; " "$3" "$1" "$2" fi } pnum $pass passed 2 pnum $fail failed 1 pnum $skip skipped 3 printf "%s total\n" $((pass + fail + skip)) if [ $fail -eq 0 ]; then exit 0 else exit 1 fi