Files
settled-reach/client/tests/test_atlas_view_api.gd
T
jpmschweitzerandClaude Fable 5 56b9f135d0 test(client): add_child AtlasViewer in view-api tests — bare .new() has nil _canvas
Three of the four new tests skipped scene-tree entry, so _ready() never resolved _canvas and set_view crashed _apply_transform. Mirrors the fourth (passing) test. Targeted suite green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 20:34:01 +02:00

72 lines
3.0 KiB
GDScript

## T-1120: tests for AtlasViewer's public view-transform API (set_view() /
## get_view_offset(), paired with the pre-existing get_view_zoom()).
##
## Added for the Atlas screenshot capture matrix harness, which needs to set
## deterministic zoom/pan without simulating mouse wheel events against
## viewer internals (_view_zoom/_view_offset were previously private-only,
## review flagged reaching into them from visual_capture.gd as the wrong
## layer to poke at — this is the public surface instead).
class_name TestAtlasViewApi
extends GdUnitTestSuite
func test_set_view_applies_zoom_and_offset() -> void:
var v: AtlasViewer = auto_free(AtlasViewer.new())
add_child(v) # _canvas resolves in _ready(); a bare .new() crashes _apply_transform
v.set_view(3.0, Vector2(100.0, -40.0))
assert_that(v.get_view_zoom()).is_equal_approx(3.0, 0.001)
assert_that(v.get_view_offset()).is_equal(Vector2(100.0, -40.0))
## MIN_ZOOM/MAX_ZOOM are 0.5/8.0 (atlas_viewer.gd) — set_view() must clamp the
## same way _zoom_at()/_fit_to_view() do, so a caller can't push the view into
## a range the rest of the viewer doesn't expect.
func test_set_view_clamps_zoom_to_min_max() -> void:
var v: AtlasViewer = auto_free(AtlasViewer.new())
add_child(v)
v.set_view(0.01, Vector2.ZERO)
assert_that(v.get_view_zoom()).is_equal_approx(AtlasViewer.MIN_ZOOM, 0.001)
v.set_view(1000.0, Vector2.ZERO)
assert_that(v.get_view_zoom()).is_equal_approx(AtlasViewer.MAX_ZOOM, 0.001)
## Getter round-trip: what set_view() writes is exactly what get_view_zoom()/
## get_view_offset() read back (within the clamp), across a few values —
## guards against an off-by-transform bug (e.g. accidentally reading
## _canvas.scale/_canvas.position instead of the cached _view_zoom/_view_offset).
func test_view_getters_round_trip_after_set_view() -> void:
var v: AtlasViewer = auto_free(AtlasViewer.new())
add_child(v)
var cases: Array = [
[1.0, Vector2.ZERO],
[2.0, Vector2(50.0, 25.0)],
[4.0, Vector2(-200.0, 300.0)],
[AtlasViewer.MIN_ZOOM, Vector2(10.0, 10.0)],
[AtlasViewer.MAX_ZOOM, Vector2(-10.0, -10.0)],
]
for c: Array in cases:
var zoom: float = c[0]
var offset: Vector2 = c[1]
v.set_view(zoom, offset)
assert_that(v.get_view_zoom()).override_failure_message(
"zoom round-trip failed for input %.2f" % zoom
).is_equal_approx(zoom, 0.001)
assert_that(v.get_view_offset()).override_failure_message(
"offset round-trip failed for input %s" % offset
).is_equal(offset)
## set_view() must drive the same _canvas transform _apply_transform() drives
## for mouse-wheel zoom/drag pan — otherwise the harness would set state the
## getters report correctly but the viewport never actually renders.
func test_set_view_updates_canvas_transform() -> void:
var v: AtlasViewer = auto_free(AtlasViewer.new())
add_child(v)
v.set_view(2.5, Vector2(15.0, -5.0))
var canvas: Node2D = v.get_node("AtlasCanvas")
assert_that(canvas.scale).is_equal(Vector2(2.5, 2.5))
assert_that(canvas.position).is_equal(Vector2(15.0, -5.0))