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 { public class MarsRover {
Logger logger = Logger.getLogger(this.getClass().getName()); Logger logger = Logger.getLogger(this.getClass().getName());
private enum Rotation {LEFT, RIGHT}
private enum Rotation {LEFT, RIGHT}
private final MarsMap marsMap; private final MarsMap marsMap;
private Direction currentDirection; private Direction currentDirection;
@ -18,8 +18,8 @@ public class MarsRover {
currentDirection = startingDirection; currentDirection = startingDirection;
} }
public Coordinates moveForward() { public void moveTowards(Direction direction) {
return marsMap.updatePositionTowards(currentDirection); marsMap.updatePositionTowards(direction);
} }
public Coordinates moveBackwards() { 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 { public class MarsRoverTest {
private MarsRover rover; private MarsRover rover;
private MoveForwardCommand moveForwardCommand;
@BeforeMethod @BeforeMethod
public void setUp() { public void setUp() {
@ -24,15 +25,17 @@ public class MarsRoverTest {
var startingCoordinates = Coordinates.of(latitudeStartingPoint, longitudeStartingPoint); var startingCoordinates = Coordinates.of(latitudeStartingPoint, longitudeStartingPoint);
var marsMap = new MarsMap(mapHeight, mapWidth, startingCoordinates); var marsMap = new MarsMap(mapHeight, mapWidth, startingCoordinates);
rover = new MarsRover(marsMap, SOUTH); rover = new MarsRover(marsMap, SOUTH);
moveForwardCommand = new MoveForwardCommand(rover);
} }
@Test @Test
public void stepForward() { public void stepForward() {
Direction originalDirection = rover.getCurrentDirection(); 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); assertEquals(rover.getCurrentDirection(), originalDirection);
} }
@ -69,7 +72,7 @@ public class MarsRoverTest {
Coordinates originalCoordinates = rover.getCurrentCoordinates(); Coordinates originalCoordinates = rover.getCurrentCoordinates();
Direction originalDirection = rover.getCurrentDirection(); Direction originalDirection = rover.getCurrentDirection();
repeatAction(10, () -> rover.moveForward()); repeatAction(10, () -> moveForwardCommand.execute());
assertEquals(rover.getCurrentCoordinates(), originalCoordinates); assertEquals(rover.getCurrentCoordinates(), originalCoordinates);
assertEquals(rover.getCurrentDirection(), originalDirection); assertEquals(rover.getCurrentDirection(), originalDirection);
@ -91,7 +94,7 @@ public class MarsRoverTest {
Coordinates originalCoordinates = rover.getCurrentCoordinates(); Coordinates originalCoordinates = rover.getCurrentCoordinates();
rover.turnLeft(); rover.turnLeft();
repeatAction(10, () -> rover.moveForward()); repeatAction(10, () -> moveForwardCommand.execute());
assertEquals(rover.getCurrentCoordinates(), originalCoordinates); assertEquals(rover.getCurrentCoordinates(), originalCoordinates);
assertEquals(rover.getCurrentDirection(), EAST); assertEquals(rover.getCurrentDirection(), EAST);
@ -110,23 +113,23 @@ public class MarsRoverTest {
@Test @Test
public void crazyTour() { public void crazyTour() {
rover.moveForward(); moveForwardCommand.execute();
assertEquals(rover.getCurrentCoordinates(), Coordinates.of(3, 3)); assertEquals(rover.getCurrentCoordinates(), Coordinates.of(3, 3));
assertEquals(rover.getCurrentDirection(), SOUTH); assertEquals(rover.getCurrentDirection(), SOUTH);
rover.turnLeft(); rover.turnLeft();
repeatAction(23, () -> rover.moveForward()); repeatAction(23, () -> moveForwardCommand.execute());
assertEquals(rover.getCurrentCoordinates(), Coordinates.of(3, 6)); assertEquals(rover.getCurrentCoordinates(), Coordinates.of(3, 6));
assertEquals(rover.getCurrentDirection(), EAST); assertEquals(rover.getCurrentDirection(), EAST);
repeatAction(3, () -> rover.turnRight()); repeatAction(3, () -> rover.turnRight());
repeatAction(9, () -> rover.moveForward()); repeatAction(9, () -> moveForwardCommand.execute());
assertEquals(rover.getCurrentCoordinates(), Coordinates.of(4, 6)); assertEquals(rover.getCurrentCoordinates(), Coordinates.of(4, 6));
assertEquals(rover.getCurrentDirection(), NORTH); assertEquals(rover.getCurrentDirection(), NORTH);
rover.moveBackwards(); rover.moveBackwards();
rover.turnRight(); rover.turnRight();
rover.moveForward(); moveForwardCommand.execute();
assertEquals(rover.getCurrentCoordinates(), Coordinates.of(5, 7)); assertEquals(rover.getCurrentCoordinates(), Coordinates.of(5, 7));
assertEquals(rover.getCurrentDirection(), EAST); assertEquals(rover.getCurrentDirection(), EAST);
} }

View File

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