diff --git a/src/libraries/System.IO/tests/StreamReader/StreamReaderTests.cs b/src/libraries/System.IO/tests/StreamReader/StreamReaderTests.cs index 0180c9364b8c79..b4a32a21ca4c2e 100644 --- a/src/libraries/System.IO/tests/StreamReader/StreamReaderTests.cs +++ b/src/libraries/System.IO/tests/StreamReader/StreamReaderTests.cs @@ -174,6 +174,46 @@ public void TestPeek() } } + [Fact] + public void TestPeekReadOneByteAtATime() + { + byte[] testData = new byte[] { 72, 69, 76, 76, 79 }; + using var ms = new MemoryStream(testData); + + // DelegateStream to read one at a time. + using var stream = new DelegateStream( + positionGetFunc: () => ms.Position, + lengthFunc: () => ms.Length, + canReadFunc: () => true, + readFunc: (buffer, offset, count) => + { + if (count == 0 || ms.Position == ms.Length) + { + return 0; + } + + ms.ReadExactly(buffer, offset, 1); + return 1; + }); + + using var sr = new StreamReader(stream); + + for (int i = 0; i < testData.Length; i++) + { + Assert.Equal(i, stream.Position); + + int tmp = sr.Peek(); + Assert.Equal(testData[i], tmp); + + tmp = sr.Read(); + Assert.Equal(testData[i], tmp); + } + + Assert.Equal(stream.Position, stream.Length); + Assert.Equal(-1, sr.Peek()); + Assert.Equal(-1, sr.Read()); + } + [Fact] public void ArgumentNullOnNullArray() { diff --git a/src/libraries/System.Private.CoreLib/src/System/IO/StreamReader.cs b/src/libraries/System.Private.CoreLib/src/System/IO/StreamReader.cs index a7e5befbb4c25d..9884c4f880bc0a 100644 --- a/src/libraries/System.Private.CoreLib/src/System/IO/StreamReader.cs +++ b/src/libraries/System.Private.CoreLib/src/System/IO/StreamReader.cs @@ -320,7 +320,7 @@ public override int Peek() if (_charPos == _charLen) { - if (_isBlocked || ReadBuffer() == 0) + if (ReadBuffer() == 0) { return -1; }