|
@@ -98,7 +98,48 @@ namespace Google.Protobuf.Reflection
|
|
|
}
|
|
|
|
|
|
[Test]
|
|
|
- public void HasValue_Proto3()
|
|
|
+ public void HasValue_Proto3_Message()
|
|
|
+ {
|
|
|
+ var message = new TestAllTypes();
|
|
|
+ var accessor = ((IMessage) message).Descriptor.Fields[TestProtos.TestAllTypes.SingleForeignMessageFieldNumber].Accessor;
|
|
|
+ Assert.False(accessor.HasValue(message));
|
|
|
+ message.SingleForeignMessage = new ForeignMessage();
|
|
|
+ Assert.True(accessor.HasValue(message));
|
|
|
+ message.SingleForeignMessage = null;
|
|
|
+ Assert.False(accessor.HasValue(message));
|
|
|
+ }
|
|
|
+
|
|
|
+ [Test]
|
|
|
+ public void HasValue_Proto3_Oneof()
|
|
|
+ {
|
|
|
+ TestAllTypes message = new TestAllTypes();
|
|
|
+ var accessor = ((IMessage) message).Descriptor.Fields[TestProtos.TestAllTypes.OneofStringFieldNumber].Accessor;
|
|
|
+ Assert.False(accessor.HasValue(message));
|
|
|
+ // Even though it's the default value, we still have a value.
|
|
|
+ message.OneofString = "";
|
|
|
+ Assert.True(accessor.HasValue(message));
|
|
|
+ message.OneofString = "hello";
|
|
|
+ Assert.True(accessor.HasValue(message));
|
|
|
+ message.OneofUint32 = 10;
|
|
|
+ Assert.False(accessor.HasValue(message));
|
|
|
+ }
|
|
|
+
|
|
|
+ [Test]
|
|
|
+ public void HasValue_Proto3_Primitive_Optional()
|
|
|
+ {
|
|
|
+ var message = new TestProto3Optional();
|
|
|
+ var accessor = ((IMessage) message).Descriptor.Fields[TestProto3Optional.OptionalInt64FieldNumber].Accessor;
|
|
|
+ Assert.IsFalse(accessor.HasValue(message));
|
|
|
+ message.OptionalInt64 = 5L;
|
|
|
+ Assert.IsTrue(accessor.HasValue(message));
|
|
|
+ message.ClearOptionalInt64();
|
|
|
+ Assert.IsFalse(accessor.HasValue(message));
|
|
|
+ message.OptionalInt64 = 0L;
|
|
|
+ Assert.IsTrue(accessor.HasValue(message));
|
|
|
+ }
|
|
|
+
|
|
|
+ [Test]
|
|
|
+ public void HasValue_Proto3_Primitive_NotOptional()
|
|
|
{
|
|
|
IMessage message = SampleMessages.CreateFullTestAllTypes();
|
|
|
var fields = message.Descriptor.Fields;
|
|
@@ -106,36 +147,63 @@ namespace Google.Protobuf.Reflection
|
|
|
}
|
|
|
|
|
|
[Test]
|
|
|
- public void HasValue_Proto3Optional()
|
|
|
+ public void HasValue_Proto3_Repeated()
|
|
|
{
|
|
|
- IMessage message = new TestProto3Optional
|
|
|
- {
|
|
|
- OptionalInt32 = 0,
|
|
|
- LazyNestedMessage = new TestProto3Optional.Types.NestedMessage()
|
|
|
- };
|
|
|
- var fields = message.Descriptor.Fields;
|
|
|
- Assert.IsFalse(fields[TestProto3Optional.OptionalInt64FieldNumber].Accessor.HasValue(message));
|
|
|
- Assert.IsFalse(fields[TestProto3Optional.OptionalNestedMessageFieldNumber].Accessor.HasValue(message));
|
|
|
- Assert.IsTrue(fields[TestProto3Optional.LazyNestedMessageFieldNumber].Accessor.HasValue(message));
|
|
|
- Assert.IsTrue(fields[TestProto3Optional.OptionalInt32FieldNumber].Accessor.HasValue(message));
|
|
|
+ var message = new TestAllTypes();
|
|
|
+ var accessor = ((IMessage) message).Descriptor.Fields[TestProtos.TestAllTypes.RepeatedBoolFieldNumber].Accessor;
|
|
|
+ Assert.Throws<InvalidOperationException>(() => accessor.HasValue(message));
|
|
|
}
|
|
|
|
|
|
[Test]
|
|
|
- public void HasValue()
|
|
|
+ public void HasValue_Proto2_Primitive()
|
|
|
{
|
|
|
- IMessage message = new Proto2.TestAllTypes();
|
|
|
- var fields = message.Descriptor.Fields;
|
|
|
- var accessor = fields[Proto2.TestAllTypes.OptionalBoolFieldNumber].Accessor;
|
|
|
+ var message = new Proto2.TestAllTypes();
|
|
|
+ var accessor = ((IMessage) message).Descriptor.Fields[Proto2.TestAllTypes.OptionalInt64FieldNumber].Accessor;
|
|
|
+
|
|
|
+ Assert.IsFalse(accessor.HasValue(message));
|
|
|
+ message.OptionalInt64 = 5L;
|
|
|
+ Assert.IsTrue(accessor.HasValue(message));
|
|
|
+ message.ClearOptionalInt64();
|
|
|
+ Assert.IsFalse(accessor.HasValue(message));
|
|
|
+ message.OptionalInt64 = 0L;
|
|
|
+ Assert.IsTrue(accessor.HasValue(message));
|
|
|
+ }
|
|
|
|
|
|
- Assert.False(accessor.HasValue(message));
|
|
|
+ [Test]
|
|
|
+ public void HasValue_Proto2_Message()
|
|
|
+ {
|
|
|
+ var message = new Proto2.TestAllTypes();
|
|
|
+ var field = ((IMessage) message).Descriptor.Fields[Proto2.TestAllTypes.OptionalForeignMessageFieldNumber];
|
|
|
+ Assert.False(field.Accessor.HasValue(message));
|
|
|
+ message.OptionalForeignMessage = new Proto2.ForeignMessage();
|
|
|
+ Assert.True(field.Accessor.HasValue(message));
|
|
|
+ message.OptionalForeignMessage = null;
|
|
|
+ Assert.False(field.Accessor.HasValue(message));
|
|
|
+ }
|
|
|
|
|
|
- accessor.SetValue(message, true);
|
|
|
+ [Test]
|
|
|
+ public void HasValue_Proto2_Oneof()
|
|
|
+ {
|
|
|
+ var message = new Proto2.TestAllTypes();
|
|
|
+ var accessor = ((IMessage) message).Descriptor.Fields[Proto2.TestAllTypes.OneofStringFieldNumber].Accessor;
|
|
|
+ Assert.False(accessor.HasValue(message));
|
|
|
+ // Even though it's the default value, we still have a value.
|
|
|
+ message.OneofString = "";
|
|
|
Assert.True(accessor.HasValue(message));
|
|
|
-
|
|
|
- accessor.Clear(message);
|
|
|
+ message.OneofString = "hello";
|
|
|
+ Assert.True(accessor.HasValue(message));
|
|
|
+ message.OneofUint32 = 10;
|
|
|
Assert.False(accessor.HasValue(message));
|
|
|
}
|
|
|
|
|
|
+ [Test]
|
|
|
+ public void HasValue_Proto2_Repeated()
|
|
|
+ {
|
|
|
+ var message = new Proto2.TestAllTypes();
|
|
|
+ var accessor = ((IMessage) message).Descriptor.Fields[Proto2.TestAllTypes.RepeatedBoolFieldNumber].Accessor;
|
|
|
+ Assert.Throws<InvalidOperationException>(() => accessor.HasValue(message));
|
|
|
+ }
|
|
|
+
|
|
|
[Test]
|
|
|
public void SetValue_SingleFields()
|
|
|
{
|
|
@@ -262,6 +330,42 @@ namespace Google.Protobuf.Reflection
|
|
|
Assert.Null(message.OptionalNestedMessage);
|
|
|
}
|
|
|
|
|
|
+ [Test]
|
|
|
+ public void Clear_Proto3_Oneof()
|
|
|
+ {
|
|
|
+ var message = new TestAllTypes();
|
|
|
+ var accessor = ((IMessage) message).Descriptor.Fields[TestProtos.TestAllTypes.OneofUint32FieldNumber].Accessor;
|
|
|
+
|
|
|
+ // The field accessor Clear method only affects a oneof if the current case is the one being cleared.
|
|
|
+ message.OneofString = "hello";
|
|
|
+ Assert.AreEqual(TestProtos.TestAllTypes.OneofFieldOneofCase.OneofString, message.OneofFieldCase);
|
|
|
+ accessor.Clear(message);
|
|
|
+ Assert.AreEqual(TestProtos.TestAllTypes.OneofFieldOneofCase.OneofString, message.OneofFieldCase);
|
|
|
+
|
|
|
+ message.OneofUint32 = 100;
|
|
|
+ Assert.AreEqual(TestProtos.TestAllTypes.OneofFieldOneofCase.OneofUint32, message.OneofFieldCase);
|
|
|
+ accessor.Clear(message);
|
|
|
+ Assert.AreEqual(TestProtos.TestAllTypes.OneofFieldOneofCase.None, message.OneofFieldCase);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Test]
|
|
|
+ public void Clear_Proto2_Oneof()
|
|
|
+ {
|
|
|
+ var message = new Proto2.TestAllTypes();
|
|
|
+ var accessor = ((IMessage) message).Descriptor.Fields[Proto2.TestAllTypes.OneofUint32FieldNumber].Accessor;
|
|
|
+
|
|
|
+ // The field accessor Clear method only affects a oneof if the current case is the one being cleared.
|
|
|
+ message.OneofString = "hello";
|
|
|
+ Assert.AreEqual(Proto2.TestAllTypes.OneofFieldOneofCase.OneofString, message.OneofFieldCase);
|
|
|
+ accessor.Clear(message);
|
|
|
+ Assert.AreEqual(Proto2.TestAllTypes.OneofFieldOneofCase.OneofString, message.OneofFieldCase);
|
|
|
+
|
|
|
+ message.OneofUint32 = 100;
|
|
|
+ Assert.AreEqual(Proto2.TestAllTypes.OneofFieldOneofCase.OneofUint32, message.OneofFieldCase);
|
|
|
+ accessor.Clear(message);
|
|
|
+ Assert.AreEqual(Proto2.TestAllTypes.OneofFieldOneofCase.None, message.OneofFieldCase);
|
|
|
+ }
|
|
|
+
|
|
|
[Test]
|
|
|
public void FieldDescriptor_ByName()
|
|
|
{
|
|
@@ -301,5 +405,32 @@ namespace Google.Protobuf.Reflection
|
|
|
message.ClearExtension(RepeatedBoolExtension);
|
|
|
Assert.IsNull(message.GetExtension(RepeatedBoolExtension));
|
|
|
}
|
|
|
+
|
|
|
+ [Test]
|
|
|
+ public void HasPresence()
|
|
|
+ {
|
|
|
+ // Proto3
|
|
|
+ var fields = TestProtos.TestAllTypes.Descriptor.Fields;
|
|
|
+ Assert.IsFalse(fields[TestProtos.TestAllTypes.SingleBoolFieldNumber].HasPresence);
|
|
|
+ Assert.IsTrue(fields[TestProtos.TestAllTypes.OneofBytesFieldNumber].HasPresence);
|
|
|
+ Assert.IsTrue(fields[TestProtos.TestAllTypes.SingleForeignMessageFieldNumber].HasPresence);
|
|
|
+ Assert.IsFalse(fields[TestProtos.TestAllTypes.RepeatedBoolFieldNumber].HasPresence);
|
|
|
+
|
|
|
+ fields = TestMap.Descriptor.Fields;
|
|
|
+ Assert.IsFalse(fields[TestMap.MapBoolBoolFieldNumber].HasPresence);
|
|
|
+
|
|
|
+ fields = TestProto3Optional.Descriptor.Fields;
|
|
|
+ Assert.IsTrue(fields[TestProto3Optional.OptionalBoolFieldNumber].HasPresence);
|
|
|
+
|
|
|
+ // Proto2
|
|
|
+ fields = Proto2.TestAllTypes.Descriptor.Fields;
|
|
|
+ Assert.IsTrue(fields[Proto2.TestAllTypes.OptionalBoolFieldNumber].HasPresence);
|
|
|
+ Assert.IsTrue(fields[Proto2.TestAllTypes.OneofBytesFieldNumber].HasPresence);
|
|
|
+ Assert.IsTrue(fields[Proto2.TestAllTypes.OptionalForeignMessageFieldNumber].HasPresence);
|
|
|
+ Assert.IsFalse(fields[Proto2.TestAllTypes.RepeatedBoolFieldNumber].HasPresence);
|
|
|
+
|
|
|
+ fields = Proto2.TestRequired.Descriptor.Fields;
|
|
|
+ Assert.IsTrue(fields[Proto2.TestRequired.AFieldNumber].HasPresence);
|
|
|
+ }
|
|
|
}
|
|
|
}
|