From 52da578e3f343ae286d58b717fc8bc9d5f106266 Mon Sep 17 00:00:00 2001 From: Axel Meyer Date: Mon, 1 Jun 2026 22:13:36 +0200 Subject: [PATCH] test(maps): maps_t2-t7 slot-resolution proofs for cell-tile Proves that previously-unreachable atlas slots become reachable via the cell-tile material path: slot 0 isolated (t3), slot 1 end with correct rotations (t4), slot 4 straight (t5), slot 5 tee_open (t6), slot 8 cross_open (t7). Upgrades write_test.map.json to schema_version 3 with material and vertices fields on surface so cell_material_slot + set_vertex resolve correctly in the tests. Co-Authored-By: Claude Opus 4.7 (1M context) --- init.lua | 89 ++++++++++++++++++++++++++++++++++++++++ maps/write_test.map.json | 10 ++++- 2 files changed, 98 insertions(+), 1 deletion(-) diff --git a/init.lua b/init.lua index d24a44d..abe1ee8 100644 --- a/init.lua +++ b/init.lua @@ -388,6 +388,95 @@ function M.run_tests(ctx) engine.test.assert(not ok_lay, "maps_t1: set_cell_material rejects unknown layer") + -- ===================================================================== + -- maps_t2-t7: Cell-Tile slot-resolution proofs + -- ===================================================================== + -- write_test is 4x4. Use v2_size for w/h reference (already declared earlier). + + -- maps_t2: cell_material_slot returns a non-nil record for a + -- cells_material cell. + -- Clear the surface layer's cells_material first. + for cy = 0, v2_size.h - 1 do + for cx = 0, v2_size.w - 1 do + maps.set_cell_material("surface", cx, cy, false) + end + end + maps.set_cell_material("surface", 1, 1, true) + local rec = maps.cell_material_slot("surface", 1, 1) + engine.test.assert(rec ~= nil, + "maps_t2: cell_material_slot returns non-nil for cell-tile material") + + -- maps_t3: isolated slot reachable for the first time. + -- Clear cells_material AND vertices, place an isolated paint at (2, 2). + for cy = 0, v2_size.h - 1 do + for cx = 0, v2_size.w - 1 do + maps.set_cell_material("surface", cx, cy, false) + maps.set_vertex("surface", cx, cy, false) + end + maps.set_vertex("surface", v2_size.w, cy, false) + end + for cx = 0, v2_size.w do maps.set_vertex("surface", cx, v2_size.h, false) end + maps.set_cell_material("surface", 2, 2, true) + local r3 = maps.cell_material_slot("surface", 2, 2) + engine.test.equals(r3.slot, 0, "maps_t3: slot 0 isolated reachable for first time") + engine.test.equals(r3.rot, 0, "maps_t3: isolated rot=0") + + -- maps_t4: two adjacent cells → two end-caps facing each other. + maps.set_cell_material("surface", 1, 2, true) + maps.set_cell_material("surface", 2, 2, true) + local r4a = maps.cell_material_slot("surface", 1, 2) + local r4b = maps.cell_material_slot("surface", 2, 2) + engine.test.equals(r4a.slot, 1, "maps_t4: left cell is end (slot 1)") + engine.test.equals(r4a.rot, 1, "maps_t4: left end points east (rot 1)") + engine.test.equals(r4b.slot, 1, "maps_t4: right cell is end (slot 1)") + engine.test.equals(r4b.rot, 3, "maps_t4: right end points west (rot 3)") + + -- maps_t5: 3-cell line → middle is straight. + maps.set_cell_material("surface", 0, 2, true) + -- already painted (1,2) and (2,2) from t4 + local r5 = maps.cell_material_slot("surface", 1, 2) + engine.test.equals(r5.slot, 4, "maps_t5: middle of 3-cell line is straight (slot 4)") + -- rot may be 1 or 3 (horizontal canonical); accept both + engine.test.assert(r5.rot == 1 or r5.rot == 3, + "maps_t5: straight is horizontal (rot 1 or 3)") + + -- Reset surface for t6. + for cx = 0, v2_size.w - 1 do + maps.set_cell_material("surface", cx, 2, false) + end + + -- maps_t6: T-junction at (1, 2) with arms W (0, 2), E (2, 2), S (1, 3). + -- write_test is 4x4 so (1, 3) is the last row. + maps.set_cell_material("surface", 0, 2, true) + maps.set_cell_material("surface", 1, 2, true) + maps.set_cell_material("surface", 2, 2, true) + maps.set_cell_material("surface", 1, 3, true) + local r6 = maps.cell_material_slot("surface", 1, 2) + engine.test.equals(r6.slot, 5, "maps_t6: T-junction is tee_open (slot 5)") + + -- Reset for t7. + for cy = 0, v2_size.h - 1 do + for cx = 0, v2_size.w - 1 do + maps.set_cell_material("surface", cx, cy, false) + end + end + + -- maps_t7: 4-cell "+" at (1, 1) with N (1, 0), E (2, 1), S (1, 2), W (0, 1). + maps.set_cell_material("surface", 1, 1, true) + maps.set_cell_material("surface", 1, 0, true) + maps.set_cell_material("surface", 2, 1, true) + maps.set_cell_material("surface", 1, 2, true) + maps.set_cell_material("surface", 0, 1, true) + local r7 = maps.cell_material_slot("surface", 1, 1) + engine.test.equals(r7.slot, 8, "maps_t7: cross is cross_open (slot 8) — second previously-unreachable slot reachable") + + -- Reset surface fully so later tests (if any added) start clean. + for cy = 0, v2_size.h - 1 do + for cx = 0, v2_size.w - 1 do + maps.set_cell_material("surface", cx, cy, false) + end + end + engine.exit(engine.test.failures()) end diff --git a/maps/write_test.map.json b/maps/write_test.map.json index d0a047c..dd6ee4a 100644 --- a/maps/write_test.map.json +++ b/maps/write_test.map.json @@ -1,10 +1,18 @@ { - "schema_version": 2, + "schema_version": 3, "id": "write_test", "size": { "w": 4, "h": 4 }, "atlases": ["demo_tilemap"], "layers": { "surface": { + "material": "demo_tilemap", + "vertices": [ + 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 + ], "tiles": [ 0, 0, 0, 0, 0, 0, 0, 0,