Files

10 KiB

StarForth Dictionary Test Coverage — Gap Audit

Branch: lithosananke | StarForth v3.0.3 / LithosAnanke v1.0.8 Audited: 2026-06-03


Summary

Metric Count
Total registered words ~230
Words with at least one test ~115
Words with no test ~115
Test files 20
Untested word categories 5 (editor, inference, log, physics-diag, q48)

Coverage is solid for the foundational FORTH-79 core but has critical holes in control-flow completeness, format output, memory ops, and the S" word just added in v3.0.3.


Priority 1 — FORTH-79 Core: Missing Critical Words

These are standard FORTH-79 words used in virtually all real programs. Missing tests here are compliance failures.

Word(s) Source file Why critical
1+ 1- 2+ 2- 2* 2/ arithmetic_words.c Shorthand increment/shift ops; used in almost every program. Arithmetic test only covers /MOD variants, not these.
I J control_words.c Loop index access. Every DO...LOOP that reads the index uses I; nested loops need J. No test at all.
EXIT control_words.c Return from word mid-execution. Essential for early-return patterns. No test.
LEAVE control_words.c Early exit from DO...LOOP. No test.
UNLOOP control_words.c Required to clean the return stack before EXIT inside a loop. Omitting it is a stack-corruption bug; no test exercises this.
AGAIN control_words.c BEGIN...AGAIN infinite loop. Common pattern, completely untested.
CASE OF ENDOF ENDCASE control_words.c Full CASE structure. Entire construct untested.
+! -! memory_words.c Modify-in-place. The single most common memory idiom in FORTH after @ and !. No test.
FILL MOVE ERASE memory_words.c Bulk memory primitives. Used by string ops, block subsystem, array initialisation. No test.
2! memory_words.c Store double/address pair. 2@ is tested; its store partner is not.

Priority 2 — S" (New in v3.0.3) — Urgent

S" was added as a proper IMMEDIATE primitive in this release. It has zero test coverage. Regression risk is high since the implementation is new.

Word(s) Source file Gap
S" string_words.c No test for interpret-mode push (c-addr u), compile-mode inline ((s") runtime), or use inside a : definition.
(s") string_words.c Internal runtime for compiled S". Exercised only by compiled S" — needs a compile-mode test.
BL string_words.c Space-character constant. Trivial but untested; often paired with S".
SOURCE >IN string_words.c Input stream state. SOURCE returns ( c-addr u ); >IN is the offset. Both untested.

Priority 3 — Format / Output Words

format_words.c has 19 registered words. Only . and BASE/DECIMAL are touched (from io_words_test.c). The pictured numeric output group is completely dark.

Word(s) Source file Gap
HEX OCTAL format_words.c Base switching. Used constantly in systems work. No test.
.S format_words.c Print entire stack without consuming it. Core debugging primitive. No test.
? format_words.c Print cell at address (@ .). Heavily used. No test.
.R U. U.R format_words.c Right-justified and unsigned output. No test.
D. D.R format_words.c Double-number output. No test.
<# # #S #> HOLD SIGN format_words.c Pictured numeric output group. Entire 6-word subsystem untested.
DUMP format_words.c Memory hex dump. No test.

Priority 4 — Logical / Comparison Gaps

logical_words_test.c covers the common cases but misses several FORTH-79 words.

Word(s) Source file Gap
0<> logical_words.c Not-equal-to-zero. Symmetric counterpart to 0=. No test.
U< U> logical_words.c Unsigned comparison. Critical for address arithmetic and char comparisons. No test.
WITHIN logical_words.c Range test. No test.
TRUE FALSE logical_words.c Boolean constants. Untested (though they're trivially 0 and -1).

Priority 5 — Stack Word Gaps

stack_words_test.c covers DUP DROP SWAP OVER ROT DEPTH PICK ROLL. Two standard words missing:

Word(s) Source file Gap
?DUP stack_words.c Conditional dup (dup only if non-zero). Common idiom. No test.
-ROT stack_words.c Reverse rotate. Tested implicitly via ROT but never directly.

Priority 6 — Double Number Gaps

double_words_test.c is thorough but misses:

Word(s) Source file Gap
S>D double_words.c Convert single to double. The entry point for all D-word arithmetic. No test.
D2* D2/ double_words.c Double arithmetic shifts. No test.
2>R 2R> 2R@ double_words.c Double-number return stack. No test.

Priority 7 — Mixed Arithmetic Gap

Word(s) Source file Gap
M- mixed_arithmetic_words.c M+ and M* are tested; M- is not.

Priority 8 — Compilation / Meta Words

These are used to build user-defined IMMEDIATE words and to manipulate the dictionary at compile time. None are tested.

Word(s) Source file Gap
COMPILE [COMPILE] defining_words.c Used to force compilation of words inside IMMEDIATE definitions. No test.
['] string_words.c Compile-time version of ' (tick). Returns XT of next word at compile time. No test.
LIT defining_words.c Internal compile-time literal push. No test.
STATE defining_words.c / dictionary_manipulation_words.c Dual-registered. Compile/interpret switch. No test.
ALIGN dictionary_words.c Align HERE to cell boundary. No test.
' (TICK) dictionary_manipulation_words.c Fetch execution token of named word. Core of ['] and EXECUTE. No test.
LITERAL [LITERAL] string_words.c Compile a literal at runtime / inside definitions. Partially touched in io test but no dedicated test.

Priority 9 — Dictionary Traversal Words

These enable introspection of the dictionary structure. No tests at all.

Word(s) Source file Gap
>NAME NAME> dictionary_manipulation_words.c Convert between CFA and NFA. No test.
>LINK LINK> dictionary_manipulation_words.c Navigate dictionary linked list. No test.
CFA NFA LFA PFA dictionary_manipulation_words.c Classic field-access words. No test.
TRAVERSE dictionary_manipulation_words.c Walk dictionary chain. No test.
INTERPRET dictionary_manipulation_words.c The outer interpreter. No test.

Priority 10 — System Words

Word(s) Source file Gap
ABORT" (ABORT") system_words.c Conditional abort with message. Used in error handling. No test.
WORDS VLIST system_words.c Dictionary listing. No test.
SEE system_words.c Decompiler. No test.
COLD WARM system_words.c System restart/reinit. No test (understandably risky to test directly).
QUIT system_words.c Outer interpreter restart. No test.

Priority 11 — Block Word Gap

Word(s) Source file Gap
--> block_words.c Chain-load next block. Used in multi-block definitions. No test.

Priority 12 — Lifecycle / Capsule Words

Capsule-BIRTH/KILL/PAUSE/RESUME/USE have partial coverage from mama_forth tests but direct functional tests are missing.

Word(s) Source file Gap
KILL PAUSE RESUME lifecycle_words_hosted.c Capsule lifecycle management. No direct test.
USE lifecycle_words_hosted.c Switch active VM. No test.

Priority 13 — Entire Untested Categories

These word groups have zero test coverage. Lower urgency than gaps above because they are StarForth-specific extensions (not FORTH-79 compliance), but they should be ticketed.

Category Source file Word count Notes
Q48 fixed-point q48_words.c 21 POST unit tests exist for the C layer but no FORTH-word tests
Inference inference_words.c 19 Physics adaptive engine; complex to test deterministically
Log words log_words.c 7 LOG-ERROR … LOG-LEVEL@; simple but untested
Physics diagnostics physics_diagnostic_words.c 4 PHYSICS-WORD-METRICS etc.
Physics freeze physics_freeze_words.c 9 FREEZE-WORD, HEAT@, etc.
Physics benchmark physics_benchmark_words.c 6 BENCH-DICT-LOOKUP etc.
Physics pipelining diag physics_pipelining_diagnostic_words.c 6 PIPELINING-SHOW-STATS etc.
Editor editor_words.c 4 L, S, SHOW, EDIT — block editor; very low priority

Work Order (suggested sequence)

1. [ ] P1a  arithmetic_words_test.c  — add 1+ 1- 2+ 2- 2* 2/
2. [ ] P1b  control_words_test.c     — add I J EXIT LEAVE UNLOOP AGAIN
3. [ ] P1c  control_words_test.c     — add CASE OF ENDOF ENDCASE
4. [ ] P1d  memory_words_test.c      — add +! -! 2! FILL MOVE ERASE
5. [ ] P2   string_words_test.c      — add S" (s") BL SOURCE >IN
6. [ ] P3a  format_words_test.c      — new file: HEX OCTAL .S ? .R U. U.R D. D.R
7. [ ] P3b  format_words_test.c      — add <# # #S #> HOLD SIGN DUMP
8. [ ] P4   logical_words_test.c     — add 0<> U< U> WITHIN TRUE FALSE
9. [ ] P5   stack_words_test.c       — add ?DUP -ROT
10.[ ] P6   double_words_test.c      — add S>D D2* D2/ 2>R 2R> 2R@
11.[ ] P7   mixed_arithmetic_words_test.c — add M-
12.[ ] P8a  defining_words_tests.c   — add COMPILE [COMPILE] LIT STATE
13.[ ] P8b  dictionary_manipulation_words_test.c — add ' ['] ALIGN LITERAL
14.[ ] P9   dictionary_manipulation_words_test.c — add >NAME NAME> CFA NFA LFA PFA TRAVERSE INTERPRET
15.[ ] P10  system_words_test.c      — new file: ABORT" WORDS VLIST SEE
16.[ ] P11  block_words_test.c       — add -->
17.[ ] P12  lifecycle capsule tests  — add KILL PAUSE RESUME USE
18.[ ] P13a q48_words_test.c         — new file: all 21 Q48 FORTH words
19.[ ] P13b log_words_test.c         — new file: LOG-ERROR … LOG-LEVEL@
20.[ ] P13c physics words tests      — new files as needed