Fix advance for single length delimiter (dotnet/corefx#35597)
authorJeremy Kuhne <jeremy.kuhne@microsoft.com>
Thu, 28 Feb 2019 00:33:56 +0000 (16:33 -0800)
committerGitHub <noreply@github.com>
Thu, 28 Feb 2019 00:33:56 +0000 (16:33 -0800)
* Fix advance for single length delimiter

If the delimiter span for TryReadTo was only one character long we weren't advancing past the delimiter if requested. Add regression test.

* Address feedback

* Scan from beginning as well

Commit migrated from https://github.com/dotnet/corefx/commit/b0bc99d6f7943a8081a84bea23c5542831c9359e

src/libraries/System.Memory/src/System/Buffers/SequenceReader.Search.cs
src/libraries/System.Memory/tests/SequenceReader/ReadTo.cs

index 771b394..45b9f62 100644 (file)
@@ -434,6 +434,10 @@ namespace System.Buffers
 
                 if (delimiter.Length == 1)
                 {
+                    if (advancePastDelimiter)
+                    {
+                        Advance(1);
+                    }
                     return true;
                 }
 
index 2742f28..f76d2a7 100644 (file)
@@ -173,5 +173,30 @@ namespace System.Memory.Tests.SequenceReader
             reader.Advance(4);
             Assert.False(reader.TryReadTo(out ReadOnlySequence<byte> span, 255, 0, advancePastDelimiter));
         }
+
+        [Fact]
+        public void TryReadTo_SingleDelimiter()
+        {
+            ReadOnlySequence<byte> bytes = SequenceFactory.Create(new byte[][] {
+                new byte[] { 1 },
+                new byte[] { 2, 3, 4, 5, 6 }
+            });
+
+            SequenceReader<byte> reader = new SequenceReader<byte>(bytes);
+            Span<byte> delimiter = new byte[] { 1 };
+
+            for (int i = 1; i < 6; i += 1)
+            {
+                // Also check scanning from the start.
+                SequenceReader<byte> resetReader = new SequenceReader<byte>(bytes);
+                delimiter[0] = (byte)i;
+                Assert.True(reader.TryReadTo(out ReadOnlySequence<byte> sequence, delimiter, advancePastDelimiter: true));
+                Assert.True(resetReader.TryReadTo(out sequence, delimiter, advancePastDelimiter: true));
+                Assert.True(reader.TryPeek(out byte value));
+                Assert.Equal(i + 1, value);
+                Assert.True(resetReader.TryPeek(out value));
+                Assert.Equal(i + 1, value);
+            }
+        }
     }
 }