## T-1182 tests: StepCanvasAnnotationLayer — the unscaled screen-space ## sibling's world->screen placement math (course polylines, settlement ## markers) and course visibility/terminus handling. Draw-call correctness ## itself needs a live render pass (this cluster's existing "state-level is ## fine" allowance, per test_atlas_descend_entry.gd's own precedent) — these ## tests pin the FRAME state (_world_to_local, _cell_center_world_m) a draw ## call would read from, without requiring a SubViewport. class_name TestStepCanvasAnnotationLayer extends GdUnitTestSuite const StepCanvasTransport := preload("res://ui/implant/apps/atlas/step_canvas/step_canvas_transport.gd") func test_set_frame_stores_the_frame_and_triggers_no_crash_on_draw() -> void: var layer: StepCanvasAnnotationLayer = auto_free(StepCanvasAnnotationLayer.new()) add_child(layer) var canvas := { "width": 4, "height": 4, "courses": [], "settlement_id": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], } layer.set_frame(canvas, Vector2(1000.0, 2000.0), "District", Vector2i(4, 4)) # No assertion beyond "did not crash" — set_frame()/queue_redraw() with a # well-formed empty-feature canvas is the baseline no-op path every # richer test below builds on. assert_object(layer).is_not_null() func test_clear_frame_drops_the_held_canvas() -> void: var layer: StepCanvasAnnotationLayer = auto_free(StepCanvasAnnotationLayer.new()) add_child(layer) layer.set_frame({"width": 1, "height": 1, "courses": []}, Vector2.ZERO, "Chunk", Vector2i(1, 1)) layer.clear_frame() assert_that(layer._canvas).is_null() ## _cell_center_world_m() is the inverse of step_canvas.rs's own per-cell ## placement (center_world_m + (col - half_w) * step_m) — a settlement id ## read from cell (col, row) must map back to the world point that cell was ## actually derived at. func test_cell_center_world_m_matches_the_servers_own_per_cell_placement() -> void: var layer: StepCanvasAnnotationLayer = auto_free(StepCanvasAnnotationLayer.new()) add_child(layer) layer.set_frame({"width": 4, "height": 4, "courses": []}, Vector2(0.0, 0.0), "District", Vector2i(4, 4)) # half_w = half_h = 2; spacing = 2048. Cell (0,0) -> (0-2)*2048 = -4096 on # both axes; cell (2,2) (the center-ish cell) -> (2-2)*2048 = 0. assert_that(layer._cell_center_world_m(0, 0)).is_equal(Vector2(-4096.0, -4096.0)) assert_that(layer._cell_center_world_m(2, 2)).is_equal(Vector2.ZERO) func test_cell_center_world_m_offsets_by_the_frames_world_center() -> void: var layer: StepCanvasAnnotationLayer = auto_free(StepCanvasAnnotationLayer.new()) add_child(layer) layer.set_frame( {"width": 2, "height": 2, "courses": []}, Vector2(10_000.0, 20_000.0), "Chunk", Vector2i(2, 2) ) # half_w = half_h = 1; spacing = 64. Cell (1,1) -> center + (1-1)*64 = center. assert_that(layer._cell_center_world_m(1, 1)).is_equal(Vector2(10_000.0, 20_000.0)) ## _world_to_local() delegates to StepCanvasTransport.world_m_to_canvas_local ## with the layer's OWN held frame — this pins that the layer actually reads ## its stored _world_center/_rung/_extent_cells, not stale defaults. func test_world_to_local_uses_the_held_frame() -> void: var layer: StepCanvasAnnotationLayer = auto_free(StepCanvasAnnotationLayer.new()) add_child(layer) var world_center := Vector2(5_000.0, -3_000.0) var extent := Vector2i(32, 32) layer.set_frame({"width": 32, "height": 32, "courses": []}, world_center, "Quarter", extent) var expected: Vector2 = StepCanvasTransport.world_m_to_canvas_local( world_center, world_center, "Quarter", extent ) assert_that(layer._world_to_local(world_center)).is_equal_approx(expected, Vector2(0.01, 0.01))