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