#! /bin/bash main() { local ret=0 for f in ./*_test.sh; do if ! one_main "$f"; then echo failed $f >&2 ret=$((ret+1)) fi done if [ $ret != 0 ]; then echo failed >&2 fi return $ret } one_main() ( local f="$1" local ret=0 for t in $(grep ^test_ "$f" | sed 's/(.*//'); do if ! one_test "$f" "$t"; then echo failed $f:$t >&2 ret=$((ret+1)) fi done return $ret ) one_test() ( local f="$1" local t="$2" each source "${f%_test.sh}.sh" source "$f" eval "$t" ) each() { export CACHE=$(mktemp -d) source ./cache.sh set -e set -o pipefail } if [ "$0" == "$BASH_SOURCE" ]; then main "$@" fi