Add more tests around merging wrappers
This was in an attempt to fix the wrapper handling corner case, but it's really fiddly.
This commit is contained in:
parent
e35e24800f
commit
0262e04dbb
@ -319,9 +319,10 @@ namespace Google.Protobuf.WellKnownTypes
|
|||||||
|
|
||||||
// Merging is odd with wrapper types, due to the way that default values aren't emitted in
|
// Merging is odd with wrapper types, due to the way that default values aren't emitted in
|
||||||
// the binary stream. In fact we cheat a little bit - a message with an explicitly present default
|
// the binary stream. In fact we cheat a little bit - a message with an explicitly present default
|
||||||
// value will have that default value ignored.
|
// value will have that default value ignored. See issue 615. Fixing this would require significant upheaval to
|
||||||
|
// the FieldCodec side of things.
|
||||||
[Test]
|
[Test]
|
||||||
public void MergingCornerCase()
|
public void MergingStreamExplicitValue()
|
||||||
{
|
{
|
||||||
var message = new TestWellKnownTypes { Int32Field = 5 };
|
var message = new TestWellKnownTypes { Int32Field = 5 };
|
||||||
|
|
||||||
@ -343,9 +344,47 @@ namespace Google.Protobuf.WellKnownTypes
|
|||||||
|
|
||||||
message.MergeFrom(bytes);
|
message.MergeFrom(bytes);
|
||||||
// A normal implementation would have 0 now, as the explicit default would have been overwritten the 5.
|
// A normal implementation would have 0 now, as the explicit default would have been overwritten the 5.
|
||||||
|
// With the FieldCodec for Nullable<int>, we can't tell the difference between an implicit 0 and an explicit 0.
|
||||||
Assert.AreEqual(5, message.Int32Field);
|
Assert.AreEqual(5, message.Int32Field);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void MergingStreamNoValue()
|
||||||
|
{
|
||||||
|
var message = new TestWellKnownTypes { Int32Field = 5 };
|
||||||
|
|
||||||
|
// Create a byte array which an Int32 field, but with no value.
|
||||||
|
var bytes = new TestWellKnownTypes { Int32Field = 0 }.ToByteArray();
|
||||||
|
Assert.AreEqual(2, bytes.Length); // The tag for Int32Field is a single byte, then a byte indicating a 0-length message.
|
||||||
|
message.MergeFrom(bytes);
|
||||||
|
|
||||||
|
// The "implicit" 0 did *not* overwrite the value.
|
||||||
|
// (This is the correct behaviour.)
|
||||||
|
Assert.AreEqual(5, message.Int32Field);
|
||||||
|
}
|
||||||
|
|
||||||
|
// All permutations of origin/merging value being null, zero (default) or non-default.
|
||||||
|
// As this is the in-memory version, we don't need to worry about the difference between implicit and explicit 0.
|
||||||
|
[Test]
|
||||||
|
[TestCase(null, null, null)]
|
||||||
|
[TestCase(null, 0, 0)]
|
||||||
|
[TestCase(null, 5, 5)]
|
||||||
|
[TestCase(0, null, 0)]
|
||||||
|
[TestCase(0, 0, 0)]
|
||||||
|
[TestCase(0, 5, 5)]
|
||||||
|
[TestCase(5, null, 5)]
|
||||||
|
[TestCase(5, 0, 5)]
|
||||||
|
[TestCase(5, 10, 10)]
|
||||||
|
public void MergingMessageWithZero(int? originValue, int? mergingValue, int? expectedResult)
|
||||||
|
{
|
||||||
|
// This differs from the MergingStreamCornerCase because when we merge message *objects*,
|
||||||
|
// we ignore default values from the "source".
|
||||||
|
var message1 = new TestWellKnownTypes { Int32Field = originValue };
|
||||||
|
var message2 = new TestWellKnownTypes { Int32Field = mergingValue };
|
||||||
|
message1.MergeFrom(message2);
|
||||||
|
Assert.AreEqual(expectedResult, message1.Int32Field);
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void UnknownFieldInWrapper()
|
public void UnknownFieldInWrapper()
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user