- New src/game/ui/event_timeline.gd flattens every recorded incident event (ADR-0005) into one time-ordered list and shows time, person, and a one-line summary. Step with Left/Right or the buttons; Esc returns to the review. No live 3D replay in this first version. - Shift review gains a "Body camera timeline" button that hands the review to the timeline; the review dim is hidden while it is open (stacked overlays made the screen nearly black) and restored on close. - ShiftCoordinator records started_at_ms so the review can stamp events as mm:ss. - 8 new string keys for the timeline UI and the review button. Tests/docs - Headless suite 113 -> 120 (test_event_timeline.gd), new smoke_timeline.gd that opens the timeline from the review, steps through every event, and closes back. - README, TODO section moved to DONE, MEMORY notes. Version 0.2.6.
91 lines
3.7 KiB
Python
91 lines
3.7 KiB
Python
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
from PIL import Image
|
|
|
|
import screen_designs
|
|
|
|
|
|
class ScreenDesignsTests(unittest.TestCase):
|
|
def setUp(self):
|
|
self.temp_dir = tempfile.TemporaryDirectory()
|
|
self.root = Path(self.temp_dir.name)
|
|
|
|
def tearDown(self):
|
|
self.temp_dir.cleanup()
|
|
|
|
def test_catalogue_is_well_formed(self):
|
|
names = [screen["name"] for screen in screen_designs.SCREENS]
|
|
self.assertEqual(len(names), len(set(names)),
|
|
"screen names must be unique")
|
|
refs = [screen["ref"] for screen in screen_designs.SCREENS
|
|
if screen["ref"]]
|
|
self.assertEqual(len(refs), len(set(refs)),
|
|
"screenshot refs must be unique")
|
|
for screen in screen_designs.SCREENS:
|
|
self.assertTrue(screen["prompt"].strip())
|
|
self.assertIn(screen["kind"], ("scene", "ui"))
|
|
self.assertTrue(screen["regions"])
|
|
for region in screen["regions"]:
|
|
x0, y0, x1, y1, label = region
|
|
self.assertLess(x0, x1)
|
|
self.assertLess(y0, y1)
|
|
self.assertTrue(0 <= x0 <= 1 and 0 <= x1 <= 1)
|
|
self.assertTrue(0 <= y0 <= 1 and 0 <= y1 <= 1)
|
|
self.assertTrue(label.strip())
|
|
|
|
def test_draft_wireframe_matches_reference_dimensions(self):
|
|
output = self.root / "draft.png"
|
|
screen = screen_designs.SCREENS[0]
|
|
screen_designs._draw_wireframe(screen, output)
|
|
with Image.open(output) as image:
|
|
self.assertEqual(image.size,
|
|
(screen_designs.WIDTH, screen_designs.HEIGHT))
|
|
|
|
def test_compose_prompt_appends_kind_specific_style(self):
|
|
scene = {"kind": "scene", "prompt": "a street"}
|
|
ui = {"kind": "ui", "prompt": "a panel"}
|
|
self.assertIn(screen_designs.SCENE_STYLE,
|
|
screen_designs._compose_prompt(scene))
|
|
self.assertIn(screen_designs.UI_STYLE,
|
|
screen_designs._compose_prompt(ui))
|
|
self.assertIn("16:9", screen_designs._compose_prompt(scene))
|
|
|
|
def test_mae_is_zero_for_identical_images(self):
|
|
path = self.root / "identical.png"
|
|
Image.new("RGB", (1280, 720), (40, 80, 120)).save(path)
|
|
left = screen_designs._load_rgb(path)
|
|
right = screen_designs._load_rgb(path)
|
|
self.assertAlmostEqual(screen_designs._mae(left, right), 0.0, places=1)
|
|
|
|
def test_histogram_distance_is_zero_for_identical_images(self):
|
|
path = self.root / "identical.png"
|
|
Image.new("RGB", (1280, 720), (40, 80, 120)).save(path)
|
|
left = screen_designs._load_rgb(path)
|
|
right = screen_designs._load_rgb(path)
|
|
self.assertAlmostEqual(
|
|
screen_designs._histogram_distance(left, right), 0.0, places=3)
|
|
|
|
def test_blank_frame_is_flagged_as_bad(self):
|
|
reference = self.root / "ref.png"
|
|
capture = self.root / "cap.png"
|
|
Image.new("RGB", (1280, 720), (200, 200, 200)).save(reference)
|
|
Image.new("RGB", (1280, 720), (0, 0, 0)).save(capture)
|
|
report = screen_designs.compare_screenshot(reference, capture)
|
|
self.assertEqual(report["quality"], "bad")
|
|
self.assertTrue(any("near-blank" in e for e in report["errors"]))
|
|
|
|
def test_wrong_aspect_is_flagged_as_bad(self):
|
|
reference = self.root / "ref.png"
|
|
capture = self.root / "cap.png"
|
|
Image.new("RGB", (1280, 720), (100, 120, 140)).save(reference)
|
|
Image.new("RGB", (640, 640), (100, 120, 140)).save(capture)
|
|
report = screen_designs.compare_screenshot(reference, capture)
|
|
self.assertEqual(report["quality"], "bad")
|
|
self.assertTrue(any("aspect" in e for e in report["errors"]))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|