introduced command pattern to ease open-close principle apply
This commit is contained in:
parent
d5b6775578
commit
f80460054d
|
@ -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() {
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
package cat.hack3.codingtests.marsrover;
|
||||||
|
|
||||||
|
public interface MarsRoverCommand {
|
||||||
|
void execute();
|
||||||
|
}
|
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue