Files
sporel-lib-core.maps-test/README.md
Axel Meyer b9d58a5cac docs(maps-test): Coverage Statements from fault-injection audit (Test-Cov Phase 2.2)
3 mutations tested. 2 caught, 1 uncaught.
Gap M3: OOB guard removal coincidentally undetectable due to Lua nil-on-OOB-index behavior.
Future-Slice B candidate.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 02:32:06 +02:00

42 lines
2.1 KiB
Markdown

# sporel-module-lib-core.maps-test
P.3.1 reference test-module — validates `lib-core.maps` API contracts
via the `engine.test.*` assertion surface.
- Module-ID: `lib-core.maps-test`
- Version: `0.1.0`
- Kind: `test-module` (headless; runs init() once + exits)
- Spec: `meta/docs/superpowers/specs/2026-05-10-test-module-pattern-design.md`
## Run
```bash
Sporel.exe --module=lib-core.maps-test
```
Output is TAP version 13 on stdout; exit-code = failure-count (0 = all pass).
## Coverage Statements (2026-05-16 Fault-Injection Audit)
Verified via deliberate-mutation in fixture-mirror; mutations reverted after observation.
### Caught Mutations
| # | Mutation | Caught by |
|---|---|---|
| M1 | `M.tile_at` renamed to `M._tile_at_disabled` (API-break) | Runtime error "attempt to call a nil value (field 'tile_at')" — test aborts at assertion 4 |
| M2 | `M.is_walkable` body prefixed with `do return false end` (always-false logic) | Assertion "grass interior walkable" (ok 7) — `not ok` with actual=false |
### Uncaught Mutations (Gaps)
| # | Mutation | Why uncaught | Severity |
|---|---|---|---|
| M3 | OOB guard in `M.tile_at` removed (`if tx < 0 or ...` commented out) | Lua's 1-indexed tables return `nil` for index 0 and negative indices, so all tested OOB coordinates (`-1,0` and `0,16`) still incidentally produce `nil` without the guard | Low |
**Resolution per Gap:**
- Gap M3: Headless-reachable in principle, but OOB guard is coincidentally shadowed by Lua nil-on-out-of-range semantics for all tested coordinates. The existing assertions (`tile_at(-1,0)=nil`, `tile_at(0,16)=nil`) pass whether the guard is present or not. Cheap fill would require a case where removal causes *non-nil* (e.g. a wrapping scenario) — not applicable here. Classify as Future-Slice B: note that guard correctness is invisible to current test vectors; no cheap fix available (asserting the guard itself is not meaningful headless-side).
### Tested Production-Lib Surface
`lib-core.maps` v0.1.0 — Tests cover behavior of: `maps.load`, `maps.set_current`, `maps.size`, `maps.tile_size`, `maps.tile_at` (2-arg and 3-arg nil-fallback forms), `maps.is_walkable`, `maps.list`.