#!/bin/bash set -euo pipefail if [[ $# -ne 2 ]]; then echo "$0 {compiler} {input.c}" exit 1 fi CC=$1 SOURCE=$2 TEST_DIR=$(mktemp -d) # Delete temporary directory and exit with nonzero status. function die { echo "$1" rm -rf "$TEST_DIR" exit 1 } # Modify, compile, run, and check expected output. function run_test { sed -e "${1}d" "$SOURCE" > "$TEST_DIR/prime.c" $CC -Wall -Wextra -Werror -pedantic \ "$TEST_DIR/prime.c" -o "$TEST_DIR/prime.exe" \ || die "$1: compile failed ($CC)" "$TEST_DIR/prime.exe" > "$TEST_DIR/output.txt" \ || die "$1: run failed ($CC)" if ! ( echo "$2" | diff -q "$TEST_DIR/output.txt" - ); then die "$1: output mismatched ($CC)" fi } run_test 1 "one" run_test 2 "prime" run_test 3 "prime" run_test 4 "composite" run_test 5 "prime" run_test 6 "composite" run_test 7 "prime" run_test 8 "composite" run_test 9 "composite" run_test 10 "composite" run_test 11 "prime" run_test 12 "composite" run_test 13 "prime" run_test 9966 "composite" run_test 9967 "prime" run_test 9968 "composite" run_test 9972 "composite" run_test 9973 "prime" for i in $(seq 9974 1 9999); do run_test "$i" "composite" done run_test 10000 "?" run_test 10001 "?" rm -rf "$TEST_DIR" exit 0