using FruityFoundation.Base.Structures; using NUnit.Framework; namespace Base.Tests.Structures; public class MaybeTests { [Test] public void TestBind_DoesNotBindEmptyValue() { var emptyMaybe = Maybe.Empty(); var result = emptyMaybe.Bind(x => Maybe.Just(x + 1)); Assert.That(result, Is.InstanceOf>()); Assert.That(result.HasValue, Is.False); } [Test] public void TestBind_BindsWhenHasValue() { var emptyMaybe = Maybe.Just(1); var result = emptyMaybe.Bind(x => Maybe.Just(x + 1)); Assert.That(result, Is.InstanceOf>()); Assert.That(result.HasValue, Is.True); Assert.That(result.Value, Is.EqualTo(2)); } [Test] public void TestBind_BindsWhenHasValue_NewOutputType() { var maybe = Maybe.Just(25); var result = maybe.Bind(x => x switch { 25 => Maybe.Just("twenty-five"), _ => Maybe.Empty() }); Assert.That(result, Is.InstanceOf>()); Assert.That(result.HasValue, Is.True); } [Test] public void EmptyBind_DoesNotBindFactory_WhenHasValue() { var maybe = Maybe.Just(25); var result = maybe.EmptyBind(() => Maybe.Just(30)); Assert.That(result, Is.InstanceOf>()); Assert.That(result.HasValue, Is.True); Assert.That(result.Value, Is.EqualTo(25)); } [Test] public void EmptyBind_BindsFactory_WhenDoesNotHaveValue() { var maybe = Maybe.Empty(); var result = maybe.EmptyBind(() => Maybe.Just(30)); Assert.That(result, Is.InstanceOf>()); Assert.That(result.HasValue, Is.True); Assert.That(result.Value, Is.EqualTo(30)); } [Test] public void EmptyBind_DoesNotBindMaybe_WhenHasValue() { var maybe = Maybe.Just(25); var result = maybe.EmptyBind(Maybe.Just(30)); Assert.That(result, Is.InstanceOf>()); Assert.That(result.HasValue, Is.True); Assert.That(result.Value, Is.EqualTo(25)); } [Test] public void EmptyBind_BindsMaybe_WhenDoesNotHaveValue() { var maybe = Maybe.Empty(); var result = maybe.EmptyBind(Maybe.Just(30)); Assert.That(result, Is.InstanceOf>()); Assert.That(result.HasValue, Is.True); Assert.That(result.Value, Is.EqualTo(30)); } [Test] public void Cast_ToNullableReferenceType_ReturnsEmptyMaybe_WhenHasNoValue() { // Arrange var maybe = Maybe.Empty(); // Act var result = maybe.Cast(); // Assert Assert.That(result, Is.InstanceOf>()); Assert.That(result.HasValue, Is.False); } [Test] public void Cast_ToNullableReferenceType_ReturnsMaybe_WhenHasValue() { // Arrange var maybe = Maybe.Just("banana"); // Act var result = maybe.Cast(); // Assert Assert.That(result, Is.InstanceOf>()); Assert.That(result.HasValue, Is.True); Assert.That(result.Value, Is.EqualTo("banana")); } [Test] public void Cast_ToNullableValueType_ReturnsEmptyMaybe_WhenHasNoValue() { // Arrange var maybe = Maybe.Empty(); // Act var result = maybe.Cast(); // Assert Assert.That(result, Is.InstanceOf>()); Assert.That(result.HasValue, Is.False); } [Test] public void Cast_ToNullableValueType_ReturnsMaybe_WhenHasValue() { // Arrange var maybe = Maybe.Just(25); // Act var result = maybe.Cast(); // Assert Assert.That(result, Is.InstanceOf>()); Assert.That(result.HasValue, Is.True); Assert.That(result.Value, Is.EqualTo(25)); } }