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.Create(x + 1)); Assert.That(result, Is.InstanceOf>()); Assert.That(result.HasValue, Is.False); } [Test] public void TestBind_BindsWhenHasValue() { var emptyMaybe = Maybe.Create(1); var result = emptyMaybe.Bind(x => Maybe.Create(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.Create(25); var result = maybe.Bind(x => x switch { 25 => Maybe.Create("twenty-five"), _ => Maybe.Empty() }); Assert.That(result, Is.InstanceOf>()); Assert.That(result.HasValue, Is.True); } [Test] public void EmptyBind_DoesNotBindFactory_WhenHasValue() { var maybe = Maybe.Create(25); var result = maybe.EmptyBind(() => Maybe.Create(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.Create(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.Create(25); var result = maybe.EmptyBind(Maybe.Create(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.Create(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.Create("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.Create(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)); } }