def test_coordinates_are_greater_if_at_least_one_dimension_is_bigger(
         self) -> None:
     assert Coordinates(3, 6) > Coordinates(4, 5)
     assert Coordinates(6, 3) > Coordinates(5, 4)
     assert Coordinates(3, 5) < Coordinates(4, 6)
     assert Coordinates(-1, 3) < Coordinates(0, 2)
     assert Coordinates(3, -1) < Coordinates(2, 0)
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_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))
 def test_two_coordinates_with_different_vertical_point(self) -> None:
     assert Coordinates(3, 4) != Coordinates(3, 5)
 def test_two_coordinates_with_different_horizontal_point(self) -> None:
     assert Coordinates(3, 4) != Coordinates(2, 4)
 def test_two_equal_coordinates(self) -> None:
     assert Coordinates(3, 4) == Coordinates(3, 4)
Example #10
0
 def _coordinates_from(self, match: Match) -> Coordinates:
     return Coordinates(
         int(match.group('horizontal')),
         int(match.group('vertical')),
     )