edward

An extensible POSIX-compatible implementation of the ed(1) text editor

git clone https://git.8pit.net/edward.git

 1#!/bin/sh
 2
 3cd "$(dirname "$0")"
 4
 5abort() {
 6	printf "${1}\n" 1>&2
 7	exit 1
 8}
 9
10run_editor() {
11	[ $# -eq 4 ] || exit 1
12	cmd="${1}"
13	cwd="${2}"
14	dat="${3}"
15	opt="${4}"
16
17	mkdir "${cwd}"
18	[ -d "${dat}" ] && cp -r "${dat}" "${cwd}"
19	cd "${cwd}"
20
21	if [ -s "${opt}" ]; then
22		set -- $(cat "${opt}")
23		"${cmd}" $@ 2>/dev/null
24	else
25		"${cmd}" 2>/dev/null
26	fi
27
28	cd - >/dev/null
29	unset cmd cwd dat opt
30}
31
32EDWARD="${EDWARD:-$(pwd)/../../bin/edward}"
33[ -x "${EDWARD}" ] || \
34	abort "Couldn't find edward executable '${EDWARD}'."
35
36REF_IMPL="$(command -v ed)"
37[ -x "${REF_IMPL}" ] || \
38	abort "Reference implementation not found."
39
40TESTDIR="/tmp/edward-test"
41TESTCWD="${TESTDIR}/cwd"
42EXPECTED="${TESTDIR}/expected"
43ACTUAL="${TESTDIR}/actual"
44
45mkdir -p "${TESTDIR}"
46trap "rm -rf '${TESTDIR}'" INT EXIT
47
48for test in *; do
49	[ -d "${test}" ] || continue
50
51	name="${test##*/}"
52	printf "Running test case '%s': " "${name}"
53
54	cmds="$(pwd)/${test}/cmds"
55	opts="$(pwd)/${test}/opts"
56
57	run_editor "${EDWARD}" "${TESTCWD}.actual" "${test}/testdata" "${opts}" \
58		> "${ACTUAL}" < "${cmds}"
59
60	output="$(pwd)/${test}/output"
61	if [ -f "${output}" ]; then
62		cp "${output}" "${EXPECTED}"
63	else
64		run_editor "${REF_IMPL}" "${TESTCWD}.expected" "${test}/testdata" "${opts}" \
65			> "${EXPECTED}" < "${cmds}"
66	
67		diff=$(diff -ur "${TESTCWD}.expected" "${TESTCWD}.actual")
68		if [ $? -ne 0 ]; then
69			printf "FAIL: Modified files differ.\n\n"
70			printf "%s\n" "${diff}"
71			exit 1
72		fi
73	fi
74
75	diff=$(diff -u "${EXPECTED}" "${ACTUAL}")
76	if [ $? -ne 0 ]; then
77		printf "FAIL: Standard output didn't match.\n\n"
78		printf "%s\n" "${diff}"
79		exit 1
80	fi
81
82	printf "OK.\n"
83	rm -rf "${TESTCWD}.actual" "${TESTCWD}.expected"
84done