def test_step(self): road = Road(100, 1, lane_width=1) vehicle = Mock() road._updateLanes = lambda f: f(vehicle) road.step() vehicle.beforeMove.assert_called_once() vehicle.move.assert_called_once()
def test_isSafePosition(self): road = Road(length=100, lanes_count=5, lane_width=1) proper = [True, True, True, False, False, False, False] vehicle = [None, Mock(), Mock(), None, None, Mock(), Mock()] pending = [Mock(), None, Mock(), None, Mock(), None, Mock()] for p, v, pv in zip(proper, vehicle, pending): road.isProperPosition = Mock(return_value=p) road.getVehicle = Mock(return_value=v) road.getPendingVehicle = Mock(return_value=pv) self.assertFalse(road.isSafePosition(position=(0, 0))) road.isProperPosition = Mock(return_value=True) road.getVehicle = Mock(return_value=None) road.getPendingVehicle = Mock(return_value=None) self.assertTrue(road.isSafePosition(position=(0, 0)))
def addObstacle(road: Road, obstacle: ObstacleValue) -> None: lane, begin, end = obstacle if not inBounds(lane, 0, road.lanes_count): raise ValueError(f'invalid obstacle, lane {lane} is not on the road') if not inBounds(begin, 0, road.length) or not inBounds( end, 0, road.length): raise ValueError( f'invalid obstacle, position {(begin, end)} is not on the road') length = end - begin + 1 width = road.lane_width position = road.getRelativePosition(position=(end, lane)) obstacle = Obstacle(position=position, width=width, length=length) road.addVehicle(obstacle)
def test_addEmergencyVehicle(self): road: Road = Road(length=100, lanes_count=1, lane_width=1) vehicle = Mock(position=(0, 0), flags=VehicleFlags.NONE) with self.assertRaises(ValueError): road.addEmergencyVehicle(vehicle) vehicle.flags = VehicleFlags.EMERGENCY road.addVehicle = Mock() road.addEmergencyVehicle(vehicle) road.addVehicle.assert_called_once_with(vehicle=vehicle) self.assertCountEqual({vehicle}, road.emergency)
def test_removeVehicle(self): road: Road = Road(length=100, lanes_count=1, lane_width=1) vehicle = Mock(position=(0, 0), flags=VehicleFlags.NONE) emergency = Mock(position=(1, 0), flags=VehicleFlags.EMERGENCY) road.emergency = {emergency} # Remove non-emergency vehicle. road._removeVehicle(vehicle) self.assertCountEqual({emergency}, road.emergency) self.assertCountEqual([vehicle], road.removed) # Remove emergency vehicle. road._removeVehicle(emergency) self.assertCountEqual({}, road.emergency) self.assertCountEqual([vehicle, emergency], road.removed) # Remove emergency vehicle not on the road. with self.assertRaises(KeyError): road._removeVehicle(emergency)
def test_sublanesCount(self): road = Road(100, 1, lane_width=1) self.assertEqual(road.sublanesCount, 1) road = Road(100, 2, lane_width=1) self.assertEqual(road.sublanesCount, 2) road = Road(100, 1, lane_width=2) self.assertEqual(road.sublanesCount, 4) road = Road(100, 2, lane_width=2) self.assertEqual(road.sublanesCount, 6) road = Road(100, 1, lane_width=4) self.assertEqual(road.sublanesCount, 8) road = Road(100, 2, lane_width=4) self.assertEqual(road.sublanesCount, 12)
def test_canPlaceVehicle(self): road = Road(length=100, lanes_count=2, lane_width=2) vehicle = Mock(width=2, length=3, position=(2, 1)) positions = [(0, 1), (1, 1), (2, 1), (0, 2), (1, 2), (2, 2)] calls = [call(position=position) for position in positions] def mock_isSafePosition(invalid: typing.Iterable[Position]) \ -> typing.Callable[[Position], bool]: return lambda position: position not in invalid road.isSafePosition = Mock(side_effect=mock_isSafePosition([])) self.assertTrue(road.canPlaceVehicle(vehicle=vehicle)) road.isSafePosition.assert_has_calls(calls, any_order=True) def powerset(xs): return chain.from_iterable(combinations(xs, r) for r in range(len(xs) + 1)) for invalid in powerset(positions): if len(invalid) == 0: continue road.isSafePosition = Mock(side_effect=mock_isSafePosition(invalid=invalid)) self.assertFalse(road.canPlaceVehicle(vehicle=vehicle), msg=f'invalid={invalid}')
def test_isProperPosition(self): road = Road(100, 1, lane_width=1) self.assertTrue(road.isProperPosition(position=(0, 0))) self.assertTrue(road.isProperPosition(position=(99, 0))) self.assertFalse(road.isProperPosition(position=(-1, 0))) self.assertFalse(road.isProperPosition(position=(100, 0))) self.assertFalse(road.isProperPosition(position=(0, 1))) self.assertFalse(road.isProperPosition(position=(0, -1))) road = Road(100, 1, lane_width=2) self.assertTrue(road.isProperPosition(position=(0, 0))) self.assertTrue(road.isProperPosition(position=(0, 1))) self.assertTrue(road.isProperPosition(position=(0, 2))) self.assertTrue(road.isProperPosition(position=(0, 3))) self.assertTrue(road.isProperPosition(position=(99, 1))) self.assertTrue(road.isProperPosition(position=(99, 2))) self.assertFalse(road.isProperPosition(position=(-1, 1))) self.assertFalse(road.isProperPosition(position=(100, 1))) self.assertFalse(road.isProperPosition(position=(0, 4)))
def test_getAbsolutePosition(self): road = Road(100, 2, lane_width=1) for x in range(100): for lane in range(2): position = (x, lane) result = road.getAbsolutePosition(position=position) self.assertEqual(result, position, f'invalid position for ({x}, {lane})') road = Road(100, 2, lane_width=2) self.assertEqual(road.getAbsolutePosition((0, 1)), (0, 0)) self.assertEqual(road.getAbsolutePosition((42, 1)), (42, 0)) self.assertEqual(road.getAbsolutePosition((0, 3)), (0, 1)) self.assertEqual(road.getAbsolutePosition((42, 3)), (42, 1)) road = Road(100, 2, lane_width=10) self.assertEqual(road.getAbsolutePosition((0, 5)), (0, 0)) self.assertEqual(road.getAbsolutePosition((42, 5)), (42, 0)) self.assertEqual(road.getAbsolutePosition((0, 15)), (0, 1)) self.assertEqual(road.getAbsolutePosition((42, 15)), (42, 1))
def test_interface(self): road = Road(100, 1, 1) with self.assertRaises(NotImplementedError): road.addVehicle(vehicle=Mock()) with self.assertRaises(NotImplementedError): _ = road.getVehicle(position=(0, 0)) with self.assertRaises(NotImplementedError): _ = road.getAllActiveVehicles() with self.assertRaises(NotImplementedError): road.addPendingVehicle(vehicle=Mock()) with self.assertRaises(NotImplementedError): _ = road.getPendingVehicle(position=(0, 0)) with self.assertRaises(NotImplementedError): _ = road.getNextVehicle(position=(0, 0)) with self.assertRaises(NotImplementedError): _ = road.getPreviousVehicle(position=(0, 0)) with self.assertRaises(NotImplementedError): _ = road._commitLanes()