smalltalk: conformance.sh + scoreboard.{json,md}
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Has been cancelled
This commit is contained in:
99
lib/smalltalk/conformance.sh
Executable file
99
lib/smalltalk/conformance.sh
Executable file
@@ -0,0 +1,99 @@
|
||||
#!/usr/bin/env bash
|
||||
# Smalltalk-on-SX conformance runner.
|
||||
#
|
||||
# Runs the full test suite once with per-file detail, pulls out the
|
||||
# classic-corpus numbers, and writes:
|
||||
# lib/smalltalk/scoreboard.json — machine-readable summary
|
||||
# lib/smalltalk/scoreboard.md — human-readable summary
|
||||
#
|
||||
# Usage: bash lib/smalltalk/conformance.sh
|
||||
|
||||
set -uo pipefail
|
||||
cd "$(git rev-parse --show-toplevel)"
|
||||
|
||||
OUT_JSON="lib/smalltalk/scoreboard.json"
|
||||
OUT_MD="lib/smalltalk/scoreboard.md"
|
||||
|
||||
DATE=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
||||
|
||||
# Catalog .st programs in the corpus.
|
||||
PROGRAMS=()
|
||||
for f in lib/smalltalk/tests/programs/*.st; do
|
||||
[ -f "$f" ] || continue
|
||||
PROGRAMS+=("$(basename "$f" .st)")
|
||||
done
|
||||
NUM_PROGRAMS=${#PROGRAMS[@]}
|
||||
|
||||
# Run the full test suite with per-file detail.
|
||||
RUNNER_OUT=$(bash lib/smalltalk/test.sh -v 2>&1)
|
||||
RC=$?
|
||||
|
||||
# Final summary line: "OK 403/403 ..." or "FAIL 400/403 ...".
|
||||
ALL_SUM=$(echo "$RUNNER_OUT" | grep -E '^(OK|FAIL) [0-9]+/[0-9]+' | tail -1)
|
||||
ALL_PASS=$(echo "$ALL_SUM" | grep -oE '[0-9]+/[0-9]+' | head -1 | cut -d/ -f1)
|
||||
ALL_TOTAL=$(echo "$ALL_SUM" | grep -oE '[0-9]+/[0-9]+' | head -1 | cut -d/ -f2)
|
||||
|
||||
# Per-file pass counts (verbose lines look like "OK <path> N passed").
|
||||
get_pass () {
|
||||
local fname="$1"
|
||||
echo "$RUNNER_OUT" | awk -v f="$fname" '
|
||||
$0 ~ f { for (i=1; i<=NF; i++) if ($i ~ /^[0-9]+$/) { print $i; exit } }'
|
||||
}
|
||||
|
||||
PROG_PASS=$(get_pass "tests/programs.sx")
|
||||
PROG_PASS=${PROG_PASS:-0}
|
||||
|
||||
# scoreboard.json
|
||||
{
|
||||
printf '{\n'
|
||||
printf ' "date": "%s",\n' "$DATE"
|
||||
printf ' "programs": [\n'
|
||||
for i in "${!PROGRAMS[@]}"; do
|
||||
sep=","; [ "$i" -eq "$((NUM_PROGRAMS - 1))" ] && sep=""
|
||||
printf ' "%s.st"%s\n' "${PROGRAMS[$i]}" "$sep"
|
||||
done
|
||||
printf ' ],\n'
|
||||
printf ' "program_count": %d,\n' "$NUM_PROGRAMS"
|
||||
printf ' "program_tests_passed": %s,\n' "$PROG_PASS"
|
||||
printf ' "all_tests_passed": %s,\n' "$ALL_PASS"
|
||||
printf ' "all_tests_total": %s,\n' "$ALL_TOTAL"
|
||||
printf ' "exit_code": %d\n' "$RC"
|
||||
printf '}\n'
|
||||
} > "$OUT_JSON"
|
||||
|
||||
# scoreboard.md
|
||||
{
|
||||
printf '# Smalltalk-on-SX Scoreboard\n\n'
|
||||
printf '_Last run: %s_\n\n' "$DATE"
|
||||
|
||||
printf '## Totals\n\n'
|
||||
printf '| Suite | Passing |\n'
|
||||
printf '|-------|---------|\n'
|
||||
printf '| All Smalltalk-on-SX tests | **%s / %s** |\n' "$ALL_PASS" "$ALL_TOTAL"
|
||||
printf '| Classic-corpus tests (`tests/programs.sx`) | **%s** |\n\n' "$PROG_PASS"
|
||||
|
||||
printf '## Classic-corpus programs (`lib/smalltalk/tests/programs/`)\n\n'
|
||||
printf '| Program | Status |\n'
|
||||
printf '|---------|--------|\n'
|
||||
for prog in "${PROGRAMS[@]}"; do
|
||||
printf '| `%s.st` | present |\n' "$prog"
|
||||
done
|
||||
printf '\n'
|
||||
|
||||
printf '## Per-file test counts\n\n'
|
||||
printf '```\n'
|
||||
echo "$RUNNER_OUT" | grep -E '^(OK|X) lib/smalltalk/tests/' | sort
|
||||
printf '```\n\n'
|
||||
|
||||
printf '## Notes\n\n'
|
||||
printf -- '- The spec interpreter is correct but slow (call/cc + dict-based ivars per send).\n'
|
||||
printf -- '- Larger Life multi-step verification, the 8-queens canonical case, and the glider-gun pattern are deferred to the JIT path.\n'
|
||||
printf -- '- Generated by `bash lib/smalltalk/conformance.sh`. Both files are committed; the runner overwrites them on each run.\n'
|
||||
} > "$OUT_MD"
|
||||
|
||||
echo "Scoreboard updated:"
|
||||
echo " $OUT_JSON"
|
||||
echo " $OUT_MD"
|
||||
echo "Programs: $NUM_PROGRAMS Corpus tests: $PROG_PASS All: $ALL_PASS/$ALL_TOTAL"
|
||||
|
||||
exit $RC
|
||||
15
lib/smalltalk/scoreboard.json
Normal file
15
lib/smalltalk/scoreboard.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"date": "2026-04-25T07:53:18Z",
|
||||
"programs": [
|
||||
"eight-queens.st",
|
||||
"fibonacci.st",
|
||||
"life.st",
|
||||
"mandelbrot.st",
|
||||
"quicksort.st"
|
||||
],
|
||||
"program_count": 5,
|
||||
"program_tests_passed": 39,
|
||||
"all_tests_passed": 403,
|
||||
"all_tests_total": 403,
|
||||
"exit_code": 0
|
||||
}
|
||||
44
lib/smalltalk/scoreboard.md
Normal file
44
lib/smalltalk/scoreboard.md
Normal file
@@ -0,0 +1,44 @@
|
||||
# Smalltalk-on-SX Scoreboard
|
||||
|
||||
_Last run: 2026-04-25T07:53:18Z_
|
||||
|
||||
## Totals
|
||||
|
||||
| Suite | Passing |
|
||||
|-------|---------|
|
||||
| All Smalltalk-on-SX tests | **403 / 403** |
|
||||
| Classic-corpus tests (`tests/programs.sx`) | **39** |
|
||||
|
||||
## Classic-corpus programs (`lib/smalltalk/tests/programs/`)
|
||||
|
||||
| Program | Status |
|
||||
|---------|--------|
|
||||
| `eight-queens.st` | present |
|
||||
| `fibonacci.st` | present |
|
||||
| `life.st` | present |
|
||||
| `mandelbrot.st` | present |
|
||||
| `quicksort.st` | present |
|
||||
|
||||
## Per-file test counts
|
||||
|
||||
```
|
||||
OK lib/smalltalk/tests/blocks.sx 19 passed
|
||||
OK lib/smalltalk/tests/cannot_return.sx 5 passed
|
||||
OK lib/smalltalk/tests/conditional.sx 25 passed
|
||||
OK lib/smalltalk/tests/dnu.sx 15 passed
|
||||
OK lib/smalltalk/tests/eval.sx 68 passed
|
||||
OK lib/smalltalk/tests/nlr.sx 14 passed
|
||||
OK lib/smalltalk/tests/parse_chunks.sx 21 passed
|
||||
OK lib/smalltalk/tests/parse.sx 47 passed
|
||||
OK lib/smalltalk/tests/programs.sx 39 passed
|
||||
OK lib/smalltalk/tests/runtime.sx 64 passed
|
||||
OK lib/smalltalk/tests/super.sx 9 passed
|
||||
OK lib/smalltalk/tests/tokenize.sx 63 passed
|
||||
OK lib/smalltalk/tests/while.sx 14 passed
|
||||
```
|
||||
|
||||
## Notes
|
||||
|
||||
- The spec interpreter is correct but slow (call/cc + dict-based ivars per send).
|
||||
- Larger Life multi-step verification, the 8-queens canonical case, and the glider-gun pattern are deferred to the JIT path.
|
||||
- Generated by `bash lib/smalltalk/conformance.sh`. Both files are committed; the runner overwrites them on each run.
|
||||
Reference in New Issue
Block a user