public async Task SetsLogLevel(string logLevel, int expected)
            {
                // Given
                string[]           args     = new[] { "build", "-l", logLevel };
                TestLoggerProvider provider = new TestLoggerProvider
                {
                    ThrowLogLevel = LogLevel.None
                };
                IBootstrapper bootstrapper = App.Bootstrapper.Create(args);

                bootstrapper.AddCommand <BuildCommand>("build");
                bootstrapper.AddServices(services => services.AddSingleton <ILoggerProvider>(provider));
                bootstrapper.AddPipeline(
                    "Foo",
                    new LogMessage(LogLevel.Trace, "A"),
                    new LogMessage(LogLevel.Debug, "B"),
                    new LogMessage(LogLevel.Information, "C"),
                    new LogMessage(LogLevel.Warning, "D"),
                    new LogMessage(LogLevel.Error, "E"),
                    new LogMessage(LogLevel.Critical, "F"));

                // When
                int exitCode = await bootstrapper.RunAsync();

                // Then
                exitCode.ShouldBe((int)ExitCode.Normal);
                provider.Messages.Count(x => x.CategoryName.StartsWith("Foo")).ShouldBe(expected);
            }
            public async Task LogsVersion()
            {
                // Given
                string[]           args         = new[] { "build" };
                TestLoggerProvider provider     = new TestLoggerProvider();
                IBootstrapper      bootstrapper = App.Bootstrapper.Create(args);

                bootstrapper.AddCommand <BuildCommand>("build");
                bootstrapper.AddServices(services => services.AddSingleton <ILoggerProvider>(provider));
                bootstrapper.AddPipeline("Foo");

                // When
                int exitCode = await bootstrapper.RunAsync();

                // Then
                exitCode.ShouldBe((int)ExitCode.Normal);
                provider.Messages.ShouldContain(x => x.FormattedMessage.StartsWith("Statiq version"));
            }
            public async Task CatalogsType()
            {
                // Given
                string[]           args         = new[] { "build", "-l", "Debug" };
                TestLoggerProvider provider     = new TestLoggerProvider();
                IBootstrapper      bootstrapper = App.Bootstrapper.Create(args);

                bootstrapper.AddCommand <BuildCommand>("build");
                bootstrapper.AddServices(services => services.AddSingleton <ILoggerProvider>(provider));
                bootstrapper.AddPipeline("Foo");

                // When
                int exitCode = await bootstrapper.RunAsync();

                // Then
                exitCode.ShouldBe((int)ExitCode.Normal);
                bootstrapper.ClassCatalog.GetAssignableFrom <BootstrapperFixture>().Count().ShouldBe(1);
                provider.Messages.ShouldContain(x => x.FormattedMessage.StartsWith("Cataloging types in assembly"));
            }
            public async Task NoPipelinesWarning()
            {
                // Given
                string[]           args     = new[] { "build" };
                TestLoggerProvider provider = new TestLoggerProvider
                {
                    ThrowLogLevel = LogLevel.None
                };
                IBootstrapper bootstrapper = App.Bootstrapper.Create(args);

                bootstrapper.AddCommand <BuildCommand>("build");
                bootstrapper.AddServices(services => services.AddSingleton <ILoggerProvider>(provider));

                // When
                int exitCode = await bootstrapper.RunAsync();

                // Then
                exitCode.ShouldBe((int)ExitCode.Normal);
                provider.Messages.ShouldContain(x =>
                                                x.LogLevel == LogLevel.Warning &&
                                                x.FormattedMessage == "No pipelines are configured.");
            }