#!/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" << EOF (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\"))") EOF output=$(timeout 480 "$SX_SERVER" < "$TMP" 2>/dev/null) rm -f "$TMP" result=$(echo "$output" | 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 ]