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:
parent
8b08a2e41c
commit
1423eb0b31
3 changed files with 150 additions and 0 deletions
143
src/game/engine/scenes/tests/viewport_proof.gd
Normal file
143
src/game/engine/scenes/tests/viewport_proof.gd
Normal 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()
|
||||
1
src/game/engine/scenes/tests/viewport_proof.gd.uid
Normal file
1
src/game/engine/scenes/tests/viewport_proof.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
|||
uid://x1dj50wpjio0
|
||||
6
src/game/engine/scenes/tests/viewport_proof.tscn
Normal file
6
src/game/engine/scenes/tests/viewport_proof.tscn
Normal 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")
|
||||
Loading…
Add table
Reference in a new issue