1#!/bin/sh23cd "$(dirname "$0")"45abort() {6 printf "${1}\n" 1>&27 exit 18}910run_editor() {11 [ $# -eq 4 ] || exit 112 cmd="${1}"13 cwd="${2}"14 dat="${3}"15 opt="${4}"1617 mkdir "${cwd}"18 [ -d "${dat}" ] && cp -r "${dat}" "${cwd}"19 cd "${cwd}"2021 if [ -s "${opt}" ]; then22 set -- $(cat "${opt}")23 "${cmd}" $@ 2>/dev/null24 else25 "${cmd}" 2>/dev/null26 fi2728 cd - >/dev/null29 unset cmd cwd dat opt30}3132EDWARD="${EDWARD:-$(pwd)/../../bin/edward}"33[ -x "${EDWARD}" ] || \34 abort "Couldn't find edward executable '${EDWARD}'."3536REF_IMPL="$(command -v ed)"37[ -x "${REF_IMPL}" ] || \38 abort "Reference implementation not found."3940TESTDIR="/tmp/edward-test"41TESTCWD="${TESTDIR}/cwd"42EXPECTED="${TESTDIR}/expected"43ACTUAL="${TESTDIR}/actual"4445mkdir -p "${TESTDIR}"46trap "rm -rf '${TESTDIR}'" INT EXIT4748for test in *; do49 [ -d "${test}" ] || continue5051 name="${test##*/}"52 printf "Running test case '%s': " "${name}"5354 cmds="$(pwd)/${test}/cmds"55 opts="$(pwd)/${test}/opts"5657 run_editor "${REF_IMPL}" "${TESTCWD}.expected" "${test}/testdata" "${opts}" \58 > "${EXPECTED}" < "${cmds}"5960 run_editor "${EDWARD}" "${TESTCWD}.actual" "${test}/testdata" "${opts}" \61 > "${ACTUAL}" < "${cmds}"6263 diff=$(diff -ur "${TESTCWD}.expected" "${TESTCWD}.actual")64 if [ $? -ne 0 ]; then65 printf "FAIL: Modified files differ.\n\n"66 printf "%s\n" "${diff}"67 exit 168 fi6970 diff=$(diff -u "${EXPECTED}" "${ACTUAL}")71 if [ $? -ne 0 ]; then72 printf "FAIL: Standard output didn't match.\n\n"73 printf "%s\n" "${diff}"74 exit 175 fi7677 printf "OK.\n"78 rm -rf "${TESTCWD}.actual" "${TESTCWD}.expected"79done