public async Task RunAsync_MainThrowsArgumentException_ReturnCodeIsMinInt()
        {
            var sysConsole = A.Fake <ISysConsole>();

            var executor = A.Fake <IConsoleAppExecutor>();

            A.CallTo(() => executor.ExecuteAsync(A <string[]> .Ignored)).Throws(_ => new ArgumentException());

            var consoleApp = new DefaultConsoleApp(executor, Array.Empty <string>(), sysConsole);

            // Act
            var result = await consoleApp.RunAsync();

            // Assert
            result
            .Should()
            .Be(int.MinValue);
        }
        public async Task RunAsync_MainThrowsConsoleException_ReturnCodeFromExceptionIsReturned()
        {
            const int expectedResult = -1234;

            var sysConsole = A.Fake <ISysConsole>();

            var executor = A.Fake <IConsoleAppExecutor>();

            A.CallTo(() => executor.ExecuteAsync(A <string[]> .Ignored)).Throws(_ => new ConsoleException(expectedResult));

            var consoleApp = new DefaultConsoleApp(executor, Array.Empty <string>(), sysConsole);

            // Act
            var result = await consoleApp.RunAsync();

            // Assert
            result
            .Should()
            .Be(expectedResult);
        }
        public async Task RunAsync_MainReturnsValue_ValueIsReturned()
        {
            const int expectedResult = 1234;

            var sysConsole = A.Fake <ISysConsole>();

            var executor = A.Fake <IConsoleAppExecutor>();

            A.CallTo(() => executor.ExecuteAsync(A <string[]> .Ignored)).Returns(Task.FromResult(expectedResult));

            var consoleApp = new DefaultConsoleApp(executor, Array.Empty <string>(), sysConsole);

            // Act
            var result = await consoleApp.RunAsync();

            // Assert
            result
            .Should()
            .Be(expectedResult);
        }