NUnitEqualityComparer
NUnitEqualityComparer encapsulates NUnit's handling of
equality tests between objects.
using NUnit.Framework.Constraints.Comparers;
using System.Collections.Generic;
namespace NUnit.Framework.Constraints
{
public class NUnitEqualityComparer
{
public class FailurePoint
{
public long Position;
public object ExpectedValue;
public object ActualValue;
public bool ExpectedHasData;
public bool ActualHasData;
}
private bool caseInsensitive;
private bool compareAsCollection;
private List<EqualityAdapter> externalComparers = new List<EqualityAdapter>();
private List<FailurePoint> failurePoints;
private readonly List<IChainComparer> _comparers;
public static NUnitEqualityComparer Default => new NUnitEqualityComparer();
public bool IgnoreCase {
get {
return caseInsensitive;
}
set {
caseInsensitive = value;
}
}
public bool CompareAsCollection {
get {
return compareAsCollection;
}
set {
compareAsCollection = value;
}
}
public IList<EqualityAdapter> ExternalComparers => externalComparers;
public IList<FailurePoint> FailurePoints => failurePoints;
public bool WithSameOffset { get; set; }
internal NUnitEqualityComparer()
{
EnumerablesComparer enumerablesComparer = new EnumerablesComparer(this);
_comparers = new List<IChainComparer> {
new ArraysComparer(this, enumerablesComparer),
new DictionariesComparer(this),
new DictionaryEntriesComparer(this),
new KeyValuePairsComparer(this),
new StringsComparer(this),
new StreamsComparer(this),
new CharsComparer(this),
new DirectoriesComparer(),
new NumericsComparer(),
new DateTimeOffsetsComparer(this),
new TimeSpanToleranceComparer(),
new EquatablesComparer(this),
new TupleComparer(this),
new ValueTupleComparer(this),
enumerablesComparer
};
}
public bool AreEqual(object x, object y, ref Tolerance tolerance, bool topLevelComparison = true)
{
failurePoints = new List<FailurePoint>();
if (x == null && y == null)
return true;
if (x == null || y == null)
return false;
if (x == y)
return true;
EqualityAdapter externalComparer = GetExternalComparer(x, y);
if (externalComparer != null)
return externalComparer.AreEqual(x, y);
foreach (IChainComparer comparer in _comparers) {
bool? nullable = comparer.Equal(x, y, ref tolerance, topLevelComparison);
if (nullable.HasValue)
return nullable.Value;
}
return x.Equals(y);
}
private EqualityAdapter GetExternalComparer(object x, object y)
{
foreach (EqualityAdapter externalComparer in externalComparers) {
if (externalComparer.CanCompare(x, y))
return externalComparer;
}
return null;
}
}
}