示例#1
0
        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);
        }
示例#5
0
        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);
            }
        }
示例#6
0
        public void Grid_Dimensions_Are_Invalid()
        {
            var gridDimension = new Point(0, 1);
            var obstacleList  = new List <Obstacle>();

            var marsGrid = new MarsGrid(gridDimension, obstacleList);
        }
示例#7
0
        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");
        }
示例#8
0
        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);
        }
示例#9
0
 public RobotMoveService(IEnumerable <IMoveCommand> movements,
                         IEnumerable <Position> scents,
                         MarsGrid marsGrid)
 {
     _movements = movements;
     _scents    = scents;
     _marsGrid  = marsGrid;
 }
示例#10
0
        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);
        }
示例#11
0
        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);
        }
示例#12
0
        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);
        }
示例#13
0
        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);
        }
示例#14
0
        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);
        }
示例#15
0
        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);
        }
示例#16
0
        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);
        }
示例#17
0
        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);
        }
示例#18
0
        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);
            });
        }
示例#19
0
        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);
            });
        }
示例#20
0
        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);
        }
示例#21
0
        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);
            });
        }
示例#22
0
        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);
            });
        }
示例#23
0
        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);
        }
示例#25
0
        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);
        }
示例#26
0
        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);
        }
示例#27
0
        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);
            }
        }
示例#28
0
        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);
            });
        }
示例#29
0
 private bool IsRobotOffMars(MarsGrid marsGrid, Position position)
 {
     return(!position.IsValid(marsGrid));
 }
示例#30
0
 public MarsBoardServiceTests()
 {
     _marsGrid = new MarsGrid(5, 3);
 }