StructuralComparer
Comparator for two types related by IStructuralEquatable.
using System.Collections;
using System.Runtime.CompilerServices;
namespace NUnit.Framework.Constraints.Comparers
{
[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
internal static class StructuralComparer
{
[System.Runtime.CompilerServices.Nullable(0)]
private sealed class NUnitEqualityComparison : IEqualityComparer
{
private readonly NUnitEqualityComparer _comparer;
private Tolerance _tolerance;
public Tolerance Tolerance => _tolerance;
public NUnitEqualityComparison(NUnitEqualityComparer comparer, Tolerance tolerance)
{
_comparer = comparer;
_tolerance = tolerance;
}
[System.Runtime.CompilerServices.NullableContext(2)]
public new bool Equals(object x, object y)
{
return _comparer.AreEqual(x, y, ref _tolerance);
}
public int GetHashCode(object obj)
{
return 0;
}
}
public static EqualMethodResult Equal(object x, object y, ref Tolerance tolerance, ComparisonState state, NUnitEqualityComparer equalityComparer)
{
if (equalityComparer.CompareAsCollection && state.TopLevelComparison)
return EqualMethodResult.TypesNotSupported;
IStructuralEquatable structuralEquatable = x as IStructuralEquatable;
if (structuralEquatable != null) {
IStructuralEquatable structuralEquatable2 = y as IStructuralEquatable;
if (structuralEquatable2 != null) {
NUnitEqualityComparison nUnitEqualityComparison = new NUnitEqualityComparison(equalityComparer, tolerance);
bool flag = structuralEquatable.Equals(y, nUnitEqualityComparison);
bool flag2 = structuralEquatable2.Equals(x, nUnitEqualityComparison);
tolerance = nUnitEqualityComparison.Tolerance;
if (!(flag | flag2))
return EqualMethodResult.ComparedNotEqual;
return EqualMethodResult.ComparedEqual;
}
}
return EqualMethodResult.TypesNotSupported;
}
}
}