def test_moves_forward(
     self,
     direction: Direction,
     initial_coordinates: Coordinates,
     final_coordinates: Coordinates,
 ) -> None:
     rover = Rover(Position(direction, initial_coordinates))
     rover.move_forward()
     assert rover.position() == Position(direction, final_coordinates)
class TestRover:
    @pytest.mark.parametrize('coordinates', [
        Coordinates(6, 3),
        Coordinates(7, 3),
        Coordinates(3, 6),
        Coordinates(3, 7),
    ],
                             ids=repr)
    def test_can_not_land_outside_of_the_surface(
            self, coordinates: Coordinates) -> None:
        with pytest.raises(RoverOutsideSurface):
            Rover(Position(Direction.north(), coordinates))

    @pytest.mark.parametrize(
        ('direction', 'initial_coordinates', 'final_coordinates'), [
            (Direction.north(), Coordinates(3, 4), Coordinates(3, 5)),
            (Direction.north(), Coordinates(3, 3), Coordinates(3, 4)),
            (Direction.north(), Coordinates(2, 3), Coordinates(2, 4)),
            (Direction.south(), Coordinates(3, 4), Coordinates(3, 3)),
            (Direction.south(), Coordinates(3, 3), Coordinates(3, 2)),
            (Direction.south(), Coordinates(2, 3), Coordinates(2, 2)),
            (Direction.east(), Coordinates(3, 4), Coordinates(4, 4)),
            (Direction.west(), Coordinates(3, 4), Coordinates(2, 4)),
        ],
        ids=repr)
    def test_moves_forward(
        self,
        direction: Direction,
        initial_coordinates: Coordinates,
        final_coordinates: Coordinates,
    ) -> None:
        rover = Rover(Position(direction, initial_coordinates))
        rover.move_forward()
        assert rover.position() == Position(direction, final_coordinates)

    @pytest.mark.parametrize(
        ('direction', 'initial_coordinates', 'final_coordinates'), [
            (Direction.north(), Coordinates(3, 4), Coordinates(3, 3)),
            (Direction.north(), Coordinates(3, 3), Coordinates(3, 2)),
            (Direction.north(), Coordinates(2, 3), Coordinates(2, 2)),
            (Direction.south(), Coordinates(3, 4), Coordinates(3, 5)),
            (Direction.south(), Coordinates(3, 3), Coordinates(3, 4)),
            (Direction.south(), Coordinates(2, 3), Coordinates(2, 4)),
            (Direction.east(), Coordinates(3, 4), Coordinates(2, 4)),
            (Direction.west(), Coordinates(3, 4), Coordinates(4, 4)),
        ],
        ids=repr)
    def test_moves_backward(
        self,
        direction: Direction,
        initial_coordinates: Coordinates,
        final_coordinates: Coordinates,
    ) -> None:
        rover = Rover(Position(direction, initial_coordinates))
        rover.move_backward()
        assert rover.position() == Position(direction, final_coordinates)

    @pytest.mark.parametrize('position', [
        Position(Direction.north(), Coordinates(3, 5)),
        Position(Direction.east(), Coordinates(5, 3)),
        Position(Direction.south(), Coordinates(3, 0)),
        Position(Direction.west(), Coordinates(0, 3)),
    ],
                             ids=repr)
    def test_does_not_move_forward_outside_the_surface(
            self, position: Position) -> None:
        rover = Rover(position)
        rover.move_forward()
        assert rover.position() == position

    @pytest.mark.parametrize('position', [
        Position(Direction.north(), Coordinates(3, 0)),
        Position(Direction.east(), Coordinates(0, 3)),
        Position(Direction.south(), Coordinates(3, 5)),
        Position(Direction.west(), Coordinates(5, 3)),
    ],
                             ids=repr)
    def test_does_not_move_backward_outside_the_surface(
            self, position: Position) -> None:
        rover = Rover(position)
        rover.move_backward()
        assert rover.position() == position

    @pytest.mark.parametrize(('initial_direction', 'final_direction'), [
        (Direction.north(), Direction.east()),
        (Direction.east(), Direction.south()),
        (Direction.south(), Direction.west()),
        (Direction.west(), Direction.north()),
    ],
                             ids=repr)
    def test_turns_right(self, initial_direction: Direction,
                         final_direction: Direction) -> None:
        rover = Rover(Position(initial_direction, Coordinates(3, 3)))
        rover.turn_right()
        assert rover.position() == Position(final_direction, Coordinates(3, 3))

    @pytest.mark.parametrize(('initial_direction', 'final_direction'), [
        (Direction.north(), Direction.west()),
        (Direction.west(), Direction.south()),
        (Direction.south(), Direction.east()),
        (Direction.east(), Direction.north()),
    ],
                             ids=repr)
    def test_turns_left(self, initial_direction: Direction,
                        final_direction: Direction) -> None:
        rover = Rover(Position(initial_direction, Coordinates(3, 3)))
        rover.turn_left()
        assert rover.position() == Position(final_direction, Coordinates(3, 3))
 def test_can_not_land_outside_of_the_surface(
         self, coordinates: Coordinates) -> None:
     with pytest.raises(RoverOutsideSurface):
         Rover(Position(Direction.north(), coordinates))
 def test_two_positions_with_differrent_coordinates(self) -> None:
     assert Position(Direction.north(), Coordinates(2, 3)) != Position(
         Direction.north(), Coordinates(3, 4))
 def test_two_positions_facing_different_direction(self) -> None:
     assert Position(Direction.north(), Coordinates(2, 3)) != Position(
         Direction.south(), Coordinates(2, 3))
 def test_two_equal_positions(self) -> None:
     assert Position(Direction.north(),
                     Coordinates(2, 3)) == Position(Direction.north(),
                                                    Coordinates(2, 3))
 def test_turns_left(self, initial_direction: Direction,
                     final_direction: Direction) -> None:
     rover = Rover(Position(initial_direction, Coordinates(3, 3)))
     rover.turn_left()
     assert rover.position() == Position(final_direction, Coordinates(3, 3))
Esempio n. 8
0
 def position_from(self, user_input: str) -> Position:
     match = self._pattern().match(user_input)
     if not match:
         raise UserInputError.invalid_position(user_input)
     return Position(self._direction_from(match), self._coordinates_from(match))