test(scenes): Add viewport proof test scene with test script and assets for viewport behavior validation

Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
Claude Code 2026-04-07 17:50:36 -07:00
parent 8b08a2e41c
commit 1423eb0b31
3 changed files with 150 additions and 0 deletions

View file

@ -0,0 +1,143 @@
extends Node2D
## Viewport Window Manager Proof Scene.
## Generates a hex map, instantiates the WorldMap scene, then exercises
## ViewportWindowManager: splits the panel horizontally and opens a floating
## window. Self-capturing: saves screenshot and quits.
const MapGeneratorScript: GDScript = preload(
"res://engine/src/generation/map_generator.gd"
)
const GameMapScript: GDScript = preload("res://engine/src/map/game_map.gd")
const PlayerScript: GDScript = preload("res://engine/src/entities/player.gd")
const WorldMapScene: PackedScene = preload(
"res://engine/scenes/world_map/world_map.tscn"
)
const OUTPUT_DIR: String = "user://screenshots"
var _captured: bool = false
var _screenshot_name: String = "viewport_proof"
func _ready() -> void:
RenderingServer.set_default_clear_color(Color(0.06, 0.05, 0.04))
get_viewport().size = Vector2i(1920, 1080)
DisplayServer.window_set_size(Vector2i(1920, 1080))
var env_name: String = OS.get_environment("SCREENSHOT_NAME")
if not env_name.is_empty():
_screenshot_name = env_name
DataLoader.load_theme("age-of-dwarves")
await get_tree().process_frame
_setup_game_state()
_add_world_map()
# Wait 2 frames for the WorldMap scene to fully initialize
await get_tree().process_frame
await get_tree().process_frame
_exercise_viewport_manager()
# Wait 1 more frame for viewport changes to render
await get_tree().process_frame
# Additional frames to let split panels and floating window settle
for _i: int in range(8):
await get_tree().process_frame
_capture_and_quit()
func _setup_game_state() -> void:
print("=== Viewport Proof ===")
var settings: Dictionary = {
"map_size": "duel",
"map_type": "continents",
"seed": 42,
"num_players": 2,
"map_wrap": "cylinder",
}
GameState.initialize_game(settings)
GameState.map_seed = 42
var generator: RefCounted = MapGeneratorScript.new()
var game_map: GameMapScript = generator.generate(settings)
var primary: Dictionary = GameState.get_primary_layer()
primary["map"] = game_map
# Create a player so WorldMap can render
var player: RefCounted = GameState.create_player("Proof Player", "dwarf", true)
print(
"Map: %dx%d, duel, seed 42 | Player: %s (index %d)"
% [game_map.width, game_map.height, player.player_name, player.index]
)
func _add_world_map() -> void:
var world_map: Node2D = WorldMapScene.instantiate()
world_map.name = "WorldMap"
add_child(world_map)
print("WorldMap scene instantiated")
func _exercise_viewport_manager() -> void:
var world_map: Node2D = get_node_or_null("WorldMap")
if world_map == null:
push_error("ViewportProof: WorldMap node not found")
return
var vwm: Control = world_map.get_node_or_null("ViewportWindowManager")
if vwm == null:
push_error("ViewportProof: ViewportWindowManager not found")
return
# Exercise split panel: make it visible and split horizontally
var split_container: Control = vwm.get_split_panel_container()
split_container.visible = true
split_container.split_focused_horizontal()
print("Split panel: split_focused_horizontal() called")
# Exercise floating window: open one at the map center
vwm.open_floating_window(Vector2(400, 300), 1)
print("Floating window: opened at (400, 300), layer_mask=1")
func _capture_and_quit() -> void:
if _captured:
return
_captured = true
DirAccess.make_dir_recursive_absolute(
ProjectSettings.globalize_path(OUTPUT_DIR)
)
var image: Image = get_viewport().get_texture().get_image()
if image == null:
push_error("ViewportProof: Failed to get viewport image")
get_tree().quit(1)
return
var timestamp: String = (
Time.get_datetime_string_from_system()
.replace(":", "-")
.replace("T", "_")
)
var rel_path: String = "%s/%s_%s.png" % [OUTPUT_DIR, _screenshot_name, timestamp]
var abs_path: String = ProjectSettings.globalize_path(rel_path)
var err: Error = image.save_png(abs_path)
if err == OK:
print("SCREENSHOT_PATH:%s" % abs_path)
print(
"Screenshot: %dx%d saved to %s"
% [image.get_width(), image.get_height(), abs_path]
)
else:
push_error("ViewportProof: Save failed: %s" % error_string(err))
get_tree().quit()

View file

@ -0,0 +1 @@
uid://x1dj50wpjio0

View file

@ -0,0 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://vp7proof1"]
[ext_resource type="Script" path="res://engine/scenes/tests/viewport_proof.gd" id="1_script"]
[node name="ViewportProof" type="Node2D"]
script = ExtResource("1_script")