#!/bin/sh # test/run — driver for `make test`. Plan 9 rc-flavoured but plain sh. # # Walks the test/ tree: # test/wcc/_.c → out/bin/test_ binary, run it. # test/lang//*.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/wcc/*.c; do [ -f "$t" ] || continue name=${t##*/} name=${name%.c} # strip leading _ 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//*.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: ` 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"