|
|
|
@@ -16,16 +16,34 @@ const StepCanvasTransport := preload("res://ui/implant/apps/atlas/step_canvas/st
|
|
|
|
|
## .cache/screenshots/t1183-eyeball-run2/02-region.png.
|
|
|
|
|
const GJ1C_GLOBAL_EXTENT := Vector2i(177, 88)
|
|
|
|
|
|
|
|
|
|
## Isolated Tier-2/3 disk-cache root for every directly-constructed viewer
|
|
|
|
|
## (T-1193 first slice). The default user://atlas_cache/ is SHARED across the
|
|
|
|
|
## whole machine — every worktree's gate run, live capture driver, and real
|
|
|
|
|
## play session writes the same directory — and T-1183's disk-cache lookup
|
|
|
|
|
## short-circuits BEFORE test_mode's silent-no-op IPC, so a warm shared cache
|
|
|
|
|
## delivers real canvases into tests written against "nothing ever arrives"
|
|
|
|
|
## (2026-07-25: a concurrent live GJ380c Global capture flipped the two
|
|
|
|
|
## before-any-canvas tests in another worktree's gate run). In test_mode the
|
|
|
|
|
## isolated root stays empty forever: no canvas ever arrives, so the cache
|
|
|
|
|
## never writes.
|
|
|
|
|
const TEST_DISK_CACHE_ROOT := "user://test_step_canvas_viewer_cache/"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _make_viewer() -> StepCanvasViewer:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
v.disk_cache_root_override = TEST_DISK_CACHE_ROOT
|
|
|
|
|
return v
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func test_enter_lands_on_the_global_opener() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.enter({"body_id": "GJ380c", "body_radius_km": 6238.4}, {})
|
|
|
|
|
assert_str(v.get_held_rung()).is_equal(StepCanvasTransport.RUNG_GLOBAL)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func test_get_body_id_reflects_the_entered_body() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
assert_str(v.get_body_id()).is_equal("")
|
|
|
|
|
v.enter({"body_id": "GJ380c", "body_radius_km": 6238.4}, {})
|
|
|
|
@@ -35,7 +53,7 @@ func test_get_body_id_reflects_the_entered_body() -> void:
|
|
|
|
|
## Scrolling one notch descends the ladder — cursor-anchored, so a cursor
|
|
|
|
|
## position must be supplied; the rung index advances by exactly one.
|
|
|
|
|
func test_scroll_rung_descends_one_notch() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.enter({"body_id": "GJ380c", "body_radius_km": 6238.4}, {})
|
|
|
|
|
v._scroll_rung(1, Vector2(400.0, 300.0))
|
|
|
|
@@ -43,7 +61,7 @@ func test_scroll_rung_descends_one_notch() -> void:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func test_scroll_rung_clamps_at_the_deepest_rung() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.enter({"body_id": "GJ380c", "body_radius_km": 6238.4}, {})
|
|
|
|
|
for _i in range(10):
|
|
|
|
@@ -52,7 +70,7 @@ func test_scroll_rung_clamps_at_the_deepest_rung() -> void:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func test_reset_to_global_returns_from_a_deep_rung() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.enter({"body_id": "GJ380c", "body_radius_km": 6238.4}, {})
|
|
|
|
|
v._scroll_rung(1, Vector2(400.0, 300.0))
|
|
|
|
@@ -71,7 +89,7 @@ func test_reset_to_global_returns_from_a_deep_rung() -> void:
|
|
|
|
|
## regression (scroll_step() clamping at index 0 meant _scroll_rung()
|
|
|
|
|
## returned before ever reaching a reset call).
|
|
|
|
|
func test_scroll_out_at_global_after_a_pan_resets_the_view() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.enter({"body_id": "GJ380c", "body_radius_km": 6238.4}, {})
|
|
|
|
|
assert_str(v.get_held_rung()).is_equal(StepCanvasTransport.RUNG_GLOBAL)
|
|
|
|
@@ -94,7 +112,7 @@ func test_scroll_out_at_global_after_a_pan_resets_the_view() -> void:
|
|
|
|
|
## (un-drifted) Global frame must stay a no-op — the reset is edge-triggered
|
|
|
|
|
## on genuine drift, not a per-scroll unconditional reset.
|
|
|
|
|
func test_scroll_out_at_undrifted_global_is_a_no_op() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.enter({"body_id": "GJ380c", "body_radius_km": 6238.4}, {})
|
|
|
|
|
v._scroll_rung(-1, Vector2(400.0, 300.0))
|
|
|
|
@@ -103,21 +121,21 @@ func test_scroll_out_at_undrifted_global_is_a_no_op() -> void:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func test_overlay_visibility_defaults_to_off_for_every_toggle() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
for def: Dictionary in v.get_overlay_defs():
|
|
|
|
|
assert_bool(v.is_overlay_visible(def["id"])).is_false()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func test_set_overlay_visible_updates_state() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.set_overlay_visible("gen_dw_temp", true)
|
|
|
|
|
assert_bool(v.is_overlay_visible("gen_dw_temp")).is_true()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func test_set_overlay_visible_unknown_id_is_a_no_op() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.set_overlay_visible("not_a_real_overlay", true)
|
|
|
|
|
assert_bool(v.is_overlay_visible("not_a_real_overlay")).is_false()
|
|
|
|
@@ -201,7 +219,7 @@ static func _synthetic_canvas(width: int, height: int) -> Dictionary:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func test_maybe_refloat_is_inert_before_any_canvas_has_arrived() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.enter({"body_id": "GJ380c", "body_radius_km": 6238.4}, {})
|
|
|
|
|
v._scroll_rung(1, Vector2(400.0, 300.0)) # District — footprint still ZERO, nothing arrived
|
|
|
|
@@ -214,7 +232,7 @@ func test_maybe_refloat_is_inert_before_any_canvas_has_arrived() -> void:
|
|
|
|
|
## the held canvas keeps drawing, no re-request (§4/§5's "only when a pan
|
|
|
|
|
## carries the view past the held window's edge").
|
|
|
|
|
func test_maybe_refloat_does_not_refloat_on_a_small_pan() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.size = Vector2(800.0, 600.0) # a real viewport size — _maybe_refloat's
|
|
|
|
|
# drift math is relative to get_rect().size's own center; leaving this at
|
|
|
|
@@ -244,7 +262,7 @@ func test_maybe_refloat_does_not_refloat_on_a_small_pan() -> void:
|
|
|
|
|
## world_center, view_offset reset to ZERO (the canvas re-centers under the
|
|
|
|
|
## new request).
|
|
|
|
|
func test_maybe_refloat_refloats_once_the_pan_crosses_the_edge_threshold() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.enter({"body_id": "GJ380c", "body_radius_km": 6238.4}, {})
|
|
|
|
|
v._scroll_rung(1, Vector2(400.0, 300.0)) # District
|
|
|
|
@@ -266,7 +284,7 @@ func test_maybe_refloat_refloats_once_the_pan_crosses_the_edge_threshold() -> vo
|
|
|
|
|
## Global never re-floats on pan (D-255(a): its canvas is the whole body,
|
|
|
|
|
## no edge to cross) — even with a real texture held and a huge drift.
|
|
|
|
|
func test_maybe_refloat_is_a_no_op_at_global_rung() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.enter({"body_id": "GJ380c", "body_radius_km": 6238.4}, {})
|
|
|
|
|
v._terrain_layer.rebuild_from_canvas(_synthetic_canvas(200, 100), v.get_held_rung(), "")
|
|
|
|
@@ -284,7 +302,7 @@ func test_maybe_refloat_is_a_no_op_at_global_rung() -> void:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func test_edge_scroll_suppressed_without_application_focus() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.size = Vector2(800.0, 600.0)
|
|
|
|
|
v._app_has_focus = false
|
|
|
|
@@ -293,7 +311,7 @@ func test_edge_scroll_suppressed_without_application_focus() -> void:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func test_edge_scroll_suppressed_when_cursor_has_never_moved_over_the_control() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.size = Vector2(800.0, 600.0)
|
|
|
|
|
# _last_mouse_pos defaults to (-1, -1) — an impossible in-bounds position,
|
|
|
|
@@ -303,7 +321,7 @@ func test_edge_scroll_suppressed_when_cursor_has_never_moved_over_the_control()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func test_edge_scroll_active_near_the_left_edge() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.size = Vector2(800.0, 600.0)
|
|
|
|
|
v._app_has_focus = true
|
|
|
|
@@ -315,7 +333,7 @@ func test_edge_scroll_active_near_the_left_edge() -> void:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func test_edge_scroll_active_near_the_right_edge() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.size = Vector2(800.0, 600.0)
|
|
|
|
|
v._app_has_focus = true
|
|
|
|
@@ -325,7 +343,7 @@ func test_edge_scroll_active_near_the_right_edge() -> void:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func test_edge_scroll_inactive_well_inside_the_viewport() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.size = Vector2(800.0, 600.0)
|
|
|
|
|
v._app_has_focus = true
|
|
|
|
@@ -345,7 +363,7 @@ func test_edge_scroll_inactive_well_inside_the_viewport() -> void:
|
|
|
|
|
## ever cached under it, so the sweep is a true no-op read (no writes to the
|
|
|
|
|
## real user://atlas_cache/ directory this test could leak).
|
|
|
|
|
func test_enter_runs_the_disk_cache_visit_sweep_without_crashing() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.enter({"body_id": "T1183_sweep_smoke_test_body", "body_radius_km": 6238.4}, {})
|
|
|
|
|
# If the wiring is broken (e.g. calling a method that doesn't exist), the
|
|
|
|
@@ -358,7 +376,7 @@ func test_enter_runs_the_disk_cache_visit_sweep_without_crashing() -> void:
|
|
|
|
|
## Timer node, not a _process()-driven counter), autostarts, and is set to
|
|
|
|
|
## the documented coarse interval — never a sub-frame or per-frame value.
|
|
|
|
|
func test_disk_sweep_timer_is_coarse_and_autostarts() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
var timer: Timer = v.get_node("DiskSweepTimer")
|
|
|
|
|
assert_object(timer).is_not_null()
|
|
|
|
@@ -383,7 +401,7 @@ func test_disk_sweep_timer_is_coarse_and_autostarts() -> void:
|
|
|
|
|
## non-blocking test speed) against an injected-root request so this test
|
|
|
|
|
## touches no real cache files.
|
|
|
|
|
func test_disk_sweep_timeout_handler_runs_background_sweep_for_the_current_body() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.enter({"body_id": "T1183_sweep_smoke_test_body", "body_radius_km": 6238.4}, {})
|
|
|
|
|
# No live server, no cached entries for this body — the assertion is
|
|
|
|
@@ -422,7 +440,7 @@ static func _land_global_canvas(v: StepCanvasViewer, width: int, height: int) ->
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func test_global_canvas_arrival_populates_the_body_extent_cap_source() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.enter({"body_id": "T1189_extent_letterbox_test_body", "body_radius_km": 6371.0}, {})
|
|
|
|
|
TestStepCanvasViewer._land_global_canvas(v, GJ1C_GLOBAL_EXTENT.x, GJ1C_GLOBAL_EXTENT.y)
|
|
|
|
@@ -434,7 +452,7 @@ func test_global_canvas_arrival_populates_the_body_extent_cap_source() -> void:
|
|
|
|
|
## scrolling to Region and firing its request must produce a CAPPED extent
|
|
|
|
|
## — never the raw viewport-fit 384x216 that overran the body on both axes.
|
|
|
|
|
func test_region_request_extent_is_capped_to_the_landed_global_extent() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.size = Vector2(1920.0, 1080.0) # the T-1183 eyeball's own viewport
|
|
|
|
|
v.enter({"body_id": "T1189_extent_letterbox_test_body", "body_radius_km": 6371.0}, {})
|
|
|
|
@@ -457,7 +475,7 @@ func test_region_request_extent_is_capped_to_the_landed_global_extent() -> void:
|
|
|
|
|
## ZERO — the Region request must go out UNCAPPED (server clamps
|
|
|
|
|
## independently) rather than silently collapsing to a zero-cell request.
|
|
|
|
|
func test_region_request_extent_is_uncapped_before_the_global_echo_lands() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.size = Vector2(1920.0, 1080.0)
|
|
|
|
|
v.enter({"body_id": "T1189_extent_letterbox_test_body", "body_radius_km": 6371.0}, {})
|
|
|
|
@@ -481,7 +499,7 @@ func test_region_request_extent_is_uncapped_before_the_global_echo_lands() -> vo
|
|
|
|
|
## same key, capped or not, never a key built from one extent and served
|
|
|
|
|
## under another.
|
|
|
|
|
func test_capped_extent_matches_what_the_request_actually_sends() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.size = Vector2(1920.0, 1080.0)
|
|
|
|
|
v.enter({"body_id": "T1189_extent_letterbox_test_body", "body_radius_km": 6371.0}, {})
|
|
|
|
@@ -515,7 +533,7 @@ func test_capped_extent_matches_what_the_request_actually_sends() -> void:
|
|
|
|
|
## proving the cap is spacing-keyed, not applied indiscriminately to every
|
|
|
|
|
## rung once a Global extent is known.
|
|
|
|
|
func test_district_request_extent_is_never_capped_by_the_global_extent() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.size = Vector2(1920.0, 1080.0)
|
|
|
|
|
v.enter({"body_id": "T1189_extent_letterbox_test_body", "body_radius_km": 6371.0}, {})
|
|
|
|
@@ -538,7 +556,7 @@ func test_district_request_extent_is_never_capped_by_the_global_extent() -> void
|
|
|
|
|
## region grid") — this proves it, through the real enter()/land/enter()
|
|
|
|
|
## sequence rather than asserting the field directly only.
|
|
|
|
|
func test_global_body_extent_resets_on_a_different_body_and_does_not_leak() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.size = Vector2(1920.0, 1080.0)
|
|
|
|
|
|
|
|
|
@@ -575,7 +593,7 @@ func test_global_body_extent_resets_on_a_different_body_and_does_not_leak() -> v
|
|
|
|
|
## have computed a non-zero centering offset (unless the canvas happens to
|
|
|
|
|
## exactly fill the viewport, not the case here).
|
|
|
|
|
func test_global_canvas_arrival_centers_the_view_not_top_left() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.size = Vector2(1920.0, 1080.0)
|
|
|
|
|
v.enter({"body_id": "T1189_extent_letterbox_test_body", "body_radius_km": 6371.0}, {})
|
|
|
|
@@ -596,7 +614,7 @@ func test_global_canvas_arrival_centers_the_view_not_top_left() -> void:
|
|
|
|
|
## legend-reserved 1920x1080 case (R=9, scale=1.8) AND the 4K case (R=20,
|
|
|
|
|
## scale=4.0) — the SAME formula, no separate coverage-threshold branch.
|
|
|
|
|
func test_global_canvas_scale_yields_an_exact_integer_pixels_per_gridunit_ratio() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.size = Vector2(1920.0, 1080.0)
|
|
|
|
|
v.enter({"body_id": "T1189_extent_letterbox_test_body", "body_radius_km": 6371.0}, {})
|
|
|
|
@@ -618,7 +636,7 @@ func test_global_canvas_scale_yields_an_exact_integer_pixels_per_gridunit_ratio(
|
|
|
|
|
## too (20/5 = 4.0) — confirms the 1080p case above isn't a coincidence of
|
|
|
|
|
## a small viewport, just the same formula at a different achievable ratio.
|
|
|
|
|
func test_global_canvas_scale_at_4k_also_yields_an_exact_integer_ratio() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.size = Vector2(3840.0, 2160.0)
|
|
|
|
|
v.enter({"body_id": "T1189_extent_letterbox_test_body", "body_radius_km": 6371.0}, {})
|
|
|
|
@@ -633,7 +651,7 @@ func test_global_canvas_scale_at_4k_also_yields_an_exact_integer_ratio() -> void
|
|
|
|
|
## stays 1.0 once the player has descended past Global, even though a
|
|
|
|
|
## Global canvas was landed earlier in the same session.
|
|
|
|
|
func test_fixed_rung_canvas_scale_stays_one_after_descending_from_global() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.size = Vector2(1920.0, 1080.0)
|
|
|
|
|
v.enter({"body_id": "T1189_extent_letterbox_test_body", "body_radius_km": 6371.0}, {})
|
|
|
|
@@ -654,7 +672,7 @@ func test_fixed_rung_canvas_scale_stays_one_after_descending_from_global() -> vo
|
|
|
|
|
## and centered, its drawn rect's LEFT edge must be at or past the legend's
|
|
|
|
|
## own right edge, never underneath it.
|
|
|
|
|
func test_global_canvas_left_edge_never_overlaps_the_legend_column() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.size = Vector2(1920.0, 1080.0)
|
|
|
|
|
v.enter({"body_id": "T1189_extent_letterbox_test_body", "body_radius_km": 6371.0}, {})
|
|
|
|
@@ -671,7 +689,7 @@ func test_global_canvas_left_edge_never_overlaps_the_legend_column() -> void:
|
|
|
|
|
## one — _notification(NOTIFICATION_RESIZED) wires _recompute_canvas_transform()
|
|
|
|
|
## for exactly this case.
|
|
|
|
|
func test_resize_recenters_an_already_held_global_canvas() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.size = Vector2(1920.0, 1080.0)
|
|
|
|
|
v.enter({"body_id": "T1189_extent_letterbox_test_body", "body_radius_km": 6371.0}, {})
|
|
|
|
@@ -695,7 +713,7 @@ func test_resize_recenters_an_already_held_global_canvas() -> void:
|
|
|
|
|
## under 1.0, end-to-end through the real viewer wiring, not just the pure
|
|
|
|
|
## transport function this mirrors.
|
|
|
|
|
func test_global_canvas_scale_never_drops_below_native_on_a_narrow_viewport() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.size = Vector2(348.0 + StepCanvasTransport.LEGEND_COLUMN_PX, 1080.0)
|
|
|
|
|
v.enter({"body_id": "T1189_extent_letterbox_test_body", "body_radius_km": 6371.0}, {})
|
|
|
|
@@ -720,7 +738,7 @@ func test_global_canvas_scale_never_drops_below_native_on_a_narrow_viewport() ->
|
|
|
|
|
## (verified end-to-end, through act(), in test_atlas_agent_interface.gd;
|
|
|
|
|
## this is the narrower unit-level check directly against the viewer).
|
|
|
|
|
func test_jump_to_sets_held_rung_and_world_center() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.enter({"body_id": "GJ380c", "body_radius_km": 6238.4}, {})
|
|
|
|
|
|
|
|
|
@@ -733,7 +751,7 @@ func test_jump_to_sets_held_rung_and_world_center() -> void:
|
|
|
|
|
## Omitting `rung` keeps whatever rung is currently held — the "revisit
|
|
|
|
|
## within the same rung" common case shouldn't require repeating it.
|
|
|
|
|
func test_jump_to_keeps_current_rung_when_omitted() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.enter({"body_id": "GJ380c", "body_radius_km": 6238.4}, {})
|
|
|
|
|
v._scroll_rung(1, Vector2(400.0, 300.0)) # Region
|
|
|
|
@@ -746,7 +764,7 @@ func test_jump_to_keeps_current_rung_when_omitted() -> void:
|
|
|
|
|
## Jumping to Global always forces world_center to ZERO — Global has no
|
|
|
|
|
## panned-center concept (mirrors _scroll_rung()'s own Global-rung handling).
|
|
|
|
|
func test_jump_to_global_forces_world_center_to_zero() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.enter({"body_id": "GJ380c", "body_radius_km": 6238.4}, {})
|
|
|
|
|
v._scroll_rung(1, Vector2(400.0, 300.0)) # Region
|
|
|
|
@@ -757,7 +775,7 @@ func test_jump_to_global_forces_world_center_to_zero() -> void:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func test_jump_to_unrecognized_rung_is_a_no_op() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.enter({"body_id": "GJ380c", "body_radius_km": 6238.4}, {})
|
|
|
|
|
var rung_before: String = v.get_held_rung()
|
|
|
|
@@ -770,7 +788,7 @@ func test_jump_to_unrecognized_rung_is_a_no_op() -> void:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func test_get_current_canvas_summary_before_any_canvas_arrives() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.enter({"body_id": "GJ380c", "body_radius_km": 6238.4}, {})
|
|
|
|
|
|
|
|
|
@@ -786,7 +804,7 @@ func test_get_current_canvas_summary_before_any_canvas_arrives() -> void:
|
|
|
|
|
## StepCanvasAnnotationLayer._draw_settlements()'s own dedup discipline —
|
|
|
|
|
## covering the same cell id twice must not double-count).
|
|
|
|
|
func test_get_current_canvas_summary_counts_match_a_fixture_canvas() -> void:
|
|
|
|
|
var v: StepCanvasViewer = auto_free(StepCanvasViewer.new())
|
|
|
|
|
var v: StepCanvasViewer = _make_viewer()
|
|
|
|
|
add_child(v)
|
|
|
|
|
v.enter({"body_id": "GJ380c", "body_radius_km": 6238.4}, {})
|
|
|
|
|
v._scroll_rung(1, Vector2(400.0, 300.0)) # Region
|
|
|
|
|