Record the real coverage numbers, and how they were nearly misreported

93.5% of lines and 97.8% of functions, up from 92.3% and 96.9% across roughly 800
new lines. The verb groups added for goal 2 carry the new surface: the two table
files and runtime_input.c at 100%, runtime_graphics.c and runtime_audio.c at 98%,
play.c at 87%.

The first reading of that number was wrong and the reason is worth keeping. A
stale build-cov/ left in the source directory by an earlier session was silently
folded in by `gcovr --root .`, which reported the *previous* run's 92.3% for a
tree that had grown by 800 lines -- a number that looked plausible precisely
because it had not moved. That is libakgl defect #13 happening here rather than
there, and build*/ being gitignored is what makes it invisible. Section 8 now
says to check `find . -name '*.gcda'` before believing a coverage figure that
looks suspiciously unchanged.

Also documents the akgl build and test commands in the README, which had none.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-31 08:51:27 -04:00
parent da50da70b5
commit ff7bec9f55
2 changed files with 26 additions and 6 deletions

View File

@@ -16,6 +16,12 @@ ctest --test-dir build --output-on-failure
# API documentation, into build/docs/html # API documentation, into build/docs/html
doxygen Doxyfile doxygen Doxyfile
# With the libakgl-backed sink and devices. Off by default, because this pulls in
# SDL3 and the whole interpreter builds and tests without it.
cmake -S . -B build-akgl -DAKBASIC_WITH_AKGL=ON
cmake --build build-akgl --parallel
SDL_VIDEODRIVER=dummy SDL_AUDIODRIVER=dummy ctest --test-dir build-akgl --output-on-failure
``` ```
There are two workflows. **`.gitea/workflows/ci.yaml`** runs on every push: the suite, There are two workflows. **`.gitea/workflows/ci.yaml`** runs on every push: the suite,

26
TODO.md
View File

@@ -797,16 +797,30 @@ entire test corpus and passes clean under ASan and UBSan.
| Gate | Result | | Gate | Result |
|---|---| |---|---|
| `ctest` | 61/61 — 41 golden cases, 17 unit tests, 2 embedding examples, 1 known-failing | | `ctest` | 70/70 — 41 upstream golden cases, 5 local ones, 21 unit tests, 2 embedding examples, 1 known-failing |
| `ctest` with `-DAKBASIC_WITH_AKGL=ON` | 71/71 — the above plus `akgl_backends` |
| Golden corpus | 41/41 byte-exact, driven in place from the submodule | | Golden corpus | 41/41 byte-exact, driven in place from the submodule |
| ASan + UBSan | 61/61 | | ASan + UBSan | 70/70 |
| Line coverage | 92.3% (2823/3058) — above the 90% gate | | Line coverage | 93.5% (3631/3884) — above the 90% gate |
| Function coverage | 96.9% (221/228) | | Function coverage | 97.8% (269/275) |
| Warnings | none under `-Wall -Wextra` | | Warnings | none under `-Wall -Wextra` |
| `doxygen Doxyfile` | clean; 114/114 public declarations documented | | `doxygen Doxyfile` | clean |
| Mutation (`src/convert.c`, `src/symtab.c`) | see `.gitea/workflows/ci.yaml` for the current score and gate | | Mutation (`src/convert.c`, `src/symtab.c`) | see `.gitea/workflows/ci.yaml` for the current score and gate |
Branch coverage reads 17.3% and is not a target, for the reason `libakgl/TODO.md` and Coverage of the verb groups added for goal 2, since they are the new surface: `src/audio_tables.c`
and `src/graphics_tables.c` 100%, `src/runtime_input.c` 100%, `src/runtime_graphics.c` and
`src/runtime_audio.c` 98%, `src/play.c` 87%. The `akbasic_akgl` target is not in the coverage
figure — it is not built in a default configuration.
**A note on reading that number, because it was misread once while producing it.** A stale
`build-cov/` left in the source directory from an earlier session was silently folded into the
report by `gcovr --root .`, which produced the *previous* run's 92.3% for a tree that had grown
by 800 lines. That is `libakgl` defect #13 happening here rather than there, and `build*/` being
gitignored is exactly what makes it invisible. **Keep build trees out of the source directory**,
and if a coverage number looks suspiciously unchanged, `find . -name '*.gcda'` before believing
it.
Branch coverage reads 18.0% and is not a target, for the reason `libakgl/TODO.md` and
`libakstdlib/TODO.md` both give: the akerror control-flow macros expand into large branch trees `libakstdlib/TODO.md` both give: the akerror control-flow macros expand into large branch trees
at every call site, most of them unreachable in normal operation. Track line and function at every call site, most of them unreachable in normal operation. Track line and function
coverage. coverage.