@@ -87,6 +87,60 @@ def test_holder_draw_positions_and_move(self):
8787 self .assertNotIn (passengers [1 ], station .passengers )
8888 self .assertIn (passengers [1 ], other_station .passengers )
8989
90+ def test_metro_draw_positions_passengers_in_3x2_grid (self ):
91+ metro = Metro ()
92+ metro .position = Point (100 , 100 )
93+ passengers = [Passenger (Circle ((0 , 0 , 0 ), 1 )) for _ in range (6 )]
94+ for passenger in passengers :
95+ passenger .draw = MagicMock ()
96+ metro .add_passenger (passenger )
97+
98+ metro .draw (self .screen )
99+
100+ grid_cols = metro .passengers_per_row
101+ grid_rows = 2
102+ metro_width = 2 * metro .size
103+ metro_height = metro .size
104+ passenger_diameter = 2 * passenger_size
105+ x_gap = (metro_width - (grid_cols * passenger_diameter )) / (grid_cols + 1 )
106+ y_gap = (metro_height - (grid_rows * passenger_diameter )) / (grid_rows + 1 )
107+ x_step = passenger_diameter + x_gap
108+ y_step = passenger_diameter + y_gap
109+ x_start = (- metro_width / 2 ) + x_gap + passenger_size
110+ y_start = (- metro_height / 2 ) + y_gap + passenger_size
111+
112+ for idx , passenger in enumerate (passengers ):
113+ col = idx % grid_cols
114+ row = idx // grid_cols
115+ x_offset = x_start + (col * x_step )
116+ y_offset = y_start + (row * y_step )
117+ expected_position = metro .position + Point (x_offset , y_offset ).rotate (0 )
118+ self .assertEqual (passenger .position , expected_position )
119+
120+ def test_metro_draw_rotates_passenger_grid_with_metro (self ):
121+ metro = Metro ()
122+ metro .position = Point (200 , 200 )
123+ metro .shape .set_degrees (90 )
124+ passenger = Passenger (Circle ((0 , 0 , 0 ), 1 ))
125+ passenger .draw = MagicMock ()
126+ metro .add_passenger (passenger )
127+
128+ metro .draw (self .screen )
129+
130+ grid_cols = metro .passengers_per_row
131+ grid_rows = 2
132+ metro_width = 2 * metro .size
133+ metro_height = metro .size
134+ passenger_diameter = 2 * passenger_size
135+ x_gap = (metro_width - (grid_cols * passenger_diameter )) / (grid_cols + 1 )
136+ y_gap = (metro_height - (grid_rows * passenger_diameter )) / (grid_rows + 1 )
137+ x_start = (- metro_width / 2 ) + x_gap + passenger_size
138+ y_start = (- metro_height / 2 ) + y_gap + passenger_size
139+ x_offset = x_start
140+ y_offset = y_start
141+ expected_position = metro .position + Point (x_offset , y_offset ).rotate (90 )
142+ self .assertEqual (passenger .position , expected_position )
143+
90144 def test_travel_plan_methods (self ):
91145 station = Station (Rect (station_color , station_size , station_size ), Point (0 , 0 ))
92146 plan = TravelPlan ([Node (station )])
0 commit comments