Skip to content

Commit 87fa4cc

Browse files
authored
Merge pull request #335 from SamuelViesselman/master
MapError UnitResult Additions
2 parents 34c3fba + bdd6203 commit 87fa4cc

4 files changed

Lines changed: 181 additions & 3 deletions

File tree

CSharpFunctionalExtensions.Tests/ResultTests/Extensions/MapErrorAsyncLeftTests.cs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,39 @@ public async Task MapError_returns_new_failure()
3939
invocations.Should().Be(1);
4040
}
4141

42+
[Fact]
43+
public async Task MapError_returns_unit_result_succcess()
44+
{
45+
Task<Result> result = Result.Success().AsTask();
46+
var invocations = 0;
47+
48+
UnitResult<E> actual = await result.MapError(error =>
49+
{
50+
invocations++;
51+
return E.Value;
52+
});
53+
54+
actual.IsSuccess.Should().BeTrue();
55+
invocations.Should().Be(0);
56+
}
57+
58+
[Fact]
59+
public async Task MapError_returns_new_unit_result_failure()
60+
{
61+
Task<Result> result = Result.Failure(ErrorMessage).AsTask();
62+
var invocations = 0;
63+
64+
UnitResult<E> actual = await result.MapError(error =>
65+
{
66+
invocations++;
67+
return E.Value;
68+
});
69+
70+
actual.IsSuccess.Should().BeFalse();
71+
actual.Error.Should().Be(E.Value);
72+
invocations.Should().Be(1);
73+
}
74+
4275
[Fact]
4376
public async Task MapError_T_returns_success()
4477
{
@@ -73,6 +106,41 @@ public async Task MapError_T_returns_new_failure()
73106
invocations.Should().Be(1);
74107
}
75108

109+
[Fact]
110+
public async Task MapError_unit_result_returns_success()
111+
{
112+
Task<UnitResult<E>> result = UnitResult.Success<E>().AsTask();
113+
var invocations = 0;
114+
115+
Result actual = await result.MapError(error =>
116+
{
117+
invocations++;
118+
return $"{error} {error}";
119+
});
120+
121+
actual.IsSuccess.Should().BeTrue();
122+
invocations.Should().Be(0);
123+
}
124+
125+
[Fact]
126+
public async Task MapError_unit_result_returns_new_failure()
127+
{
128+
Task<UnitResult<E>> result = UnitResult.Failure(E.Value).AsTask();
129+
var invocations = 0;
130+
131+
Result actual = await result.MapError(error =>
132+
{
133+
error.Should().Be(E.Value);
134+
135+
invocations++;
136+
return "error";
137+
});
138+
139+
actual.IsSuccess.Should().BeFalse();
140+
actual.Error.Should().Be("error");
141+
invocations.Should().Be(1);
142+
}
143+
76144
[Fact]
77145
public async Task MapError_T_E_returns_success()
78146
{

CSharpFunctionalExtensions.Tests/ResultTests/Extensions/MapErrorTests.cs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,39 @@ public void MapError_returns_new_failure()
3838
invocations.Should().Be(1);
3939
}
4040

41+
[Fact]
42+
public void MapError_returns_unit_result_succcess()
43+
{
44+
Result result = Result.Success();
45+
var invocations = 0;
46+
47+
UnitResult<E> actual = result.MapError(error =>
48+
{
49+
invocations++;
50+
return E.Value;
51+
});
52+
53+
actual.IsSuccess.Should().BeTrue();
54+
invocations.Should().Be(0);
55+
}
56+
57+
[Fact]
58+
public void MapError_returns_new_unit_result_failure()
59+
{
60+
Result result = Result.Failure(ErrorMessage);
61+
var invocations = 0;
62+
63+
UnitResult<E> actual = result.MapError(error =>
64+
{
65+
invocations++;
66+
return E.Value;
67+
});
68+
69+
actual.IsSuccess.Should().BeFalse();
70+
actual.Error.Should().Be(E.Value);
71+
invocations.Should().Be(1);
72+
}
73+
4174
[Fact]
4275
public void MapError_T_returns_success()
4376
{
@@ -72,6 +105,41 @@ public void MapError_T_returns_new_failure()
72105
invocations.Should().Be(1);
73106
}
74107

108+
[Fact]
109+
public void MapError_unit_result_returns_success()
110+
{
111+
UnitResult<E> result = UnitResult.Success<E>();
112+
var invocations = 0;
113+
114+
Result actual = result.MapError(error =>
115+
{
116+
invocations++;
117+
return $"{error} {error}";
118+
});
119+
120+
actual.IsSuccess.Should().BeTrue();
121+
invocations.Should().Be(0);
122+
}
123+
124+
[Fact]
125+
public void MapError_unit_result_returns_new_failure()
126+
{
127+
UnitResult<E> result = UnitResult.Failure(E.Value);
128+
var invocations = 0;
129+
130+
Result actual = result.MapError(error =>
131+
{
132+
error.Should().Be(E.Value);
133+
134+
invocations++;
135+
return "error";
136+
});
137+
138+
actual.IsSuccess.Should().BeFalse();
139+
actual.Error.Should().Be("error");
140+
invocations.Should().Be(1);
141+
}
142+
75143
[Fact]
76144
public void MapError_T_E_returns_success()
77145
{

CSharpFunctionalExtensions/Result/Extensions/MapError.cs

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,18 @@ public static Result MapError(this Result result, Func<string, string> errorFact
1818
/// <summary>
1919
/// If the calling Result is a success, a new success result is returned. Otherwise, creates a new failure result from the return value of a given function.
2020
/// </summary>
21-
public static Result<T> MapError<T>(this Result<T> result, Func<string, string> errorFactory)
21+
public static UnitResult<E> MapError<E>(this Result result, Func<string, E> errorFactory)
22+
{
23+
if (result.IsFailure)
24+
return UnitResult.Failure(errorFactory(result.Error));
25+
26+
return UnitResult.Success<E>();
27+
}
28+
29+
/// <summary>
30+
/// If the calling Result is a success, a new success result is returned. Otherwise, creates a new failure result from the return value of a given function.
31+
/// </summary>
32+
public static Result<T> MapError<T>(this Result<T> result, Func<string, string> errorFactory)
2233
{
2334
if (result.IsFailure)
2435
return Result.Failure<T>(errorFactory(result.Error));
@@ -40,14 +51,25 @@ public static Result<T, E> MapError<T, E>(this Result<T> result, Func<string, E>
4051
/// <summary>
4152
/// If the calling Result is a success, a new success result is returned. Otherwise, creates a new failure result from the return value of a given function.
4253
/// </summary>
43-
public static Result<T> MapError<T, E>(this Result<T, E> result, Func<E, string> errorFactory)
54+
public static Result MapError<E>(this UnitResult<E> result, Func<E, string> errorFactory)
55+
{
56+
if (result.IsFailure)
57+
return Result.Failure(errorFactory(result.Error));
58+
59+
return Result.Success();
60+
}
61+
62+
/// <summary>
63+
/// If the calling Result is a success, a new success result is returned. Otherwise, creates a new failure result from the return value of a given function.
64+
/// </summary>
65+
public static Result<T> MapError<T, E>(this Result<T, E> result, Func<E, string> errorFactory)
4466
{
4567
if (result.IsFailure)
4668
return Result.Failure<T>(errorFactory(result.Error));
4769

4870
return Result.Success(result.Value);
4971
}
50-
72+
5173
/// <summary>
5274
/// If the calling Result is a success, a new success result is returned. Otherwise, creates a new failure result from the return value of a given function.
5375
/// </summary>

CSharpFunctionalExtensions/Result/Extensions/MapErrorAsyncLeft.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,16 @@ public static async Task<Result> MapError(this Task<Result> resultTask, Func<str
1515
return result.MapError(errorFactory);
1616
}
1717

18+
/// <summary>
19+
/// If the calling Result is a success, a new success result is returned. Otherwise, creates a new failure result from the return value of a given function.
20+
/// </summary>
21+
public static async Task<UnitResult<E>> MapError<E>(this Task<Result> resultTask, Func<string, E> errorFactory)
22+
{
23+
var result = await resultTask.DefaultAwait();
24+
25+
return result.MapError(errorFactory);
26+
}
27+
1828
/// <summary>
1929
/// If the calling Result is a success, a new success result is returned. Otherwise, creates a new failure result from the return value of a given function.
2030
/// </summary>
@@ -35,6 +45,16 @@ public static async Task<Result<T, E>> MapError<T, E>(this Task<Result<T>> resul
3545
return result.MapError(errorFactory);
3646
}
3747

48+
/// <summary>
49+
/// If the calling Result is a success, a new success result is returned. Otherwise, creates a new failure result from the return value of a given function.
50+
/// </summary>
51+
public static async Task<Result> MapError<E>(this Task<UnitResult<E>> resultTask, Func<E, string> errorFactory)
52+
{
53+
var result = await resultTask.DefaultAwait();
54+
55+
return result.MapError(errorFactory);
56+
}
57+
3858
/// <summary>
3959
/// If the calling Result is a success, a new success result is returned. Otherwise, creates a new failure result from the return value of a given function.
4060
/// </summary>

0 commit comments

Comments
 (0)