Index: third_party/protobuf/src/google/protobuf/message_unittest.cc |
=================================================================== |
--- third_party/protobuf/src/google/protobuf/message_unittest.cc (revision 216642) |
+++ third_party/protobuf/src/google/protobuf/message_unittest.cc (working copy) |
@@ -257,6 +257,78 @@ |
EXPECT_FALSE(message.ParseFromArray("\014", 1)); |
} |
+namespace { |
+ |
+void ExpectMessageMerged(const unittest::TestAllTypes& message) { |
+ EXPECT_EQ(3, message.optional_int32()); |
+ EXPECT_EQ(2, message.optional_int64()); |
+ EXPECT_EQ("hello", message.optional_string()); |
+} |
+ |
+void AssignParsingMergeMessages( |
+ unittest::TestAllTypes* msg1, |
+ unittest::TestAllTypes* msg2, |
+ unittest::TestAllTypes* msg3) { |
+ msg1->set_optional_int32(1); |
+ msg2->set_optional_int64(2); |
+ msg3->set_optional_int32(3); |
+ msg3->set_optional_string("hello"); |
+} |
+ |
+} // namespace |
+ |
+// Test that if an optional or required message/group field appears multiple |
+// times in the input, they need to be merged. |
+TEST(MessageTest, ParsingMerge) { |
+ unittest::TestParsingMerge::RepeatedFieldsGenerator generator; |
+ unittest::TestAllTypes* msg1; |
+ unittest::TestAllTypes* msg2; |
+ unittest::TestAllTypes* msg3; |
+ |
+#define ASSIGN_REPEATED_FIELD(FIELD) \ |
+ msg1 = generator.add_##FIELD(); \ |
+ msg2 = generator.add_##FIELD(); \ |
+ msg3 = generator.add_##FIELD(); \ |
+ AssignParsingMergeMessages(msg1, msg2, msg3) |
+ |
+ ASSIGN_REPEATED_FIELD(field1); |
+ ASSIGN_REPEATED_FIELD(field2); |
+ ASSIGN_REPEATED_FIELD(field3); |
+ ASSIGN_REPEATED_FIELD(ext1); |
+ ASSIGN_REPEATED_FIELD(ext2); |
+ |
+#undef ASSIGN_REPEATED_FIELD |
+#define ASSIGN_REPEATED_GROUP(FIELD) \ |
+ msg1 = generator.add_##FIELD()->mutable_field1(); \ |
+ msg2 = generator.add_##FIELD()->mutable_field1(); \ |
+ msg3 = generator.add_##FIELD()->mutable_field1(); \ |
+ AssignParsingMergeMessages(msg1, msg2, msg3) |
+ |
+ ASSIGN_REPEATED_GROUP(group1); |
+ ASSIGN_REPEATED_GROUP(group2); |
+ |
+#undef ASSIGN_REPEATED_GROUP |
+ |
+ string buffer; |
+ generator.SerializeToString(&buffer); |
+ unittest::TestParsingMerge parsing_merge; |
+ parsing_merge.ParseFromString(buffer); |
+ |
+ // Required and optional fields should be merged. |
+ ExpectMessageMerged(parsing_merge.required_all_types()); |
+ ExpectMessageMerged(parsing_merge.optional_all_types()); |
+ ExpectMessageMerged( |
+ parsing_merge.optionalgroup().optional_group_all_types()); |
+ ExpectMessageMerged( |
+ parsing_merge.GetExtension(unittest::TestParsingMerge::optional_ext)); |
+ |
+ // Repeated fields should not be merged. |
+ EXPECT_EQ(3, parsing_merge.repeated_all_types_size()); |
+ EXPECT_EQ(3, parsing_merge.repeatedgroup_size()); |
+ EXPECT_EQ(3, parsing_merge.ExtensionSize( |
+ unittest::TestParsingMerge::repeated_ext)); |
+} |
+ |
TEST(MessageFactoryTest, GeneratedFactoryLookup) { |
EXPECT_EQ( |
MessageFactory::generated_factory()->GetPrototype( |
@@ -277,5 +349,6 @@ |
MessageFactory::generated_factory()->GetPrototype(descriptor) == NULL); |
} |
+ |
} // namespace protobuf |
} // namespace google |