// Copyright (c) The Geekeey Authors // SPDX-License-Identifier: EUPL-1.2 using System.Globalization; namespace Geekeey.Request.Result.Tests; internal sealed class ResultTransformTests { [Test] public async Task I_can_map_and_it_returns_success_for_success() { var start = Prelude.Success(2); var result = start.Map(value => value.ToString(CultureInfo.InvariantCulture)); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); await Assert.That(result.Value).IsEqualTo("2"); } [Test] public async Task I_can_map_and_it_returns_failure_for_failure() { var start = Prelude.Failure("error"); var result = start.Map(value => value.ToString(CultureInfo.InvariantCulture)); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_transform_result_with_then_and_it_returns_success_for_success_and_mapping_returning_success() { var start = Prelude.Success(2); var result = start.Then(value => Prelude.Success(value.ToString(CultureInfo.InvariantCulture))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); await Assert.That(result.Value).IsEqualTo("2"); } [Test] public async Task I_can_transform_result_with_then_and_it_returns_failure_for_success_and_mapping_returning_failure() { var start = Prelude.Success(2); var result = start.Then(_ => Prelude.Failure("error")); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_transform_result_with_then_and_it_returns_failure_for_failure_and_mapping_returning_success() { var start = Prelude.Failure("error"); var result = start.Then(value => Prelude.Success(value.ToString(CultureInfo.InvariantCulture))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_transform_result_with_then_and_it_returns_failure_for_failure_and_mapping_returning_failure() { var start = Prelude.Failure("error"); var result = start.Then(_ => Prelude.Failure("error 2")); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_map_and_it_returns_success_for_success_without_throwing() { var start = Prelude.Success(2); var result = start.TryMap(value => value.ToString(CultureInfo.InvariantCulture)); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); await Assert.That(result.Value).IsEqualTo("2"); } [Test] public async Task I_can_try_map_and_it_returns_failure_for_failure_without_throwing() { var start = Prelude.Failure("error"); var result = start.TryMap(value => value.ToString(CultureInfo.InvariantCulture)); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_map_and_it_returns_failure_for_success_with_throwing() { var start = Prelude.Success(2); var result = start.TryMap(_ => throw new CustomTestException()); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_try_map_and_it_returns_failure_for_failure_with_throwing() { var start = Prelude.Failure("error"); var result = start.TryMap(_ => throw new CustomTestException()); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error).IsTypeOf(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_transform_result_with_then_and_it_returns_success_for_success_and_mapping_returning_success() { var start = Prelude.Success(2); var result = start.ThenTry(value => Prelude.Success(value.ToString(CultureInfo.InvariantCulture))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); await Assert.That(result.Value).IsEqualTo("2"); } [Test] public async Task I_can_try_transform_result_with_then_and_it_returns_failure_for_success_and_mapping_returning_failure() { var start = Prelude.Success(2); var result = start.ThenTry(_ => Prelude.Failure("error")); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_transform_result_with_then_and_it_returns_failure_for_failure_and_mapping_returning_failure() { var start = Prelude.Failure("error"); var result = start.ThenTry(x => Prelude.Success(x.ToString(CultureInfo.InvariantCulture))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_transform_result_with_then_and_it_returns_failure_for_success_and_mapping_throwing() { var start = Prelude.Success(2); var result = start.ThenTry(_ => throw new CustomTestException()); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_try_transform_result_with_then_and_it_returns_failure_for_failure_and_mapping_throwing() { var start = Prelude.Failure("error"); var result = start.ThenTry(_ => throw new CustomTestException()); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error).IsTypeOf(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_map_async_and_it_returns_success_for_success() { var start = Prelude.Success(2); var result = await start.MapAsync(value => Task.FromResult(value.ToString(CultureInfo.InvariantCulture))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); await Assert.That(result.Value).IsEqualTo("2"); } [Test] public async Task I_can_map_async_and_it_returns_failure_for_failure() { var start = Prelude.Failure("error"); var result = await start.MapAsync(value => Task.FromResult(value.ToString(CultureInfo.InvariantCulture))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_transform_result_async_with_then_and_it_returns_success_for_success_and_mapping_returning_success() { var start = Prelude.Success(2); var result = await start.ThenAsync(value => Task.FromResult(Prelude.Success(value.ToString(CultureInfo.InvariantCulture)))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); await Assert.That(result.Value).IsEqualTo("2"); } [Test] public async Task I_can_transform_result_async_with_then_and_it_returns_failure_for_success_and_mapping_returning_failure() { var start = Prelude.Success(2); var result = await start.ThenAsync(_ => Task.FromResult(Prelude.Failure("error"))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_transform_result_async_with_then_and_it_returns_failure_for_failure_and_mapping_returning_success() { var start = Prelude.Failure("error"); var result = await start.ThenAsync(value => Task.FromResult(Prelude.Success(value.ToString(CultureInfo.InvariantCulture)))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_transform_result_async_with_then_and_it_returns_failure_for_failure_and_mapping_returning_failure() { var start = Prelude.Failure("error"); var result = await start.ThenAsync(_ => Task.FromResult(Prelude.Failure("error 2"))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_map_async_and_it_returns_success_for_success_without_throwing() { var start = Prelude.Success(2); var result = await start.TryMapAsync(value => Task.FromResult(value.ToString(CultureInfo.InvariantCulture))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); await Assert.That(result.Value).IsEqualTo("2"); } [Test] public async Task I_can_try_map_async_and_it_returns_failure_for_failure_without_throwing() { var start = Prelude.Failure("error"); var result = await start.TryMapAsync(value => Task.FromResult(value.ToString(CultureInfo.InvariantCulture))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_map_async_and_it_returns_failure_for_success_with_throwing() { var start = Prelude.Success(2); var result = await start.TryMapAsync(Task (_) => throw new CustomTestException()); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_try_map_async_and_it_returns_failure_for_success_with_await_throwing() { var start = Prelude.Success(2); var result = await start.TryMapAsync(async Task (_) => { await Task.CompletedTask; throw new CustomTestException(); }); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_try_map_async_and_it_returns_failure_for_failure_with_throwing() { var start = Prelude.Failure("error"); var result = await start.TryMapAsync(Task (_) => throw new CustomTestException()); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error).IsTypeOf(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_map_async_and_it_returns_failure_for_failure_with_await_throwing() { var start = Prelude.Failure("error"); var result = await start.TryMapAsync(async Task (_) => { await Task.CompletedTask; throw new CustomTestException(); }); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error).IsTypeOf(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_transform_result_async_with_then_and_it_returns_success_for_success_and_mapping_returning_success() { var start = Prelude.Success(2); var result = await start.ThenTryAsync(value => Task.FromResult(Prelude.Success(value.ToString(CultureInfo.InvariantCulture)))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); await Assert.That(result.Value).IsEqualTo("2"); } [Test] public async Task I_can_try_transform_result_async_with_then_and_it_returns_failure_for_success_and_mapping_returning_failure() { var start = Prelude.Success(2); var result = await start.ThenTryAsync(_ => Task.FromResult(Prelude.Failure("error"))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_transform_result_async_with_then_and_it_returns_failure_for_failure_and_mapping_returning_failure() { var start = Prelude.Failure("error"); var result = await start.ThenTryAsync(x => Task.FromResult(Prelude.Success(x.ToString(CultureInfo.InvariantCulture)))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_transform_result_async_with_then_and_it_returns_failure_for_success_and_mapping_throwing() { var start = Prelude.Success(2); var result = await start.ThenTryAsync(Task> (_) => throw new CustomTestException()); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_try_transform_result_async_with_then_and_it_returns_failure_for_success_and_mapping_await_throwing() { var start = Prelude.Success(2); var result = await start.ThenTryAsync(async Task> (_) => { await Task.CompletedTask; throw new CustomTestException(); }); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_try_transform_result_async_with_then_and_it_returns_failure_for_failure_and_mapping_throwing() { var start = Prelude.Failure("error"); var result = await start.ThenTryAsync(Task> (_) => throw new CustomTestException()); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error).IsTypeOf(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_transform_result_async_with_then_and_it_returns_failure_for_failure_and_mapping_await_throwing() { var start = Prelude.Failure("error"); var result = await start.ThenTryAsync(async Task> (_) => { await Task.CompletedTask; throw new CustomTestException(); }); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error).IsTypeOf(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_map_async_and_it_returns_success_for_success_ValueTask() { var start = Prelude.Success(2); var result = await start.MapAsync(value => ValueTask.FromResult(value.ToString(CultureInfo.InvariantCulture))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); await Assert.That(result.Value).IsEqualTo("2"); } [Test] public async Task I_can_map_async_and_it_returns_failure_for_failure_ValueTask() { var start = Prelude.Failure("error"); var result = await start.MapAsync(value => ValueTask.FromResult(value.ToString(CultureInfo.InvariantCulture))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_transform_result_async_with_then_and_it_returns_success_for_success_and_mapping_returning_success_ValueTask() { var start = Prelude.Success(2); var result = await start.ThenAsync(value => ValueTask.FromResult(Prelude.Success(value.ToString(CultureInfo.InvariantCulture)))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); await Assert.That(result.Value).IsEqualTo("2"); } [Test] public async Task I_can_transform_result_async_with_then_and_it_returns_failure_for_success_and_mapping_returning_failure_ValueTask() { var start = Prelude.Success(2); var result = await start.ThenAsync(_ => ValueTask.FromResult(Prelude.Failure("error"))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_transform_result_async_with_then_and_it_returns_failure_for_failure_and_mapping_returning_success_ValueTask() { var start = Prelude.Failure("error"); var result = await start.ThenAsync(value => ValueTask.FromResult(Prelude.Success(value.ToString(CultureInfo.InvariantCulture)))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_transform_result_async_with_then_and_it_returns_failure_for_failure_and_mapping_returning_failure_ValueTask() { var start = Prelude.Failure("error"); var result = await start.ThenAsync(_ => ValueTask.FromResult(Prelude.Failure("error 2"))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_map_async_and_it_returns_success_for_success_without_throwing_ValueTask() { var start = Prelude.Success(2); var result = await start.TryMapAsync(value => ValueTask.FromResult(value.ToString(CultureInfo.InvariantCulture))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); await Assert.That(result.Value).IsEqualTo("2"); } [Test] public async Task I_can_try_map_async_and_it_returns_failure_for_failure_without_throwing_ValueTask() { var start = Prelude.Failure("error"); var result = await start.TryMapAsync(value => ValueTask.FromResult(value.ToString(CultureInfo.InvariantCulture))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_map_async_and_it_returns_failure_for_success_with_throwing_ValueTask() { var start = Prelude.Success(2); var result = await start.TryMapAsync(ValueTask (_) => throw new CustomTestException()); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_try_map_async_and_it_returns_failure_for_success_with_await_throwing_ValueTask() { var start = Prelude.Success(2); var result = await start.TryMapAsync(async ValueTask (_) => { await ValueTask.CompletedTask; throw new CustomTestException(); }); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_try_map_async_and_it_returns_failure_for_failure_with_throwing_ValueTask() { var start = Prelude.Failure("error"); var result = await start.TryMapAsync(ValueTask (_) => throw new CustomTestException()); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error).IsTypeOf(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_map_async_and_it_returns_failure_for_failure_with_await_throwing_ValueTask() { var start = Prelude.Failure("error"); var result = await start.TryMapAsync(async ValueTask (_) => { await ValueTask.CompletedTask; throw new CustomTestException(); }); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error).IsTypeOf(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_transform_result_async_with_then_and_it_returns_success_for_success_and_mapping_returning_success_ValueTask() { var start = Prelude.Success(2); var result = await start.ThenTryAsync(value => ValueTask.FromResult(Prelude.Success(value.ToString(CultureInfo.InvariantCulture)))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); await Assert.That(result.Value).IsEqualTo("2"); } [Test] public async Task I_can_try_transform_result_async_with_then_and_it_returns_failure_for_success_and_mapping_returning_failure_ValueTask() { var start = Prelude.Success(2); var result = await start.ThenTryAsync(_ => ValueTask.FromResult(Prelude.Failure("error"))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_transform_result_async_with_then_and_it_returns_failure_for_failure_and_mapping_returning_failure_ValueTask() { var start = Prelude.Failure("error"); var result = await start.ThenTryAsync(x => ValueTask.FromResult(Prelude.Success(x.ToString(CultureInfo.InvariantCulture)))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_transform_result_async_with_then_and_it_returns_failure_for_success_and_mapping_throwing_ValueTask() { var start = Prelude.Success(2); var result = await start.ThenTryAsync(ValueTask> (_) => throw new CustomTestException()); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_try_transform_result_async_with_then_and_it_returns_failure_for_success_and_mapping_await_throwing_ValueTask() { var start = Prelude.Success(2); var result = await start.ThenTryAsync(async ValueTask> (_) => { await ValueTask.CompletedTask; throw new CustomTestException(); }); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_try_transform_result_async_with_then_and_it_returns_failure_for_failure_and_mapping_throwing_ValueTask() { var start = Prelude.Failure("error"); var result = await start.ThenTryAsync(ValueTask> (_) => throw new CustomTestException()); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error).IsTypeOf(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_transform_result_async_with_then_and_it_returns_failure_for_failure_and_mapping_await_throwing_ValueTask() { var start = Prelude.Failure("error"); var result = await start.ThenTryAsync(async ValueTask> (_) => { await ValueTask.CompletedTask; throw new CustomTestException(); }); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error).IsTypeOf(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_map_non_generic_result_and_it_returns_success_for_success() { var start = Prelude.Success(); var result = start.Map(() => 42); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); await Assert.That(result.Value).IsEqualTo(42); } [Test] public async Task I_can_map_non_generic_result_and_it_returns_failure_for_failure() { var start = Prelude.Failure("error"); var result = start.Map(() => 42); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_map_non_generic_result_and_it_returns_failure_for_exception() { var start = Prelude.Success(); var result = start.TryMap(() => throw new CustomTestException()); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_transform_non_generic_result_with_then_and_it_returns_success_for_success() { var start = Prelude.Success(); var result = start.Then(Prelude.Success); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); } [Test] public async Task I_can_transform_non_generic_result_with_then_to_generic_and_it_returns_success_for_success() { var start = Prelude.Success(); var result = start.Then(() => Prelude.Success(42)); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); await Assert.That(result.Value).IsEqualTo(42); } [Test] public async Task I_can_transform_generic_result_with_then_to_non_generic_and_it_returns_success_for_success() { var start = Prelude.Success(42); var result = start.Then(_ => Prelude.Success()); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); } [Test] public async Task I_can_map_non_generic_result_async_and_it_returns_success_for_success_Task() { var start = Prelude.Success(); var result = await start.MapAsync(() => Task.FromResult(42)); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); await Assert.That(result.Value).IsEqualTo(42); } [Test] public async Task I_can_try_map_non_generic_result_async_and_it_returns_failure_for_exception_Task() { var start = Prelude.Success(); var result = await start.TryMapAsync((Func>)(() => throw new CustomTestException())); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_transform_non_generic_result_async_with_then_and_it_returns_success_for_success_Task() { var start = Prelude.Success(); var result = await start.ThenAsync(() => Task.FromResult(Prelude.Success())); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); } [Test] public async Task I_can_transform_generic_result_async_with_then_to_non_generic_and_it_returns_success_for_success_Task() { var start = Prelude.Success(42); var result = await start.ThenAsync(_ => Task.FromResult(Prelude.Success())); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); } [Test] public async Task I_can_map_non_generic_result_async_and_it_returns_success_for_success_ValueTask() { var start = Prelude.Success(); var result = await start.MapAsync(() => ValueTask.FromResult(42)); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); await Assert.That(result.Value).IsEqualTo(42); } [Test] public async Task I_can_try_map_non_generic_result_async_and_it_returns_failure_for_exception_ValueTask() { var start = Prelude.Success(); var result = await start.TryMapAsync((Func>)(() => throw new CustomTestException())); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_transform_generic_result_async_with_then_to_non_generic_and_it_returns_success_for_success_ValueTask() { var start = Prelude.Success(42); var result = await start.ThenAsync(_ => ValueTask.FromResult(Prelude.Success())); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); } [Test] public async Task I_can_try_transform_result_to_non_generic_and_it_returns_success_for_success() { var start = Prelude.Success(2); var result = start.ThenTry(value => Prelude.Success()); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); } [Test] public async Task I_can_try_transform_result_to_non_generic_and_it_returns_failure_for_success_and_mapping_returning_failure() { var start = Prelude.Success(2); var result = start.ThenTry(_ => Prelude.Failure("error")); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_transform_result_to_non_generic_and_it_returns_failure_for_success_and_mapping_throwing() { var start = Prelude.Success(2); var result = start.ThenTry(_ => throw new CustomTestException()); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_try_transform_result_async_to_non_generic_and_it_returns_success_for_success_Task() { var start = Prelude.Success(2); var result = await start.ThenTryAsync(value => Task.FromResult(Prelude.Success())); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); } [Test] public async Task I_can_try_transform_result_async_to_non_generic_and_it_returns_failure_for_success_and_mapping_throwing_Task() { var start = Prelude.Success(2); var result = await start.ThenTryAsync(Task (_) => throw new CustomTestException()); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_try_transform_result_async_to_non_generic_and_it_returns_success_for_success_ValueTask() { var start = Prelude.Success(2); var result = await start.ThenTryAsync(value => ValueTask.FromResult(Prelude.Success())); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); } [Test] public async Task I_can_try_transform_result_async_to_non_generic_and_it_returns_failure_for_success_and_mapping_throwing_ValueTask() { var start = Prelude.Success(2); var result = await start.ThenTryAsync(ValueTask (_) => throw new CustomTestException()); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_try_transform_non_generic_result_with_then_and_it_returns_success_for_success() { var start = Prelude.Success(); var result = start.ThenTry(Prelude.Success); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); } [Test] public async Task I_can_try_transform_non_generic_result_with_then_and_it_returns_failure_for_exception() { var start = Prelude.Success(); var result = start.ThenTry(() => throw new CustomTestException()); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_try_transform_non_generic_result_with_then_to_generic_and_it_returns_success_for_success() { var start = Prelude.Success(); var result = start.ThenTry(() => Prelude.Success(42)); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); await Assert.That(result.Value).IsEqualTo(42); } [Test] public async Task I_can_try_transform_non_generic_result_with_then_to_generic_and_it_returns_failure_for_exception() { var start = Prelude.Success(); var result = start.ThenTry(() => throw new CustomTestException()); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_map_non_generic_result_async_and_it_returns_failure_for_failure_Task() { var start = Prelude.Failure("error"); var result = await start.MapAsync(() => Task.FromResult(42)); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_map_non_generic_result_async_and_it_returns_success_for_success_Task() { var start = Prelude.Success(); var result = await start.TryMapAsync(() => Task.FromResult(42)); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); await Assert.That(result.Value).IsEqualTo(42); } [Test] public async Task I_can_try_map_non_generic_result_async_and_it_returns_failure_for_failure_Task() { var start = Prelude.Failure("error"); var result = await start.TryMapAsync(() => Task.FromResult(42)); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_map_non_generic_result_async_and_it_returns_failure_for_await_exception_Task() { var start = Prelude.Success(); var result = await start.TryMapAsync((Func>)(async () => { await Task.CompletedTask; throw new CustomTestException(); })); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_transform_non_generic_result_async_with_then_and_it_returns_failure_for_failure_Task() { var start = Prelude.Failure("error"); var result = await start.ThenAsync(() => Task.FromResult(Prelude.Success())); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_transform_non_generic_result_async_with_then_and_it_returns_success_for_success_Task() { var start = Prelude.Success(); var result = await start.ThenTryAsync(() => Task.FromResult(Prelude.Success())); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); } [Test] public async Task I_can_try_transform_non_generic_result_async_with_then_and_it_returns_failure_for_exception_Task() { var start = Prelude.Success(); var result = await start.ThenTryAsync((Func>)(() => throw new CustomTestException())); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_try_transform_non_generic_result_async_with_then_and_it_returns_failure_for_await_exception_Task() { var start = Prelude.Success(); var result = await start.ThenTryAsync((Func>)(async () => { await Task.CompletedTask; throw new CustomTestException(); })); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_transform_non_generic_result_async_with_then_to_generic_and_it_returns_success_for_success_Task() { var start = Prelude.Success(); var result = await start.ThenAsync(() => Task.FromResult(Prelude.Success(42))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); await Assert.That(result.Value).IsEqualTo(42); } [Test] public async Task I_can_transform_non_generic_result_async_with_then_to_generic_and_it_returns_failure_for_failure_Task() { var start = Prelude.Failure("error"); var result = await start.ThenAsync(() => Task.FromResult(Prelude.Success(42))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_transform_non_generic_result_async_with_then_to_generic_and_it_returns_success_for_success_Task() { var start = Prelude.Success(); var result = await start.ThenTryAsync(() => Task.FromResult(Prelude.Success(42))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); await Assert.That(result.Value).IsEqualTo(42); } [Test] public async Task I_can_try_transform_non_generic_result_async_with_then_to_generic_and_it_returns_failure_for_exception_Task() { var start = Prelude.Success(); var result = await start.ThenTryAsync((Func>>)(() => throw new CustomTestException())); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_try_transform_non_generic_result_async_with_then_to_generic_and_it_returns_failure_for_await_exception_Task() { var start = Prelude.Success(); var result = await start.ThenTryAsync((Func>>)(async () => { await Task.CompletedTask; throw new CustomTestException(); })); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_transform_generic_result_async_with_then_to_non_generic_and_it_returns_failure_for_failure_ValueTask() { var start = Prelude.Failure("error"); var result = await start.ThenAsync(_ => ValueTask.FromResult(Prelude.Success())); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_transform_result_async_to_non_generic_and_it_returns_failure_for_success_and_mapping_returning_failure_ValueTask() { var start = Prelude.Success(2); var result = await start.ThenTryAsync(_ => ValueTask.FromResult(Prelude.Failure("error"))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_transform_result_async_to_non_generic_and_it_returns_failure_for_success_and_mapping_await_throwing_ValueTask() { var start = Prelude.Success(2); var result = await start.ThenTryAsync(async ValueTask (_) => { await ValueTask.CompletedTask; throw new CustomTestException(); }); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_map_non_generic_result_async_and_it_returns_failure_for_failure_ValueTask() { var start = Prelude.Failure("error"); var result = await start.MapAsync(() => ValueTask.FromResult(42)); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_map_non_generic_result_async_and_it_returns_success_for_success_ValueTask() { var start = Prelude.Success(); var result = await start.TryMapAsync(() => ValueTask.FromResult(42)); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); await Assert.That(result.Value).IsEqualTo(42); } [Test] public async Task I_can_try_map_non_generic_result_async_and_it_returns_failure_for_failure_ValueTask() { var start = Prelude.Failure("error"); var result = await start.TryMapAsync(() => ValueTask.FromResult(42)); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_map_non_generic_result_async_and_it_returns_failure_for_await_exception_ValueTask() { var start = Prelude.Success(); var result = await start.TryMapAsync((Func>)(async () => { await ValueTask.CompletedTask; throw new CustomTestException(); })); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_transform_non_generic_result_async_with_then_and_it_returns_success_for_success_ValueTask() { var start = Prelude.Success(); var result = await start.ThenAsync(() => ValueTask.FromResult(Prelude.Success())); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); } [Test] public async Task I_can_transform_non_generic_result_async_with_then_and_it_returns_failure_for_failure_ValueTask() { var start = Prelude.Failure("error"); var result = await start.ThenAsync(() => ValueTask.FromResult(Prelude.Success())); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_transform_non_generic_result_async_with_then_and_it_returns_success_for_success_ValueTask() { var start = Prelude.Success(); var result = await start.ThenTryAsync(() => ValueTask.FromResult(Prelude.Success())); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); } [Test] public async Task I_can_try_transform_non_generic_result_async_with_then_and_it_returns_failure_for_exception_ValueTask() { var start = Prelude.Success(); var result = await start.ThenTryAsync((Func>)(() => throw new CustomTestException())); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_try_transform_non_generic_result_async_with_then_and_it_returns_failure_for_await_exception_ValueTask() { var start = Prelude.Success(); var result = await start.ThenTryAsync((Func>)(async () => { await ValueTask.CompletedTask; throw new CustomTestException(); })); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_transform_non_generic_result_async_with_then_to_generic_and_it_returns_success_for_success_ValueTask() { var start = Prelude.Success(); var result = await start.ThenAsync(() => ValueTask.FromResult(Prelude.Success(42))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); await Assert.That(result.Value).IsEqualTo(42); } [Test] public async Task I_can_transform_non_generic_result_async_with_then_to_generic_and_it_returns_failure_for_failure_ValueTask() { var start = Prelude.Failure("error"); var result = await start.ThenAsync(() => ValueTask.FromResult(Prelude.Success(42))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); await Assert.That(result.Error?.Message).IsEqualTo("error"); } [Test] public async Task I_can_try_transform_non_generic_result_async_with_then_to_generic_and_it_returns_success_for_success_ValueTask() { var start = Prelude.Success(); var result = await start.ThenTryAsync(() => ValueTask.FromResult(Prelude.Success(42))); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsTrue(); await Assert.That(result.Value).IsEqualTo(42); } [Test] public async Task I_can_try_transform_non_generic_result_async_with_then_to_generic_and_it_returns_failure_for_exception_ValueTask() { var start = Prelude.Success(); var result = await start.ThenTryAsync((Func>>)(() => throw new CustomTestException())); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } [Test] public async Task I_can_try_transform_non_generic_result_async_with_then_to_generic_and_it_returns_failure_for_await_exception_ValueTask() { var start = Prelude.Success(); var result = await start.ThenTryAsync((Func>>)(async () => { await ValueTask.CompletedTask; throw new CustomTestException(); })); using var scope = Assert.Multiple(); await Assert.That(result.IsSuccess).IsFalse(); var instance = await Assert.That(result.Error).IsTypeOf(); await Assert.That(instance?.Exception).IsTypeOf(); } }