Skip to content

Commit

Permalink
feature: add second overload of the Ensure method
Browse files Browse the repository at this point in the history
  • Loading branch information
daht-x authored Dec 6, 2023
1 parent f2fa030 commit b11c7ca
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 1 deletion.
2 changes: 1 addition & 1 deletion Sagitta.sln
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.8.34322.80
VisualStudioVersion = 17.8.34330.188
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{D4223882-8D25-49B3-9299-A680AFD6D275}"
EndProject
Expand Down
17 changes: 17 additions & 0 deletions source/Monads/Result.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,23 @@ public static Result<TSuccess, TFailure> Ensure<TSuccess, TFailure>(TSuccess? su
? Fail<TSuccess, TFailure>(failure)
: Succeed<TSuccess, TFailure>(success);

/// <summary>Creates a new failed result if <paramref name="success"/> is <see langword="null"/>; otherwise, creates a new successful result.</summary>
/// <typeparam name="TSuccess">Type of expected success.</typeparam>
/// <typeparam name="TFailure">Type of possible failure.</typeparam>
/// <param name="success">The expected success.</param>
/// <param name="createFailure">
/// <para>Creates the possible failure.</para>
/// <para>If <paramref name="createFailure"/> is <see langword="null"/> or its value is <see langword="null"/>, <seealso cref="ArgumentNullException"/> will be thrown.</para>
/// </param>
/// <returns>A new failed result if <paramref name="success"/> is <see langword="null"/>; otherwise, a new successful result.</returns>
/// <exception cref="ArgumentNullException"/>
public static Result<TSuccess, TFailure> Ensure<TSuccess, TFailure>(TSuccess? success, Func<TFailure> createFailure)
where TSuccess : notnull
where TFailure : notnull
=> success is null
? Fail<TSuccess, TFailure>(createFailure)
: Succeed<TSuccess, TFailure>(success);

/// <summary>Creates a new failed result if the value of <paramref name="createSuccess"/> throws <typeparamref name="TException"/>; otherwise, creates a new successful result.</summary>
/// <typeparam name="TException">Type of possible exception.</typeparam>
/// <typeparam name="TSuccess">Type of expected success.</typeparam>
Expand Down
69 changes: 69 additions & 0 deletions test/unit/Monads/ResultTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ public sealed class ResultTest

#region Ensure

#region Overload No. 01

[Fact]
[Trait(root, ensure)]
public void Ensure_NullSuccessPlusNullFailure_ArgumentNullException()
Expand Down Expand Up @@ -61,6 +63,73 @@ public void Ensure_SuccessPlusFailure_SuccessfulResult()

#endregion

#region Overload No. 02

[Fact]
[Trait(root, ensure)]
public void Ensure_NullSuccessPlusNullCreateFailure_ArgumentNullException()
{
//Arrange
const string success = null!;
const Func<string> createFailure = null!;

//Act
ArgumentNullException? actualException = ExceptionHandler.Catch<ArgumentNullException>(static () => _ = Result.Ensure(success, createFailure));

//Assert
ArgumentNullExceptionAsserter.AreEqualParameterNames(nameof(createFailure), actualException);
}

[Fact]
[Trait(root, ensure)]
public void Ensure_NullSuccessPlusCreateFailureWithNullValue_ArgumentNullException()
{
//Arrange
const string success = null!;
Func<string> createFailure = static () => null!;

//Act
ArgumentNullException? actualException = ExceptionHandler.Catch<ArgumentNullException>(() => _ = Result.Ensure(success, createFailure));

//Assert
ArgumentNullExceptionAsserter.AreEqualParameterNames(nameof(createFailure), actualException);
}

[Fact]
[Trait(root, ensure)]
public void Ensure_NullSuccessPlusCreateFailure_FailedResult()
{
//Arrange
const string? success = null;
const string expectedFailure = ResultFixture.Failure;
Func<string> createFailure = static () => expectedFailure;

//Act
Result<string, string> actualResult = Result.Ensure(success, createFailure);

//Assert
ResultAsserter.AreFailed(expectedFailure, actualResult);
}

[Fact]
[Trait(root, ensure)]
public void Ensure_SuccessPlusCreateFailure_SuccessfulResult()
{
//Arrange
const string expectedSuccess = ResultFixture.Success;
Func<string> createFailure = static () => ResultFixture.Failure;

//Act
Result<string, string> actualResult = Result.Ensure(expectedSuccess, createFailure);

//Assert
ResultAsserter.AreSuccessful(expectedSuccess, actualResult);
}

#endregion

#endregion

#region Catch

[Fact]
Expand Down

0 comments on commit b11c7ca

Please sign in to comment.