McRogueFace/tests/unit/test_viewport_scaling.py

138 lines
4.1 KiB
Python
Raw Permalink Normal View History

#!/usr/bin/env python3
"""Test viewport scaling modes"""
import mcrfpy
from mcrfpy import Window, Frame, Caption, Color, Vector
2026-02-09 08:15:18 -05:00
from mcrfpy import automation
import sys
print("Creating viewport test scene...")
2026-01-03 10:59:52 -05:00
test = mcrfpy.Scene("test")
2026-02-09 08:15:18 -05:00
mcrfpy.current_scene = test
print("Testing viewport scaling modes...")
# Get window singleton
window = Window.get()
# Test initial state
print(f"Initial game resolution: {window.game_resolution}")
print(f"Initial scaling mode: {window.scaling_mode}")
print(f"Window resolution: {window.resolution}")
# Create test scene with visual elements
scene = test.children
# Create a frame that fills the game resolution to show boundaries
game_res = window.game_resolution
boundary = Frame(pos=(0, 0), size=(game_res[0], game_res[1]),
fill_color=Color(50, 50, 100),
outline_color=Color(255, 255, 255),
outline=2)
boundary.name = "boundary"
scene.append(boundary)
# Add corner markers
corner_size = 50
corners = [
(0, 0, "TL"), # Top-left
(game_res[0] - corner_size, 0, "TR"), # Top-right
(0, game_res[1] - corner_size, "BL"), # Bottom-left
(game_res[0] - corner_size, game_res[1] - corner_size, "BR") # Bottom-right
]
for x, y, label in corners:
corner = Frame(pos=(x, y), size=(corner_size, corner_size),
fill_color=Color(255, 100, 100),
outline_color=Color(255, 255, 255),
outline=1)
scene.append(corner)
text = Caption(text=label, pos=(x + 5, y + 5))
text.font_size = 20
text.fill_color = Color(255, 255, 255)
scene.append(text)
# Add center crosshair
center_x = game_res[0] // 2
center_y = game_res[1] // 2
h_line = Frame(pos=(center_x - 50, center_y - 1), size=(100, 2),
fill_color=Color(255, 255, 0))
v_line = Frame(pos=(center_x - 1, center_y - 50), size=(2, 100),
fill_color=Color(255, 255, 0))
scene.append(h_line)
scene.append(v_line)
# Add mode indicator
mode_text = Caption(text=f"Mode: {window.scaling_mode}", pos=(10, 10))
mode_text.font_size = 24
mode_text.fill_color = Color(255, 255, 255)
mode_text.name = "mode_text"
scene.append(mode_text)
# Render initial frame
mcrfpy.step(0.01)
print("\nTesting scaling modes:")
# Test center mode
window.scaling_mode = "center"
print(f"Set to center mode: {window.scaling_mode}")
mode_text.text = f"Mode: center (1:1 pixels)"
mcrfpy.step(0.01)
automation.screenshot("viewport_center_mode.png")
# Test stretch mode
window.scaling_mode = "stretch"
print(f"Set to stretch mode: {window.scaling_mode}")
mode_text.text = f"Mode: stretch (fill window)"
mcrfpy.step(0.01)
automation.screenshot("viewport_stretch_mode.png")
# Test fit mode
window.scaling_mode = "fit"
print(f"Set to fit mode: {window.scaling_mode}")
mode_text.text = f"Mode: fit (aspect ratio maintained)"
mcrfpy.step(0.01)
automation.screenshot("viewport_fit_mode.png")
# Test window resize (may fail in headless mode)
print("\nTesting window resize with fit mode:")
try:
window.resolution = (1280, 720)
print(f"Window resized to: {window.resolution}")
mcrfpy.step(0.01)
automation.screenshot("viewport_fit_wide.png")
try:
window.resolution = (800, 1000)
print(f"Window resized to: {window.resolution}")
mcrfpy.step(0.01)
automation.screenshot("viewport_fit_tall.png")
except RuntimeError as e:
print(f" Skipping tall window test (headless mode): {e}")
except RuntimeError as e:
print(f" Skipping window resize tests (headless mode): {e}")
# Test game resolution change
print("\nTesting game resolution change:")
window.game_resolution = (800, 600)
print(f"Game resolution changed to: {window.game_resolution}")
print("\nTest completed!")
print("Screenshots saved:")
print(" - viewport_center_mode.png")
print(" - viewport_stretch_mode.png")
print(" - viewport_fit_mode.png")
print(" - viewport_fit_wide.png")
print(" - viewport_fit_tall.png")
# Restore original settings
try:
window.resolution = (1024, 768)
except RuntimeError:
pass # Headless mode - can't change resolution
window.game_resolution = (1024, 768)
window.scaling_mode = "fit"
sys.exit(0)