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>
72 lines
3.0 KiB
GDScript
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))
|