Skip to content

Commit a76060e

Browse files
committed
Add UnitResult and ResultTE extensions
1 parent 7672d4a commit a76060e

File tree

4 files changed

+177
-11
lines changed

4 files changed

+177
-11
lines changed

src/CSharpFunctionalExtensions.FluentAssertions/ResultExtensions.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ public AndConstraint<ResultAssertions> Succeed(string because = "", params objec
2525
{
2626
Execute.Assertion
2727
.BecauseOf(because, becauseArgs)
28-
.Given(() => Subject.IsSuccess)
29-
.ForCondition(isSuccess => isSuccess)
28+
.Given(() => Subject)
29+
.ForCondition(s => s.IsSuccess)
3030
.FailWith("Expected Result to be successful but it failed");
3131

3232
return new AndConstraint<ResultAssertions>(this);
@@ -42,8 +42,8 @@ public AndConstraint<ResultAssertions> Fail(string because = "", params object[]
4242
{
4343
Execute.Assertion
4444
.BecauseOf(because, becauseArgs)
45-
.Given(() => Subject.IsFailure)
46-
.ForCondition(isSuccess => isSuccess)
45+
.Given(() => Subject)
46+
.ForCondition(s => s.IsFailure)
4747
.FailWith("Expected Result to be failure but it succeeded");
4848

4949
return new AndConstraint<ResultAssertions>(this);
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
using FluentAssertions.Execution;
2+
using FluentAssertions.Primitives;
3+
using FluentAssertions;
4+
5+
namespace CSharpFunctionalExtensions.FluentAssertions;
6+
public static class ResultTEExtensions
7+
{
8+
public static ResultTEAssertions<T, E> Should<T, E>(this Result<T, E> instance) => new(instance);
9+
}
10+
11+
public class ResultTEAssertions<T, E> : ReferenceTypeAssertions<Result<T, E>, ResultTEAssertions<T, E>>
12+
{
13+
public ResultTEAssertions(Result<T, E> instance) : base(instance) { }
14+
15+
protected override string Identifier => "Result{T}";
16+
17+
/// <summary>
18+
/// Asserts a result is a success.
19+
/// </summary>
20+
/// <param name="because"></param>
21+
/// <param name="becauseArgs"></param>
22+
/// <returns></returns>
23+
public AndConstraint<ResultTEAssertions<T, E>> Succeed(string because = "", params object[] becauseArgs)
24+
{
25+
Execute.Assertion
26+
.BecauseOf(because, becauseArgs)
27+
.Given(() => Subject)
28+
.ForCondition(s => s.IsSuccess)
29+
.FailWith("Expected Result to be successful but it failed");
30+
31+
return new AndConstraint<ResultTEAssertions<T, E>>(this);
32+
}
33+
34+
/// <summary>
35+
/// Asserts a result is a success with a specified value.
36+
/// </summary>
37+
/// <param name="value"></param>
38+
/// <param name="because"></param>
39+
/// <param name="becauseArgs"></param>
40+
/// <returns></returns>
41+
public AndConstraint<ResultTEAssertions<T, E>> SucceedWith(T value, string because = "", params object[] becauseArgs)
42+
{
43+
Execute.Assertion
44+
.BecauseOf(because, becauseArgs)
45+
.Given(() => Subject)
46+
.ForCondition(s => s.IsSuccess)
47+
.FailWith("Expected Result to be successful but it failed")
48+
.Then
49+
.Given(s => s.Value)
50+
.ForCondition(v => v.Equals(value))
51+
.FailWith("Excepted Result value to be {0} but found {1}", value, Subject.Value);
52+
53+
return new AndConstraint<ResultTEAssertions<T, E>>(this);
54+
}
55+
56+
/// <summary>
57+
/// Asserts a result is a failure.
58+
/// </summary>
59+
/// <param name="because"></param>
60+
/// <param name="becauseArgs"></param>
61+
/// <returns></returns>
62+
public AndConstraint<ResultTEAssertions<T, E>> Fail(string because = "", params object[] becauseArgs)
63+
{
64+
Execute.Assertion
65+
.BecauseOf(because, becauseArgs)
66+
.Given(() => Subject)
67+
.ForCondition(s => s.IsFailure)
68+
.FailWith("Expected Result to be failure but it succeeded");
69+
70+
return new AndConstraint<ResultTEAssertions<T, E>>(this);
71+
}
72+
73+
/// <summary>
74+
/// Asserts a result is a failure with a specified error.
75+
/// </summary>
76+
/// <param name="error"></param>
77+
/// <param name="because"></param>
78+
/// <param name="becauseArgs"></param>
79+
/// <returns></returns>
80+
public AndConstraint<ResultTEAssertions<T, E>> FailWith(E error, string because = "", params object[] becauseArgs)
81+
{
82+
Execute.Assertion
83+
.BecauseOf(because, becauseArgs)
84+
.Given(() => Subject)
85+
.ForCondition(s => s.IsFailure)
86+
.FailWith("Expected Result to be failure but it succeeded")
87+
.Then
88+
.Given(s => s.Error)
89+
.ForCondition(e => e.Equals(error))
90+
.FailWith("Excepted Result value to be {0} but found {1}", error, Subject.Error);
91+
92+
return new AndConstraint<ResultTEAssertions<T, E>>(this);
93+
}
94+
}

src/CSharpFunctionalExtensions.FluentAssertions/ResultTExtensions.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ public AndConstraint<ResultTAssertions<T>> Succeed(string because = "", params o
2525
{
2626
Execute.Assertion
2727
.BecauseOf(because, becauseArgs)
28-
.Given(() => Subject.IsSuccess)
29-
.ForCondition(isSuccess => isSuccess)
28+
.Given(() => Subject)
29+
.ForCondition(s => s.IsSuccess)
3030
.FailWith("Expected Result to be successful but it failed");
3131

3232
return new AndConstraint<ResultTAssertions<T>>(this);
3333
}
3434

3535
/// <summary>
36-
/// Asserts a result is a failure.
36+
/// Asserts a result is a success with a specified value.
3737
/// </summary>
3838
/// <param name="value"></param>
3939
/// <param name="because"></param>
@@ -44,7 +44,7 @@ public AndConstraint<ResultTAssertions<T>> SucceedWith(T value, string because =
4444
Execute.Assertion
4545
.BecauseOf(because, becauseArgs)
4646
.Given(() => Subject)
47-
.ForCondition(isSuccess => Subject.IsSuccess)
47+
.ForCondition(s => s.IsSuccess)
4848
.FailWith("Expected Result to be successful but it failed")
4949
.Then
5050
.Given(s => s.Value)
@@ -55,7 +55,7 @@ public AndConstraint<ResultTAssertions<T>> SucceedWith(T value, string because =
5555
}
5656

5757
/// <summary>
58-
///
58+
/// Asserts a result is a failure
5959
/// </summary>
6060
/// <param name="because"></param>
6161
/// <param name="becauseArgs"></param>
@@ -64,8 +64,8 @@ public AndConstraint<ResultTAssertions<T>> Fail(string because = "", params obje
6464
{
6565
Execute.Assertion
6666
.BecauseOf(because, becauseArgs)
67-
.Given(() => Subject.IsFailure)
68-
.ForCondition(isSuccess => isSuccess)
67+
.Given(() => Subject)
68+
.ForCondition(s => s.IsFailure)
6969
.FailWith("Expected Result to be failure but it succeeded");
7070

7171
return new AndConstraint<ResultTAssertions<T>>(this);
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
using FluentAssertions.Execution;
2+
using FluentAssertions.Primitives;
3+
using FluentAssertions;
4+
5+
namespace CSharpFunctionalExtensions.FluentAssertions;
6+
public static class UnitResultExtensions
7+
{
8+
public static UnitResultAssertions<E> Should<E>(this UnitResult<E> instance) => new(instance);
9+
}
10+
11+
public class UnitResultAssertions<E> : ReferenceTypeAssertions<UnitResult<E>, UnitResultAssertions<E>>
12+
{
13+
public UnitResultAssertions(UnitResult<E> instance) : base(instance) { }
14+
15+
protected override string Identifier => "Result";
16+
17+
/// <summary>
18+
/// Asserts a unit result is a success.
19+
/// </summary>
20+
/// <param name="because"></param>
21+
/// <param name="becauseArgs"></param>
22+
/// <returns></returns>
23+
public AndConstraint<UnitResultAssertions<E>> Succeed(string because = "", params object[] becauseArgs)
24+
{
25+
Execute.Assertion
26+
.BecauseOf(because, becauseArgs)
27+
.Given(() => Subject)
28+
.ForCondition(s => s.IsSuccess)
29+
.FailWith("Expected UnitResult to be successful but it failed");
30+
31+
return new AndConstraint<UnitResultAssertions<E>>(this);
32+
}
33+
34+
/// <summary>
35+
/// Asserts a unit result is a failure.
36+
/// </summary>
37+
/// <param name="because"></param>
38+
/// <param name="becauseArgs"></param>
39+
/// <returns></returns>
40+
public AndConstraint<UnitResultAssertions<E>> Fail(string because = "", params object[] becauseArgs)
41+
{
42+
Execute.Assertion
43+
.BecauseOf(because, becauseArgs)
44+
.Given(() => Subject)
45+
.ForCondition(s => s.IsFailure)
46+
.FailWith("Expected UnitResult to be failure but it succeeded");
47+
48+
return new AndConstraint<UnitResultAssertions<E>>(this);
49+
}
50+
51+
/// <summary>
52+
/// Asserts a unit result is a failure with a specfied error.
53+
/// </summary>
54+
/// <param name="error"></param>
55+
/// <param name="because"></param>
56+
/// <param name="becauseArgs"></param>
57+
/// <returns></returns>
58+
public AndConstraint<UnitResultAssertions<E>> Fail(E error, string because = "", params object[] becauseArgs)
59+
{
60+
Execute.Assertion
61+
.BecauseOf(because, becauseArgs)
62+
.Given(() => Subject)
63+
.ForCondition(s => s.IsFailure)
64+
.FailWith("Expected UnitResult to be failure but it succeeded")
65+
.Then
66+
.Given(s => s.Error)
67+
.ForCondition(e => e.Equals(error))
68+
.FailWith("Excepted UnitResult value to be {0} but found {1}", error, Subject.Error);
69+
70+
return new AndConstraint<UnitResultAssertions<E>>(this);
71+
}
72+
}

0 commit comments

Comments
 (0)