public async Task Should_Execute_Task_Continuation()
        {
            var successResult = SuccessResult <int, int> .Create(1);

            var failureResult = FailureResult <int, int> .Create(2);

            Assert.AreEqual(
                2,
                await successResult
                .OnSuccessAsync(s => Task.FromResult(s * 2))
                .OnFailureAsync(f => Task.FromResult(f * 5))
                .GetResultOrThrowExceptionAsync(f => new Exception()));
            Assert.AreEqual(
                2,
                await successResult
                .OnSuccessAsync(s => SuccessResult <int, int> .CreateAsync(s * 2))
                .OnFailureAsync(f => FailureResult <int, int> .CreateAsync(f * 5))
                .GetResultOrThrowExceptionAsync(f => new Exception()));
            Assert.AreEqual(
                4,
                await failureResult
                .OnFailureAsync(f => Task.FromResult(f * 2))
                .OnSuccessAsync(s => Task.FromResult(s * 5))
                .HandleAsync(s => 0, f => f));
            Assert.AreEqual(
                4,
                await failureResult
                .OnFailureAsync(f => FailureResult <int, int> .CreateAsync(f * 2))
                .OnSuccessAsync(s => SuccessResult <int, int> .CreateAsync(s * 5))
                .HandleAsync(s => 0, f => f));
        }
        public void Should_Throw_Exception_When_No_Async_Result()
        {
            var failure             = "failure";
            var failableAsyncResult = FailureResult <string, string> .CreateAsync(failure);

            Assert.ThrowsAsync <Exception>(async() => await failableAsyncResult.GetResultOrThrowExceptionAsync(f => new Exception()));
        }
        public async Task Should_Create_Failure_Async_Result_When_Factory_Method_Used()
        {
            var failure            = "failure";
            var failureAsyncResult = FailureResult <bool, string> .CreateAsync(failure);

            var failureResult = await failureAsyncResult;

            Assert.AreEqual(failure, (failureResult as FailureResult <bool, string>).Failure);
        }
        public async Task Should_handle_async_result_with_async_continuations()
        {
            var asyncSuccessResult = SuccessResult <int, int> .CreateAsync(1);

            var asyncFailureResult = FailureResult <int, int> .CreateAsync(1);

            Func <int, Task <int> > f1 = x => Task.FromResult(x * 2);
            Func <int, Task <int> > f2 = x => Task.FromResult(-x);
            var handledSuccessResult   = await asyncSuccessResult.HandleAsync(f1, f2);

            var handledFailureResult = await asyncFailureResult.HandleAsync(f1, f2);

            Assert.AreEqual(2, handledSuccessResult);
            Assert.AreEqual(-1, handledFailureResult);
        }
        public async Task Should_handle_async_result()
        {
            var asyncSuccessResult = SuccessResult <int, int> .CreateAsync(1);

            var asyncFailureResult = FailureResult <int, int> .CreateAsync(1);

            Func <int, int> f1 = x => x * 2;
            Func <int, int> f2 = x => - x;
            var             handledSuccessResult = await asyncSuccessResult.HandleAsync(f1, f2);

            var handledFailureResult = await asyncFailureResult.HandleAsync(f1, f2);

            Assert.AreEqual(2, handledSuccessResult);
            Assert.AreEqual(-1, handledFailureResult);
        }