Coverage for backend/tests/test_game.py: 100%
29 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-05-02 01:42 +0000
« prev ^ index » next coverage.py v7.6.12, created at 2025-05-02 01:42 +0000
1import queue
3import pytest
5from backend.game import GameLoop
6from backend.game_state import Lobby, Player
7from backend.models import Burger, Drink, Order, Side
10@pytest.mark.parametrize(
11 ["correct_order", "inp_order", "exp"],
12 [
13 pytest.param(
14 Order(burger=Burger(ingredients=["a", "b"]), side=None, drink=None),
15 Order(burger=Burger(ingredients=["a", "b"]), side=None, drink=None),
16 500,
17 id="correct burger only",
18 ),
19 pytest.param(
20 Order(burger=Burger(ingredients=["a", "b"]), side=Side(table_state="fries"), drink=None),
21 Order(burger=Burger(ingredients=["a", "b"]), side=Side(table_state="fries"), drink=None),
22 800,
23 id="correct burger and side",
24 ),
25 pytest.param(
26 Order(
27 burger=Burger(ingredients=["a", "b"]),
28 side=Side(table_state="fries"),
29 drink=Drink(color="blue", size="M", fill=100),
30 ),
31 Order(
32 burger=Burger(ingredients=["a", "b"]),
33 side=Side(table_state="fries"),
34 drink=Drink(color="blue", size="M", fill=100),
35 ),
36 1200,
37 id="correct burger, side, and drink",
38 ),
39 pytest.param(
40 Order(
41 burger=Burger(ingredients=["a"]),
42 side=None,
43 drink=None,
44 ),
45 Order(
46 burger=Burger(ingredients=[]),
47 side=None,
48 drink=None,
49 ),
50 300,
51 id="incorrect burger",
52 ),
53 pytest.param(
54 Order(
55 burger=Burger(ingredients=["a", "b"]),
56 side=None,
57 drink=None,
58 ),
59 Order(
60 burger=None,
61 side=None,
62 drink=None,
63 ),
64 300,
65 id="missing burger",
66 ),
67 pytest.param(
68 Order(
69 burger=Burger(ingredients=["a", "b"]),
70 side=Side(table_state="fries"),
71 drink=None,
72 ),
73 Order(
74 burger=Burger(ingredients=["a", "b"]),
75 side=None,
76 drink=None,
77 ),
78 600,
79 id="correct burger and missing side",
80 ),
81 ],
82)
83def test_grade_order(correct_order: Order, inp_order: Order, exp: float) -> None:
84 """Test grade order."""
85 game_loop = GameLoop(lobby=Lobby(code=("Lettuce", "Tomato", "Onion")))
86 game_loop.order = correct_order
88 out = game_loop.grade_order(inp_order)
90 assert exp == out
93@pytest.mark.parametrize(
94 ["correct_color", "inp_color", "color_score"],
95 [
96 ["blue", "orange", 0],
97 ["blue", "blue", 50],
98 ],
99)
100@pytest.mark.parametrize(
101 ["correct_size", "inp_size", "size_score"],
102 [
103 ["M", "L", 0],
104 ["M", "M", 50],
105 ],
106)
107@pytest.mark.parametrize(
108 "inp_fill",
109 range(100 + 1),
110)
111def test_grade_order_drink(
112 correct_color: str,
113 inp_color: str,
114 color_score: float,
115 correct_size: str,
116 inp_size: str,
117 size_score: float,
118 inp_fill: float,
119) -> None:
120 """Grade order test for drinks specifically to take advantage of parameter matrix."""
121 game_loop = GameLoop(lobby=Lobby(("Lettuce", "Tomato", "Onion")))
122 game_loop.order = Order(
123 burger=Burger(ingredients=["a", "b"]),
124 side=Side(table_state="fries"),
125 drink=Drink(color=correct_color, size=correct_size, fill=100),
126 )
128 inp_order = Order(
129 burger=Burger(ingredients=["a", "b"]),
130 side=Side(table_state="fries"),
131 drink=Drink(color=inp_color, size=inp_size, fill=inp_fill),
132 )
133 fill_score = int((1 - abs(1 - inp_fill / 100)) ** 0.5 * 100)
135 out = game_loop.grade_order(inp_order)
137 assert 1000 + color_score + size_score + fill_score == out
140def test_rotate_role() -> None:
141 """Test that all players have different roles after rotating."""
142 game_loop = GameLoop(lobby=Lobby(("e",)))
143 game_loop.lobby.players = {id: Player(channel=queue.Queue(), role=None) for id in "abcd"}
144 game_loop.assign_roles()
145 roles_before = [player.role for player in game_loop.lobby.players.values()]
146 game_loop.rotate_roles()
147 roles_after = [player.role for player in game_loop.lobby.players.values()]
149 assert all(x != y for x, y in zip(roles_before, roles_after, strict=False))