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) <noreply@anthropic.com>
This commit is contained in:
Axel Meyer
2026-06-01 22:13:36 +02:00
parent b68b1d4fba
commit 52da578e3f
2 changed files with 98 additions and 1 deletions

View File

@@ -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

View File

@@ -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,