EnumerablesComparer
Comparator for two IEnumerables.
using System;
using System.Collections;
using System.Runtime.CompilerServices;
namespace NUnit.Framework.Constraints.Comparers
{
internal static class EnumerablesComparer
{
[System.Runtime.CompilerServices.NullableContext(1)]
public static EqualMethodResult Equal(object x, object y, ref Tolerance tolerance, ComparisonState state, NUnitEqualityComparer equalityComparer)
{
IEnumerable enumerable = x as IEnumerable;
if (enumerable != null) {
IEnumerable enumerable2 = y as IEnumerable;
if (enumerable2 != null) {
IEnumerator enumerator = enumerable.GetEnumerator();
using (enumerator as IDisposable) {
IEnumerator enumerator2 = enumerable2.GetEnumerator();
using (enumerator2 as IDisposable) {
ComparisonState state2 = state.PushComparison(x, y);
int num = 0;
bool flag;
bool flag2;
EqualMethodResult equalMethodResult;
while (true) {
flag = enumerator.MoveNext();
flag2 = enumerator2.MoveNext();
if (!flag && !flag2)
return EqualMethodResult.ComparedEqual;
equalMethodResult = ((flag == flag2) ? equalityComparer.AreEqual(enumerator.Current, enumerator2.Current, ref tolerance, state2) : EqualMethodResult.ComparedNotEqual);
if (equalMethodResult != EqualMethodResult.ComparedEqual)
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 equalMethodResult;
}
}
}
}
return EqualMethodResult.TypesNotSupported;
}
}
}