All 41 .bas/.txt pairs copied byte for byte from basicinterpreter@d76162c into tests/reference/, plus the Commodore font into assets/fonts/ -- the two things that tied the build to deps/basicinterpret. Both were verified cmp-identical to the submodule copies. This reverses a decision that was deliberate and correct at the time: the corpus was driven in place because copying a submodule's corpus guarantees drift. Overruled on purpose -- the Go dependency is being deprecated, and a build that cannot run its acceptance suite without cloning the implementation it replaced is not finished. tests/reference/README.md records what the drift now costs and that those expectations are never edited. Checked rather than assumed: both configurations configure, build and pass from scratch with deps/basicinterpret moved out of the tree entirely. The submodule is kept as the behavioural spec, which is a real use. The font came with an open licence question; assets/fonts/PROVENANCE.md states it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2.6 KiB
The reference interpreter's own test corpus
These 41 .bas files and their 41 .txt expectations are not this project's tests. They
are a byte-for-byte copy of the acceptance corpus belonging to the Go implementation this
interpreter was ported from:
| Source | https://source.starfort.tech/andrew/basicinterpreter, tests/ |
| Copied at | commit d76162cb37eeaccddae2cf6cab7af7bc8175d6d2 ("Update README.md") |
| Copied on | 2026-07-31 |
| Verified | every file cmp-identical to the submodule at the time of the copy |
They are registered as the golden_* CTest cases and run against basic on every build, in
both the default and the -DAKBASIC_WITH_AKGL=ON configurations.
Why they are a copy now, when they deliberately were not
Until 2026-07-31 these were driven in place out of deps/basicinterpret, and the reasoning
was written down in CMakeLists.txt: the corpus is a submodule, and copying a submodule's
corpus guarantees drift.
That reasoning was sound. It was overruled on purpose, because the Go dependency is being deprecated and a build that cannot run its own acceptance suite without cloning the implementation it replaced is not finished.
What the change costs, stated plainly so nobody has to rediscover it: if the Go implementation ever gains a test, this directory will not. There is no longer anything watching for that. The trade is deliberate — the Go project is the thing being retired, so a corpus that stops tracking it is a corpus that stopped tracking something that stopped moving.
The rule for editing these
Don't.
This directory is a record of what the Go implementation did, and it is what makes the claim
"reproduces the reference byte for byte" checkable at all. A failure here means this
interpreter's behaviour changed, and the answer is to change this interpreter or to record a
deliberate deviation in TODO.md §5 — never to edit the expectation to match.
New cases for this project's own behaviour go in tests/language/, which is registered under
local_* for exactly this reason: the prefix says which corpus a failure came from, and a diff
that touches tests/reference/ stands out as the thing it is.
There is one case worth knowing about before anybody "fixes" it.
examples/strreverse.bas names a variable INPUT$, which a real Commodore 128 would refuse
and which this interpreter accepts only because the reference's reserved-word check never
fires. That is TODO.md §6 item 16, and it is the reason that item is filed as a decision
rather than a defect: making the check work costs this case.