@@ -0,0 +1,45 @@
1+#!/usr/bin/env bash
2+set -euo pipefail
3+
4+cd "$(dirname "$0")/.."
5+
6+PASS=0
7+FAIL=0
8+ERRORS=()
9+
10+for f in compile-fail/*.purs; do
11+ name=$(basename "$f" .purs)
12+ # Extract expected error pattern from first line comment: -- expect: <pattern>
13+ expected=$(head -1 "$f" | sed -n 's/^-- expect: //p')
14+
15+ output=$(eval "purs compile 'src/**/*.purs' '.spago/p/*/src/**/*.purs' '$f' --output output-compile-fail" 2>&1 || true)
16+
17+ if echo "$output" | grep -q "^Error found:"; then
18+ if [ -n "$expected" ]; then
19+ if echo "$output" | grep -q "$expected"; then
20+ printf " \033[32m✓\033[0m %s \033[2m(%s)\033[0m\n" "$name" "$expected"
21+ ((PASS++))
22+ else
23+ ERRORS+=("WRONG ERROR: $name — expected '$expected' but got different error")
24+ ((FAIL++))
25+ fi
26+ else
27+ printf " \033[32m✓\033[0m %s correctly rejected\n" "$name"
28+ ((PASS++))
29+ fi
30+ else
31+ ERRORS+=("UNEXPECTED PASS: $name compiled but should have failed")
32+ ((FAIL++))
33+ fi
34+done
35+
36+rm -rf output-compile-fail
37+
38+echo ""
39+echo "Compile-fail: $PASS passed, $FAIL failed"
40+
41+for err in "${ERRORS[@]+"${ERRORS[@]}"}"; do
42+ printf " \033[31m✗ %s\033[0m\n" "$err"
43+done
44+
45+[ "$FAIL" -eq 0 ]