Skip to content

Commit

Permalink
Add ComparingMembers(Func<Type, bool?>) predicate) (fluentassertions#…
Browse files Browse the repository at this point in the history
  • Loading branch information
Urs Enzler committed Aug 13, 2020
1 parent 0b32279 commit a6d37d2
Show file tree
Hide file tree
Showing 7 changed files with 28 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ public abstract class SelfReferenceEquivalencyAssertionOptions<TSelf> : IEquival

private bool includeFields;

private Func<Type, bool?> comparingByMembersCallback = null;

#endregion

internal SelfReferenceEquivalencyAssertionOptions()
Expand Down Expand Up @@ -162,38 +164,29 @@ IEnumerable<IMemberSelectionRule> 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; }
Expand Down Expand Up @@ -539,6 +532,12 @@ public TSelf ComparingByMembers<T>()
return (TSelf)this;
}

public TSelf ComparingByMembers(Func<Type, bool?> predicate)
{
comparingByMembersCallback = predicate;
return (TSelf)this;
}

/// <summary>
/// Marks the <typeparamref name="T" /> as a value type which must be compared using its
/// <see cref="object.Equals(object)" /> method, regardless of it overriding it or not.
Expand Down
2 changes: 1 addition & 1 deletion Tests/Approval.Tests/ApiApproval.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<System.Type, bool?> predicate) { }
public TSelf ComparingByMembers<T>() { }
public TSelf ComparingByValue<T>() { }
public TSelf ComparingEnumsByName() { }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<System.Type, bool?> predicate) { }
public TSelf ComparingByMembers<T>() { }
public TSelf ComparingByValue<T>() { }
public TSelf ComparingEnumsByName() { }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<System.Type, bool?> predicate) { }
public TSelf ComparingByMembers<T>() { }
public TSelf ComparingByValue<T>() { }
public TSelf ComparingEnumsByName() { }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<System.Type, bool?> predicate) { }
public TSelf ComparingByMembers<T>() { }
public TSelf ComparingByValue<T>() { }
public TSelf ComparingEnumsByName() { }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<System.Type, bool?> predicate) { }
public TSelf ComparingByMembers<T>() { }
public TSelf ComparingByValue<T>() { }
public TSelf ComparingEnumsByName() { }
Expand Down

0 comments on commit a6d37d2

Please sign in to comment.