From a6d37d27e1457e2eef2154dcef78b3a95f0bda93 Mon Sep 17 00:00:00 2001 From: Urs Enzler Date: Thu, 13 Aug 2020 08:17:27 +0200 Subject: [PATCH] Add ComparingMembers(Func) predicate) (#1374) --- ...elfReferenceEquivalencyAssertionOptions.cs | 45 +++++++++---------- Tests/Approval.Tests/ApiApproval.cs | 2 +- .../FluentAssertions/net47.approved.txt | 1 + .../netcoreapp2.1.approved.txt | 1 + .../netcoreapp3.0.approved.txt | 1 + .../netstandard2.0.approved.txt | 1 + .../netstandard2.1.approved.txt | 1 + 7 files changed, 28 insertions(+), 24 deletions(-) diff --git a/Src/FluentAssertions/Equivalency/SelfReferenceEquivalencyAssertionOptions.cs b/Src/FluentAssertions/Equivalency/SelfReferenceEquivalencyAssertionOptions.cs index 40dc892ef9..8ced5c50b8 100644 --- a/Src/FluentAssertions/Equivalency/SelfReferenceEquivalencyAssertionOptions.cs +++ b/Src/FluentAssertions/Equivalency/SelfReferenceEquivalencyAssertionOptions.cs @@ -58,6 +58,8 @@ public abstract class SelfReferenceEquivalencyAssertionOptions : IEquival private bool includeFields; + private Func comparingByMembersCallback = null; + #endregion internal SelfReferenceEquivalencyAssertionOptions() @@ -162,38 +164,29 @@ IEnumerable IEquivalencyAssertionOptions.SelectionRules EqualityStrategy IEquivalencyAssertionOptions.GetEqualityStrategy(Type type) { - EqualityStrategy strategy; + var callbackResult = comparingByMembersCallback?.Invoke(type); + if (callbackResult != null) + { + return callbackResult.Value ? EqualityStrategy.ForceMembers : EqualityStrategy.ForceEquals; + } if (referenceTypes.Any(type.IsSameOrInherits)) { - strategy = EqualityStrategy.ForceMembers; + return EqualityStrategy.ForceMembers; } - else if (valueTypes.Any(type.IsSameOrInherits)) + + if (valueTypes.Any(type.IsSameOrInherits)) { - strategy = EqualityStrategy.ForceEquals; + return EqualityStrategy.ForceEquals; } - else + + if (getDefaultEqualityStrategy != null) { - if (getDefaultEqualityStrategy != null) - { - strategy = getDefaultEqualityStrategy(type); - } - else - { - bool hasValueSemantics = hasValueSemanticsMap.GetOrAdd(type, t => t.HasValueSemantics()); - - if (hasValueSemantics) - { - strategy = EqualityStrategy.Equals; - } - else - { - strategy = EqualityStrategy.Members; - } - } + return getDefaultEqualityStrategy(type); } - return strategy; + bool hasValueSemantics = hasValueSemanticsMap.GetOrAdd(type, t => t.HasValueSemantics()); + return hasValueSemantics ? EqualityStrategy.Equals : EqualityStrategy.Members; } public ITraceWriter TraceWriter { get; private set; } @@ -539,6 +532,12 @@ public TSelf ComparingByMembers() return (TSelf)this; } + public TSelf ComparingByMembers(Func predicate) + { + comparingByMembersCallback = predicate; + return (TSelf)this; + } + /// /// Marks the as a value type which must be compared using its /// method, regardless of it overriding it or not. diff --git a/Tests/Approval.Tests/ApiApproval.cs b/Tests/Approval.Tests/ApiApproval.cs index dbc106498e..f9cbe3da97 100644 --- a/Tests/Approval.Tests/ApiApproval.cs +++ b/Tests/Approval.Tests/ApiApproval.cs @@ -19,7 +19,7 @@ public class ApiApproval [InlineData("FluentAssertions", "netstandard2.1")] [InlineData("FluentAssertions", "netcoreapp2.1")] [InlineData("FluentAssertions", "netcoreapp3.0")] - [UseReporter(typeof(DiffReporter))] + [UseReporter(typeof(RiderReporter))] [MethodImpl(MethodImplOptions.NoInlining)] public void ApproveApi(string projectName, string frameworkVersion) { diff --git a/Tests/Approval.Tests/ApprovedApi/FluentAssertions/net47.approved.txt b/Tests/Approval.Tests/ApprovedApi/FluentAssertions/net47.approved.txt index 22edce9b96..7842bb0c47 100644 --- a/Tests/Approval.Tests/ApprovedApi/FluentAssertions/net47.approved.txt +++ b/Tests/Approval.Tests/ApprovedApi/FluentAssertions/net47.approved.txt @@ -854,6 +854,7 @@ namespace FluentAssertions.Equivalency public FluentAssertions.Equivalency.ITraceWriter TraceWriter { get; } protected TSelf AddSelectionRule(FluentAssertions.Equivalency.IMemberSelectionRule selectionRule) { } public TSelf AllowingInfiniteRecursion() { } + public TSelf ComparingByMembers(System.Func predicate) { } public TSelf ComparingByMembers() { } public TSelf ComparingByValue() { } public TSelf ComparingEnumsByName() { } diff --git a/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netcoreapp2.1.approved.txt b/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netcoreapp2.1.approved.txt index 9f4b857bee..0d9b8d2cd7 100644 --- a/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netcoreapp2.1.approved.txt +++ b/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netcoreapp2.1.approved.txt @@ -854,6 +854,7 @@ namespace FluentAssertions.Equivalency public FluentAssertions.Equivalency.ITraceWriter TraceWriter { get; } protected TSelf AddSelectionRule(FluentAssertions.Equivalency.IMemberSelectionRule selectionRule) { } public TSelf AllowingInfiniteRecursion() { } + public TSelf ComparingByMembers(System.Func predicate) { } public TSelf ComparingByMembers() { } public TSelf ComparingByValue() { } public TSelf ComparingEnumsByName() { } diff --git a/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netcoreapp3.0.approved.txt b/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netcoreapp3.0.approved.txt index a907036d15..1aa0046306 100644 --- a/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netcoreapp3.0.approved.txt +++ b/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netcoreapp3.0.approved.txt @@ -854,6 +854,7 @@ namespace FluentAssertions.Equivalency public FluentAssertions.Equivalency.ITraceWriter TraceWriter { get; } protected TSelf AddSelectionRule(FluentAssertions.Equivalency.IMemberSelectionRule selectionRule) { } public TSelf AllowingInfiniteRecursion() { } + public TSelf ComparingByMembers(System.Func predicate) { } public TSelf ComparingByMembers() { } public TSelf ComparingByValue() { } public TSelf ComparingEnumsByName() { } diff --git a/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netstandard2.0.approved.txt b/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netstandard2.0.approved.txt index 8dde2ec6de..696dd9fc07 100644 --- a/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netstandard2.0.approved.txt +++ b/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netstandard2.0.approved.txt @@ -847,6 +847,7 @@ namespace FluentAssertions.Equivalency public FluentAssertions.Equivalency.ITraceWriter TraceWriter { get; } protected TSelf AddSelectionRule(FluentAssertions.Equivalency.IMemberSelectionRule selectionRule) { } public TSelf AllowingInfiniteRecursion() { } + public TSelf ComparingByMembers(System.Func predicate) { } public TSelf ComparingByMembers() { } public TSelf ComparingByValue() { } public TSelf ComparingEnumsByName() { } diff --git a/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netstandard2.1.approved.txt b/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netstandard2.1.approved.txt index 12778e7b56..ff609c748c 100644 --- a/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netstandard2.1.approved.txt +++ b/Tests/Approval.Tests/ApprovedApi/FluentAssertions/netstandard2.1.approved.txt @@ -854,6 +854,7 @@ namespace FluentAssertions.Equivalency public FluentAssertions.Equivalency.ITraceWriter TraceWriter { get; } protected TSelf AddSelectionRule(FluentAssertions.Equivalency.IMemberSelectionRule selectionRule) { } public TSelf AllowingInfiniteRecursion() { } + public TSelf ComparingByMembers(System.Func predicate) { } public TSelf ComparingByMembers() { } public TSelf ComparingByValue() { } public TSelf ComparingEnumsByName() { }