Index: doc/theses/andrew_beach_MMath/code/test.sh
===================================================================
--- doc/theses/andrew_beach_MMath/code/test.sh	(revision acb38ce9307e682cf9e2f5b10a27e1f8de69a4ed)
+++ doc/theses/andrew_beach_MMath/code/test.sh	(revision acb38ce9307e682cf9e2f5b10a27e1f8de69a4ed)
@@ -0,0 +1,108 @@
+#!/usr/bin/env bash
+
+# Usage: LANGUAGE TEST | -b SOURCE_FILE
+
+readonly ITERATIONS=1000000 # 1 000 000, one million
+readonly STACK_HEIGHT=100
+
+# Build Test Programs:
+# Mini-Make: TARGET SOURCE COMMAND ARGS...
+mmake() (
+	if [ ! -e "$1" -o "$1" -ot "$2" ]; then
+		"${@:3}"
+	fi
+)
+
+build() (
+	case "$1" in
+	*.cfa)
+		# Requires a symbolic link.
+		mmake "${1%.cfa}" "$1" ./cfa "$1" -o "${1%.cfa}"
+		;;
+	*.cpp)
+		mmake "${1%.cpp}-cpp" "$1" g++ "$1" -o "${1%.cpp}-cpp"
+		;;
+	*.java)
+		mmake "${1%.java}.class" "$1" javac "$1"
+		;;
+	*)
+		echo "Don't know how to build:" $1 >&2
+		exit 2
+		;;
+	esac
+)
+
+if [ "-b" = "$1" ]; then
+	for file in "${@:2}"; do
+		build $file
+	done
+	exit 0
+fi
+
+# Run Test Programs:
+# Used in place of unsupported language/test combinations.
+unsupported() {
+	echo "Run-Time: NA"
+}
+
+case "$2" in
+cond-match-all)
+	CFAT="./cond-catch $ITERATIONS 1"
+	CFAR="./cond-fixup $ITERATIONS 1"
+	CPP="./cond-catch-cpp $ITERATIONS 1"
+	JAVA="java CondCatch $ITERATIONS 1"
+	;;
+cond-match-none)
+	CFAT="./cond-catch $ITERATIONS 0"
+	CFAR="./cond-fixup $ITERATIONS 0"
+	CPP="./cond-catch-cpp $ITERATIONS 0"
+	JAVA="java CondCatch $ITERATIONS 0"
+	;;
+cross-catch)
+	CFAT="./cross-catch $ITERATIONS"
+	CFAR="./cross-resume $ITERATIONS"
+	CPP="./cross-catch-cpp $ITERATIONS"
+	JAVA="java CrossCatch $ITERATIONS"
+	;;
+cross-finally)
+	CFAT="./cross-finally $ITERATIONS"
+	CFAR=unsupported
+	CPP=unsupported
+	JAVA="java CrossFinally $ITERATIONS"
+	;;
+raise-detor)
+	CFAT="./throw-detor $ITERATIONS $STACK_HEIGHT"
+	CFAR="./resume-detor $ITERATIONS $STACK_HEIGHT"
+	CPP="./throw-detor-cpp $ITERATIONS $STACK_HEIGHT"
+	JAVA=unsupported
+	;;
+raise-empty)
+	CFAT="./throw-empty $ITERATIONS $STACK_HEIGHT"
+	CFAR="./resume-empty $ITERATIONS $STACK_HEIGHT"
+	CPP="./throw-empty-cpp $ITERATIONS $STACK_HEIGHT"
+	JAVA="java ThrowEmpty $ITERATIONS $STACK_HEIGHT"
+	;;
+raise-finally)
+	CFAT="./throw-finally $ITERATIONS $STACK_HEIGHT"
+	CFAR="./resume-finally $ITERATIONS $STACK_HEIGHT"
+	CPP=unsupported
+	JAVA="java ThrowFinally $ITERATIONS $STACK_HEIGHT"
+	;;
+raise-other)
+	CFAT="./throw-other $ITERATIONS $STACK_HEIGHT"
+	CFAR="./resume-other $ITERATIONS $STACK_HEIGHT"
+	CPP="./throw-other-cpp $ITERATIONS $STACK_HEIGHT"
+	JAVA="java ThrowOther $ITERATIONS $STACK_HEIGHT"
+	;;
+*)
+	echo "No such test." >&2
+	exit 2
+	;;
+esac
+
+case "$1" in
+cfa-t) echo $CFAT; $CFAT;;
+cfa-r) echo $CFAR; $CFAR;;
+cpp) echo $CPP; $CPP;;
+java) echo $JAVA; $JAVA;;
+esac
