Skip to content

Commit 9bb4ffa

Browse files
authored
Merge pull request #588 from bothzoli/feature/maybe-to-inverted-result
Create `ToInvertedResult` extension methods on Maybe
2 parents c2095e5 + f03c0b6 commit 9bb4ffa

19 files changed

Lines changed: 440 additions & 167 deletions

CSharpFunctionalExtensions.Tests/CSharpFunctionalExtensions.Tests.csproj

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,9 @@
2929
<Compile Update="MaybeTests\Extensions\ToUnitResultTests.Task.cs">
3030
<DependentUpon>ToUnitResultTests.cs</DependentUpon>
3131
</Compile>
32-
<Compile Update="MaybeTests\Extensions\ToUnitResultTests.Task.Left.cs">
33-
<DependentUpon>ToUnitResultTests.Task.cs</DependentUpon>
34-
</Compile>
3532
<Compile Update="MaybeTests\Extensions\ToUnitResultTests.ValueTask.cs">
3633
<DependentUpon>ToUnitResultTests.cs</DependentUpon>
3734
</Compile>
38-
<Compile Update="MaybeTests\Extensions\ToUnitResultTests.ValueTask.Left.cs">
39-
<DependentUpon>ToUnitResultTests.ValueTask.cs</DependentUpon>
40-
</Compile>
4135
<Compile Update="ResultTests\Extensions\MapTests.Task.cs">
4236
<DependentUpon>MapTests.cs</DependentUpon>
4337
</Compile>
@@ -446,12 +440,6 @@
446440
<Compile Update="MaybeTests\Extensions\OrTests.Task.cs">
447441
<DependentUpon>OrTests.cs</DependentUpon>
448442
</Compile>
449-
<Compile Update="MaybeTests\Extensions\ToResultTests.ValueTask.Left.cs">
450-
<DependentUpon>ToResultTests.ValueTask.cs</DependentUpon>
451-
</Compile>
452-
<Compile Update="MaybeTests\Extensions\ToResultTests.Task.Left.cs">
453-
<DependentUpon>ToResultTests.Task.cs</DependentUpon>
454-
</Compile>
455443
<Compile Update="MaybeTests\Extensions\ToResultTests.ValueTask.cs">
456444
<DependentUpon>ToResultTests.cs</DependentUpon>
457445
</Compile>
@@ -575,5 +563,11 @@
575563
<Compile Update="ResultTests\Extensions\MapTryTests.ValueTask.Right.cs">
576564
<DependentUpon>MapTryTests.ValueTask.cs</DependentUpon>
577565
</Compile>
566+
<Compile Update="MaybeTests\Extensions\ToInvertedResultTests.Task.cs">
567+
<DependentUpon>ToInvertedResultTests.cs</DependentUpon>
568+
</Compile>
569+
<Compile Update="MaybeTests\Extensions\ToInvertedResultTests.ValueTask.cs">
570+
<DependentUpon>ToInvertedResultTests.cs</DependentUpon>
571+
</Compile>
578572
</ItemGroup>
579573
</Project>

CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/MaybeTestBase.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,24 @@ namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
88
{
99
public class MaybeTestBase : TestBase
1010
{
11+
private bool errorFuncExecuted;
12+
13+
protected E ErrorFunc()
14+
{
15+
errorFuncExecuted = true;
16+
return E.Value;
17+
}
18+
19+
protected void AssertErrorFuncCalled()
20+
{
21+
errorFuncExecuted.Should().BeTrue();
22+
}
23+
24+
protected void AssertErrorFuncNotCalled()
25+
{
26+
errorFuncExecuted.Should().BeFalse();
27+
}
28+
1129
protected static Func<T, R> ExpectAndReturn<R>(T expected, R result)
1230
{
1331
return actual =>
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
using System.Threading.Tasks;
2+
using FluentAssertions;
3+
using Xunit;
4+
5+
namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
6+
{
7+
public class ToInvertedResultTests_Task : MaybeTestBase
8+
{
9+
[Fact]
10+
public async Task ToInvertedResult_Task_returns_failure_if_has_value()
11+
{
12+
var maybe = Maybe<T>.From(T.Value);
13+
14+
var result = await maybe.AsTask().ToInvertedResult("Error");
15+
16+
result.IsSuccess.Should().BeFalse();
17+
result.Error.Should().Be("Error");
18+
}
19+
20+
[Fact]
21+
public async Task ToInvertedResult_Task_returns_success_if_has_no_value()
22+
{
23+
Maybe<T> maybe = null;
24+
25+
var result = await maybe.AsTask().ToInvertedResult("Error");
26+
27+
result.IsSuccess.Should().BeTrue();
28+
}
29+
30+
[Fact]
31+
public async Task ToInvertedResult_Task_returns_custom_failure_if_has_value()
32+
{
33+
var maybe = Maybe<T>.From(T.Value);
34+
35+
var result = await maybe.AsTask().ToInvertedResult(E.Value);
36+
37+
result.IsSuccess.Should().BeFalse();
38+
result.Error.Should().Be(E.Value);
39+
}
40+
41+
[Fact]
42+
public async Task ToInvertedResult_Task_custom_failure_returns_success_if_has_no_value()
43+
{
44+
Maybe<T> maybe = null;
45+
46+
var result = await maybe.AsTask().ToInvertedResult(E.Value);
47+
48+
result.IsSuccess.Should().BeTrue();
49+
}
50+
51+
[Fact]
52+
public async Task ToInvertedResult_Task_returns_custom_failure_via_error_function_if_has_value()
53+
{
54+
var maybe = Maybe<T>.From(T.Value);
55+
56+
var result = await maybe.AsTask().ToInvertedResult(ErrorFunc);
57+
58+
result.IsSuccess.Should().BeFalse();
59+
result.Error.Should().Be(E.Value);
60+
AssertErrorFuncCalled();
61+
}
62+
63+
[Fact]
64+
public async Task ToInvertedResult_Task_custom_failure_with_error_function_returns_success_if_has_no_value()
65+
{
66+
Maybe<T> maybe = null;
67+
68+
var result = await maybe.AsTask().ToInvertedResult(ErrorFunc);
69+
70+
result.IsSuccess.Should().BeTrue();
71+
AssertErrorFuncNotCalled();
72+
}
73+
}
74+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
using System.Threading.Tasks;
2+
using FluentAssertions;
3+
using Xunit;
4+
5+
namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
6+
{
7+
public class ToInvertedResultTests_ValueTask : MaybeTestBase
8+
{
9+
[Fact]
10+
public async Task ToInvertedResult_ValueTask_returns_failure_if_has_value()
11+
{
12+
var maybe = Maybe<T>.From(T.Value);
13+
14+
var result = await maybe.AsValueTask().ToInvertedResult("Error");
15+
16+
result.IsSuccess.Should().BeFalse();
17+
result.Error.Should().Be("Error");
18+
}
19+
20+
[Fact]
21+
public async Task ToInvertedResult_ValueTask_returns_success_if_has_no_value()
22+
{
23+
Maybe<T> maybe = null;
24+
25+
var result = await maybe.AsValueTask().ToInvertedResult("Error");
26+
27+
result.IsSuccess.Should().BeTrue();
28+
}
29+
30+
[Fact]
31+
public async Task ToInvertedResult_ValueTask_returns_custom_failure_if_has_value()
32+
{
33+
var maybe = Maybe<T>.From(T.Value);
34+
35+
var result = await maybe.AsValueTask().ToInvertedResult(E.Value);
36+
37+
result.IsSuccess.Should().BeFalse();
38+
result.Error.Should().Be(E.Value);
39+
}
40+
41+
[Fact]
42+
public async Task ToInvertedResult_ValueTask_custom_failure_returns_success_if_has_no_value()
43+
{
44+
Maybe<T> maybe = null;
45+
46+
var result = await maybe.AsValueTask().ToInvertedResult(E.Value);
47+
48+
result.IsSuccess.Should().BeTrue();
49+
}
50+
51+
[Fact]
52+
public async Task ToInvertedResult_ValueTask_returns_custom_failure_via_error_function_if_has_value()
53+
{
54+
var maybe = Maybe<T>.From(T.Value);
55+
56+
var result = await maybe.AsValueTask().ToInvertedResult(ErrorFunc);
57+
58+
result.IsSuccess.Should().BeFalse();
59+
result.Error.Should().Be(E.Value);
60+
AssertErrorFuncCalled();
61+
}
62+
63+
[Fact]
64+
public async Task ToInvertedResult_ValueTask_custom_failure_with_error_function_returns_success_if_has_no_value()
65+
{
66+
Maybe<T> maybe = null;
67+
68+
var result = await maybe.AsValueTask().ToInvertedResult(ErrorFunc);
69+
70+
result.IsSuccess.Should().BeTrue();
71+
AssertErrorFuncNotCalled();
72+
}
73+
}
74+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
using FluentAssertions;
2+
using Xunit;
3+
4+
namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
5+
{
6+
public class ToInvertedResultTests : MaybeTestBase
7+
{
8+
[Fact]
9+
public void ToInvertedResult_returns_failure_if_has_value()
10+
{
11+
var maybe = Maybe<T>.From(T.Value);
12+
13+
var result = maybe.ToInvertedResult("Error");
14+
15+
result.IsSuccess.Should().BeFalse();
16+
result.Error.Should().Be("Error");
17+
}
18+
19+
[Fact]
20+
public void ToInvertedResult_returns_success_if_has_no_value()
21+
{
22+
Maybe<T> maybe = null;
23+
24+
var result = maybe.ToInvertedResult("Error");
25+
26+
result.IsSuccess.Should().BeTrue();
27+
}
28+
29+
[Fact]
30+
public void ToInvertedResult_returns_custom_failure_if_has_value()
31+
{
32+
var maybe = Maybe<T>.From(T.Value);
33+
34+
var result = maybe.ToInvertedResult(E.Value);
35+
36+
result.IsSuccess.Should().BeFalse();
37+
result.Error.Should().Be(E.Value);
38+
}
39+
40+
[Fact]
41+
public void ToInvertedResult_custom_failure_returns_success_if_has_no_value()
42+
{
43+
Maybe<T> maybe = null;
44+
45+
var result = maybe.ToInvertedResult(E.Value);
46+
47+
result.IsSuccess.Should().BeTrue();
48+
}
49+
50+
[Fact]
51+
public void ToInvertedResult_returns_custom_failure_via_error_function_if_has_value()
52+
{
53+
Maybe<T> maybe = Maybe<T>.From(T.Value);
54+
55+
var result = maybe.ToInvertedResult(ErrorFunc);
56+
57+
result.IsSuccess.Should().BeFalse();
58+
result.Error.Should().Be(E.Value);
59+
AssertErrorFuncCalled();
60+
}
61+
62+
[Fact]
63+
public void ToInvertedResult_custom_failure_with_error_function_returns_success_if_has_no_value()
64+
{
65+
Maybe<T> maybe = null;
66+
67+
var result = maybe.ToInvertedResult(ErrorFunc);
68+
69+
result.IsSuccess.Should().BeTrue();
70+
AssertErrorFuncNotCalled();
71+
}
72+
}
73+
}

CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/ToResultTests.Task.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,21 +55,23 @@ public async Task ToResult_Task_returns_custom_failure_via_error_function_if_has
5555
{
5656
Maybe<T> maybe = null;
5757

58-
var result = await maybe.AsTask().ToResult(() => E.Value);
58+
var result = await maybe.AsTask().ToResult(ErrorFunc);
5959

6060
result.IsSuccess.Should().BeFalse();
6161
result.Error.Should().Be(E.Value);
62+
AssertErrorFuncCalled();
6263
}
6364

6465
[Fact]
6566
public async Task ToResult_Task_custom_failure_with_error_function_returns_success_if_has_value()
6667
{
6768
var maybe = Maybe<T>.From(T.Value);
6869

69-
var result = await maybe.AsTask().ToResult(() => E.Value);
70+
var result = await maybe.AsTask().ToResult(ErrorFunc);
7071

7172
result.IsSuccess.Should().BeTrue();
7273
result.Value.Should().Be(T.Value);
74+
AssertErrorFuncNotCalled();
7375
}
7476
}
7577
}

CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/ToResultTests.ValueTask.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,21 +56,23 @@ public async Task ToResult_ValueTask_returns_custom_failure_via_error_function_i
5656
{
5757
Maybe<T> maybe = null;
5858

59-
var result = await maybe.AsValueTask().ToResult(() => E.Value);
59+
var result = await maybe.AsValueTask().ToResult(ErrorFunc);
6060

6161
result.IsSuccess.Should().BeFalse();
6262
result.Error.Should().Be(E.Value);
63+
AssertErrorFuncCalled();
6364
}
6465

6566
[Fact]
6667
public async Task ToResult_ValueTask_custom_failure_with_error_function_returns_success_if_has_value()
6768
{
6869
var maybe = Maybe<T>.From(T.Value);
6970

70-
var result = await maybe.AsValueTask().ToResult(() => E.Value);
71+
var result = await maybe.AsValueTask().ToResult(ErrorFunc);
7172

7273
result.IsSuccess.Should().BeTrue();
7374
result.Value.Should().Be(T.Value);
75+
AssertErrorFuncNotCalled();
7476
}
7577
}
7678
}

CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/ToResultTests.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,21 +54,23 @@ public void ToResult_returns_custom_failure_via_error_function_if_has_no_value()
5454
{
5555
Maybe<T> maybe = null;
5656

57-
var result = maybe.ToResult(() => E.Value);
57+
var result = maybe.ToResult(ErrorFunc);
5858

5959
result.IsSuccess.Should().BeFalse();
6060
result.Error.Should().Be(E.Value);
61+
AssertErrorFuncCalled();
6162
}
6263

6364
[Fact]
6465
public void ToResult_custom_failure_with_error_function_returns_success_if_has_value()
6566
{
6667
var maybe = Maybe<T>.From(T.Value);
6768

68-
var result = maybe.ToResult(() => E.Value);
69+
var result = maybe.ToResult(ErrorFunc);
6970

7071
result.IsSuccess.Should().BeTrue();
7172
result.Value.Should().Be(T.Value);
73+
AssertErrorFuncNotCalled();
7274
}
7375
}
7476
}

0 commit comments

Comments
 (0)