#!/usr/bin/env bash # Go-on-SX conformance runner. # # Loads every Go-on-SX test suite via the epoch protocol, collects # pass/fail counts, and writes lib/go/scoreboard.json + .md. # # Usage: # bash lib/go/conformance.sh # run all suites # bash lib/go/conformance.sh -v # verbose per-suite 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 if [ ! -x "$SX_SERVER" ]; then echo "ERROR: sx_server.exe not found." >&2 exit 1 fi VERBOSE="${1:-}" TMPFILE=$(mktemp) OUTFILE=$(mktemp) trap "rm -f $TMPFILE $OUTFILE" EXIT # Each suite: name | pass-counter | total-counter SUITES=( "lex|go-test-pass|go-test-count" "parse|go-parse-test-pass|go-parse-test-count" "types|go-types-test-pass|go-types-test-count" ) cat > "$TMPFILE" <<'EPOCHS' (epoch 1) (load "lib/guest/lex.sx") (load "lib/guest/ast.sx") (load "lib/guest/pratt.sx") (load "lib/go/lex.sx") (load "lib/go/parse.sx") (load "lib/go/types.sx") (load "lib/go/tests/lex.sx") (load "lib/go/tests/parse.sx") (load "lib/go/tests/types.sx") EPOCHS idx=0 for entry in "${SUITES[@]}"; do name="${entry%%|*}" pass_var=$(echo "$entry" | awk -F'|' '{print $2}') total_var=$(echo "$entry" | awk -F'|' '{print $3}') epoch=$((100 + idx)) echo "(epoch $epoch)" >> "$TMPFILE" echo "(eval \"(list $pass_var $total_var)\")" >> "$TMPFILE" idx=$((idx + 1)) done "$SX_SERVER" < "$TMPFILE" > "$OUTFILE" 2>&1 parse_pair() { local epoch="$1" local line line=$(grep -A1 "^(ok-len $epoch " "$OUTFILE" | tail -1) echo "$line" | sed -E 's/[()]//g' } TOTAL_PASS=0 TOTAL_COUNT=0 JSON_SUITES="" MD_ROWS="" idx=0 for entry in "${SUITES[@]}"; do name="${entry%%|*}" epoch=$((100 + idx)) pair=$(parse_pair "$epoch") pass=$(echo "$pair" | awk '{print $1}') count=$(echo "$pair" | awk '{print $2}') if [ -z "$pass" ] || [ -z "$count" ]; then pass=0 count=0 fi TOTAL_PASS=$((TOTAL_PASS + pass)) TOTAL_COUNT=$((TOTAL_COUNT + count)) status="ok" marker="✅" if [ "$pass" != "$count" ]; then status="fail" marker="❌" fi if [ "$VERBOSE" = "-v" ]; then printf " %-12s %s/%s\n" "$name" "$pass" "$count" fi if [ -n "$JSON_SUITES" ]; then JSON_SUITES+=","; fi JSON_SUITES+=$'\n ' JSON_SUITES+="{\"name\":\"$name\",\"pass\":$pass,\"total\":$count,\"status\":\"$status\"}" MD_ROWS+="| $marker | $name | $pass | $count |"$'\n' idx=$((idx + 1)) done printf '\nGo-on-SX conformance: %d / %d\n' "$TOTAL_PASS" "$TOTAL_COUNT" cat > lib/go/scoreboard.json < lib/go/scoreboard.md <