File size: 3,662 Bytes
aefe381
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
"""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