diff --git a/src/NUnitFramework/benchmarks/nunit.framework.benchmarks/StreamsComparerBenchmark.cs b/src/NUnitFramework/benchmarks/nunit.framework.benchmarks/StreamsComparerBenchmark.cs index fbb0044853..6e6b5ebc32 100644 --- a/src/NUnitFramework/benchmarks/nunit.framework.benchmarks/StreamsComparerBenchmark.cs +++ b/src/NUnitFramework/benchmarks/nunit.framework.benchmarks/StreamsComparerBenchmark.cs @@ -153,7 +153,7 @@ public static EqualMethodResult Equal_Enhanced(Stream xStream, Stream yStream, o if (MemoryExtensions.SequenceEqual(bufferExpected, bufferActual)) { - readByte += BUFFER_SIZE; + readByte += readActual; continue; } diff --git a/src/NUnitFramework/framework/Constraints/Comparers/StreamsComparer.cs b/src/NUnitFramework/framework/Constraints/Comparers/StreamsComparer.cs index ae3bb5a790..8d32ab55dc 100644 --- a/src/NUnitFramework/framework/Constraints/Comparers/StreamsComparer.cs +++ b/src/NUnitFramework/framework/Constraints/Comparers/StreamsComparer.cs @@ -70,7 +70,7 @@ public static EqualMethodResult Equal(object x, object y, ref Tolerance toleranc if (MemoryExtensions.SequenceEqual(bufferExpected, bufferActual)) { - readByte += BUFFER_SIZE; + readByte += readActual; continue; } @@ -88,7 +88,6 @@ public static EqualMethodResult Equal(object x, object y, ref Tolerance toleranc return EqualMethodResult.ComparedNotEqual; } } - readByte += BUFFER_SIZE; } } finally diff --git a/src/NUnitFramework/tests/Constraints/EqualConstraintTests.cs b/src/NUnitFramework/tests/Constraints/EqualConstraintTests.cs index 28fb89abea..7f63bc8afb 100644 --- a/src/NUnitFramework/tests/Constraints/EqualConstraintTests.cs +++ b/src/NUnitFramework/tests/Constraints/EqualConstraintTests.cs @@ -243,6 +243,20 @@ public void UnSeekableLargeActualStreamUnequal() Assert.That(entryStream, Is.Not.EqualTo(expectedStream)); } + [Test] + public void ShortReadingMemoryStream_AssertErrorMessageFailurePointIsCorrect() + { + var unequalStream = HelloString.Remove(HelloString.Length - 1, 1) + "."; + + using var expectedStream = new ShortReadingMemoryStream(Encoding.UTF8.GetBytes(HelloString)); + + using var entryStream = new ShortReadingMemoryStream(Encoding.UTF8.GetBytes(unequalStream)); + + var ex = Assert.Throws(() => Assert.That(entryStream, Is.EqualTo(expectedStream))); + + Assert.That(ex?.Message, Does.Contain("Stream lengths are both 9. Streams differ at offset 8.")); + } + [Test] public void SeekableEmptyStreamEqual() { @@ -269,6 +283,18 @@ private static ZipArchive CreateZipArchive(string content) return new ZipArchive(archiveContents, ZipArchiveMode.Read, leaveOpen: false); } + + private class ShortReadingMemoryStream : MemoryStream + { + public ShortReadingMemoryStream(byte[] bytes) : base(bytes) + { + } + + public override int Read(byte[] buffer, int offset, int count) + { + return base.Read(buffer, offset, 2); + } + } } #endregion