示例#1
0
        public static void Main(string[] args)
        {
            var roverService = new RoverService(new RoverParser(), new RoverManager());

            string fileName     = args.FirstOrDefault();
            var    fileContents = File.ReadAllLines(fileName);

            if (string.IsNullOrWhiteSpace(fileName))
            {
                System.Console.Error.WriteLine("Please enter a file name.");
            }
            else
            {
                try
                {
                    roverService.ExecuteInstructions(fileContents);

                    var headingConverter = new HeadingConverter();

                    foreach (var rover in roverService.EnumerateRovers())
                    {
                        System.Console.WriteLine(string.Format("Rover{0}:{1} {2} {3}", rover.Id, rover.Position.X, rover.Position.Z, headingConverter.ToChar(rover.Heading)));
                    }
                }
                catch (Exception ex)
                {
                    System.Console.Error.WriteLine(ex.Message);
                }
            }

            System.Console.Write("Please press any key...");
            System.Console.ReadLine();
        }
示例#2
0
        public void Execute_Instruction_Test()
        {
            var plateauMock = new Mock <IPlateauService>();

            plateauMock.Setup(p => p.IsValidPosition(It.IsAny <Position>())).Returns(true);

            var leftInstruction = new Mock <IInstruction>();

            leftInstruction.Setup(x => x.Execute(It.IsAny <Position>())).Returns(new Position {
                X = 1, Y = 3, D = 'N'
            });

            var instructionFactory = new Mock <IInstructionFactory>();

            instructionFactory.Setup(p => p.GetInstruction('L')).Returns(leftInstruction.Object);

            var roverService = new RoverService(instructionFactory.Object, plateauMock.Object);

            roverService.Deploy("1 3 E", "L");

            roverService.ExecuteInstruction();

            var rover = roverService.GetRover(0);

            Assert.AreEqual(1, rover.Position.X);
            Assert.AreEqual(3, rover.Position.Y);
            Assert.AreEqual(Direction.North, rover.Position.D);
        }
        public void ParseInputTest()
        {
            string input          = $"5 5{Environment.NewLine}1 2 N{Environment.NewLine}LMLMLMLMM{Environment.NewLine}3 3 E{Environment.NewLine}MMRMMRMRRM{Environment.NewLine}";
            string output         = string.Empty;
            string expectedOutput = $"1 3 N{Environment.NewLine}5 1 E{Environment.NewLine}";

            //poor man's dependency injection
            IInstructionParser parser  = new InstructionParser();
            IRoverFactory      factory = new RoverFactory();
            IRoverService      service = new RoverService(factory, parser);

            var response = service.ParseInput(new Domain.Parser.Messages.ExecuteRequest()
            {
                Input = input
            });

            //if no exceptions encountered
            if (response.Exception == null)
            {
                //get the output
                output = response.Output;
            }
            else
            {
                output = response.Exception.Message;
            }

            Console.WriteLine(output);
            Assert.AreEqual(expectedOutput, output);
        }
示例#4
0
        /// <summary>
        /// save screenshots and other in-outs
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task <bool> SaveScreenShotData(RoverEntity input)
        {
            RoverService service = new RoverService();
            var          res     = await service.SaveData(input);

            return(res);
        }
示例#5
0
        /// <summary>
        /// get complete history of inouts
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task <List <RoverEntity> > GetAllHistoryInformations()
        {
            RoverService service = new RoverService();
            var          res     = await service.GetAllDatas();

            return(res);
        }
示例#6
0
        public void CreateRoverObject(List <string> inputs)
        {
            RoverService roverService = new RoverService();
            List <Rover> rovers       = roverService.GetRoversByInput(inputs);

            int expectedRoverCount = (inputs.Count) / 2;

            Assert.Equal(expectedRoverCount, rovers.Count);
        }
示例#7
0
        public void Deploy_Direction_Exception()
        {
            var plateauMock        = new Mock <IPlateauService>();
            var instructionFactory = new Mock <IInstructionFactory>();

            var roverService = new RoverService(instructionFactory.Object, plateauMock.Object);

            roverService.Deploy("1 3 P", "LMLMLMLMM");
        }
示例#8
0
        /// <summary>
        /// get final points from azure
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task <RoverFinalPoints> GetFinalPosFromAzure(RoverInput input)
        {
            RoverService     service = new RoverService();
            RoverFinalPoints res     = await service.GetFinalPoints(input);

            if (res != null && res.FlowPath.Length > 0)
            {
                return(res);
            }
            return(null);
        }
示例#9
0
        public void Deploy_Position_Exception()
        {
            var plateauMock = new Mock <IPlateauService>();

            plateauMock.Setup(p => p.IsValidPosition(It.IsAny <Position>())).Returns(false);

            var instructionFactory = new Mock <IInstructionFactory>();

            var roverService = new RoverService(instructionFactory.Object, plateauMock.Object);

            roverService.Deploy("1 3 E", "LMLMLMLMM");
        }
示例#10
0
        public void Process_FirstInput_ReturnExpectedResult()
        {
            //Arrange
            var plateauOne   = new Plateau(new Position(5, 5));
            var roverService = new RoverService(plateauOne, new Position(1, 2), Directions.N);

            //Act
            roverService.Process("LMLMLMLMM");

            //Assert
            var expectedResult = roverService.Print();

            expectedResult.Should().Be("1 3 N");
        }
示例#11
0
        public void Process_SecondInput_ReturnExpectedResult()
        {
            //Arrange
            var plateauOne   = new Plateau(new Position(5, 5));
            var roverService = new RoverService(plateauOne, new Position(3, 3), Directions.E);

            //Act
            roverService.Process("MMRMMRMRRM");

            //Assert
            var expectedResult = roverService.Print();

            expectedResult.Should().Be("5 1 E");
        }
示例#12
0
        public RoverServiceTest()
        {
            //Given
            _plateauService = new Mock <IPlateauService>();
            _loggerMock     = new Mock <ILogger <RoverService> >();
            _roverService   = new RoverService(_loggerMock.Object);

            _roverPositionModel = new RoverPositionModel
            {
                Direction = Direction.North,
                X         = 1,
                Y         = 1
            };
        }
示例#13
0
        public void Deploy_Test()
        {
            var plateauMock = new Mock <IPlateauService>();

            plateauMock.Setup(p => p.IsValidPosition(It.IsAny <Position>())).Returns(true);

            var instructionFactory = new Mock <IInstructionFactory>();

            var roverService = new RoverService(instructionFactory.Object, plateauMock.Object);

            roverService.Deploy("1 3 E", "LMLMLMLMM");

            Assert.AreEqual(1, roverService.rovers.Count);
        }
        public async void GenerateRoverMovementCommands()
        {
            string test1 = "20,20 N|LMLMLMM";// test if code handles extremme data

            // convert string to stream
            byte[]       byteArray1 = Encoding.ASCII.GetBytes(test1);
            MemoryStream stream     = new MemoryStream(byteArray1);

            IFileProcessingService fileData = new CsvFileProcessingService(100, 500);
            await fileData.ReadFileAsync(stream);

            IControlService roverService = new RoverService(fileData.ProcessedRoverData);

            roverService.GenerateRoverMovementCommands();
            var result = roverService.rovers;

            Assert.IsNotNull(result);
        }
示例#15
0
        public void Get_Rover_Test()
        {
            var plateauMock = new Mock <IPlateauService>();

            plateauMock.Setup(p => p.IsValidPosition(It.IsAny <Position>())).Returns(true);

            var instructionFactory = new Mock <IInstructionFactory>();

            var roverService = new RoverService(instructionFactory.Object, plateauMock.Object);

            roverService.Deploy("1 3 E", "LMLMLMLMM");

            var rover = roverService.GetRover(0);

            Assert.AreEqual(1, rover.Position.X);
            Assert.AreEqual(3, rover.Position.Y);
            Assert.AreEqual(Direction.East, rover.Position.D);

            CollectionAssert.AreEqual("LMLMLMLMM".ToCharArray(), rover.Instruction);
        }
示例#16
0
        public void ChangeDirectionTest()
        {
            Rover        myRover      = new Rover();
            RoverService roverService = new RoverService();

            myRover.X         = 1;
            myRover.Y         = 2;
            myRover.Direction = Direction.North;
            var response = roverService.ChangeDirection(myRover, 'L');

            Assert.AreEqual(myRover.Direction, Direction.West);
            Assert.IsNotNull(response);
            Assert.IsNotNull(response.IsSuccess);
            Assert.IsNotNull(response.Message);
            Assert.IsTrue(response.IsSuccess, response.Message);
            if (!response.IsSuccess && !string.IsNullOrEmpty(response.Message))
            {
                Assert.Inconclusive(string.Format("Service success is false. Error Message{0}", response.Message), response.Message);
            }
        }
示例#17
0
        public async Task MoveSequence_HitsObsacle_MoveSuccessUntilHit()
        {
            //Arrange
            var fileReaderServiceMock = new Mock <PlanetSurfaceService>();

            fileReaderServiceMock.Setup(service => service.GetPlanetLayout()).Returns(() => new int[3, 3] {
                { 0, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 }
            });
            var planetService = new PlanetService(fileReaderServiceMock.Object);

            var roverService = new RoverService(_loggerMock, planetService);

            await roverService.Land(0, 0);

            //Act

            await roverService.MoveSequence("FLFF");

            //Assert

            Assert.True(roverService.Position.Item1 == 0 && roverService.Position.Item2 == 1);
        }
示例#18
0
        public async Task MoveSequence_FacesWest_MoveSequenceL()
        {
            //Arrange
            var fileReaderServiceMock = new Mock <PlanetSurfaceService>();

            fileReaderServiceMock.Setup(service => service.GetPlanetLayout()).Returns(() => new int[2, 2] {
                { 0, 0 }, { 0, 0 }
            });
            var planetService = new PlanetService(fileReaderServiceMock.Object);

            var roverService = new RoverService(_loggerMock, planetService);

            await roverService.Land(0, 0);

            //Act

            await roverService.MoveSequence("L");

            //Assert

            Assert.True(roverService.Compass == Models.Compass.E);
        }
示例#19
0
        public async Task MoveSequence_MovesBackward_MoveSequenceS()
        {
            //Arrange
            var fileReaderServiceMock = new Mock <PlanetSurfaceService>();

            fileReaderServiceMock.Setup(service => service.GetPlanetLayout()).Returns(() => new int[2, 2] {
                { 0, 0 }, { 0, 0 }
            });
            var planetService = new PlanetService(fileReaderServiceMock.Object);

            var roverService = new RoverService(_loggerMock, planetService);

            await roverService.Land(0, 1);

            //Act

            await roverService.MoveSequence("B");

            //Assert

            Assert.True(roverService.Position.Item1 == 0 && roverService.Position.Item2 == 0);
        }
示例#20
0
        public async Task <Rover> MoveAsync(MoveParams moveParams)
        {
            // Get Rover
            Rover rover = await GetRoverInfoAsync(moveParams.Id);

            if (rover == null)
            {
                throw new RestException(HttpStatusCode.NotFound,
                                        new { message = $"Rover with id {moveParams.Id} not found." });
            }

            await using SqliteConnection connection =
                            new SqliteConnection(_configuration.GetSection("ConnectionStrings:Database").Value);
            await connection.OpenAsync();

            // Get Planet
            Planet planet = await _planetRepository.GetPlanetInfoAsync(rover.PlanetId);

            Rover newRover = new Rover
            {
                Id        = rover.Id,
                PosX      = rover.PosX,
                PosY      = rover.PosY,
                Direction = rover.Direction,
                PlanetId  = rover.PlanetId
            };

            SqliteCommand updateRoverPositionCmd = new SqliteCommand
            {
                Connection  = connection,
                CommandText = await File.ReadAllTextAsync("../Infrastructure/SQL/Queries/Rover/UpdateRover.sql"),
            };

            foreach (char instruction in moveParams.Instructions)
            {
                int prevPosX = newRover.PosX;
                int prevPosY = newRover.PosY;
                newRover = RoverService.GetNewRoverPosition(planet, newRover, instruction);
                // Check if there is an obstacle
                if (instruction == RoverDirections.Forward || instruction == RoverDirections.Backward)
                {
                    bool positionHasObstacle =
                        await _obstacleRepository.PositionHasObstacle(newRover.PosX, newRover.PosY);

                    if (positionHasObstacle)
                    {
                        updateRoverPositionCmd.Parameters.AddRange(
                            new[]
                        {
                            new SqliteParameter
                            {
                                ParameterName = "$id",
                                SqliteType    = SqliteType.Integer,
                                Value         = newRover.Id
                            },
                            new SqliteParameter
                            {
                                ParameterName = "$posX",
                                SqliteType    = SqliteType.Integer,
                                Value         = prevPosX
                            },
                            new SqliteParameter
                            {
                                ParameterName = "$posY",
                                SqliteType    = SqliteType.Integer,
                                Value         = prevPosY
                            },
                            new SqliteParameter
                            {
                                ParameterName = "$direction",
                                SqliteType    = SqliteType.Text,
                                Value         = newRover.Direction
                            }
                        }
                            );
                        await updateRoverPositionCmd.ExecuteNonQueryAsync();

                        throw new RestException(HttpStatusCode.Forbidden,
                                                new
                        {
                            obstacle = new Obstacle
                            {
                                PosX = newRover.PosX,
                                PosY = newRover.PosY
                            },
                            rover =
                                new Rover
                            {
                                Id        = newRover.Id,
                                PosX      = prevPosX,
                                PosY      = prevPosY,
                                Direction = newRover.Direction,
                                PlanetId  = newRover.PlanetId
                            }
                        });
                    }
                }
            }

            updateRoverPositionCmd.Parameters.AddRange(
                new[]
            {
                new SqliteParameter
                {
                    ParameterName = "$id",
                    SqliteType    = SqliteType.Integer,
                    Value         = newRover.Id
                },
                new SqliteParameter
                {
                    ParameterName = "$posX",
                    SqliteType    = SqliteType.Integer,
                    Value         = newRover.PosX
                },
                new SqliteParameter
                {
                    ParameterName = "$posY",
                    SqliteType    = SqliteType.Integer,
                    Value         = newRover.PosY
                },
                new SqliteParameter
                {
                    ParameterName = "$direction",
                    SqliteType    = SqliteType.Text,
                    Value         = newRover.Direction
                }
            }
                );

            await updateRoverPositionCmd.ExecuteNonQueryAsync();

            return(newRover);
        }
示例#21
0
        public void CheckRoverInputData(List <string> inputs)
        {
            RoverService roverService = new RoverService();

            Assert.Throws <InvalidCastException>(() => roverService.GetRoversByInput(inputs));
        }
示例#22
0
 public RoverController(PlanetService planetService, RoverService roverService)
 {
     _planetService = planetService;
     _roverService  = roverService;
 }
示例#23
0
 public CalculateRoverMovement()
 {
     _roverService = new RoverService();
 }
示例#24
0
 public DrawPlateauTest()
 {
     _roverService = new RoverService();
 }
示例#25
0
 public RoverServiceTest()
 {
     _mockedInputValidator = new Mock <IInputValidator>();
     _sut = new RoverService(_mockedInputValidator.Object);
 }
        public void If_Given_Invalid_Input_Return_InvalidCastException(List <string> inputs)
        {
            var roverService = new RoverService();

            Assert.Throws <InvalidCastException>(() => roverService.GetRovers(inputs));
        }
        public void If_Given_Valid_Input_Return_RoverList(List <string> inputs)
        {
            var roverService = new RoverService();

            Assert.NotNull(roverService.GetRovers(inputs));
        }
示例#28
0
 public RoverTest()
 {
     _plateauService = new PlateauService();
     _roverService   = new RoverService();
 }
 public SetRoverOnPlateauTest()
 {
     _roverService = new RoverService();
 }