+#### check_exit() runs the command in $2..., capturing stdout and
+#### stderr, and then tests its exit status with the test(1) condition
+#### in $1. If that fails, the captured stdout and stderr are
+#### displayed, and $failed incremented.
+check_exit() {
+ c="$1"; shift
+ t="$MH_TEST_DIR/.check_exit"
+ r=0
+ $NMH_TEST_PREFIX "$@" >"$t.1" 2>"$t.2" || r=$?
+ if test $r $c; then
+ rm "$t.1" "$t.2"
+ else
+ echo "$0: check_exit: $r $c failed: $*" >&2
+ echo " stdout:" >&2
+ sed 's/^/ /' "$t.1" >&2
+ echo " stderr:" >&2
+ sed 's/^/ /' "$t.2" >&2
+ failed=`expr ${failed:-0} + 1`
+ fi
+}
+
+#### Function invoked by trap on exit.
+cleanup() {
+ #### Save exit status to use as status for this program.
+ status=$?
+
+ #### Clean up test mail space.
+ #### cd to $MH_TEST_DIR before trying to remove its Mail
+ #### subdirectory. rm on Solaris won't remove it if it's in the
+ #### path of the current working directory.
+ test -z "$MH_TEST_NOCLEANUP" && (cd "$MH_TEST_DIR" && rm -rf "$MH_TEST_DIR"/Mail)
+
+ #### Report test name if set, which indicates failure.
+ #### Relies on set -e to invoke the trap which calls
+ #### this function on failure.
+ #### To use:
+ #### 1) Set test name before running the test, use start_test().
+ #### 2) Unset upon successful completion, use finish_test().
+ if test -n "$nmh_tests_testname"; then
+ echo "first named test failure: $nmh_tests_testname"
+ fi
+
+ #### Exit with non-zero status if failure. Failure is defined as either
+ #### non-empty nmh_tests_testname or non-zero exit status on entry to the
+ #### function.
+ if test -n "$nmh_tests_testname" -o $status -ne 0; then
+ test $status -ne 0 && exit $status || exit 1
+ test $status -ne 0 && exit 0 || exit 0
+ fi
+}
+
+#### Function to set the test name, and whatever the future brings.
+start_test() {
+ #### run_test disables exit on non-zero status, but does increment
+ #### failed. Don't overwrite nmh_tests_testname if there was a
+ #### failure; remember the first test that failed.
+ [ ${failed:-0} -eq 0 ] && nmh_tests_testname="$1"
+}
+
+#### Corresponding function to indicate that the test has finished. It need
+#### not be called after each test, just the last one in a file.
+finish_test() {
+ #### run_test disables exit on non-zero status, but does increment
+ #### failed. Don't unset nmh_tests_testname if there was a failure.
+ [ ${failed:-0} -eq 0 ] && unset nmh_tests_testname
+}
+