EnumerablesComparer
Comparator for two IEnumerables.
using System;
using System.Collections;
namespace NUnit.Framework.Constraints.Comparers
{
internal class EnumerablesComparer : IChainComparer
{
private readonly NUnitEqualityComparer _equalityComparer;
internal EnumerablesComparer(NUnitEqualityComparer equalityComparer)
{
_equalityComparer = equalityComparer;
}
public bool? Equal(object x, object y, ref Tolerance tolerance, bool topLevelComparison = true)
{
if (x is IEnumerable && y is IEnumerable) {
IEnumerable enumerable = (IEnumerable)x;
IEnumerable enumerable2 = (IEnumerable)y;
IEnumerator enumerator = null;
IEnumerator enumerator2 = null;
try {
enumerator = enumerable.GetEnumerator();
enumerator2 = enumerable2.GetEnumerator();
int num = 0;
bool flag;
bool flag2;
while (true) {
flag = enumerator.MoveNext();
flag2 = enumerator2.MoveNext();
if (!flag && !flag2)
return true;
if (flag != flag2 || !_equalityComparer.AreEqual(enumerator.Current, enumerator2.Current, ref tolerance, false))
break;
num++;
}
NUnitEqualityComparer.FailurePoint failurePoint = new NUnitEqualityComparer.FailurePoint();
failurePoint.Position = num;
failurePoint.ExpectedHasData = flag;
if (flag)
failurePoint.ExpectedValue = enumerator.Current;
failurePoint.ActualHasData = flag2;
if (flag2)
failurePoint.ActualValue = enumerator2.Current;
_equalityComparer.FailurePoints.Insert(0, failurePoint);
return false;
} finally {
(enumerator as IDisposable)?.Dispose();
(enumerator2 as IDisposable)?.Dispose();
}
}
return null;
}
}
}