35 #include <google/protobuf/reflection_ops.h>
36 #include <google/protobuf/test_util.h>
37 #include <google/protobuf/unittest.pb.h>
38 #include <google/protobuf/descriptor.h>
40 #include <google/protobuf/stubs/logging.h>
41 #include <google/protobuf/stubs/common.h>
42 #include <google/protobuf/testing/googletest.h>
43 #include <gtest/gtest.h>
45 #include <google/protobuf/stubs/strutil.h>
52 TEST(ReflectionOpsTest, SanityCheck) {
60 unittest::TestAllTypes
message, message2;
73 TEST(ReflectionOpsTest, CopyExtensions) {
74 unittest::TestAllExtensions
message, message2;
80 TestUtil::ExpectAllExtensionsSet(message2);
83 TEST(ReflectionOpsTest, CopyOneof) {
84 unittest::TestOneof2
message, message2;
87 TestUtil::ExpectOneofSet1(message2);
90 TestUtil::ExpectOneofSet2(
message);
92 TestUtil::ExpectOneofSet2(message2);
99 unittest::TestAllTypes
message, message2;
104 message2.set_optional_int32(
message.optional_int32());
105 message.clear_optional_int32();
108 message2.set_optional_string(
message.optional_string());
109 message.set_optional_string(
"something else");
112 message2.add_repeated_int32(
message.repeated_int32(1));
114 message.clear_repeated_int32();
122 TEST(ReflectionOpsTest, MergeExtensions) {
126 unittest::TestAllExtensions
message, message2;
131 message2.SetExtension(
132 unittest::optional_int32_extension,
133 message.GetExtension(unittest::optional_int32_extension));
134 message.ClearExtension(unittest::optional_int32_extension);
137 message2.SetExtension(
138 unittest::optional_string_extension,
139 message.GetExtension(unittest::optional_string_extension));
140 message.SetExtension(unittest::optional_string_extension,
"something else");
143 message2.AddExtension(
144 unittest::repeated_int32_extension,
145 message.GetExtension(unittest::repeated_int32_extension, 1));
146 int32 i =
message.GetExtension(unittest::repeated_int32_extension, 0);
147 message.ClearExtension(unittest::repeated_int32_extension);
148 message.AddExtension(unittest::repeated_int32_extension, i);
152 TestUtil::ExpectAllExtensionsSet(
message);
155 TEST(ReflectionOpsTest, MergeUnknown) {
157 unittest::TestEmptyMessage message1, message2;
158 message1.mutable_unknown_fields()->AddVarint(1234, 1);
159 message2.mutable_unknown_fields()->AddVarint(1234, 2);
163 ASSERT_EQ(2, message1.unknown_fields().field_count());
165 message1.unknown_fields().field(0).type());
166 EXPECT_EQ(1, message1.unknown_fields().field(0).varint());
168 message1.unknown_fields().field(1).type());
169 EXPECT_EQ(2, message1.unknown_fields().field(1).varint());
172 TEST(ReflectionOpsTest, MergeOneof) {
173 unittest::TestOneof2 message1, message2;
174 TestUtil::SetOneof1(&message1);
178 TestUtil::ExpectOneofSet1(message2);
182 TestUtil::ExpectOneofSet1(message2);
185 TestUtil::SetOneof2(&message1);
187 TestUtil::ExpectOneofSet2(message2);
190 #ifdef PROTOBUF_HAS_DEATH_TEST
192 TEST(ReflectionOpsTest, MergeFromSelf) {
196 unittest::TestAllTypes
message;
201 #endif // PROTOBUF_HAS_DEATH_TEST
204 unittest::TestAllTypes
message;
210 TestUtil::ExpectClear(
message);
214 EXPECT_NE(&unittest::TestAllTypes::OptionalGroup::default_instance(),
216 EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(),
217 &
message.optional_nested_message());
218 EXPECT_NE(&unittest::ForeignMessage::default_instance(),
219 &
message.optional_foreign_message());
220 EXPECT_NE(&unittest_import::ImportMessage::default_instance(),
221 &
message.optional_import_message());
224 TEST(ReflectionOpsTest, ClearExtensions) {
225 unittest::TestAllExtensions
message;
231 TestUtil::ExpectExtensionsClear(
message);
235 EXPECT_NE(&unittest::OptionalGroup_extension::default_instance(),
236 &
message.GetExtension(unittest::optionalgroup_extension));
237 EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(),
238 &
message.GetExtension(unittest::optional_nested_message_extension));
240 &unittest::ForeignMessage::default_instance(),
241 &
message.GetExtension(unittest::optional_foreign_message_extension));
242 EXPECT_NE(&unittest_import::ImportMessage::default_instance(),
243 &
message.GetExtension(unittest::optional_import_message_extension));
246 TEST(ReflectionOpsTest, ClearUnknown) {
248 unittest::TestEmptyMessage
message;
249 message.mutable_unknown_fields()->AddVarint(1234, 1);
256 TEST(ReflectionOpsTest, ClearOneof) {
259 TestUtil::ExpectOneofClear(
message);
261 TestUtil::ExpectOneofSet1(
message);
263 TestUtil::ExpectOneofClear(
message);
266 TestUtil::ExpectOneofSet1(
message);
268 TestUtil::ExpectOneofSet2(
message);
270 TestUtil::ExpectOneofClear(
message);
274 unittest::TestAllTypes
message;
278 message.mutable_unknown_fields()->AddVarint(123456, 654321);
279 message.mutable_optional_nested_message()
280 ->mutable_unknown_fields()
281 ->AddVarint(123456, 654321);
282 message.mutable_repeated_nested_message(0)
283 ->mutable_unknown_fields()
284 ->AddVarint(123456, 654321);
288 message.optional_nested_message().unknown_fields().field_count());
290 message.repeated_nested_message(0).unknown_fields().field_count());
298 message.optional_nested_message().unknown_fields().field_count());
300 message.repeated_nested_message(0).unknown_fields().field_count());
303 TEST(ReflectionOpsTest, DiscardUnknownExtensions) {
304 unittest::TestAllExtensions
message;
308 message.mutable_unknown_fields()->AddVarint(123456, 654321);
309 message.MutableExtension(unittest::optional_nested_message_extension)
310 ->mutable_unknown_fields()
311 ->AddVarint(123456, 654321);
312 message.MutableExtension(unittest::repeated_nested_message_extension, 0)
313 ->mutable_unknown_fields()
314 ->AddVarint(123456, 654321);
317 EXPECT_EQ(1,
message.GetExtension(unittest::optional_nested_message_extension)
321 message.GetExtension(unittest::repeated_nested_message_extension, 0)
327 TestUtil::ExpectAllExtensionsSet(
message);
330 EXPECT_EQ(0,
message.GetExtension(unittest::optional_nested_message_extension)
334 message.GetExtension(unittest::repeated_nested_message_extension, 0)
340 unittest::TestRequired
message;
359 TEST(ReflectionOpsTest, ForeignIsInitialized) {
360 unittest::TestRequiredForeign
message;
368 message.mutable_optional_message();
374 message.mutable_optional_message()->set_a(1);
375 message.mutable_optional_message()->set_b(2);
376 message.mutable_optional_message()->set_c(3);
382 unittest::TestRequired* sub_message =
message.add_repeated_message();
388 sub_message->set_a(1);
389 sub_message->set_b(2);
390 sub_message->set_c(3);
396 TEST(ReflectionOpsTest, ExtensionIsInitialized) {
397 unittest::TestAllExtensions
message;
406 message.MutableExtension(unittest::TestRequired::single);
412 message.MutableExtension(unittest::TestRequired::single)->set_a(1);
413 message.MutableExtension(unittest::TestRequired::single)->set_b(2);
414 message.MutableExtension(unittest::TestRequired::single)->set_c(3);
420 message.AddExtension(unittest::TestRequired::multi);
426 message.MutableExtension(unittest::TestRequired::multi, 0)->set_a(1);
427 message.MutableExtension(unittest::TestRequired::multi, 0)->set_b(2);
428 message.MutableExtension(unittest::TestRequired::multi, 0)->set_c(3);
434 TEST(ReflectionOpsTest, OneofIsInitialized) {
435 unittest::TestRequiredOneof
message;
454 message.mutable_foo_message()->set_required_double(0.1);
461 std::vector<std::string>
errors;
467 unittest::TestRequired
message;
471 TEST(ReflectionOpsTest, FindForeignInitializationErrors) {
472 unittest::TestRequiredForeign
message;
473 message.mutable_optional_message();
474 message.add_repeated_message();
475 message.add_repeated_message();
477 "optional_message.a,"
478 "optional_message.b,"
479 "optional_message.c,"
480 "repeated_message[0].a,"
481 "repeated_message[0].b,"
482 "repeated_message[0].c,"
483 "repeated_message[1].a,"
484 "repeated_message[1].b,"
485 "repeated_message[1].c",
489 TEST(ReflectionOpsTest, FindExtensionInitializationErrors) {
490 unittest::TestAllExtensions
message;
491 message.MutableExtension(unittest::TestRequired::single);
492 message.AddExtension(unittest::TestRequired::multi);
493 message.AddExtension(unittest::TestRequired::multi);
495 "(protobuf_unittest.TestRequired.single).a,"
496 "(protobuf_unittest.TestRequired.single).b,"
497 "(protobuf_unittest.TestRequired.single).c,"
498 "(protobuf_unittest.TestRequired.multi)[0].a,"
499 "(protobuf_unittest.TestRequired.multi)[0].b,"
500 "(protobuf_unittest.TestRequired.multi)[0].c,"
501 "(protobuf_unittest.TestRequired.multi)[1].a,"
502 "(protobuf_unittest.TestRequired.multi)[1].b,"
503 "(protobuf_unittest.TestRequired.multi)[1].c",
507 TEST(ReflectionOpsTest, FindOneofInitializationErrors) {
508 unittest::TestRequiredOneof
message;
516 unittest::TestAllTypes
message;
517 auto* arena_message = Arena::CreateMessage<unittest::TestAllTypes>(&
arena);
519 const uint64 initial_arena_size =
arena.SpaceUsed();
524 TestUtil::ExpectClear(*arena_message);
529 unittest::TestAllTypes
message;
530 auto* arena_message = Arena::CreateMessage<unittest::TestAllTypes>(&
arena);
532 const uint64 initial_arena_size =
arena.SpaceUsed();
537 TestUtil::ExpectClear(*arena_message);