diff --git a/src/MessagePack/MessagePackReader.cs b/src/MessagePack/MessagePackReader.cs index 9d49bf7c6..faa63cf5c 100644 --- a/src/MessagePack/MessagePackReader.cs +++ b/src/MessagePack/MessagePackReader.cs @@ -805,6 +805,7 @@ private string ReadStringSlow(int byteLength) } } #endif + this.reader.Advance(bytesRead); } string value = new string(charArray, 0, initializedChars); diff --git a/tests/MessagePack.Tests/MessagePackReaderTests.ReadString.cs b/tests/MessagePack.Tests/MessagePackReaderTests.ReadString.cs new file mode 100644 index 000000000..a4174bbf7 --- /dev/null +++ b/tests/MessagePack.Tests/MessagePackReaderTests.ReadString.cs @@ -0,0 +1,59 @@ +using System; +using System.Buffers; +using Xunit; + +namespace MessagePack.Tests +{ + partial class MessagePackReaderTests + { + [Fact] + public void ReadString_HandlesSingleSegment() + { + var seq = BuildSequence(new[] { + (byte)(MessagePackCode.MinFixStr + 2), + (byte)'A', (byte)'B' }); + + var reader = new MessagePackReader(seq); + var result = reader.ReadString(); + Assert.Equal("AB", result); + } + + [Fact] + public void ReadString_HandlesMultipleSegments() + { + var seq = BuildSequence( + new[] { (byte)(MessagePackCode.MinFixStr + 2), (byte)'A' }, + new[] { (byte)'B' }); + + var reader = new MessagePackReader(seq); + var result = reader.ReadString(); + Assert.Equal("AB", result); + } + + ReadOnlySequence BuildSequence(params T[][] segmentContents) + { + var segments = new TestSequenceSegment[segmentContents.Length]; + TestSequenceSegment last = null; + for (var i = 0; i < segmentContents.Length; i++) + { + last = segments[i] = new TestSequenceSegment(segmentContents[i], last); + } + + return new ReadOnlySequence(segments[0], 0, last, last.Memory.Length); + } + + class TestSequenceSegment : ReadOnlySequenceSegment + { + public TestSequenceSegment(T[] data, TestSequenceSegment prev = null) + { + Memory = new Memory(data); + + if (prev != null) + { + prev.Next = this; + RunningIndex = prev.RunningIndex + prev.Memory.Length; + } + } + } + } +}