public void DemoTest_InputGrid5_3_Robot0_3_W_LLFFFLFLFL_ScentAt3_3_N_Expected2_3_S_NotLost() { // Arrange var grid = new MarsGrid(5, 3); // create scent var robot = new MarsRobot(3, 2, RobotDirection.North); var instructions = Parsers.ParseInstructions("FRRFLLFFRRFLL").ToArray(); robot.PerformInstructions(grid, instructions); var robot2 = new MarsRobot(0, 3, RobotDirection.West); var instructions2 = Parsers.ParseInstructions("LLFFFLFLFL").ToArray(); // Act var result = robot2.PerformInstructions(grid, instructions2); // Assert Assert.Multiple(() => { Assert.AreEqual((2, 3), (result.endX, result.endY)); Assert.AreEqual(RobotDirection.South, result.direction); Assert.IsFalse(result.lost); }); }
public void SetGridBoundaries(MarsGrid marsGrid, string boundaryFeed) { var boundaryFeedSplit = boundaryFeed.Trim().Split(" "); marsGrid.XMaxBoundary = int.Parse(boundaryFeedSplit[0].ToString()); marsGrid.YMaxBoundary = int.Parse(boundaryFeedSplit[1].ToString()); }
public IEnumerable <FinalPosition> GetOutput(MarsGrid marsGrid, IEnumerable <PositionMove> positionMoves) { var finalPositions = new List <FinalPosition>(); var scents = new List <Position>(); try { foreach (var positionMove in positionMoves) { if (!positionMove.InitialPosition.IsValid(marsGrid)) { throw new Exception($"Position X: {positionMove.InitialPosition.PositionX} Y: {positionMove.InitialPosition.PositionY} is invalid"); } var robotMoveService = new RobotMoveService(positionMove.Movements, scents, marsGrid); var finalPosition = robotMoveService.GetFinalPosition(positionMove.InitialPosition); if (finalPosition.IsLost) { scents.Add(finalPosition.Scent); } finalPositions.Add(finalPosition); } return(finalPositions); } catch (System.Exception) { throw; } }
public RoverPosition MoveRoverPosition(MarsGrid marsGrid, RoverPosition currentRoverPosition) { int newYPos = 0; int newXPos = 0; string exceptionMsg = "Cannot move forward, end of planet reached"; switch (currentRoverPosition.Direction) { case "N": newYPos = currentRoverPosition.YPosition + 1; if (newYPos <= marsGrid.YMaxBoundary) { currentRoverPosition.YPosition = newYPos; } else { throw new PlanetOutOfBoundsException(exceptionMsg); } break; case "W": newXPos = currentRoverPosition.XPosition - 1; if (newXPos >= marsGrid.XMinBoundary) { currentRoverPosition.XPosition = newXPos; } else { throw new PlanetOutOfBoundsException(exceptionMsg); } break; case "S": newYPos = currentRoverPosition.YPosition - 1; if (newYPos >= marsGrid.YMinBoundary) { currentRoverPosition.YPosition = newYPos; } else { throw new PlanetOutOfBoundsException(exceptionMsg); } break; case "E": newXPos = currentRoverPosition.XPosition + 1; if (newXPos <= marsGrid.XMaxBoundary) { currentRoverPosition.XPosition = newXPos; } else { throw new Exception(exceptionMsg); } break; } return(currentRoverPosition); }
static void Main(string[] args) { try { Console.WriteLine("Waiting for input."); var(rightLimit, topLimit) = ParseGridSize(); var grid = new MarsGrid(rightLimit, topLimit); while (true) { (int startX, int startY, RobotDirection direction) = ParseRobotPosition(); var robot = new MarsRobot(startX, startY, direction); var instructions = ParseInstructions(); (int endX, int endY, RobotDirection endDirection, bool lost) = robot.PerformInstructions(grid, instructions); var lostText = lost ? "LOST" : ""; Console.WriteLine($"{endX} {endY} {endDirection.ToString()[0]} {lostText}"); } } catch (ArgumentException ex) { Console.WriteLine("Bad input: " + ex.Message); } catch (Exception ex) { Console.WriteLine("Unexpected error: " + ex.Message); } }
public void Grid_Dimensions_Are_Invalid() { var gridDimension = new Point(0, 1); var obstacleList = new List <Obstacle>(); var marsGrid = new MarsGrid(gridDimension, obstacleList); }
public void Rover_Direction_Is_Invalid() { var gridDimension = new Point(1, 1); var obstacleList = new List <Obstacle>(); var marsGrid = new MarsGrid(gridDimension, obstacleList); var rover = new Rover(marsGrid, new Point(1, 1), "D"); }
public void Rover_Starting_Position_Is_Invalid_Because_It_Is_Outside_The_Grid() { var gridDimension = new Point(1, 1); var obstacleList = new List <Obstacle>(); var marsGrid = new MarsGrid(gridDimension, obstacleList); var rover = new Rover(marsGrid, new Point(1, 2), Direction.South); }
public RobotMoveService(IEnumerable <IMoveCommand> movements, IEnumerable <Position> scents, MarsGrid marsGrid) { _movements = movements; _scents = scents; _marsGrid = marsGrid; }
public void Obstacle_Position_Is_Invalid() { var gridDimension = new Point(1, 1); var obstacleList = new List <Obstacle>(); obstacleList.Add(new Obstacle(new Point(1, 2))); var marsGrid = new MarsGrid(gridDimension, obstacleList); }
private void btnSetupMarsAndRover_Click(object sender, EventArgs e) { MarsGrid marsGrid = null; btnSendCommands.Enabled = false; //Setup Mars grid var gridX = Convert.ToInt32(numMarsGridX.Value); var gridY = Convert.ToInt32(numMarsGridY.Value); var gridDimension = new MarsRoverKataApi.Point(gridX, gridY); try { marsGrid = new MarsGrid(gridDimension, _obstacleList); } catch (Exception ex) { if (ex is GridDimensionInvalidException || ex is ObstaclePositionInvalidException) { MessageBox.Show(ex.Message, "Mars grid", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } throw; } //Setup rover var roverX = Convert.ToInt32(numRoverX.Value); var roverY = Convert.ToInt32(numRoverY.Value); var roverStartingPosition = new MarsRoverKataApi.Point(roverX, roverY); try { _rover = new Rover(marsGrid, roverStartingPosition, cboRoverDirection.Text); } catch (Exception ex) { if (ex is RoverStartingDirectionInvalidException || ex is RoverStartingPositionInvalidException) { MessageBox.Show(ex.Message, "Rover", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } throw; } btnSendCommands.Enabled = true; txtRoverStatus.Text = roverX + "," + roverY + " " + cboRoverDirection.Text; MessageBox.Show("Mars grid and rover correctly setup", "Setup", MessageBoxButtons.OK, MessageBoxIcon.Information); }
public void Rover_Starting_Position_Is_Invalid_Because_It_Is_On_An_Obstacle() { var gridDimension = new Point(3, 3); var obstacleList = new List <Obstacle>(); obstacleList.Add(new Obstacle(new Point(1, 2))); var marsGrid = new MarsGrid(gridDimension, obstacleList); var rover = new Rover(marsGrid, new Point(1, 2), Direction.South); }
public void Rover_Turns_Left_From_North() { var gridDimension = new Point(1, 1); var obstacleList = new List <Obstacle>(); var marsGrid = new MarsGrid(gridDimension, obstacleList); var newDirection = marsGrid.TurnRoverLeft(Direction.North); Assert.IsTrue(newDirection == Direction.West); }
public void Rover_Reaches_The_Destination_3() { var gridDimension = new Point(5, 5); var obstacleList = new List <Obstacle>(); var marsGrid = new MarsGrid(gridDimension, obstacleList); var rover = new Rover(marsGrid, new Point(3, 3), Direction.East); var roverInfo = rover.MoveAndTurn("FFRFFRFRRF"); Assert.IsTrue(roverInfo.RoverDirection == Direction.East && roverInfo.RoverPosition.X == 5 && roverInfo.RoverPosition.Y == 1); }
public void Rover_Receives_No_Commands() { var gridDimension = new Point(2, 2); var obstacleList = new List <Obstacle>(); var marsGrid = new MarsGrid(gridDimension, obstacleList); var rover = new Rover(marsGrid, new Point(2, 2), Direction.North); var roverInfo = rover.MoveAndTurn(""); Assert.IsTrue(roverInfo.RoverDirection == Direction.North && roverInfo.RoverPosition.X == 2 && roverInfo.RoverPosition.Y == 2); }
public void Rover_Reaches_The_Destination_2() { var gridDimension = new Point(5, 5); var obstacleList = new List <Obstacle>(); var marsGrid = new MarsGrid(gridDimension, obstacleList); var rover = new Rover(marsGrid, new Point(1, 2), Direction.North); var roverInfo = rover.MoveAndTurn("LFLFLFLFF"); Assert.IsTrue(roverInfo.RoverDirection == Direction.North && roverInfo.RoverPosition.X == 1 && roverInfo.RoverPosition.Y == 3); }
public void Rover_Blocked_By_Obstacle_2() { var gridDimension = new Point(10, 9); var obstacleListString = "1,9;4,4;5,5;8,3;7,8"; var obstacleList = CreateObstacleList(obstacleListString); var marsGrid = new MarsGrid(gridDimension, obstacleList); var rover = new Rover(marsGrid, new Point(8, 6), Direction.South); var roverInfo = rover.MoveAndTurn("RFFFRFFFFFFFF"); Assert.IsTrue(roverInfo.RoverDirection == Direction.North && roverInfo.RoverPosition.X == 5 && roverInfo.RoverPosition.Y == 4); }
public void DemoTest_InputGrid5_3_Robot3_2_N_FRRFLLFFRRFLL_Expected3_3_N_Lost() { // Arrange var grid = new MarsGrid(5, 3); var robot = new MarsRobot(3, 2, RobotDirection.North); var instructions = Parsers.ParseInstructions("FRRFLLFFRRFLL").ToArray(); // Act var result = robot.PerformInstructions(grid, instructions); // Assert Assert.Multiple(() => { Assert.AreEqual((3, 3), (result.endX, result.endY)); Assert.AreEqual(RobotDirection.North, result.direction); Assert.IsTrue(result.lost); }); }
public void DemoTest_InputGrid5_3_Robot1_1_E_RFRFRFRF_Expected1_1_E_NotLost() { // Arrange var grid = new MarsGrid(5, 3); var robot = new MarsRobot(1, 1, RobotDirection.East); var instructions = Parsers.ParseInstructions("RFRFRFRF").ToArray(); // Act var result = robot.PerformInstructions(grid, instructions); // Assert Assert.Multiple(() => { Assert.AreEqual((1, 1), (result.endX, result.endY)); Assert.AreEqual(RobotDirection.East, result.direction); Assert.IsFalse(result.lost); }); }
public void Rover_Reaches_The_Destination_5() { var gridDimension = new Point(10, 9); var obstacleListString = "1,9;4,4;5,5;8,3;7,8"; var obstacleList = CreateObstacleList(obstacleListString); var marsGrid = new MarsGrid(gridDimension, obstacleList); var rover = new Rover(marsGrid, new Point(8, 6), Direction.South); var roverInfo = rover.MoveAndTurn("LFRFFFFRFFLBBB"); Assert.IsTrue(roverInfo.RoverDirection == Direction.South && roverInfo.RoverPosition.X == 7 && roverInfo.RoverPosition.Y == 5); }
public void NotLostTest_InputGrid2_2_Robot1_0_W_Perform_F_Expected0_0_W_NotLost() { // Arrange var grid = new MarsGrid(2, 2); var robot = new MarsRobot(1, 0, RobotDirection.West); var instructions = new RobotInstruction[] { RobotInstruction.Forward }; // Act var result = robot.PerformInstructions(grid, instructions); // Assert Assert.Multiple(() => { Assert.AreEqual((0, 0), (result.endX, result.endY)); Assert.AreEqual(RobotDirection.West, result.direction); Assert.IsFalse(result.lost); }); }
public void LostTest_InputGrid2_2_Robot2_2_N_Perform_F_Expected2_2_N_Lost() { // Arrange var grid = new MarsGrid(2, 2); var robot = new MarsRobot(2, 2, RobotDirection.North); var instructions = new RobotInstruction[] { RobotInstruction.Forward }; // Act var result = robot.PerformInstructions(grid, instructions); // Assert Assert.Multiple(() => { Assert.AreEqual((2, 2), (result.endX, result.endY)); Assert.AreEqual(RobotDirection.North, result.direction); Assert.IsTrue(result.lost); }); }
public void LapOfHonorTest_InputGrid2_2_Robot0_0_N_Perform_FFRFFRFFRFFRRFFLFFLFFLFF_Expected0_0_S_NotLost() { // Arrange var grid = new MarsGrid(2, 2); var robot = new MarsRobot(0, 0, RobotDirection.North); var instructions = Parsers.ParseInstructions("FFRFFRFFRFFRRFFLFFLFFLFF").ToArray(); // Act var result = robot.PerformInstructions(grid, instructions); // Assert Assert.Multiple(() => { Assert.AreEqual((0, 0), (result.endX, result.endY)); Assert.AreEqual(RobotDirection.South, result.direction); Assert.IsFalse(result.lost); }); }
public RoverPosition NavigateRover(MarsGrid marsGrid, RoverPosition currentRoverPosition, string navigationFeed) { foreach (var navigationCmd in navigationFeed.ToUpper()) { switch (navigationCmd) { case 'M': MoveRoverPosition(marsGrid, currentRoverPosition); break; case 'L': case 'R': TurnRoverDirection(currentRoverPosition, navigationCmd); break; } } return(currentRoverPosition); }
public void Rover_Reaches_The_Destination_4() { var gridDimension = new Point(20, 17); var obstacleListString = "2,3;2,4;2,5;2,6;2,7;2,8;2,9;2,10"; obstacleListString += ";4,8;4,14;7,4;8,4;9,4;9,12;9,13;13,10;13,11;17,16"; var obstacleList = CreateObstacleList(obstacleListString); var marsGrid = new MarsGrid(gridDimension, obstacleList); var rover = new Rover(marsGrid, new Point(8, 2), Direction.North); var roverInfo = rover.MoveAndTurn("RFFFLFFFRFRFFFFFFFFRFFFL"); Assert.IsTrue(roverInfo.RoverDirection == Direction.South && roverInfo.RoverPosition.X == 9 && roverInfo.RoverPosition.Y == 14); }
public void Rover_Blocked_By_Obstacle_1() { var gridDimension = new Point(20, 17); var obstacleListString = "2,3;2,4;2,5;2,6;2,7;2,8;2,9;2,10"; obstacleListString += ";4,8;4,14;7,4;8,4;9,4;9,12;9,13;13,10;13,11;17,16"; var obstacleList = CreateObstacleList(obstacleListString); var marsGrid = new MarsGrid(gridDimension, obstacleList); var rover = new Rover(marsGrid, new Point(8, 2), Direction.North); var roverInfo = rover.MoveAndTurn("LFFRFFFFFFLFFFF"); Assert.IsTrue(roverInfo.RoverHasBeenBlockedByObstacle && roverInfo.RoverDirection == Direction.West && roverInfo.RoverPosition.X == 5 && roverInfo.RoverPosition.Y == 8); }
private void Move(MarsGrid grid) { var previousPosition = _coordinates; if (grid.HasScent(_coordinates, _direction)) { return; } switch (_direction) { case RobotDirection.North: _coordinates.PositionY++; break; case RobotDirection.South: _coordinates.PositionY--; break; case RobotDirection.East: _coordinates.PositionX++; break; case RobotDirection.West: _coordinates.PositionX--; break; default: throw new ArgumentException("Invalid robot direction"); } ; if (_coordinates.PositionX > grid.MaxX || _coordinates.PositionX < grid.MinX || _coordinates.PositionY > grid.MaxY || _coordinates.PositionY < grid.MinY) { _lost = true; _coordinates = previousPosition; grid.AddScent(_coordinates, _direction); } }
public void ScentTest_InputFirstRobotLostSecondRepeatsRouteButHasDifferentLastDirection_ExpectedBothLost() { // Arrange var grid = new MarsGrid(2, 2); var robot = new MarsRobot(2, 2, RobotDirection.North); var robot2 = new MarsRobot(2, 2, RobotDirection.North); var instructions = new RobotInstruction[] { RobotInstruction.Forward }; var instructions2 = new RobotInstruction[] { RobotInstruction.TurnRight, RobotInstruction.Forward }; // Act var result1 = robot.PerformInstructions(grid, instructions); var result2 = robot2.PerformInstructions(grid, instructions2); // Assert Assert.Multiple(() => { Assert.AreEqual((2, 2), (result1.endX, result1.endY)); Assert.AreEqual((2, 2), (result2.endX, result2.endY)); Assert.IsTrue(result1.lost); Assert.IsTrue(result2.lost); }); }
private bool IsRobotOffMars(MarsGrid marsGrid, Position position) { return(!position.IsValid(marsGrid)); }
public MarsBoardServiceTests() { _marsGrid = new MarsGrid(5, 3); }