#!/bin/sh
# test/run — driver for `make test`. Plan 9 rc-flavoured but plain sh.
#
# Walks the test/ tree:
#   test/wwc/<NNN>_<name>.c → out/bin/test_<name> binary, run it.
#   test/lang/<phase>/*.ww  → compile/run via $WW, compare stdout/exit
#                              with header comments (// expected: ...).
# Exit non-zero on first failure.

set -e

BIN=${BIN:-out/bin}
WW=${WW:-$BIN/ww}

fail=0
ran=0

# ---- C-side unit tests --------------------------------------------------
for t in test/wwc/*.c; do
	[ -f "$t" ] || continue
	name=${t##*/}
	name=${name%.c}
	# strip leading <NNN>_
	short=${name#[0-9][0-9][0-9]_}
	bin=$BIN/test_$short
	if [ ! -x "$bin" ]; then
		echo "SKIP $name (no binary $bin)"
		continue
	fi
	if "$bin" >"$BIN/.$short.out" 2>"$BIN/.$short.err"; then
		echo "ok   $name"
	else
		rc=$?
		echo "FAIL $name (rc=$rc)"
		echo "--- stdout ---"
		cat "$BIN/.$short.out"
		echo "--- stderr ---"
		cat "$BIN/.$short.err"
		fail=$((fail + 1))
	fi
	ran=$((ran + 1))
done

# ---- ww source-level tests ----------------------------------------------
# Each test/lang/<phase>/*.ww has a header:
#   // expected-exit: 0
#   // expected-stdout: hello world
# These run with `ww run`; phases that don't compile yet skip entries
# that begin with `// phase: <N>` if N > current.
if [ -d test/lang ]; then
	for f in test/lang/*/*.ww; do
		[ -f "$f" ] || continue
		# Skip until ww run exists; placeholder for phase 7+
		echo "skip $f (ww run not online yet)"
	done
fi

if [ $ran -eq 0 ]; then
	echo "no tests were run"
	exit 1
fi
if [ $fail -gt 0 ]; then
	echo "$fail test(s) failed"
	exit 1
fi
echo "all $ran tests passed"
