Index: third_party/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc |
=================================================================== |
--- third_party/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc (revision 216642) |
+++ third_party/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc (working copy) |
@@ -225,11 +225,59 @@ |
unittest::TestAllExtensions::descriptor()); |
TestUtil::SetAllExtensions(&message); |
+ |
reflection_tester.RemoveLastRepeatedsViaReflection(&message); |
TestUtil::ExpectLastRepeatedExtensionsRemoved(message); |
} |
+TEST(GeneratedMessageReflectionTest, ReleaseLast) { |
+ unittest::TestAllTypes message; |
+ const Descriptor* descriptor = message.GetDescriptor(); |
+ TestUtil::ReflectionTester reflection_tester(descriptor); |
+ |
+ TestUtil::SetAllFields(&message); |
+ |
+ reflection_tester.ReleaseLastRepeatedsViaReflection(&message, false); |
+ |
+ TestUtil::ExpectLastRepeatedsReleased(message); |
+ |
+ // Now test that we actually release the right message. |
+ message.Clear(); |
+ TestUtil::SetAllFields(&message); |
+ ASSERT_EQ(2, message.repeated_foreign_message_size()); |
+ const protobuf_unittest::ForeignMessage* expected = |
+ message.mutable_repeated_foreign_message(1); |
+ scoped_ptr<Message> released(message.GetReflection()->ReleaseLast( |
+ &message, descriptor->FindFieldByName("repeated_foreign_message"))); |
+ EXPECT_EQ(expected, released.get()); |
+} |
+ |
+TEST(GeneratedMessageReflectionTest, ReleaseLastExtensions) { |
+ unittest::TestAllExtensions message; |
+ const Descriptor* descriptor = message.GetDescriptor(); |
+ TestUtil::ReflectionTester reflection_tester(descriptor); |
+ |
+ TestUtil::SetAllExtensions(&message); |
+ |
+ reflection_tester.ReleaseLastRepeatedsViaReflection(&message, true); |
+ |
+ TestUtil::ExpectLastRepeatedExtensionsReleased(message); |
+ |
+ // Now test that we actually release the right message. |
+ message.Clear(); |
+ TestUtil::SetAllExtensions(&message); |
+ ASSERT_EQ(2, message.ExtensionSize( |
+ unittest::repeated_foreign_message_extension)); |
+ const protobuf_unittest::ForeignMessage* expected = message.MutableExtension( |
+ unittest::repeated_foreign_message_extension, 1); |
+ scoped_ptr<Message> released(message.GetReflection()->ReleaseLast( |
+ &message, descriptor->file()->FindExtensionByName( |
+ "repeated_foreign_message_extension"))); |
+ EXPECT_EQ(expected, released.get()); |
+ |
+} |
+ |
TEST(GeneratedMessageReflectionTest, SwapRepeatedElements) { |
unittest::TestAllTypes message; |
TestUtil::ReflectionTester reflection_tester( |
@@ -327,6 +375,58 @@ |
FindKnownExtensionByName(extension1->full_name()) == NULL); |
} |
+TEST(GeneratedMessageReflectionTest, ReleaseMessageTest) { |
+ unittest::TestAllTypes message; |
+ TestUtil::ReflectionTester reflection_tester( |
+ unittest::TestAllTypes::descriptor()); |
+ |
+ // When nothing is set, we expect all released messages to be NULL. |
+ reflection_tester.ExpectMessagesReleasedViaReflection( |
+ &message, TestUtil::ReflectionTester::IS_NULL); |
+ |
+ // After fields are set we should get non-NULL releases. |
+ reflection_tester.SetAllFieldsViaReflection(&message); |
+ reflection_tester.ExpectMessagesReleasedViaReflection( |
+ &message, TestUtil::ReflectionTester::NOT_NULL); |
+ |
+ // After Clear() we may or may not get a message from ReleaseMessage(). |
+ // This is implementation specific. |
+ reflection_tester.SetAllFieldsViaReflection(&message); |
+ message.Clear(); |
+ reflection_tester.ExpectMessagesReleasedViaReflection( |
+ &message, TestUtil::ReflectionTester::CAN_BE_NULL); |
+ |
+ // Test a different code path for setting after releasing. |
+ TestUtil::SetAllFields(&message); |
+ TestUtil::ExpectAllFieldsSet(message); |
+} |
+ |
+TEST(GeneratedMessageReflectionTest, ReleaseExtensionMessageTest) { |
+ unittest::TestAllExtensions message; |
+ TestUtil::ReflectionTester reflection_tester( |
+ unittest::TestAllExtensions::descriptor()); |
+ |
+ // When nothing is set, we expect all released messages to be NULL. |
+ reflection_tester.ExpectMessagesReleasedViaReflection( |
+ &message, TestUtil::ReflectionTester::IS_NULL); |
+ |
+ // After fields are set we should get non-NULL releases. |
+ reflection_tester.SetAllFieldsViaReflection(&message); |
+ reflection_tester.ExpectMessagesReleasedViaReflection( |
+ &message, TestUtil::ReflectionTester::NOT_NULL); |
+ |
+ // After Clear() we may or may not get a message from ReleaseMessage(). |
+ // This is implementation specific. |
+ reflection_tester.SetAllFieldsViaReflection(&message); |
+ message.Clear(); |
+ reflection_tester.ExpectMessagesReleasedViaReflection( |
+ &message, TestUtil::ReflectionTester::CAN_BE_NULL); |
+ |
+ // Test a different code path for setting after releasing. |
+ TestUtil::SetAllExtensions(&message); |
+ TestUtil::ExpectAllExtensionsSet(message); |
+} |
+ |
#ifdef GTEST_HAS_DEATH_TEST |
TEST(GeneratedMessageReflectionTest, UsageErrors) { |