Created
October 16, 2014 13:14
-
-
Save vfarcic/615d3837cd679378ae67 to your computer and use it in GitHub Desktop.
Mars Rover kata spec
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.technologyconversations.kata.marsrover; | |
import org.junit.Before; | |
import org.junit.Test; | |
import java.util.ArrayList; | |
import java.util.Arrays; | |
import java.util.List; | |
import static org.assertj.core.api.Assertions.*; | |
/* | |
Source: http://dallashackclub.com/rover | |
Develop an api that moves a rover around on a grid. | |
* You are given the initial starting point (x,y) of a rover and the direction (N,S,E,W) it is facing. | |
* - The rover receives a character array of commands. | |
* - Implement commands that move the rover forward/backward (f,b). | |
* - Implement commands that turn the rover left/right (l,r). | |
* - Implement wrapping from one edge of the grid to another. (planets are spheres after all) | |
* - Implement obstacle detection before each move to a new square. | |
* If a given sequence of commands encounters an obstacle, the rover moves up to the last possible point and reports the obstacle. | |
*/ | |
public class RoverSpec { | |
private Rover rover; | |
private Coordinates roverCoordinates; | |
private final Direction direction = Direction.NORTH; | |
private Point x; | |
private Point y; | |
private List<Obstacle> obstacles; | |
@Before | |
public void beforeRoverTest() { | |
x = new Point(1, 9); | |
y = new Point(2, 9); | |
obstacles = new ArrayList<Obstacle>(); | |
roverCoordinates = new Coordinates(x, y, direction, obstacles); | |
rover = new Rover(roverCoordinates); | |
} | |
@Test | |
public void newInstanceShouldSetRoverCoordinatesAndDirection() { | |
assertThat(rover.getCoordinates()).isEqualToComparingFieldByField(roverCoordinates); | |
} | |
@Test | |
public void receiveSingleCommandShouldMoveForwardWhenCommandIsF() throws Exception { | |
int expected = y.getLocation() + 1; | |
rover.receiveSingleCommand('F'); | |
assertThat(rover.getCoordinates().getY().getLocation()).isEqualTo(expected); | |
} | |
@Test | |
public void receiveSingleCommandShouldMoveBackwardWhenCommandIsB() throws Exception { | |
int expected = y.getLocation() - 1; | |
rover.receiveSingleCommand('B'); | |
assertThat(rover.getCoordinates().getY().getLocation()).isEqualTo(expected); | |
} | |
@Test | |
public void receiveSingleCommandShouldTurnLeftWhenCommandIsL() throws Exception { | |
rover.receiveSingleCommand('L'); | |
assertThat(rover.getCoordinates().getDirection()).isEqualTo(Direction.WEST); | |
} | |
@Test | |
public void receiveSingleCommandShouldTurnRightWhenCommandIsR() throws Exception { | |
rover.receiveSingleCommand('R'); | |
assertThat(rover.getCoordinates().getDirection()).isEqualTo(Direction.EAST); | |
} | |
@Test | |
public void receiveSingleCommandShouldIgnoreCase() throws Exception { | |
rover.receiveSingleCommand('r'); | |
assertThat(rover.getCoordinates().getDirection()).isEqualTo(Direction.EAST); | |
} | |
@Test(expected = Exception.class) | |
public void receiveSingleCommandShouldThrowExceptionWhenCommandIsUnknown() throws Exception { | |
rover.receiveSingleCommand('X'); | |
} | |
@Test | |
public void receiveCommandsShouldBeAbleToReceiveMultipleCommands() throws Exception { | |
int expected = x.getLocation() + 1; | |
rover.receiveCommands("RFR"); | |
assertThat(rover.getCoordinates().getX().getLocation()).isEqualTo(expected); | |
assertThat(rover.getCoordinates().getDirection()).isEqualTo(Direction.SOUTH); | |
} | |
@Test | |
public void receiveCommandShouldWhatFromOneEdgeOfTheGridToAnother() throws Exception { | |
int expected = x.getMaxLocation() + x.getLocation() - 2; | |
rover.receiveCommands("LFFF"); | |
assertThat(rover.getCoordinates().getX().getLocation()).isEqualTo(expected); | |
} | |
@Test | |
public void receiveCommandsShouldStopWhenObstacleIsFound() throws Exception { | |
int expected = x.getLocation() + 1; | |
rover.getCoordinates().setObstacles(Arrays.asList(new Obstacle(expected + 1, y.getLocation()))); | |
rover.getCoordinates().setDirection(Direction.EAST); | |
rover.receiveCommands("FFFRF"); | |
assertThat(rover.getCoordinates().getX().getLocation()).isEqualTo(expected); | |
assertThat(rover.getCoordinates().getDirection()).isEqualTo(Direction.EAST); | |
} | |
@Test | |
public void positionShouldReturnXYAndDirection() throws Exception { | |
rover.receiveCommands("LFFFRFF"); | |
assertThat(rover.getPosition()).isEqualTo("8 X 4 N"); | |
} | |
@Test | |
public void positionShouldReturnNokWhenObstacleIsFound() throws Exception { | |
rover.getCoordinates().setObstacles(Arrays.asList(new Obstacle(x.getLocation() + 1, y.getLocation()))); | |
rover.getCoordinates().setDirection(Direction.EAST); | |
rover.receiveCommands("F"); | |
assertThat(rover.getPosition()).endsWith(" NOK"); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment