diff --git a/lib/go/conformance.conf b/lib/go/conformance.conf new file mode 100644 index 00000000..b86399cb --- /dev/null +++ b/lib/go/conformance.conf @@ -0,0 +1,65 @@ +# Go-on-SX conformance config — sourced by lib/guest/conformance.sh. +# +# Like erlang: suites load into one session and each exposes a pass counter and +# a *count* (total) counter, not a fail counter. dict mode fits — each runner is +# a dict literal computing :failed as count - pass. + +LANG_NAME=go +MODE=dict + +PRELOADS=( + lib/guest/lex.sx + lib/guest/ast.sx + lib/guest/pratt.sx + lib/go/lex.sx + lib/go/parse.sx + lib/go/types.sx + lib/go/sched.sx + lib/go/eval.sx + lib/go/std/strings.sx + lib/go/std/strconv.sx +) + +# name:file:(runner) — runner is a dict literal {:passed :failed :total}. +SUITES=( + "lex:lib/go/tests/lex.sx:{:passed go-test-pass :failed (- go-test-count go-test-pass) :total go-test-count}" + "parse:lib/go/tests/parse.sx:{:passed go-parse-test-pass :failed (- go-parse-test-count go-parse-test-pass) :total go-parse-test-count}" + "types:lib/go/tests/types.sx:{:passed go-types-test-pass :failed (- go-types-test-count go-types-test-pass) :total go-types-test-count}" + "eval:lib/go/tests/eval.sx:{:passed go-eval-test-pass :failed (- go-eval-test-count go-eval-test-pass) :total go-eval-test-count}" + "runtime:lib/go/tests/runtime.sx:{:passed go-rt-test-pass :failed (- go-rt-test-count go-rt-test-pass) :total go-rt-test-count}" + "stdlib:lib/go/tests/stdlib.sx:{:passed go-std-test-pass :failed (- go-std-test-count go-std-test-pass) :total go-std-test-count}" + "e2e:lib/go/tests/e2e.sx:{:passed go-e2e-test-pass :failed (- go-e2e-test-count go-e2e-test-pass) :total go-e2e-test-count}" +) + +# Preserve the historical scoreboard schema so consumers of +# lib/go/scoreboard.json keep working. +emit_scoreboard_json() { + local n=${#GC_NAMES[@]} i status + printf '{\n' + printf ' "language": "go",\n' + printf ' "total_pass": %d,\n' "$GC_TOTAL_PASS" + printf ' "total": %d,\n' "$GC_TOTAL" + printf ' "suites": [' + for ((i=0; i&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" - "eval|go-eval-test-pass|go-eval-test-count" - "runtime|go-rt-test-pass|go-rt-test-count" - "stdlib|go-std-test-pass|go-std-test-count" - "e2e|go-e2e-test-pass|go-e2e-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/sched.sx") -(load "lib/go/eval.sx") -(load "lib/go/std/strings.sx") -(load "lib/go/std/strconv.sx") -(load "lib/go/tests/lex.sx") -(load "lib/go/tests/parse.sx") -(load "lib/go/tests/types.sx") -(load "lib/go/tests/eval.sx") -(load "lib/go/tests/runtime.sx") -(load "lib/go/tests/stdlib.sx") -(load "lib/go/tests/e2e.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 <