public async Task RunAsync_Cancellation_Test()
        {
            // Arrange
            using var console = new VirtualConsole();

            var application = new CliApplicationBuilder()
                              .AddCommand(typeof(CancellableCommand))
                              .UseConsole(console)
                              .Build();

            var commandLineArguments = new[] { "cancel" };
            var environmentVariables = new Dictionary <string, string>();

            // Act
            console.CancelAfter(TimeSpan.FromSeconds(0.2));

            var exitCode = await application.RunAsync(commandLineArguments, environmentVariables);

            var stdOut = console.ReadOutputString().Trim();
            var stdErr = console.ReadErrorString().Trim();

            // Assert
            exitCode.Should().NotBe(0);
            stdOut.Should().BeNullOrWhiteSpace();
            stdErr.Should().NotBeNullOrWhiteSpace();

            Console.WriteLine(stdErr);
        }
        public async Task RunAsync_Negative_Test(
            IReadOnlyList <Type> commandTypes,
            IReadOnlyList <string> commandLineArguments,
            IReadOnlyDictionary <string, string> environmentVariables,
            string?expectedStdErr = null,
            int?expectedExitCode  = null)
        {
            // Arrange
            using var console = new VirtualConsole();

            var application = new CliApplicationBuilder()
                              .AddCommands(commandTypes)
                              .UseTitle(TestAppName)
                              .UseExecutableName(TestAppName)
                              .UseVersionText(TestVersionText)
                              .UseConsole(console)
                              .Build();

            // Act
            var exitCode = await application.RunAsync(commandLineArguments, environmentVariables);

            var stdErr = console.ReadErrorString().Trim();

            // Assert
            exitCode.Should().NotBe(0);
            stdErr.Should().NotBeNullOrWhiteSpace();

            if (expectedExitCode != null)
            {
                exitCode.Should().Be(expectedExitCode);
            }

            if (expectedStdErr != null)
            {
                stdErr.Should().Be(expectedStdErr);
            }

            Console.WriteLine(stdErr);
        }