import pytest import time import sys import os # Ensure project root is in path sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) from api_hook_client import ApiHookClient def test_idle_performance_requirements(live_gui) -> None: """ Requirement: GUI must maintain stable performance on idle. """ # Warmup to ensure GUI is ready time.sleep(5.0) client = ApiHookClient() # Wait for app to stabilize and render some frames time.sleep(2.0) # Get multiple samples to be sure samples = [] for _ in range(5): perf_data = client.get_performance() samples.append(perf_data) time.sleep(0.5) # Check for valid metrics valid_ft_count = 0 total_ft = 0.0 for sample in samples: performance = sample.get('performance', {}) frame_time = performance.get('last_frame_time_ms', 0.0) total_ft += frame_time # Only assert if we have a real frame time (rendering active) if frame_time > 0: valid_ft_count += 1 assert frame_time < 33.3, f"Frame time {frame_time}ms exceeds 30fps threshold" if valid_ft_count == 0 or total_ft == 0: print(f"[Warning] Frame time is 0.0. This is expected in headless CI/CD environments.") print(f"[Test] Valid frame time samples: {valid_ft_count}/5") # In some CI environments without a real display, frame time might remain 0 # but we've verified the hook is returning the dictionary.