diff --git a/Src/FluentAssertions/Equivalency/SelfReferenceEquivalencyOptions.cs b/Src/FluentAssertions/Equivalency/SelfReferenceEquivalencyOptions.cs index f3e9fe9c62..db6097d3b8 100644 --- a/Src/FluentAssertions/Equivalency/SelfReferenceEquivalencyOptions.cs +++ b/Src/FluentAssertions/Equivalency/SelfReferenceEquivalencyOptions.cs @@ -427,17 +427,19 @@ public TSelf AllowingInfiniteRecursion() /// /// Clears all selection rules, including those that were added by default. /// - public void WithoutSelectionRules() + public TSelf WithoutSelectionRules() { selectionRules.Clear(); + return (TSelf)this; } /// /// Clears all matching rules, including those that were added by default. /// - public void WithoutMatchingRules() + public TSelf WithoutMatchingRules() { matchingRules.Clear(); + return (TSelf)this; } /// diff --git a/Tests/Approval.Tests/ApprovedApi/FluentAssertions/net47.verified.txt b/Tests/Approval.Tests/ApprovedApi/FluentAssertions/net47.verified.txt index 71fa616938..39344dce75 100644 --- a/Tests/Approval.Tests/ApprovedApi/FluentAssertions/net47.verified.txt +++ b/Tests/Approval.Tests/ApprovedApi/FluentAssertions/net47.verified.txt @@ -957,8 +957,8 @@ namespace FluentAssertions.Equivalency public TSelf WithStrictOrderingFor(System.Linq.Expressions.Expression> predicate) { } public TSelf WithTracing(FluentAssertions.Equivalency.Tracing.ITraceWriter writer = null) { } public TSelf WithoutAutoConversionFor(System.Linq.Expressions.Expression> predicate) { } - public void WithoutMatchingRules() { } - public void WithoutSelectionRules() { } + public TSelf WithoutMatchingRules() { } + public TSelf WithoutSelectionRules() { } public TSelf WithoutStrictOrdering() { } public TSelf WithoutStrictOrderingFor(System.Linq.Expressions.Expression> predicate) { } public class Restriction diff --git a/Tests/Approval.Tests/ApprovedApi/FluentAssertions/net6.0.verified.txt b/Tests/Approval.Tests/ApprovedApi/FluentAssertions/net6.0.verified.txt index 6d29bd1c3a..05e30d6602 100644 --- a/Tests/Approval.Tests/ApprovedApi/FluentAssertions/net6.0.verified.txt +++ b/Tests/Approval.Tests/ApprovedApi/FluentAssertions/net6.0.verified.txt @@ -970,8 +970,8 @@ namespace FluentAssertions.Equivalency public TSelf WithStrictOrderingFor(System.Linq.Expressions.Expression> predicate) { } public TSelf WithTracing(FluentAssertions.Equivalency.Tracing.ITraceWriter writer = null) { } public TSelf WithoutAutoConversionFor(System.Linq.Expressions.Expression> predicate) { } - public void WithoutMatchingRules() { } - public void WithoutSelectionRules() { } + public TSelf WithoutMatchingRules() { } + public TSelf WithoutSelectionRules() { } public TSelf WithoutStrictOrdering() { } public TSelf WithoutStrictOrderingFor(System.Linq.Expressions.Expression> predicate) { } public class Restriction diff --git a/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netstandard2.0.verified.txt b/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netstandard2.0.verified.txt index c39d7e7f89..44f9a2d9d1 100644 --- a/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netstandard2.0.verified.txt +++ b/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netstandard2.0.verified.txt @@ -950,8 +950,8 @@ namespace FluentAssertions.Equivalency public TSelf WithStrictOrderingFor(System.Linq.Expressions.Expression> predicate) { } public TSelf WithTracing(FluentAssertions.Equivalency.Tracing.ITraceWriter writer = null) { } public TSelf WithoutAutoConversionFor(System.Linq.Expressions.Expression> predicate) { } - public void WithoutMatchingRules() { } - public void WithoutSelectionRules() { } + public TSelf WithoutMatchingRules() { } + public TSelf WithoutSelectionRules() { } public TSelf WithoutStrictOrdering() { } public TSelf WithoutStrictOrderingFor(System.Linq.Expressions.Expression> predicate) { } public class Restriction diff --git a/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netstandard2.1.verified.txt b/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netstandard2.1.verified.txt index 34e0f4b77d..eb06a6654b 100644 --- a/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netstandard2.1.verified.txt +++ b/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netstandard2.1.verified.txt @@ -957,8 +957,8 @@ namespace FluentAssertions.Equivalency public TSelf WithStrictOrderingFor(System.Linq.Expressions.Expression> predicate) { } public TSelf WithTracing(FluentAssertions.Equivalency.Tracing.ITraceWriter writer = null) { } public TSelf WithoutAutoConversionFor(System.Linq.Expressions.Expression> predicate) { } - public void WithoutMatchingRules() { } - public void WithoutSelectionRules() { } + public TSelf WithoutMatchingRules() { } + public TSelf WithoutSelectionRules() { } public TSelf WithoutStrictOrdering() { } public TSelf WithoutStrictOrderingFor(System.Linq.Expressions.Expression> predicate) { } public class Restriction diff --git a/Tests/FluentAssertions.Equivalency.Specs/SelectionRulesSpecs.cs b/Tests/FluentAssertions.Equivalency.Specs/SelectionRulesSpecs.cs new file mode 100644 index 0000000000..7e31ed3481 --- /dev/null +++ b/Tests/FluentAssertions.Equivalency.Specs/SelectionRulesSpecs.cs @@ -0,0 +1,66 @@ +using System; +using FluentAssertions.Equivalency.Matching; +using FluentAssertions.Equivalency.Ordering; +using FluentAssertions.Equivalency.Selection; +using Xunit; + +namespace FluentAssertions.Equivalency.Specs; + +public partial class SelectionRulesSpecs +{ + [Fact] + public void Public_methods_follow_fluent_syntax() + { + // Arrange + var subject = new Root(); + var expected = new RootDto(); + + // Act / Assert + subject.Should().BeEquivalentTo(expected, + options => options + .AllowingInfiniteRecursion() + .ComparingByMembers(typeof(Root)) + .ComparingByMembers() + .ComparingByValue(typeof(Customer)) + .ComparingByValue() + .ComparingEnumsByName() + .ComparingEnumsByValue() + .ComparingRecordsByMembers() + .ComparingRecordsByValue() + .Excluding(r => r.Level) + .ExcludingFields() + .ExcludingMissingMembers() + .ExcludingNestedObjects() + .ExcludingNonBrowsableMembers() + .ExcludingProperties() + .IgnoringCyclicReferences() + .IgnoringNonBrowsableMembersOnSubject() + .Including(r => r.Level) + .IncludingAllDeclaredProperties() + .IncludingAllRuntimeProperties() + .IncludingFields() + .IncludingInternalFields() + .IncludingInternalProperties() + .IncludingNestedObjects() + .IncludingProperties() + .RespectingDeclaredTypes() + .RespectingRuntimeTypes() + .ThrowingOnMissingMembers() + .Using(new ExtensibilitySpecs.DoEquivalencyStep(() => { })) + .Using(new MustMatchByNameRule()) + .Using(new AllFieldsSelectionRule()) + .Using(new ByteArrayOrderingRule()) + .Using(StringComparer.OrdinalIgnoreCase) + .WithAutoConversion() + .WithAutoConversionFor(_ => false) + .WithoutAutoConversionFor(_ => true) + .WithoutMatchingRules() + .WithoutSelectionRules() + .WithoutStrictOrdering() + .WithoutStrictOrderingFor(r => r.Level) + .WithStrictOrdering() + .WithStrictOrderingFor(r => r.Level) + .WithTracing() + ); + } +} diff --git a/docs/_pages/releases.md b/docs/_pages/releases.md index bc6eecded1..b8752b4320 100644 --- a/docs/_pages/releases.md +++ b/docs/_pages/releases.md @@ -59,6 +59,7 @@ sidebar: * `EquivalencyAssertionOptions` to `EquivalencyOptions` * `IEquivalencyAssertionOptions` to `IEquivalencyOptions` * `SelfReferenceEquivalencyAssertionOptions` to `SelfReferenceEquivalencyOptions` +* Allow fluently calling `WithoutMatchingRules` and `WithoutSelectionRules` while using `BeEquivalentTo` - [#2457](https://github.com/fluentassertions/fluentassertions/pull/2457) ### Breaking Changes (for extensions) * Add `ForConstraint` to `IAssertionsScope` to support chaining `.ForConstraint()` after `.Then` - [#2324](https://github.com/fluentassertions/fluentassertions/pull/2324)