public void TestFieldPresence() { // Optional non-message fields set to their default value are treated the same // way as not set. // Serialization will ignore such fields. TestAllTypes.Builder builder = TestAllTypes.CreateBuilder(); builder.SetOptionalInt32(0); builder.SetOptionalString(""); builder.SetOptionalBytes(ByteString.Empty); builder.SetOptionalNestedEnum(TestAllTypes.Types.NestedEnum.FOO); TestAllTypes message = builder.Build(); Assert.AreEqual(0, message.SerializedSize); // Test merge TestAllTypes.Builder a = TestAllTypes.CreateBuilder(); a.SetOptionalInt32(1); a.SetOptionalString("x"); a.SetOptionalBytes(ByteString.CopyFromUtf8("y")); a.SetOptionalNestedEnum(TestAllTypes.Types.NestedEnum.BAR); a.MergeFrom(message); TestAllTypes messageA = a.Build(); Assert.AreEqual(1, messageA.OptionalInt32); Assert.AreEqual("x", messageA.OptionalString); Assert.AreEqual(ByteString.CopyFromUtf8("y"), messageA.OptionalBytes); Assert.AreEqual(TestAllTypes.Types.NestedEnum.BAR, messageA.OptionalNestedEnum); // equals/hashCode should produce the same results TestAllTypes empty = TestAllTypes.CreateBuilder().Build(); Assert.IsTrue(empty.Equals(message)); Assert.IsTrue(message.Equals(empty)); Assert.AreEqual(empty.GetHashCode(), message.GetHashCode()); }