From cb1f7e2dc7840f3016914e5702c575dfb2a8a133 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Thu, 10 Oct 2019 13:48:36 +0200 Subject: [PATCH] Fix platform dependency in buffered reader test Tests for the line-buffered reader added in 7b1ff38 were subtly dependent on the execution environment due to differing end-of-line markers on Windows and Unix-based systems. Because StreamReader discards all newlines when reading line-by-line, LineBufferedReader used a StringBuilder to patch the peeked lines back together with the remaining contents of the file being read. As StringBuilder.AppendLine uses the environment-specific newline delimiter, the delimiters after the peeked-but-unconsumed lines can therefore be substituted by the platform-specific variants, causing the test failures due to the overly-simplified way they were written. Reformulate the test to avoid such issues from resurfacing again by splitting lines by \r or \n and then testing each line individually. Additionally remove all raw literals in favour of explicitly mixing various line delimiter character sequences for additional coverage. --- .../Beatmaps/IO/LineBufferedReaderTest.cs | 34 +++++++------------ 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/osu.Game.Tests/Beatmaps/IO/LineBufferedReaderTest.cs b/osu.Game.Tests/Beatmaps/IO/LineBufferedReaderTest.cs index b582ca0a6f..25517ad615 100644 --- a/osu.Game.Tests/Beatmaps/IO/LineBufferedReaderTest.cs +++ b/osu.Game.Tests/Beatmaps/IO/LineBufferedReaderTest.cs @@ -1,6 +1,7 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +using System; using System.IO; using System.Text; using NUnit.Framework; @@ -14,9 +15,7 @@ namespace osu.Game.Tests.Beatmaps.IO [Test] public void TestReadLineByLine() { - const string contents = @"line 1 -line 2 -line 3"; + const string contents = "line 1\rline 2\nline 3"; using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(contents))) using (var bufferedReader = new LineBufferedReader(stream)) @@ -31,9 +30,7 @@ line 3"; [Test] public void TestPeekLineOnce() { - const string contents = @"line 1 -peek this -line 3"; + const string contents = "line 1\r\npeek this\nline 3"; using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(contents))) using (var bufferedReader = new LineBufferedReader(stream)) @@ -49,9 +46,7 @@ line 3"; [Test] public void TestPeekLineMultipleTimes() { - const string contents = @"peek this once -line 2 -peek this a lot"; + const string contents = "peek this once\nline 2\rpeek this a lot"; using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(contents))) using (var bufferedReader = new LineBufferedReader(stream)) @@ -70,8 +65,7 @@ peek this a lot"; [Test] public void TestPeekLineAtEndOfStream() { - const string contents = @"first line -second line"; + const string contents = "first line\r\nsecond line"; using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(contents))) using (var bufferedReader = new LineBufferedReader(stream)) @@ -100,8 +94,7 @@ second line"; [Test] public void TestReadToEndNoPeeks() { - const string contents = @"first line -second line"; + const string contents = "first line\r\nsecond line"; using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(contents))) using (var bufferedReader = new LineBufferedReader(stream)) @@ -113,20 +106,19 @@ second line"; [Test] public void TestReadToEndAfterReadsAndPeeks() { - const string contents = @"this line is gone -this one shouldn't be -these ones -definitely not"; + const string contents = "this line is gone\rthis one shouldn't be\r\nthese ones\ndefinitely not"; using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(contents))) using (var bufferedReader = new LineBufferedReader(stream)) { Assert.AreEqual("this line is gone", bufferedReader.ReadLine()); Assert.AreEqual("this one shouldn't be", bufferedReader.PeekLine()); - const string ending = @"this one shouldn't be -these ones -definitely not"; - Assert.AreEqual(ending, bufferedReader.ReadToEnd()); + + var endingLines = bufferedReader.ReadToEnd().Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); + Assert.AreEqual(3, endingLines.Length); + Assert.AreEqual("this one shouldn't be", endingLines[0]); + Assert.AreEqual("these ones", endingLines[1]); + Assert.AreEqual("definitely not", endingLines[2]); } } }