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

StreamsComparer

Comparator for two Streams.
using System; using System.IO; namespace NUnit.Framework.Constraints.Comparers { internal class StreamsComparer : IChainComparer { private static readonly int BUFFER_SIZE = 4096; private readonly NUnitEqualityComparer _equalityComparer; internal StreamsComparer(NUnitEqualityComparer equalityComparer) { _equalityComparer = equalityComparer; } public bool? Equal(object x, object y, ref Tolerance tolerance) { if (!(x is Stream) || !(y is Stream)) return null; Stream stream = (Stream)x; Stream stream2 = (Stream)y; if (stream == stream2) return true; if (!stream.CanRead) throw new ArgumentException("Stream is not readable", "expected"); if (!stream2.CanRead) throw new ArgumentException("Stream is not readable", "actual"); if (!stream.CanSeek) throw new ArgumentException("Stream is not seekable", "expected"); if (!stream2.CanSeek) throw new ArgumentException("Stream is not seekable", "actual"); if (stream.Length != stream2.Length) return false; byte[] array = new byte[BUFFER_SIZE]; byte[] array2 = new byte[BUFFER_SIZE]; BinaryReader binaryReader = new BinaryReader(stream); BinaryReader binaryReader2 = new BinaryReader(stream2); long position = stream.Position; long position2 = stream2.Position; try { binaryReader.BaseStream.Seek(0, SeekOrigin.Begin); binaryReader2.BaseStream.Seek(0, SeekOrigin.Begin); for (long num = 0; num < stream.Length; num += BUFFER_SIZE) { binaryReader.Read(array, 0, BUFFER_SIZE); binaryReader2.Read(array2, 0, BUFFER_SIZE); for (int i = 0; i < BUFFER_SIZE; i++) { if (array[i] != array2[i]) { NUnitEqualityComparer.FailurePoint failurePoint = new NUnitEqualityComparer.FailurePoint(); failurePoint.Position = num + i; failurePoint.ExpectedHasData = true; failurePoint.ExpectedValue = array[i]; failurePoint.ActualHasData = true; failurePoint.ActualValue = array2[i]; _equalityComparer.FailurePoints.Insert(0, failurePoint); return false; } } } } finally { stream.Position = position; stream2.Position = position2; } return true; } } }