proejct commit
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
"""Smoke-Test: Die echte Hauptschleife läuft einige Sekunden headless mit Zufallseingaben.
|
||||
|
||||
Ein simulierter, zufällig klickender "Affe" bedient dabei alles, was ein Mensch auch
|
||||
bedienen könnte: Klicks in Welt und Sidebar, Ziehen und Werfen, Rechtsklicks, Mausrad
|
||||
und Tastenkürzel. Der Test gilt als bestanden, wenn keine Exception auftritt und die
|
||||
Simulation danach in einem gültigen Zustand ist.
|
||||
"""
|
||||
|
||||
import random
|
||||
|
||||
import pygame
|
||||
import pytest
|
||||
|
||||
from sandbox.config import PHYSICS
|
||||
from sandbox.main import App
|
||||
|
||||
SMOKE_SECONDS = 3.0
|
||||
SAFE_KEYS = ("space", "g", "c", "delete", "1", "2", "f1") # alles außer "Beenden"
|
||||
|
||||
|
||||
class MonkeyApp(App):
|
||||
"""Die echte Anwendung, die sich vor jedem Frame selbst zufällige Events schickt."""
|
||||
|
||||
def __init__(self, seed: int) -> None:
|
||||
super().__init__(rng=random.Random(seed))
|
||||
self.monkey = random.Random(seed)
|
||||
self.frame_count = 0
|
||||
|
||||
def frame(self, frame_time: float) -> None:
|
||||
self._post_random_events()
|
||||
super().frame(frame_time)
|
||||
self.frame_count += 1
|
||||
|
||||
def _random_position(self) -> tuple[int, int]:
|
||||
return (
|
||||
self.monkey.randrange(self.config.window.width),
|
||||
self.monkey.randrange(self.config.window.height),
|
||||
)
|
||||
|
||||
def _post_random_events(self) -> None:
|
||||
roll = self.monkey.random()
|
||||
position = self._random_position()
|
||||
if roll < 0.25:
|
||||
button = self.monkey.choice([pygame.BUTTON_LEFT, pygame.BUTTON_RIGHT])
|
||||
pygame.event.post(
|
||||
pygame.event.Event(pygame.MOUSEBUTTONDOWN, pos=position, button=button)
|
||||
)
|
||||
elif roll < 0.45:
|
||||
pygame.event.post(pygame.event.Event(pygame.MOUSEBUTTONUP, pos=position, button=1))
|
||||
elif roll < 0.85:
|
||||
pygame.event.post(
|
||||
pygame.event.Event(pygame.MOUSEMOTION, pos=position, rel=(0, 0), buttons=(1, 0, 0))
|
||||
)
|
||||
elif roll < 0.93:
|
||||
pygame.event.post(
|
||||
pygame.event.Event(pygame.MOUSEWHEEL, x=0, y=self.monkey.choice([-1, 1]))
|
||||
)
|
||||
else:
|
||||
key = pygame.key.key_code(self.monkey.choice(SAFE_KEYS))
|
||||
pygame.event.post(
|
||||
pygame.event.Event(pygame.KEYDOWN, key=key, mod=0, unicode="", scancode=0)
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.slow
|
||||
def test_main_loop_survives_seconds_of_random_input() -> None:
|
||||
app = MonkeyApp(seed=7)
|
||||
try:
|
||||
app.load_demo_scene()
|
||||
app.run(max_seconds=SMOKE_SECONDS)
|
||||
assert app.running
|
||||
assert app.frame_count > 0
|
||||
for body in app.world.bodies:
|
||||
assert body.position.is_finite()
|
||||
assert body.velocity.length() <= PHYSICS.max_speed + 1e-6
|
||||
finally:
|
||||
app.close()
|
||||
Reference in New Issue
Block a user