public void DeployRoverExpectValidLocationOrThrows(string deployRoverCommandText) { var splittedRoverInfo = deployRoverCommandText.Split(' '); ICommand <Rover> roverDeployCommand = new RoverDeployCommand(Plateau); if (splittedRoverInfo.Length == 3) { var isRoverLocationXParsedSuccessfully = int.TryParse(splittedRoverInfo[0], out var roverX); var isRoverLocationYParsedSuccessfully = int.TryParse(splittedRoverInfo[1], out var roverY); if (!isRoverLocationXParsedSuccessfully) { var ex = Assert.Throws <InvalidCastException>(() => roverDeployCommand.Execute(deployRoverCommandText)); Assert.AreEqual("Invalid argument value for parsing upper value of x.", ex.Message); } else if (!isRoverLocationYParsedSuccessfully) { var ex = Assert.Throws <InvalidCastException>(() => roverDeployCommand.Execute(deployRoverCommandText)); Assert.That(ex.Message, Is.EqualTo("Invalid argument value for parsing upper value of y.")); } else if (!Plateau.ContainsKey(new Block { X = roverX, Y = roverY }) || Plateau[new Block { X = roverX, Y = roverY }] != null) { var ex = Assert.Throws <ArgumentException>(() => roverDeployCommand.Execute(deployRoverCommandText)); Assert.AreEqual("The location is not valid for deploying.", ex.Message); } else { var roverDirection = EnumHelper.GetValueFromDescription <DirectionType>(splittedRoverInfo[2]); if (roverDirection == DirectionType.None) { var ex = Assert.Throws <InvalidEnumArgumentException>(() => roverDeployCommand.Execute(deployRoverCommandText)); Assert.AreEqual("roverDirection", ex.ParamName); } else { var rover = roverDeployCommand.Execute(deployRoverCommandText); Assert.NotNull(rover); Assert.AreEqual(roverDirection, rover.Direction); var roverLocation = new Block { X = roverX, Y = roverY }; Assert.AreSame(Plateau[roverLocation], rover); } } } else { var ex = Assert.Throws <TargetParameterCountException>(() => roverDeployCommand.Execute(deployRoverCommandText)); Assert.That(ex.Message, Is.EqualTo($"{deployRoverCommandText} is not a valid deploy command, please give the order in \"x(1) y(2) direction(N)\" format.")); } }
public void Call_Rover_Deploy_When_Command_Executed() { const CardinalDirection expectedCardinalDirection = CardinalDirection.North; var expectedPosition = new Position(0, 0); var mockRover = new Mock <IRover>(); var mockLandingSurface = new Mock <ILandingSurface>(); var roverDeployCommand = new RoverDeployCommand(expectedPosition, expectedCardinalDirection); roverDeployCommand.SetReceivers(mockRover.Object, mockLandingSurface.Object); roverDeployCommand.Execute(); mockRover.Verify(x => x.Deploy(mockLandingSurface.Object, expectedPosition, expectedCardinalDirection), Times.Once()); }
public void MoveRoverExpectValidPositionOrThrows(string deployRoverCommandText, string moveRoverCommandText, string expectedPositionText) { ICommand <Rover> roverDeployCommand = new RoverDeployCommand(Plateau); var deployedRover = roverDeployCommand.Execute(deployRoverCommandText); ICommand <Rover> roverMoveCommand = new RoverMoveCommand(deployedRover, Plateau); var regexMoveCommandPattern = new Regex("^[LRM]+$"); if (regexMoveCommandPattern.IsMatch(moveRoverCommandText)) { var splittedPosition = expectedPositionText.Split(' '); int.TryParse(splittedPosition[0], out var expectedRoverXLocation); int.TryParse(splittedPosition[1], out var expectedRoverYLocation); var expectedRoverDirection = EnumHelper.GetValueFromDescription <DirectionType>(splittedPosition[2]); var expectedPosition = new Block { X = expectedRoverXLocation, Y = expectedRoverYLocation }; if (Plateau.ContainsKey(expectedPosition) && Plateau[expectedPosition] == null) { var movedRover = roverMoveCommand.Execute(moveRoverCommandText); Assert.AreSame(deployedRover, movedRover); var actualPosition = Plateau.GetRoverLocation(movedRover); Assert.AreEqual(expectedRoverXLocation, actualPosition.X); Assert.AreEqual(expectedRoverYLocation, actualPosition.Y); Assert.AreEqual(expectedRoverDirection, movedRover.Direction); } else { var ex = Assert.Throws <ArgumentException>(() => roverMoveCommand.Execute(moveRoverCommandText)); Assert.AreEqual($"Direction of {expectedRoverDirection} at order {deployedRover.Order} rover's move command is not valid!", ex.Message); } } else { var ex = Assert.Throws <ArgumentException>(() => roverMoveCommand.Execute(moveRoverCommandText)); Assert.AreEqual($"Invalid character(s) in \"{moveRoverCommandText}\" text for move command.", ex.Message); } }