1write_sub_test_lib_test () {
2	name="$1" # stdin is the body of the test code
3	mkdir "$name" &&
4	write_script "$name/$name.sh" "$TEST_SHELL_PATH" <<-EOF &&
5	test_description='A test of test-lib.sh itself'
6
7	# Point to the t/test-lib.sh, which isn't in ../ as usual
8	. "\$TEST_DIRECTORY"/test-lib.sh
9	EOF
10	cat >>"$name/$name.sh"
11}
12
13_run_sub_test_lib_test_common () {
14	cmp_op="$1" want_code="$2" name="$3" # stdin is the body of the test code
15	shift 3
16
17	# intercept pseudo-options at the front of the argument list that we
18	# will not pass to child script
19	skip=
20	while test $# -gt 0
21	do
22		case "$1" in
23		--skip=*)
24			skip=${1#--*=}
25			shift
26			;;
27		*)
28			break
29			;;
30		esac
31	done
32
33	(
34		cd "$name" &&
35
36		# Pretend we're not running under a test harness, whether we
37		# are or not. The test-lib output depends on the setting of
38		# this variable, so we need a stable setting under which to run
39		# the sub-test.
40		sane_unset HARNESS_ACTIVE &&
41
42		export TEST_DIRECTORY &&
43		# The child test re-sources GIT-BUILD-OPTIONS and may thus
44		# override the test output directory. We thus pass it as an
45		# explicit override to the child.
46		TEST_OUTPUT_DIRECTORY_OVERRIDE=$(pwd) &&
47		export TEST_OUTPUT_DIRECTORY_OVERRIDE &&
48		GIT_SKIP_TESTS=$skip &&
49		export GIT_SKIP_TESTS &&
50		sane_unset GIT_TEST_FAIL_PREREQS &&
51		./"$name.sh" "$@" >out 2>err;
52		ret=$? &&
53		test "$ret" "$cmp_op" "$want_code"
54	)
55}
56
57write_and_run_sub_test_lib_test () {
58	name="$1" descr="$2" # stdin is the body of the test code
59	write_sub_test_lib_test "$@" || return 1
60	_run_sub_test_lib_test_common -eq 0 "$@"
61}
62
63write_and_run_sub_test_lib_test_err () {
64	name="$1" descr="$2" # stdin is the body of the test code
65	write_sub_test_lib_test "$@" || return 1
66	_run_sub_test_lib_test_common -eq 1 "$@"
67}
68
69run_sub_test_lib_test () {
70	_run_sub_test_lib_test_common -eq 0 "$@"
71}
72
73run_sub_test_lib_test_err () {
74	_run_sub_test_lib_test_common -eq 1 "$@"
75}
76
77_check_sub_test_lib_test_common () {
78	name="$1" &&
79	sed -e 's/^> //' -e 's/Z$//' >"$name"/expect.out &&
80	test_cmp "$name"/expect.out "$name"/out
81}
82
83check_sub_test_lib_test () {
84	name="$1" # stdin is the expected output from the test
85	_check_sub_test_lib_test_common "$name" &&
86	test_must_be_empty "$name"/err
87}
88
89check_sub_test_lib_test_err () {
90	name="$1" # stdin is the expected output from the test
91	_check_sub_test_lib_test_common "$name" &&
92	# expected error output is in descriptor 3
93	sed -e 's/^> //' -e 's/Z$//' <&3 >"$name"/expect.err &&
94	test_cmp "$name"/expect.err "$name"/err
95}
96