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, 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 and it stopped applying. The Go project is deprecated and will not be updated, so there is nothing left to drift from — and a build that cannot run its own acceptance suite without cloning the implementation it replaced is not finished.
What these are for now
A regression suite, not a specification. That distinction is the whole of how to treat
them, and it changed on 2026-07-31 (TODO.md §0.1): matching the Go implementation is no
longer a goal, so a difference between it and this interpreter is not automatically a bug in
this one.
What they are still good for is unchanged and is worth a lot: forty-one real BASIC programs
with known-good output, covering arithmetic, arrays, flow control, every builtin function,
READ/DATA, labels and three worked examples. That catches regressions whatever its
provenance.
The rule for editing these
Diverge deliberately, never by accident.
A failure here means this interpreter's behaviour changed. Nine times in ten that is a bug you just introduced and the answer is to fix the code. The tenth time it is an improvement on the reference, and then the answer is:
- Change the expectation in the same commit as the code.
- Say why in the commit message.
- Add a line to
TODO.md§5, which is the list of deliberate deviations.
What is not acceptable is editing a .txt to make a red suite green without deciding which of
the two you are doing.
New cases for this project's own behaviour go in tests/language/, registered under local_*.
The prefix says which corpus a failure came from, and a diff touching tests/reference/ stands
out as the thing it is.
Divergences so far
| Case | Change | Why |
|---|---|---|
language/arithmetic/integer.txt |
Expectation grew from 4 4 2 to 4 4 2 2 |
The program has four PRINT statements and the expectation had three values. The file ends in a blank line, and both interpreters filed a blank line under the loader's cursor — which for a line with no number of its own is the number of the line before it. So 40 PRINT 4 - 2 was erased before the program ran. The reference lost it the same way, which is why the expectation was written short. Fixed by skipping blank lines in RUNSTREAM, as akbasic_runtime_load() and DLOAD already did. TODO.md §5. |
examples/strreverse.bas |
Variable INPUT$ renamed to SOURCE$ |
INPUT$ is a reserved word with a type suffix, which a real C128 refuses and which this interpreter now refuses too (TODO.md §6 item 16). The reference accepted it only because its own reserved-word check never fired. The expectation is byte-for-byte unchanged — the program still prints REVERSED: OLLEH — so the case keeps all of its value. |