<PackageReference Include="NUnit" Version="3.8.1" />

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) { 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)) 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; } } }