1
0
Fork 0

introduced command pattern to ease open-close principle apply

This commit is contained in:
Xavier Fontanet 2024-06-22 14:31:42 +02:00
parent d5b6775578
commit f80460054d
5 changed files with 43 additions and 18 deletions

View File

@ -8,8 +8,8 @@ import java.util.logging.Logger;
public class MarsRover {
Logger logger = Logger.getLogger(this.getClass().getName());
private enum Rotation {LEFT, RIGHT}
private enum Rotation {LEFT, RIGHT}
private final MarsMap marsMap;
private Direction currentDirection;
@ -18,8 +18,8 @@ public class MarsRover {
currentDirection = startingDirection;
}
public Coordinates moveForward() {
return marsMap.updatePositionTowards(currentDirection);
public void moveTowards(Direction direction) {
marsMap.updatePositionTowards(direction);
}
public Coordinates moveBackwards() {

View File

@ -0,0 +1,5 @@
package cat.hack3.codingtests.marsrover;
public interface MarsRoverCommand {
void execute();
}

View File

@ -0,0 +1,13 @@
package cat.hack3.codingtests.marsrover;
public class MoveForwardCommand implements MarsRoverCommand{
private final MarsRover marsRover;
public MoveForwardCommand(MarsRover marsRover) {
this.marsRover = marsRover;
}
public void execute() {
marsRover.moveTowards(marsRover.getCurrentDirection());
}
}

View File

@ -14,6 +14,7 @@ import static org.testng.Assert.assertEquals;
public class MarsRoverTest {
private MarsRover rover;
private MoveForwardCommand moveForwardCommand;
@BeforeMethod
public void setUp() {
@ -24,15 +25,17 @@ public class MarsRoverTest {
var startingCoordinates = Coordinates.of(latitudeStartingPoint, longitudeStartingPoint);
var marsMap = new MarsMap(mapHeight, mapWidth, startingCoordinates);
rover = new MarsRover(marsMap, SOUTH);
moveForwardCommand = new MoveForwardCommand(rover);
}
@Test
public void stepForward() {
Direction originalDirection = rover.getCurrentDirection();
Coordinates oneStepForward = rover.moveForward();
moveForwardCommand.execute();
assertEquals(oneStepForward, Coordinates.of(3, 3));
assertEquals(rover.getCurrentCoordinates(), Coordinates.of(3, 3));
assertEquals(rover.getCurrentDirection(), originalDirection);
}
@ -69,7 +72,7 @@ public class MarsRoverTest {
Coordinates originalCoordinates = rover.getCurrentCoordinates();
Direction originalDirection = rover.getCurrentDirection();
repeatAction(10, () -> rover.moveForward());
repeatAction(10, () -> moveForwardCommand.execute());
assertEquals(rover.getCurrentCoordinates(), originalCoordinates);
assertEquals(rover.getCurrentDirection(), originalDirection);
@ -91,7 +94,7 @@ public class MarsRoverTest {
Coordinates originalCoordinates = rover.getCurrentCoordinates();
rover.turnLeft();
repeatAction(10, () -> rover.moveForward());
repeatAction(10, () -> moveForwardCommand.execute());
assertEquals(rover.getCurrentCoordinates(), originalCoordinates);
assertEquals(rover.getCurrentDirection(), EAST);
@ -110,23 +113,23 @@ public class MarsRoverTest {
@Test
public void crazyTour() {
rover.moveForward();
moveForwardCommand.execute();
assertEquals(rover.getCurrentCoordinates(), Coordinates.of(3, 3));
assertEquals(rover.getCurrentDirection(), SOUTH);
rover.turnLeft();
repeatAction(23, () -> rover.moveForward());
repeatAction(23, () -> moveForwardCommand.execute());
assertEquals(rover.getCurrentCoordinates(), Coordinates.of(3, 6));
assertEquals(rover.getCurrentDirection(), EAST);
repeatAction(3, () -> rover.turnRight());
repeatAction(9, () -> rover.moveForward());
repeatAction(9, () -> moveForwardCommand.execute());
assertEquals(rover.getCurrentCoordinates(), Coordinates.of(4, 6));
assertEquals(rover.getCurrentDirection(), NORTH);
rover.moveBackwards();
rover.turnRight();
rover.moveForward();
moveForwardCommand.execute();
assertEquals(rover.getCurrentCoordinates(), Coordinates.of(5, 7));
assertEquals(rover.getCurrentDirection(), EAST);
}

View File

@ -15,6 +15,7 @@ import static org.testng.Assert.assertNotEquals;
public class MarsRoverWithObstaclesTest {
private MarsRover rover;
private MoveForwardCommand moveForwardCommand;
@BeforeMethod
public void setUp() {
@ -32,6 +33,8 @@ public class MarsRoverWithObstaclesTest {
);
var marsMap = new MarsMap(mapHeight, mapWidth, startingCoordinates, obstaclesLocalizations);
rover = new MarsRover(marsMap, SOUTH);
moveForwardCommand = new MoveForwardCommand(rover);
}
@Test
@ -39,7 +42,7 @@ public class MarsRoverWithObstaclesTest {
Coordinates originalCoordinates = rover.getCurrentCoordinates();
Direction originalDirection = rover.getCurrentDirection();
rover.moveForward();
moveForwardCommand.execute();
assertEquals(rover.getCurrentCoordinates(), originalCoordinates);
assertEquals(rover.getCurrentDirection(), originalDirection);
@ -47,18 +50,19 @@ public class MarsRoverWithObstaclesTest {
@Test
public void afterFindingObstacleWalkAroundUntilFindingNext() {
Coordinates oneStepForward = rover.moveForward();
moveForwardCommand.execute();
Coordinates oneStepForward = rover.getCurrentCoordinates();
assertNotEquals(oneStepForward, Coordinates.of(3, 3));
rover.turnLeft();
rover.moveForward();
rover.moveForward();
moveForwardCommand.execute();
moveForwardCommand.execute();
rover.turnRight();
rover.moveForward();
rover.moveForward();
moveForwardCommand.execute();
moveForwardCommand.execute();
var currentPosition = Coordinates.of(4, 5);
assertEquals(rover.getCurrentCoordinates(), currentPosition);
rover.moveForward();
moveForwardCommand.execute();
var positionAfterMove = Coordinates.of(5, 4);
assertNotEquals(rover.getCurrentCoordinates(), positionAfterMove);
}