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

1import queue 

2 

3import pytest 

4 

5from backend.game import GameLoop 

6from backend.game_state import Lobby, Player 

7from backend.models import Burger, Drink, Order, Side 

8 

9 

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 

87 

88 out = game_loop.grade_order(inp_order) 

89 

90 assert exp == out 

91 

92 

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 ) 

127 

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) 

134 

135 out = game_loop.grade_order(inp_order) 

136 

137 assert 1000 + color_score + size_score + fill_score == out 

138 

139 

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

148 

149 assert all(x != y for x, y in zip(roles_before, roles_after, strict=False))