Coverage for backend/tests/test_game.py: 100%

20 statements  

« prev     ^ index     » next       coverage.py v7.6.12, created at 2025-04-17 17:55 +0000

1import pytest 

2 

3from backend.game import GameLoop 

4from backend.game_state import Lobby 

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

6 

7 

8@pytest.mark.parametrize( 

9 ["correct_order", "inp_order", "exp"], 

10 [ 

11 pytest.param( 

12 Order(burger=Burger(ingredients=["a", "b"]), side=None, drink=None), 

13 Order(burger=Burger(ingredients=["a", "b"]), side=None, drink=None), 

14 500, 

15 id="correct burger only", 

16 ), 

17 pytest.param( 

18 Order(burger=Burger(ingredients=["a", "b"]), side=Side(table_state="fries"), drink=None), 

19 Order(burger=Burger(ingredients=["a", "b"]), side=Side(table_state="fries"), drink=None), 

20 800, 

21 id="correct burger and side", 

22 ), 

23 pytest.param( 

24 Order( 

25 burger=Burger(ingredients=["a", "b"]), 

26 side=Side(table_state="fries"), 

27 drink=Drink(color="blue", size="M", fill=100), 

28 ), 

29 Order( 

30 burger=Burger(ingredients=["a", "b"]), 

31 side=Side(table_state="fries"), 

32 drink=Drink(color="blue", size="M", fill=100), 

33 ), 

34 1200, 

35 id="correct burger, side, and drink", 

36 ), 

37 pytest.param( 

38 Order( 

39 burger=Burger(ingredients=["a"]), 

40 side=None, 

41 drink=None, 

42 ), 

43 Order( 

44 burger=Burger(ingredients=[]), 

45 side=None, 

46 drink=None, 

47 ), 

48 300, 

49 id="incorrect burger", 

50 ), 

51 pytest.param( 

52 Order( 

53 burger=Burger(ingredients=["a", "b"]), 

54 side=None, 

55 drink=None, 

56 ), 

57 Order( 

58 burger=None, 

59 side=None, 

60 drink=None, 

61 ), 

62 300, 

63 id="missing burger", 

64 ), 

65 pytest.param( 

66 Order( 

67 burger=Burger(ingredients=["a", "b"]), 

68 side=Side(table_state="fries"), 

69 drink=None, 

70 ), 

71 Order( 

72 burger=Burger(ingredients=["a", "b"]), 

73 side=None, 

74 drink=None, 

75 ), 

76 600, 

77 id="correct burger and missing side", 

78 ), 

79 ], 

80) 

81def test_grade_order(correct_order: Order, inp_order: Order, exp: float) -> None: 

82 """Test grade order.""" 

83 game_loop = GameLoop(lobby=Lobby(code=("Lettuce", "Tomato", "Onion"))) 

84 game_loop.order = correct_order 

85 

86 out = game_loop.grade_order(inp_order) 

87 

88 assert exp == out 

89 

90 

91@pytest.mark.parametrize( 

92 ["correct_color", "inp_color", "color_score"], 

93 [ 

94 ["blue", "orange", 0], 

95 ["blue", "blue", 50], 

96 ], 

97) 

98@pytest.mark.parametrize( 

99 ["correct_size", "inp_size", "size_score"], 

100 [ 

101 ["M", "L", 0], 

102 ["M", "M", 50], 

103 ], 

104) 

105@pytest.mark.parametrize( 

106 "inp_fill", 

107 range(100 + 1), 

108) 

109def test_grade_order_drink( 

110 correct_color: str, 

111 inp_color: str, 

112 color_score: float, 

113 correct_size: str, 

114 inp_size: str, 

115 size_score: float, 

116 inp_fill: float, 

117) -> None: 

118 """Grade order test for drinks specifically to take advantage of parameter matrix.""" 

119 game_loop = GameLoop(lobby=Lobby(("Lettuce", "Tomato", "Onion"))) 

120 game_loop.order = Order( 

121 burger=Burger(ingredients=["a", "b"]), 

122 side=Side(table_state="fries"), 

123 drink=Drink(color=correct_color, size=correct_size, fill=100), 

124 ) 

125 

126 inp_order = Order( 

127 burger=Burger(ingredients=["a", "b"]), 

128 side=Side(table_state="fries"), 

129 drink=Drink(color=inp_color, size=inp_size, fill=inp_fill), 

130 ) 

131 fill_score = int((1 - abs(1 - inp_fill / 100)) ** 0.5 * 100) 

132 

133 out = game_loop.grade_order(inp_order) 

134 

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