Ejemplo n.º 1
0
 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()
Ejemplo n.º 2
0
 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)))
Ejemplo n.º 3
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)
Ejemplo n.º 4
0
 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)
Ejemplo n.º 5
0
 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)
Ejemplo n.º 6
0
 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)
Ejemplo n.º 7
0
    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}')
Ejemplo n.º 8
0
 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)))
Ejemplo n.º 9
0
 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))
Ejemplo n.º 10
0
 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()