Code Review Feedback
* Move additional `ReadOnlySpan<byte>` `ParseContext` overloads next to
the existing overload
* Pass `ReadOnlySpan<byte>` parameters by `ref`
* Update `MessageParsingHelpers` to add checks for parsing from
`ReadOnlySpan<byte>`, remove tests from `CodedInputStreamTest`
diff --git a/csharp/src/Google.Protobuf.Test/MessageParsingHelpers.cs b/csharp/src/Google.Protobuf.Test/MessageParsingHelpers.cs
index 65d2fe0..0e33cc0 100644
--- a/csharp/src/Google.Protobuf.Test/MessageParsingHelpers.cs
+++ b/csharp/src/Google.Protobuf.Test/MessageParsingHelpers.cs
@@ -41,32 +41,40 @@
{
public static void AssertReadingMessage<T>(MessageParser<T> parser, byte[] bytes, Action<T> assert) where T : IMessage<T>
{
- var parsedStream = parser.ParseFrom(bytes);
+ var parsedBuffer = parser.ParseFrom(bytes);
+ assert(parsedBuffer);
// Load content as single segment
- var parsedBuffer = parser.ParseFrom(new ReadOnlySequence<byte>(bytes));
+ parsedBuffer = parser.ParseFrom(new ReadOnlySequence<byte>(bytes));
assert(parsedBuffer);
// Load content as multiple segments
parsedBuffer = parser.ParseFrom(ReadOnlySequenceFactory.CreateWithContent(bytes));
assert(parsedBuffer);
- assert(parsedStream);
+ // Load content as ReadOnlySpan
+ ReadOnlySpan<byte> bytesSpan = bytes.AsSpan();
+ parsedBuffer = parser.ParseFrom(ref bytesSpan);
+ assert(parsedBuffer);
}
public static void AssertReadingMessage(MessageParser parser, byte[] bytes, Action<IMessage> assert)
{
- var parsedStream = parser.ParseFrom(bytes);
+ var parsedBuffer = parser.ParseFrom(bytes);
+ assert(parsedBuffer);
// Load content as single segment
- var parsedBuffer = parser.ParseFrom(new ReadOnlySequence<byte>(bytes));
+ parsedBuffer = parser.ParseFrom(new ReadOnlySequence<byte>(bytes));
assert(parsedBuffer);
// Load content as multiple segments
parsedBuffer = parser.ParseFrom(ReadOnlySequenceFactory.CreateWithContent(bytes));
assert(parsedBuffer);
- assert(parsedStream);
+ // Load content as ReadOnlySpan
+ ReadOnlySpan<byte> bytesSpan = bytes.AsSpan();
+ parsedBuffer = parser.ParseFrom(ref bytesSpan);
+ assert(parsedBuffer);
}
public static void AssertReadingMessageThrows<TMessage, TException>(MessageParser<TMessage> parser, byte[] bytes)
@@ -76,6 +84,12 @@
Assert.Throws<TException>(() => parser.ParseFrom(bytes));
Assert.Throws<TException>(() => parser.ParseFrom(new ReadOnlySequence<byte>(bytes)));
+
+ Assert.Throws<TException>(() =>
+ {
+ ReadOnlySpan<byte> bytesSpan = bytes.AsSpan();
+ parser.ParseFrom(ref bytesSpan);
+ });
}
public static void AssertRoundtrip<T>(MessageParser<T> parser, T message, Action<T> additionalAssert = null) where T : IMessage<T>
@@ -87,8 +101,12 @@
message.WriteTo(bufferWriter);
Assert.AreEqual(bytes, bufferWriter.WrittenSpan.ToArray(), "Both serialization approaches need to result in the same data.");
+ var parsedBuffer = parser.ParseFrom(bytes);
+ Assert.AreEqual(message, parsedBuffer);
+ additionalAssert?.Invoke(parsedBuffer);
+
// Load content as single segment
- var parsedBuffer = parser.ParseFrom(new ReadOnlySequence<byte>(bytes));
+ parsedBuffer = parser.ParseFrom(new ReadOnlySequence<byte>(bytes));
Assert.AreEqual(message, parsedBuffer);
additionalAssert?.Invoke(parsedBuffer);
@@ -97,10 +115,11 @@
Assert.AreEqual(message, parsedBuffer);
additionalAssert?.Invoke(parsedBuffer);
- var parsedStream = parser.ParseFrom(bytes);
-
- Assert.AreEqual(message, parsedStream);
- additionalAssert?.Invoke(parsedStream);
+ // Load content as ReadOnlySpan
+ ReadOnlySpan<byte> bytesSpan = bytes.AsSpan();
+ parsedBuffer = parser.ParseFrom(ref bytesSpan);
+ Assert.AreEqual(message, parsedBuffer);
+ additionalAssert?.Invoke(parsedBuffer);
}
public static void AssertWritingMessage(IMessage message)