#!/bin/bash
# tests/zoe-favorites-test.sh — runs the CL compatibility + Zoë
# favorites acceptance suite across every tier. See ticket 0004,
# ticket 0005, and whitepaper §9.2.
#
# Coverage:
#   Python + C + asm-full : tests/cl-compat.lsp (macro + shim)
#   Python + C + asm-full : tests/ursa.lsp      (Scheme port + CL)
#   asm (minimal)         : tests/ursa-scheme.lsp (Scheme port only —
#                                                  asm has no macros)
set -e
ulimit -v 524288
cd "$(dirname "$0")/.."
trap 'pkill -9 -u "$USER" -f "c/lumbda\|asm/lumbda" 2>/dev/null || true' EXIT INT TERM

echo "═══════════════════════════════════════════════════════"
echo "Zoë Trout's favorites — CL compat + Scheme ports"
echo "═══════════════════════════════════════════════════════"

FAIL=0
run_one() {
    local impl="$1" cmd="$2" input="$3"
    echo ""
    echo "── $impl: $input ──"
    # asm exits 1 on EOF; treat non-zero as failure only when no
    # assertion output implies a real crash. We rely on PASS/FAIL
    # lines being counted by each test file's own summary.
    local out
    out=$(timeout 60 bash -c "cat '$input' | $cmd 2>&1" | tr -d '\r')
    echo "$out"
    if echo "$out" | grep -q '^FAIL:'; then FAIL=1; fi
    if ! echo "$out" | grep -qE '[0-9]+ passed'; then FAIL=1; fi
}

# Tiers with full macro support.
run_one "Python"   "python3 lumbda.py" "tests/cl-compat.lsp"
run_one "C"        "c/lumbda"          "tests/cl-compat.lsp"
run_one "asm-full" "asm/lumbda-full"   "tests/cl-compat.lsp"
run_one "Python"   "python3 lumbda.py" "tests/ursa.lsp"
run_one "C"        "c/lumbda"          "tests/ursa.lsp"
run_one "asm-full" "asm/lumbda-full"   "tests/ursa.lsp"

# Minimal asm — Scheme port only (no cl-compat / cl-loop macros).
run_one "asm"      "asm/lumbda"        "tests/ursa-scheme.lsp"

echo ""
echo "═══════════════════════════════════════════════════════"
if [ $FAIL -eq 0 ]; then
    echo "All Zoë-favorites tests passed (Python + C + asm + asm-full)"
else
    echo "SOME TESTS FAILED"
fi
echo "═══════════════════════════════════════════════════════"
exit $FAIL
