## T-1182 tests: StepCanvasViewer — the rung transport state machine ## (enter() lands on the Global opener, scroll steps through the ladder, ## overlay toggle wiring) and RegionalScreen's re-entry guard against the ## new viewer. test_mode (SimBridge default outside SR_LIVE=1) means ## request_step_canvas() is a silent no-op — these tests exercise ## client-side state only, matching test_atlas_view_api.gd's own ## no-live-server convention for viewer-internals tests. class_name TestStepCanvasViewer extends GdUnitTestSuite const StepCanvasTransport := preload("res://ui/implant/apps/atlas/step_canvas/step_canvas_transport.gd") func test_enter_lands_on_the_global_opener() -> void: var v: StepCanvasViewer = auto_free(StepCanvasViewer.new()) 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()) add_child(v) assert_str(v.get_body_id()).is_equal("") v.enter({"body_id": "GJ380c", "body_radius_km": 6238.4}, {}) assert_str(v.get_body_id()).is_equal("GJ380c") ## 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()) add_child(v) v.enter({"body_id": "GJ380c", "body_radius_km": 6238.4}, {}) v._scroll_rung(1, Vector2(400.0, 300.0)) assert_str(v.get_held_rung()).is_equal(StepCanvasTransport.RUNG_REGION) func test_scroll_rung_clamps_at_the_deepest_rung() -> void: var v: StepCanvasViewer = auto_free(StepCanvasViewer.new()) add_child(v) v.enter({"body_id": "GJ380c", "body_radius_km": 6238.4}, {}) for _i in range(10): v._scroll_rung(1, Vector2(400.0, 300.0)) assert_str(v.get_held_rung()).is_equal(StepCanvasTransport.RUNG_CHUNK) func test_reset_to_global_returns_from_a_deep_rung() -> void: var v: StepCanvasViewer = auto_free(StepCanvasViewer.new()) add_child(v) v.enter({"body_id": "GJ380c", "body_radius_km": 6238.4}, {}) v._scroll_rung(1, Vector2(400.0, 300.0)) v._scroll_rung(1, Vector2(400.0, 300.0)) v._reset_to_global() assert_str(v.get_held_rung()).is_equal(StepCanvasTransport.RUNG_GLOBAL) func test_overlay_visibility_defaults_to_off_for_every_toggle() -> void: var v: StepCanvasViewer = auto_free(StepCanvasViewer.new()) 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()) 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()) add_child(v) v.set_overlay_visible("not_a_real_overlay", true) assert_bool(v.is_overlay_visible("not_a_real_overlay")).is_false() # ============================================================================= # RegionalScreen re-entry guard (BUG 2 lineage, carried forward from the # retired AtlasWindowViewer-era regression) — now against StepCanvasViewer. # ============================================================================= func test_regional_screen_repeat_enter_for_the_same_body_is_a_no_op() -> void: var screen: RegionalScreen = auto_free(RegionalScreen.new()) add_child(screen) var body: Dictionary = {"body_id": "GJ380c", "body_radius_km": 6238.4} screen.enter({"body": body, "system": {}}) screen._viewer._scroll_rung(1, Vector2(400.0, 300.0)) assert_str(screen._viewer.get_held_rung()).is_equal(StepCanvasTransport.RUNG_REGION) screen.enter({"body": body, "system": {}}) # A no-op re-entry must NOT reset the held rung back to Global — that # would be the exact "repeat enter tears down in-flight state" class the # retired viewer's own cold-start guard existed to prevent. assert_str(screen._viewer.get_held_rung()).override_failure_message( "a repeat enter() for the SAME body must not reset the held rung" ).is_equal(StepCanvasTransport.RUNG_REGION) func test_regional_screen_different_body_still_re_enters() -> void: var screen: RegionalScreen = auto_free(RegionalScreen.new()) add_child(screen) screen.enter({"body": {"body_id": "GJ380c", "body_radius_km": 6238.4}, "system": {}}) screen.enter({"body": {"body_id": "OtherBody", "body_radius_km": 100.0}, "system": {}}) assert_str(screen._viewer.get_body_id()).is_equal("OtherBody")