"""Hilfsfunktionen, um die Anwendung headless per Event zu bedienen. Die Tests posten echte pygame-Events in die Event-Queue und rufen dann :meth:`sandbox.main.App.frame` auf – genau wie die Hauptschleife. So wird die komplette Kette Event → Sidebar/InputHandler → Werkzeuge → Physik → Zeichnen durchlaufen. """ import pygame from sandbox.main import App from sandbox.physics import Vector2 #: Dauer eines Test-Frames (60 Bilder/s → je zwei Physikschritte). FRAME = 1 / 60 def screen_pos(app: App, x: float, y: float) -> tuple[int, int]: """Bildschirmposition eines Weltpunkts (auf ganze Pixel gerundet).""" sx, sy = app.viewport.to_screen(Vector2(x, y)) return (round(sx), round(sy)) def frames(app: App, count: int = 1) -> None: """Lässt die Anwendung einige Frames laufen.""" for _ in range(count): app.frame(FRAME) def post(event_type: int, **attributes: object) -> None: """Legt ein Event in die pygame-Queue.""" pygame.event.post(pygame.event.Event(event_type, **attributes)) def press(app: App, pos: tuple[int, int], button: int = pygame.BUTTON_LEFT) -> None: """Maustaste an ``pos`` drücken (ein Frame).""" post(pygame.MOUSEBUTTONDOWN, pos=pos, button=button) frames(app) def move(app: App, pos: tuple[int, int]) -> None: """Maus nach ``pos`` bewegen (ein Frame).""" post(pygame.MOUSEMOTION, pos=pos, rel=(0, 0), buttons=(1, 0, 0)) frames(app) def release(app: App, pos: tuple[int, int], button: int = pygame.BUTTON_LEFT) -> None: """Maustaste an ``pos`` loslassen (ein Frame).""" post(pygame.MOUSEBUTTONUP, pos=pos, button=button) frames(app) def click(app: App, pos: tuple[int, int], button: int = pygame.BUTTON_LEFT) -> None: """Klick (Drücken und Loslassen) an ``pos``.""" press(app, pos, button) release(app, pos, button) def key(app: App, name: str) -> None: """Taste drücken (Name wie in ``pygame.key.key_code``).""" post(pygame.KEYDOWN, key=pygame.key.key_code(name), mod=0, unicode="", scancode=0) frames(app) def wheel(app: App, pos: tuple[int, int], steps: int) -> None: """Mausrad über ``pos`` drehen.""" move(app, pos) post(pygame.MOUSEWHEEL, x=0, y=steps, flipped=False) frames(app)