Files
rose-ash/lib/ocaml/baseline/run.sh
giles de7be332c8
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 33s
ocaml: phase 5.1 baseline OCaml programs (5/5 pass) + lookahead boundary
lib/ocaml/baseline/{factorial,list_ops,option_match,module_use,sum_squares}.ml
exercised through ocaml-run-program (file-read F). lib/ocaml/baseline/
run.sh runs them and compares against expected.json — all 5 pass.

To make module_use.ml (with nested let-in) parse, parser's
skip-let-rhs-boundary! now uses has-matching-in? lookahead: a let at
depth 0 in a let-decl rhs opens a nested block IFF a matching in
exists before any decl-keyword. Without that in, the let is a new
top-level decl (preserves test 274 'let x = 1 let y = 2').

This is the first piece of Phase 5.1 'vendor a slice of OCaml
testsuite' — handcrafted fixtures for now, real testsuite TBD.
2026-05-08 13:33:24 +00:00

76 lines
2.0 KiB
Bash
Executable File

#!/usr/bin/env bash
# lib/ocaml/baseline/run.sh — run each baseline OCaml program through
# ocaml-run-program and compare to expected.json.
set -uo pipefail
cd "$(git rev-parse --show-toplevel)"
SX_SERVER="${SX_SERVER:-hosts/ocaml/_build/default/bin/sx_server.exe}"
if [ ! -x "$SX_SERVER" ]; then
SX_SERVER="/root/rose-ash/hosts/ocaml/_build/default/bin/sx_server.exe"
fi
PASS=0
FAIL=0
ERRORS=""
for f in lib/ocaml/baseline/*.ml; do
name=$(basename "$f")
expected=$(grep -oE "\"$name\"[[:space:]]*:[[:space:]]*[0-9-]+" lib/ocaml/baseline/expected.json | sed -E 's/.*:[[:space:]]*//')
if [ -z "$expected" ]; then
continue
fi
TMP=$(mktemp)
cat > "$TMP" << EPOCHS
(epoch 1)
(load "lib/guest/lex.sx")
(load "lib/guest/prefix.sx")
(load "lib/guest/pratt.sx")
(load "lib/ocaml/tokenizer.sx")
(load "lib/ocaml/parser.sx")
(load "lib/ocaml/eval.sx")
(load "lib/ocaml/runtime.sx")
(eval "(ocaml-load-stdlib!)")
(epoch 2)
(eval "(ocaml-run-program (file-read \\"$f\\"))")
EPOCHS
output=$(timeout 60 "$SX_SERVER" < "$TMP" 2>/dev/null | grep -E '^\(ok-len 2|^\(ok 2' | head -1)
rm -f "$TMP"
# Pull the next line which has the value
result=$(timeout 60 "$SX_SERVER" < <(cat <<EPOCHS
(epoch 1)
(load "lib/guest/lex.sx")
(load "lib/guest/prefix.sx")
(load "lib/guest/pratt.sx")
(load "lib/ocaml/tokenizer.sx")
(load "lib/ocaml/parser.sx")
(load "lib/ocaml/eval.sx")
(load "lib/ocaml/runtime.sx")
(eval "(ocaml-load-stdlib!)")
(epoch 2)
(eval "(ocaml-run-program (file-read \"$f\"))")
EPOCHS
) 2>/dev/null | awk '/^\(ok-len 2 / {getline; print; exit} /^\(ok 2 / {sub(/^\(ok 2 /, ""); sub(/\)$/, ""); print; exit}')
if [ "$result" = "$expected" ]; then
PASS=$((PASS + 1))
echo " ok $name$result"
else
FAIL=$((FAIL + 1))
ERRORS+=" FAIL $name expected=$expected got=$result
"
fi
done
TOTAL=$((PASS + FAIL))
if [ $FAIL -eq 0 ]; then
echo "ok $PASS/$TOTAL baseline OCaml programs run correctly"
else
echo "FAIL $PASS/$TOTAL baseline programs"
echo "$ERRORS"
fi
[ $FAIL -eq 0 ]