| """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() |
| |
| 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() |
| |
|
|
| 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() |
|
|
| |
| 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 |
|
|