run.sh raw
1 #!/bin/bash
2 # Spawn test suite for Moxie.
3 # Runs each test program through the moxie compiler and checks results.
4 set -euo pipefail
5
6 MOXIE="${MOXIE:-./moxie}"
7 MOXIEROOT="${MOXIEROOT:-$(cd "$(dirname "$0")/../.." && pwd)}"
8 export MOXIEROOT
9 TESTDIR="$(cd "$(dirname "$0")" && pwd)"
10 TMPDIR=$(mktemp -d)
11 STAGEROOT="$MOXIEROOT/tests/_spawn_stage_$$"
12 mkdir -p "$STAGEROOT"
13 trap "rm -rf $TMPDIR $STAGEROOT" EXIT
14
15 export PATH="/usr/lib/llvm19/bin:$PATH"
16
17 pass=0
18 fail=0
19 skip=0
20
21 # stage_src copies $1 to a fresh per-test package directory under the moxie
22 # tree so the package resolver can find it, and prints the package path.
23 stage_src() {
24 local src="$1"
25 local name=$(basename "$src" .go)
26 local stage="$STAGEROOT/$name"
27 mkdir -p "$stage"
28 cp "$src" "$stage/main.go"
29 echo "./tests/_spawn_stage_$$/$name"
30 }
31
32 run_pass_test() {
33 local src="$1"
34 local name=$(basename "$src" .go)
35 local bin="$TMPDIR/$name"
36 local pkg
37 pkg=$(stage_src "$src")
38
39 if ! (cd "$MOXIEROOT" && "$MOXIE" build -o "$bin" "$pkg") 2>"$TMPDIR/$name.err"; then
40 echo "FAIL $name: compilation failed"
41 cat "$TMPDIR/$name.err"
42 fail=$((fail + 1))
43 return
44 fi
45
46 local output
47 output=$(timeout 5 "$bin" 2>&1 || true)
48
49 # Check that no FAIL markers appear and at least one PASS marker does.
50 if echo "$output" | grep -q "FAIL:"; then
51 echo "FAIL $name: wrong values received"
52 echo "$output"
53 fail=$((fail + 1))
54 return
55 fi
56 if echo "$output" | grep -q "PASS:"; then
57 local passes=$(echo "$output" | grep -c "PASS:" || true)
58 echo "OK $name ($passes checks)"
59 pass=$((pass + 1))
60 else
61 echo "FAIL $name: no PASS markers in output"
62 echo "$output"
63 fail=$((fail + 1))
64 fi
65 }
66
67 run_fail_test() {
68 local src="$1"
69 local pattern="$2"
70 local name=$(basename "$src" .go)
71 local bin="$TMPDIR/$name"
72 local pkg
73 pkg=$(stage_src "$src")
74
75 local errout
76 if errout=$(cd "$MOXIEROOT" && "$MOXIE" build -o "$bin" "$pkg" 2>&1); then
77 echo "FAIL $name: compilation should have failed"
78 fail=$((fail + 1))
79 return
80 fi
81
82 if echo "$errout" | grep -qi "$pattern"; then
83 echo "OK $name (rejected: $pattern)"
84 pass=$((pass + 1))
85 else
86 echo "FAIL $name: expected error containing '$pattern'"
87 echo "$errout"
88 fail=$((fail + 1))
89 fi
90 }
91
92 echo "=== Spawn positive tests ==="
93 for src in "$TESTDIR"/pass_*.go; do
94 run_pass_test "$src"
95 done
96
97 echo ""
98 echo "=== Spawn negative tests ==="
99 run_fail_test "$TESTDIR/fail_pointer.go" "pointer"
100 run_fail_test "$TESTDIR/fail_func.go" "function"
101 run_fail_test "$TESTDIR/fail_interface.go" "interface"
102 run_fail_test "$TESTDIR/fail_empty_iface.go" "interface"
103 run_fail_test "$TESTDIR/fail_slice_iface.go" "interface"
104 run_fail_test "$TESTDIR/fail_struct_chan.go" "channel"
105 run_fail_test "$TESTDIR/fail_array_chan.go" "channel"
106 run_fail_test "$TESTDIR/fail_alias.go" "after spawn"
107 run_fail_test "$TESTDIR/fail_type_mismatch.go" "expects"
108 run_fail_test "$TESTDIR/fail_wrong_count.go" "expects"
109
110 echo ""
111 echo "=== Results: $pass passed, $fail failed ==="
112 [ "$fail" -eq 0 ]
113