extends SceneTree var failures: Array[String] = [] func _init() -> void: _run.call_deferred() func _run() -> void: root.size = Vector2i(1152, 648) var settings := _ensure_game_settings() settings.call("set_difficulty", &"normal") var flow: Node = load("res://autoload/game_flow_manager.gd").new() flow.name = "FlowUnderTest" flow.set("manage_scene", false) root.add_child(flow) await process_frame flow.call("_set_state", &"Title") await process_frame _expect_equal(StringName(str(flow.get("state"))), &"Title", "Flow should start on title") var title_screen := flow.get("_screens").get(&"Title", null) as Control _expect(title_screen != null, "Title screen should exist") if title_screen != null: _expect(title_screen.get_node_or_null("MenuArt") is TextureRect, "Title should use the panel frame art") _expect(title_screen.get_node_or_null("TitleLogo") is TextureRect, "Title should show the game logo art") _expect(title_screen.get_node_or_null("TitleDifficultyValue") is Label, "Title should show the current-difficulty footer (2026-07-05 mockup)") _expect(title_screen.get_node_or_null("StartGameButton") is Button, "Title should expose the start button") _expect(title_screen.get_node_or_null("DifficultyButton") is Button, "Title should expose the difficulty button") _expect(title_screen.get_node_or_null("QuitGameButton") is Button, "Title should expose the quit button") await _click(Vector2(191, 355)) _expect_equal(StringName(str(flow.get("state"))), &"DifficultySelect", "Clicking difficulty opens the difficulty page") var difficulty_screen := flow.get("_screens").get(&"DifficultySelect", null) as Control _expect(difficulty_screen != null, "Difficulty screen should exist") if difficulty_screen != null: _expect(difficulty_screen.get_node_or_null("MenuArt") is TextureRect, "Difficulty should use the panel frame art") _expect(difficulty_screen.get_node_or_null("DifficultyFooterValue") is Label, "Difficulty screen should show the current-difficulty footer (2026-07-05 mockup)") _expect(difficulty_screen.get_node_or_null("ConfirmStartButton") is Button, "Difficulty should expose the start command") _expect(difficulty_screen.get_node_or_null("BackTitleButton") is Button, "Difficulty should expose the back command") await _click(Vector2(191, 221)) _expect_equal(StringName(str(flow.get("_pending_difficulty"))), &"easy", "Clicking easy selects the easy difficulty") _expect_equal(StringName(str(settings.get("difficulty"))), &"easy", "Clicking easy applies the selected difficulty immediately") await _click(Vector2(191, 558)) _expect_equal(StringName(str(flow.get("state"))), &"Title", "Clicking the reference back button returns to title") flow.free() _finish() func _click(position: Vector2) -> void: var motion := InputEventMouseMotion.new() motion.position = position root.push_input(motion) await process_frame var press := InputEventMouseButton.new() press.button_index = MOUSE_BUTTON_LEFT press.position = position press.pressed = true root.push_input(press) await process_frame var release := InputEventMouseButton.new() release.button_index = MOUSE_BUTTON_LEFT release.position = position release.pressed = false root.push_input(release) await process_frame func _ensure_game_settings() -> Node: var settings := root.get_node_or_null("GameSettings") if settings != null: return settings settings = load("res://autoload/game_settings.gd").new() settings.name = "GameSettings" root.add_child(settings) return settings func _expect(condition: bool, label: String) -> void: if not condition: failures.append(label) func _expect_equal(actual: Variant, expected: Variant, label: String) -> void: if actual != expected: failures.append("%s: expected %s, got %s" % [label, expected, actual]) func _finish() -> void: if failures.is_empty(): print("PASS menu difficulty confirm") quit(0) else: for failure: String in failures: push_error(failure) quit(1)