public async Task ShouldProcessCommandsAndTransmitCurrentPosition()
        {
            var manouvreCommandParameter = RoverCommandParametersBuilder.WithOneSafeMoveCommand();

            var commandRetrieverStub = new Mock <IRetrieveRoverCommands>();

            commandRetrieverStub
            .Setup(x => x.GetAll())
            .ReturnsAsync(new[]
            {
                manouvreCommandParameter
            })
            .Verifiable();

            var transmitterStub = new Mock <ITransmitRoverPosition>();

            transmitterStub
            .Setup(x => x.Transmit(It.IsAny <CurrentRoverPosition>()))
            .Returns(Task.CompletedTask)
            .Verifiable();

            var useCase = new RoverOperationUsecase(
                commandRetrieverStub.Object,
                transmitterStub.Object);

            await useCase.StartRoverOperation();

            commandRetrieverStub.Verify(x => x.GetAll(), Times.Once);
            transmitterStub.Verify(x =>
                                   x.Transmit(It.IsAny <CurrentRoverPosition>()),
                                   Times.Once);
        }
        public async Task ShouldNotTransmitPositionIfThereAreNoManouvreCommandsToProcess()
        {
            var commandRetrieverStub = new Mock <IRetrieveRoverCommands>();

            commandRetrieverStub
            .Setup(x => x.GetAll())
            .ReturnsAsync(new[]
            {
                RoverCommandParametersBuilder.WithNoManouvreCommands()
            });

            var transmitterStub = new Mock <ITransmitRoverPosition>();

            transmitterStub
            .Setup(x => x.Transmit(It.IsAny <CurrentRoverPosition>()))
            .Returns(Task.CompletedTask)
            .Verifiable();

            var useCase = new RoverOperationUsecase(
                commandRetrieverStub.Object,
                transmitterStub.Object);

            await useCase.StartRoverOperation();

            transmitterStub.Verify(x => x.Transmit(It.IsAny <CurrentRoverPosition>()), Times.Never);
        }
        public async Task ShouldThrowIfCommandForcesRoverToMoveOffTerrain()
        {
            var commandRetrieverStub = new Mock <IRetrieveRoverCommands>();

            commandRetrieverStub
            .Setup(x => x.GetAll())
            .ReturnsAsync(new[]
            {
                RoverCommandParametersBuilder.WithUnsafeManouvreCommand()
            });

            var useCase = new RoverOperationUsecase(
                commandRetrieverStub.Object,
                new Mock <ITransmitRoverPosition>().Object);

            await Assert.ThrowsAsync <InvalidOperationException>(() => useCase.StartRoverOperation());
        }
        private static Mock <IRetrieveRoverCommands> CreateCommandRetrieverStubWith(
            int startingX,
            int startingY,
            Direction startingHeading)
        {
            var manouvreCommandParameter = RoverCommandParametersBuilder.WithOneSafeMoveCommandWithStartingPosition(
                startingX, startingY, startingHeading);

            var commandRetrieverStub = new Mock <IRetrieveRoverCommands>();

            commandRetrieverStub
            .Setup(x => x.GetAll())
            .ReturnsAsync(new[]
            {
                manouvreCommandParameter
            });
            return(commandRetrieverStub);
        }