Skip to content

Commit ae0c1bd

Browse files
authored
Merge pull request #9 from NitroDevs/feat/unit-and-t-e-results
Add UnitResult<E> and Result<T, E> Assertions
2 parents 7672d4a + 9a0e06d commit ae0c1bd

File tree

9 files changed

+297
-26
lines changed

9 files changed

+297
-26
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>> FailWith(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+
}

tests/CSharpFunctionalExtensions.FluentAssertions.Tests/MaybeAssertionsTests.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ namespace CSharpFunctionalExtensions.FluentAssertions.Tests;
77
public class MaybeAssertionsTests
88
{
99
[Fact]
10-
public void When_Maybe_Is_Expected_To_Have_Value_And_It_Does_Should_Not_Throw()
10+
public void WhenMaybeIsExpectedToHaveValueAndItDoesShouldNotThrow()
1111
{
1212
var x = Maybe.From("test");
1313

1414
x.Should().HaveValue("test");
1515
}
1616

1717
[Fact]
18-
public void When_Maybe_Is_Expected_To_Have_Value_And_It_Has_Wrong_Value_Should_Throw()
18+
public void WhenMaybeIsExpectedToHaveValueAndItHasWrongValueShouldThrow()
1919
{
2020
var x = Maybe.From("oops");
2121

@@ -25,7 +25,7 @@ public void When_Maybe_Is_Expected_To_Have_Value_And_It_Has_Wrong_Value_Should_T
2525
}
2626

2727
[Fact]
28-
public void When_Maybe_Is_Expected_To_Have_Value_And_It_Does_Not_Should_Throw()
28+
public void WhenMaybeIsExpectedToHaveValueAndItDoesNotShouldThrow()
2929
{
3030
Maybe<string> x = null;
3131

@@ -35,15 +35,15 @@ public void When_Maybe_Is_Expected_To_Have_Value_And_It_Does_Not_Should_Throw()
3535
}
3636

3737
[Fact]
38-
public void When_Maybe_Is_Expected_To_Have_No_Value_And_It_Has_None_Should_Not_Throw()
38+
public void WhenMaybeIsExpectedToHaveNoValueAndItHasNoneShouldNotThrow()
3939
{
4040
Maybe<string> x = null;
4141

4242
x.Should().HaveNoValue();
4343
}
4444

4545
[Fact]
46-
public void When_Maybe_Is_Expected_To_Have_No_Value_And_It_Has_One_Should_Throw()
46+
public void WhenMaybeIsExpectedToHaveNoValueAndItHasOneShouldThrow()
4747
{
4848
var x = Maybe.From("test");
4949

tests/CSharpFunctionalExtensions.FluentAssertions.Tests/ResultAssertionTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ namespace CSharpFunctionalExtensions.FluentAssertions.Tests;
77
public class ResultAssertionTests
88
{
99
[Fact]
10-
public void When_Result_Is_Expected_To_Have_Value_It_Should_Be_Successful()
10+
public void WhenResultIsExpectedToHaveValueItShouldBeSuccessful()
1111
{
1212
var x = Result.Success();
1313

1414
x.Should().Succeed();
1515
}
1616

1717
[Fact]
18-
public void When_Result_Is_Expected_To_Have_Value_It_Should_Not_Be_Failure()
18+
public void WhenResultIsExpectedToHaveValueItShouldNotBeFailure()
1919
{
2020
var x = Result.Success();
2121

@@ -25,15 +25,15 @@ public void When_Result_Is_Expected_To_Have_Value_It_Should_Not_Be_Failure()
2525
}
2626

2727
[Fact]
28-
public void When_Result_Is_Expected_To_Have_Error_It_Should_Not_Be_Failure()
28+
public void WhenResultIsExpectedToHaveErrorItShouldNotBeFailure()
2929
{
3030
var x = Result.Failure("error");
3131

3232
x.Should().Fail();
3333
}
3434

3535
[Fact]
36-
public void When_Result_Is_Expected_To_Have_Error_It_Should_Be_Failure()
36+
public void WhenResultIsExpectedToHaveErrorItShouldBeFailure()
3737
{
3838
var x = Result.Failure("error");
3939

tests/CSharpFunctionalExtensions.FluentAssertions.Tests/ResultTAssertionsTests.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ namespace CSharpFunctionalExtensions.FluentAssertions.Tests;
77
public class ResultAssertionsTests
88
{
99
[Fact]
10-
public void When_Result_Is_Expected_To_Have_Value_It_Should_Be_Successful()
10+
public void WhenResultIsExpectedToHaveValueItShouldBeSuccessful()
1111
{
1212
var x = Result.Success("test");
1313

1414
x.Should().Succeed();
1515
}
1616

1717
[Fact]
18-
public void When_Result_Is_Expected_To_Have_Value_It_Should_Not_Be_Failure()
18+
public void WhenResultIsExpectedToHaveValueItShouldNotBeFailure()
1919
{
2020
var x = Result.Success("test");
2121

@@ -25,7 +25,7 @@ public void When_Result_Is_Expected_To_Have_Value_It_Should_Not_Be_Failure()
2525
}
2626

2727
[Fact]
28-
public void When_Result_Is_Expected_To_Have_Value_It_Should_Be_Successful_With_Value()
28+
public void WhenResultIsExpectedToHaveValueItShouldBeSuccessfulWithValue()
2929
{
3030
string expected = "test";
3131
var x = Result.Success(expected);
@@ -34,7 +34,7 @@ public void When_Result_Is_Expected_To_Have_Value_It_Should_Be_Successful_With_V
3434
}
3535

3636
[Fact]
37-
public void When_Result_Is_Expected_To_Have_Value_It_Should_Not_Be_Successful_With_Different_Value()
37+
public void WhenResultIsExpectedToHaveValueItShouldNotBeSuccessfulWithDifferentValue()
3838
{
3939
var x = Result.Success("foo");
4040

@@ -44,15 +44,15 @@ public void When_Result_Is_Expected_To_Have_Value_It_Should_Not_Be_Successful_Wi
4444
}
4545

4646
[Fact]
47-
public void When_Result_Is_Expected_To_Have_Error_It_Should_Not_Be_Failure()
47+
public void WhenResultIsExpectedToHaveErrorItShouldNotBeFailure()
4848
{
4949
var x = Result.Failure<string>("error");
5050

5151
x.Should().Fail();
5252
}
5353

5454
[Fact]
55-
public void When_Result_Is_Expected_To_Have_Error_It_Should_Be_Failure()
55+
public void WhenResultIsExpectedToHaveErrorItShouldBeFailure()
5656
{
5757
var x = Result.Failure<string>("error");
5858

0 commit comments

Comments
 (0)