Files
akbasic/tests/reference/README.md
Andrew Kesterson eb5374d212 Check the reference corpus in, so the build stops needing the Go submodule
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>
2026-07-31 12:35:40 -04:00

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.