public void ProcessCommandLineArguments_TooFewArgumentsSupplied()
        {
            // arrange
            var filterName = "filterName";
            var filename   = "file.txt";

            var expectedMessage = "Error: Expecting 2 command line arguments";

            var mockLogger        = new Mock <ILogger <CommandLineProcessorService> >();
            var mockOutputService = new Mock <IOutputService>();
            var mockFilterFactory = new Mock <IFilterFactory>();

            var commandLineProcessorService = new CommandLineProcessorService(
                mockLogger.Object, mockOutputService.Object, mockFilterFactory.Object);

            // logging extension methods cannot be setup/verified
            mockOutputService
            .Setup(x => x.OutputMessage(expectedMessage))
            .Verifiable();
            mockOutputService
            .Setup(x => x.OutputMessage(commandLineProcessorService.usage))
            .Verifiable();

            // act
            commandLineProcessorService.ProcessCommandLineArguments(
                new string[] { filterName });

            // assert
            mockOutputService.VerifyAll();
            mockOutputService.VerifyNoOtherCalls();
            mockFilterFactory.VerifyAll();
            mockFilterFactory.VerifyNoOtherCalls();
        }
        public void ProcessCommandLineArguments_CannotFindFilter()
        {
            // arrange
            var filterName           = "filterName";
            var filename             = "file.txt";
            var expectedErrorMessage = "Error: filter \"filterName\" not found";

            var mockLogger        = new Mock <ILogger <CommandLineProcessorService> >();
            var mockOutputService = new Mock <IOutputService>();
            var mockFilterFactory = new Mock <IFilterFactory>();

            var commandLineProcessorService = new CommandLineProcessorService(
                mockLogger.Object, mockOutputService.Object, mockFilterFactory.Object);

            mockFilterFactory
            .Setup(x => x.CreateFilter(filterName))
            .Throws(new FilterNotFoundException(filterName))
            .Verifiable();
            mockOutputService
            .Setup(x => x.OutputMessage(expectedErrorMessage))
            .Verifiable();
            mockOutputService
            .Setup(x => x.OutputMessage(commandLineProcessorService.usage))
            .Verifiable();

            // act
            commandLineProcessorService.ProcessCommandLineArguments(new string[] { filterName, filename });

            // assert
            mockOutputService.VerifyAll();
            mockOutputService.VerifyNoOtherCalls();
            mockFilterFactory.VerifyAll();
            mockFilterFactory.VerifyNoOtherCalls();
        }
        public void ProcessCommandLineArguments_OtherExceptionThrown()
        {
            // arrange
            var filterName           = "filterName";
            var filename             = "file.txt";
            var expectedErrorMessage = "Something went wrong";

            var mockLogger        = new Mock <ILogger <CommandLineProcessorService> >();
            var mockOutputService = new Mock <IOutputService>();
            var mockFilterFactory = new Mock <IFilterFactory>();
            var mockFilter        = new Mock <IWordFilter>();

            var commandLineProcessorService = new CommandLineProcessorService(
                mockLogger.Object, mockOutputService.Object, mockFilterFactory.Object);

            mockFilterFactory
            .Setup(x => x.CreateFilter(filterName))
            .Returns(mockFilter.Object)
            .Verifiable();
            mockFilter
            .Setup(x => x.Filter(It.IsAny <string>()))
            .Throws(new Exception("just because"))
            .Verifiable();

            mockOutputService
            .Setup(x => x.OutputMessage(expectedErrorMessage))
            .Verifiable();
            mockOutputService
            .Setup(x => x.OutputMessage(commandLineProcessorService.usage))
            .Verifiable();

            // act
            commandLineProcessorService.ProcessCommandLineArguments(new string[] { filterName, filename });

            // assert
            mockOutputService.VerifyAll();
            mockOutputService.VerifyNoOtherCalls();
            mockFilterFactory.VerifyAll();
            mockFilterFactory.VerifyNoOtherCalls();
            mockFilter.VerifyAll();
            mockFilter.VerifyNoOtherCalls();
        }
        public void ProcessCommandLineArguments_FileFoundAndFiltered()
        {
            // arrange
            var filterName     = "filterName";
            var filename       = "file.txt";
            var filteredString = "filtered string";

            var mockLogger        = new Mock <ILogger <CommandLineProcessorService> >();
            var mockOutputService = new Mock <IOutputService>();
            var mockFilterFactory = new Mock <IFilterFactory>();
            var mockFilter        = new Mock <IWordFilter>();

            var commandLineProcessorService = new CommandLineProcessorService(
                mockLogger.Object, mockOutputService.Object, mockFilterFactory.Object);

            mockFilterFactory
            .Setup(x => x.CreateFilter(filterName))
            .Returns(mockFilter.Object)
            .Verifiable();
            mockFilter
            .Setup(x => x.Filter(It.IsAny <string>()))
            .Returns(filteredString)
            .Verifiable();
            mockOutputService
            .Setup(x => x.OutputMessage($"string filtered by {filterName}:"))
            .Verifiable();
            mockOutputService
            .Setup(x => x.OutputMessage(filteredString))
            .Verifiable();

            // act
            commandLineProcessorService.ProcessCommandLineArguments(new string[] { filterName, filename });

            // assert
            mockOutputService.VerifyAll();
            mockOutputService.VerifyNoOtherCalls();
            mockFilterFactory.VerifyAll();
            mockFilterFactory.VerifyNoOtherCalls();
            mockFilter.VerifyAll();
            mockFilter.VerifyNoOtherCalls();
        }