PromptWar / tests /test_simulator.py
Mr-TD's picture
feat: Add operator dashboard, alerts, analytics, and simulator pages
aefe381
"""Simulator logic tests."""
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from services.simulator import (
create_demo_venue,
create_demo_queue_stations,
create_demo_event,
Simulator,
PHASE_PROFILES,
)
from services.crowd_service import CrowdService
from services.queue_service import QueueService
from services.notification_service import NotificationService
def _make_simulator():
"""Create a simulator for testing."""
venue = create_demo_venue()
event = create_demo_event()
crowd = CrowdService()
queue = QueueService()
notif = NotificationService()
stations = create_demo_queue_stations()
queue.register_stations(stations)
return Simulator(venue, queue, crowd, notif, event)
class TestDemoData:
"""Test demo data creation."""
def test_venue_has_zones(self):
venue = create_demo_venue()
assert len(venue.zones) > 10
assert venue.name == "Wankhede Stadium"
assert venue.total_capacity == 50000
def test_venue_zones_have_coordinates(self):
venue = create_demo_venue()
for zone in venue.zones:
assert zone.lat != 0 or zone.lng != 0
def test_queue_stations_created(self):
stations = create_demo_queue_stations()
assert len(stations) > 10
categories = set(s.category for s in stations)
assert "food" in categories
assert "restroom" in categories
assert "entry" in categories
def test_event_created(self):
event = create_demo_event()
assert "IPL" in event.name
assert event.sport == "Cricket"
class TestSimulator:
"""Test simulation engine."""
def test_single_tick(self):
sim = _make_simulator()
sim.tick()
# After a tick, venue should have some crowd
assert sim.venue.total_current > 0
def test_multiple_ticks(self):
sim = _make_simulator()
for _ in range(5):
sim.tick()
assert sim._tick_count == 5
def test_phase_change(self):
sim = _make_simulator()
sim.set_phase("halftime")
assert sim.event.current_phase == "halftime"
def test_all_phases_valid(self):
for phase in PHASE_PROFILES:
sim = _make_simulator()
sim.set_phase(phase)
sim.tick()
# Should not crash for any phase
def test_speed_control(self):
sim = _make_simulator()
sim.set_speed(2.0)
assert sim._speed == 2.0
def test_speed_clamped(self):
sim = _make_simulator()
sim.set_speed(100)
assert sim._speed == 10.0
sim.set_speed(0)
assert sim._speed == 0.1
def test_status_output(self):
sim = _make_simulator()
sim.tick()
status = sim.get_status()
assert "running" in status
assert "phase" in status
assert "tick_count" in status
assert "venue_occupancy" in status
def test_callback_fires(self):
sim = _make_simulator()
called = []
sim.set_update_callback(lambda: called.append(True))
sim.tick()
assert len(called) == 1
def test_halftime_increases_food_queues(self):
sim = _make_simulator()
sim.set_phase("halftime")
for _ in range(10):
sim.tick()
# During halftime, food queues should be busy
food_stations = [
s for s in sim.queue_service._stations.values()
if s.category == "food"
]
total_in_food = sum(s.current_length for s in food_stations)
assert total_in_food > 0