Skip to content

Commit

Permalink
feature: add third 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 b11c7ca commit 9a30378
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 0 deletions.
24 changes: 24 additions & 0 deletions source/Monads/Result.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,30 @@ public static Result<TSuccess, TFailure> Ensure<TSuccess, TFailure>(TSuccess? su
? Fail<TSuccess, TFailure>(createFailure)
: Succeed<TSuccess, TFailure>(success);

/// <summary>Creates a new failed result if the value of <paramref name="createSuccess"/> 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="createSuccess">
/// <para>Creates the expected success.</para>
/// <para>If <paramref name="createSuccess"/> is <see langword="null"/>, <seealso cref="ArgumentNullException"/> will be thrown.</para>
/// </param>
/// <param name="failure">
/// <para>The possible failure.</para>
/// <para>If <paramref name="failure"/> is <see langword="null"/>, <seealso cref="ArgumentNullException"/> will be thrown.</para>
/// </param>
/// <returns>A new failed result if the value of <paramref name="createSuccess"/> is <see langword="null"/>; otherwise, a new successful result.</returns>
/// <exception cref="ArgumentNullException"/>
public static Result<TSuccess, TFailure> Ensure<TSuccess, TFailure>(Func<TSuccess?> createSuccess, TFailure failure)
where TSuccess : notnull
where TFailure : notnull
{
ArgumentNullException.ThrowIfNull(createSuccess);
TSuccess? success = createSuccess();
return success is null
? Fail<TSuccess, TFailure>(failure)
: 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
65 changes: 65 additions & 0 deletions test/unit/Monads/ResultTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,71 @@ public void Ensure_SuccessPlusCreateFailure_SuccessfulResult()

#endregion

#region Overload No. 03

[Fact]
[Trait(root, ensure)]
public void Ensure_NullCreateSuccessPlusFailure_ArgumentNullException()
{
//Arrange
const Func<string> createSuccess = null!;
const string failure = ResultFixture.Failure;

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

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

[Fact]
[Trait(root, ensure)]
public void Ensure_CreateSuccessWithNullValuePlusNullFailure_ArgumentNullException()
{
//Arrange
Func<string?> createSuccess = static () => null;
const string failure = null!;

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

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

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

//Act
Result<string, string> actualResult = Result.Ensure(createSuccess, expectedFailure);

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

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

//Act
Result<string, string> actualResult = Result.Ensure(createSuccess, failure);

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

#endregion

#endregion

#region Catch
Expand Down

0 comments on commit 9a30378

Please sign in to comment.