45 #include <google/protobuf/generated_message_reflection.h>
49 #include <google/protobuf/stubs/logging.h>
50 #include <google/protobuf/stubs/common.h>
51 #include <google/protobuf/map_test_util.h>
52 #include <google/protobuf/map_unittest.pb.h>
53 #include <google/protobuf/test_util.h>
54 #include <google/protobuf/unittest.pb.h>
55 #include <google/protobuf/unittest_mset.pb.h>
56 #include <google/protobuf/unittest_mset_wire_format.pb.h>
57 #include <google/protobuf/arena.h>
58 #include <google/protobuf/descriptor.h>
59 #include <google/protobuf/testing/googletest.h>
60 #include <gtest/gtest.h>
63 #include <google/protobuf/port_def.inc>
72 const std::vector<const FieldDescriptor*>&
fields) {
76 return msg.GetReflection()->IsLazyExtension(
msg,
ext);
90 TEST(GeneratedMessageReflectionTest, Defaults) {
93 TestUtil::ReflectionTester reflection_tester(
96 reflection_tester.ExpectClearViaReflection(
message);
98 const Reflection* reflection =
message.GetReflection();
103 EXPECT_EQ(&unittest::TestAllTypes::OptionalGroup::default_instance(),
104 &reflection->GetMessage(
message,
F(
"optionalgroup")));
105 EXPECT_EQ(&unittest::TestAllTypes::NestedMessage::default_instance(),
106 &reflection->GetMessage(
message,
F(
"optional_nested_message")));
107 EXPECT_EQ(&unittest::ForeignMessage::default_instance(),
108 &reflection->GetMessage(
message,
F(
"optional_foreign_message")));
109 EXPECT_EQ(&unittest_import::ImportMessage::default_instance(),
110 &reflection->GetMessage(
message,
F(
"optional_import_message")));
113 TEST(GeneratedMessageReflectionTest, Accessors) {
116 unittest::TestAllTypes
message;
117 TestUtil::ReflectionTester reflection_tester(
120 reflection_tester.SetAllFieldsViaReflection(&
message);
122 reflection_tester.ExpectAllFieldsSetViaReflection(
message);
124 reflection_tester.ModifyRepeatedFieldsViaReflection(&
message);
125 TestUtil::ExpectRepeatedFieldsModified(
message);
128 TEST(GeneratedMessageReflectionTest, GetStringReference) {
131 unittest::TestAllTypes
message;
132 message.set_optional_string(
"foo");
133 message.add_repeated_string(
"foo");
135 const Reflection* reflection =
message.GetReflection();
140 &reflection->GetStringReference(
message,
F(
"optional_string"), &
scratch))
141 <<
"For simple string fields, GetStringReference() should return a "
142 "reference to the underlying string.";
144 &reflection->GetRepeatedStringReference(
146 <<
"For simple string fields, GetRepeatedStringReference() should "
148 "a reference to the underlying string.";
152 TEST(GeneratedMessageReflectionTest, DefaultsAfterClear) {
155 unittest::TestAllTypes
message;
156 TestUtil::ReflectionTester reflection_tester(
162 const Reflection* reflection =
message.GetReflection();
164 EXPECT_NE(&unittest::TestAllTypes::OptionalGroup::default_instance(),
165 &reflection->GetMessage(
message,
F(
"optionalgroup")));
166 EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(),
167 &reflection->GetMessage(
message,
F(
"optional_nested_message")));
168 EXPECT_NE(&unittest::ForeignMessage::default_instance(),
169 &reflection->GetMessage(
message,
F(
"optional_foreign_message")));
170 EXPECT_NE(&unittest_import::ImportMessage::default_instance(),
171 &reflection->GetMessage(
message,
F(
"optional_import_message")));
178 reflection->UnsafeArenaSwap(lhs, rhs);
180 reflection->Swap(lhs, rhs);
183 void SwapFields(
const Reflection* reflection,
Message* lhs,
Message* rhs,
184 const std::vector<const FieldDescriptor*>&
fields) {
186 reflection->UnsafeArenaSwapFields(lhs, rhs,
fields);
188 reflection->SwapFields(lhs, rhs,
fields);
197 TEST_P(GeneratedMessageReflectionSwapTest, LhsSet) {
198 unittest::TestAllTypes lhs;
199 unittest::TestAllTypes rhs;
203 Swap(lhs.GetReflection(), &lhs, &rhs);
205 TestUtil::ExpectClear(lhs);
209 TEST_P(GeneratedMessageReflectionSwapTest, BothSet) {
210 unittest::TestAllTypes lhs;
211 unittest::TestAllTypes rhs;
215 TestUtil::ModifyRepeatedFields(&rhs);
217 const Reflection* reflection = lhs.GetReflection();
218 Swap(reflection, &lhs, &rhs);
220 TestUtil::ExpectRepeatedFieldsModified(lhs);
223 lhs.set_optional_int32(532819);
225 Swap(reflection, &lhs, &rhs);
230 TEST_P(GeneratedMessageReflectionSwapTest, LhsCleared) {
231 unittest::TestAllTypes lhs;
232 unittest::TestAllTypes rhs;
240 Swap(lhs.GetReflection(), &lhs, &rhs);
242 TestUtil::ExpectClear(rhs);
245 TEST_P(GeneratedMessageReflectionSwapTest, RhsCleared) {
246 unittest::TestAllTypes lhs;
247 unittest::TestAllTypes rhs;
255 Swap(lhs.GetReflection(), &lhs, &rhs);
257 TestUtil::ExpectClear(lhs);
261 unittest::TestAllExtensions lhs;
262 unittest::TestAllExtensions rhs;
266 Swap(lhs.GetReflection(), &lhs, &rhs);
268 TestUtil::ExpectExtensionsClear(lhs);
269 TestUtil::ExpectAllExtensionsSet(rhs);
272 TEST_P(GeneratedMessageReflectionSwapTest, Unknown) {
273 unittest::TestEmptyMessage lhs, rhs;
275 lhs.mutable_unknown_fields()->AddVarint(1234, 1);
277 EXPECT_EQ(1, lhs.unknown_fields().field_count());
278 EXPECT_EQ(0, rhs.unknown_fields().field_count());
279 Swap(lhs.GetReflection(), &lhs, &rhs);
280 EXPECT_EQ(0, lhs.unknown_fields().field_count());
281 EXPECT_EQ(1, rhs.unknown_fields().field_count());
284 TEST_P(GeneratedMessageReflectionSwapTest,
Oneof) {
285 unittest::TestOneof2 lhs, rhs;
286 TestUtil::SetOneof1(&lhs);
288 Swap(lhs.GetReflection(), &lhs, &rhs);
290 TestUtil::ExpectOneofClear(lhs);
291 TestUtil::ExpectOneofSet1(rhs);
294 TEST_P(GeneratedMessageReflectionSwapTest, OneofBothSet) {
295 unittest::TestOneof2 lhs, rhs;
296 TestUtil::SetOneof1(&lhs);
297 TestUtil::SetOneof2(&rhs);
299 Swap(lhs.GetReflection(), &lhs, &rhs);
301 TestUtil::ExpectOneofSet2(lhs);
302 TestUtil::ExpectOneofSet1(rhs);
305 TEST_P(GeneratedMessageReflectionSwapTest, SwapFields) {
306 unittest::TestAllTypes lhs, rhs;
307 lhs.set_optional_double(12.3);
308 lhs.mutable_repeated_int32()->Add(10);
309 lhs.mutable_repeated_int32()->Add(20);
311 rhs.set_optional_string(
"hello");
312 rhs.mutable_repeated_int64()->Add(30);
314 std::vector<const FieldDescriptor*>
fields;
321 SwapFields(lhs.GetReflection(), &lhs, &rhs,
fields);
326 EXPECT_EQ(
"hello", lhs.optional_string());
340 TEST_P(GeneratedMessageReflectionSwapTest, SwapFieldsAll) {
341 unittest::TestAllTypes lhs;
342 unittest::TestAllTypes rhs;
346 std::vector<const FieldDescriptor*>
fields;
347 const Reflection* reflection = lhs.GetReflection();
348 reflection->ListFields(rhs, &
fields);
349 SwapFields(reflection, &lhs, &rhs,
fields);
352 TestUtil::ExpectClear(rhs);
355 TEST(GeneratedMessageReflectionTest, SwapFieldsAllOnDifferentArena) {
356 Arena arena1, arena2;
357 auto* message1 = Arena::CreateMessage<unittest::TestAllTypes>(&arena1);
358 auto* message2 = Arena::CreateMessage<unittest::TestAllTypes>(&arena2);
362 std::vector<const FieldDescriptor*>
fields;
363 const Reflection* reflection = message1->GetReflection();
364 reflection->ListFields(*message2, &
fields);
365 reflection->SwapFields(message1, message2,
fields);
368 TestUtil::ExpectClear(*message2);
371 TEST(GeneratedMessageReflectionTest, SwapFieldsAllOnArenaHeap) {
373 auto* message1 = Arena::CreateMessage<unittest::TestAllTypes>(&
arena);
374 std::unique_ptr<unittest::TestAllTypes> message2(
375 Arena::CreateMessage<unittest::TestAllTypes>(
nullptr));
379 std::vector<const FieldDescriptor*>
fields;
380 const Reflection* reflection = message1->GetReflection();
381 reflection->ListFields(*message2, &
fields);
382 reflection->SwapFields(message1, message2.get(),
fields);
385 TestUtil::ExpectClear(*message2);
388 TEST(GeneratedMessageReflectionTest, SwapFieldsAllExtension) {
389 unittest::TestAllExtensions message1;
390 unittest::TestAllExtensions message2;
394 std::vector<const FieldDescriptor*>
fields;
395 const Reflection* reflection = message1.GetReflection();
396 reflection->ListFields(message1, &
fields);
397 reflection->SwapFields(&message1, &message2,
fields);
399 TestUtil::ExpectExtensionsClear(message1);
400 TestUtil::ExpectAllExtensionsSet(message2);
403 TEST(GeneratedMessageReflectionTest, SwapFieldsAllExtensionArenaHeap) {
406 std::unique_ptr<unittest::TestAllExtensions> message1(
407 Arena::CreateMessage<unittest::TestAllExtensions>(
nullptr));
408 auto* message2 = Arena::CreateMessage<unittest::TestAllExtensions>(&
arena);
412 std::vector<const FieldDescriptor*>
fields;
413 const Reflection* reflection = message1->GetReflection();
414 reflection->ListFields(*message1, &
fields);
415 reflection->SwapFields(message1.get(), message2,
fields);
417 TestUtil::ExpectExtensionsClear(*message1);
418 TestUtil::ExpectAllExtensionsSet(*message2);
421 TEST(GeneratedMessageReflectionTest, UnsafeShallowSwapFieldsAll) {
423 auto* message1 = Arena::CreateMessage<unittest::TestAllTypes>(&
arena);
424 auto* message2 = Arena::CreateMessage<unittest::TestAllTypes>(&
arena);
428 auto* kept_nested_message_ptr = message2->mutable_optional_nested_message();
429 auto* kept_foreign_message_ptr = message2->mutable_optional_foreign_message();
430 auto* kept_repeated_nested_message_ptr =
431 message2->mutable_repeated_nested_message(0);
432 auto* kept_repeated_foreign_message_ptr =
433 message2->mutable_repeated_foreign_message(0);
435 std::vector<const FieldDescriptor*>
fields;
436 const Reflection* reflection = message1->GetReflection();
437 reflection->ListFields(*message2, &
fields);
439 message1, message2,
fields);
442 TestUtil::ExpectClear(*message2);
447 message1->mutable_optional_nested_message());
449 message1->mutable_optional_foreign_message());
450 EXPECT_EQ(kept_repeated_nested_message_ptr,
451 message1->mutable_repeated_nested_message(0));
452 EXPECT_EQ(kept_repeated_foreign_message_ptr,
453 message1->mutable_repeated_foreign_message(0));
456 TEST(GeneratedMessageReflectionTest, UnsafeShallowSwapFieldsMap) {
458 auto* message1 = Arena::CreateMessage<unittest::TestMap>(&
arena);
459 auto* message2 = Arena::CreateMessage<unittest::TestMap>(&
arena);
461 MapTestUtil::SetMapFields(message2);
463 auto* kept_map_int32_fm_ptr =
464 &(*message2->mutable_map_int32_foreign_message())[0];
466 std::vector<const FieldDescriptor*>
fields;
467 const Reflection* reflection = message1->GetReflection();
468 reflection->ListFields(*message2, &
fields);
470 message1, message2,
fields);
472 MapTestUtil::ExpectMapFieldsSet(*message1);
473 MapTestUtil::ExpectClear(*message2);
477 &(*message1->mutable_map_int32_foreign_message())[0]);
480 TEST(GeneratedMessageReflectionTest, UnsafeShallowSwapFieldsAllExtension) {
482 auto* message1 = Arena::CreateMessage<unittest::TestAllExtensions>(&
arena);
483 auto* message2 = Arena::CreateMessage<unittest::TestAllExtensions>(&
arena);
487 auto* kept_nested_message_ext_ptr =
488 message1->MutableExtension(unittest::optional_nested_message_extension);
489 auto* kept_foreign_message_ext_ptr =
490 message1->MutableExtension(unittest::optional_foreign_message_extension);
491 auto* kept_repeated_nested_message_ext_ptr =
492 message1->MutableRepeatedExtension(
493 unittest::repeated_nested_message_extension);
494 auto* kept_repeated_foreign_message_ext_ptr =
495 message1->MutableRepeatedExtension(
496 unittest::repeated_foreign_message_extension);
498 std::vector<const FieldDescriptor*>
fields;
499 const Reflection* reflection = message1->GetReflection();
500 reflection->ListFields(*message1, &
fields);
502 message1, message2,
fields);
504 TestUtil::ExpectExtensionsClear(*message1);
505 TestUtil::ExpectAllExtensionsSet(*message2);
509 kept_nested_message_ext_ptr,
510 message2->MutableExtension(unittest::optional_nested_message_extension));
512 kept_foreign_message_ext_ptr,
513 message2->MutableExtension(unittest::optional_foreign_message_extension));
514 EXPECT_EQ(kept_repeated_nested_message_ext_ptr,
515 message2->MutableRepeatedExtension(
516 unittest::repeated_nested_message_extension));
517 EXPECT_EQ(kept_repeated_foreign_message_ext_ptr,
518 message2->MutableRepeatedExtension(
519 unittest::repeated_foreign_message_extension));
522 TEST(GeneratedMessageReflectionTest, SwapFieldsOneof) {
523 unittest::TestOneof2 message1, message2;
524 TestUtil::SetOneof1(&message1);
526 std::vector<const FieldDescriptor*>
fields;
531 const Reflection* reflection = message1.GetReflection();
532 reflection->SwapFields(&message1, &message2,
fields);
534 TestUtil::ExpectOneofClear(message1);
535 TestUtil::ExpectOneofSet1(message2);
538 TEST(GeneratedMessageReflectionTest, UnsafeShallowSwapFieldsOneof) {
540 auto* message1 = Arena::CreateMessage<unittest::TestOneof2>(&
arena);
541 auto* message2 = Arena::CreateMessage<unittest::TestOneof2>(&
arena);
542 TestUtil::SetOneof1(message1);
544 std::vector<const FieldDescriptor*>
fields;
550 message1, message2,
fields);
552 TestUtil::ExpectOneofClear(*message1);
553 TestUtil::ExpectOneofSet1(*message2);
556 TEST(GeneratedMessageReflectionTest,
557 UnsafeShallowSwapFieldsOneofExpectShallow) {
559 auto* message1 = Arena::CreateMessage<unittest::TestOneof2>(&
arena);
560 auto* message2 = Arena::CreateMessage<unittest::TestOneof2>(&
arena);
561 TestUtil::SetOneof1(message1);
562 message1->mutable_foo_message()->set_qux_int(1000);
563 auto* kept_foo_ptr = message1->mutable_foo_message();
565 std::vector<const FieldDescriptor*>
fields;
571 message1, message2,
fields);
574 EXPECT_EQ(message2->foo_message().qux_int(), 1000);
575 EXPECT_EQ(kept_foo_ptr, message2->mutable_foo_message());
578 TEST(GeneratedMessageReflectionTest, RemoveLast) {
579 unittest::TestAllTypes
message;
580 TestUtil::ReflectionTester reflection_tester(
585 reflection_tester.RemoveLastRepeatedsViaReflection(&
message);
587 TestUtil::ExpectLastRepeatedsRemoved(
message);
590 TEST(GeneratedMessageReflectionTest, RemoveLastExtensions) {
591 unittest::TestAllExtensions
message;
592 TestUtil::ReflectionTester reflection_tester(
597 reflection_tester.RemoveLastRepeatedsViaReflection(&
message);
599 TestUtil::ExpectLastRepeatedExtensionsRemoved(
message);
602 TEST(GeneratedMessageReflectionTest, ReleaseLast) {
603 unittest::TestAllTypes
message;
605 TestUtil::ReflectionTester reflection_tester(
descriptor);
609 reflection_tester.ReleaseLastRepeatedsViaReflection(&
message,
false);
611 TestUtil::ExpectLastRepeatedsReleased(
message);
617 const protobuf_unittest::ForeignMessage* expected =
618 message.mutable_repeated_foreign_message(1);
620 std::unique_ptr<Message> released(
message.GetReflection()->ReleaseLast(
625 TEST(GeneratedMessageReflectionTest, ReleaseLastExtensions) {
626 unittest::TestAllExtensions
message;
628 TestUtil::ReflectionTester reflection_tester(
descriptor);
632 reflection_tester.ReleaseLastRepeatedsViaReflection(&
message,
true);
634 TestUtil::ExpectLastRepeatedExtensionsReleased(
message);
640 2,
message.ExtensionSize(unittest::repeated_foreign_message_extension));
641 const protobuf_unittest::ForeignMessage* expected =
642 message.MutableExtension(unittest::repeated_foreign_message_extension, 1);
643 std::unique_ptr<Message> released(
message.GetReflection()->ReleaseLast(
645 "repeated_foreign_message_extension")));
649 TEST(GeneratedMessageReflectionTest, SwapRepeatedElements) {
650 unittest::TestAllTypes
message;
651 TestUtil::ReflectionTester reflection_tester(
657 reflection_tester.SwapRepeatedsViaReflection(&
message);
658 TestUtil::ExpectRepeatedsSwapped(
message);
661 reflection_tester.SwapRepeatedsViaReflection(&
message);
665 TEST(GeneratedMessageReflectionTest, SwapRepeatedElementsExtension) {
666 unittest::TestAllExtensions
message;
667 TestUtil::ReflectionTester reflection_tester(
673 reflection_tester.SwapRepeatedsViaReflection(&
message);
674 TestUtil::ExpectRepeatedExtensionsSwapped(
message);
677 reflection_tester.SwapRepeatedsViaReflection(&
message);
678 TestUtil::ExpectAllExtensionsSet(
message);
684 unittest::TestAllExtensions
message;
685 TestUtil::ReflectionTester reflection_tester(
688 reflection_tester.SetAllFieldsViaReflection(&
message);
689 TestUtil::ExpectAllExtensionsSet(
message);
690 reflection_tester.ExpectAllFieldsSetViaReflection(
message);
692 reflection_tester.ModifyRepeatedFieldsViaReflection(&
message);
693 TestUtil::ExpectRepeatedExtensionsModified(
message);
696 TEST(GeneratedMessageReflectionTest, FindExtensionTypeByNumber) {
697 const Reflection* reflection =
698 unittest::TestAllExtensions::default_instance().GetReflection();
702 "optional_int32_extension");
705 "repeated_string_extension");
708 reflection->FindKnownExtensionByNumber(extension1->number()));
710 reflection->FindKnownExtensionByNumber(extension2->number()));
713 EXPECT_TRUE(reflection->FindKnownExtensionByNumber(62341) ==
nullptr);
717 EXPECT_TRUE(unittest::TestAllTypes::default_instance()
719 ->FindKnownExtensionByNumber(extension1->number()) ==
723 TEST(GeneratedMessageReflectionTest, FindKnownExtensionByName) {
724 const Reflection* reflection =
725 unittest::TestAllExtensions::default_instance().GetReflection();
729 "optional_int32_extension");
732 "repeated_string_extension");
735 reflection->FindKnownExtensionByName(extension1->full_name()));
737 reflection->FindKnownExtensionByName(extension2->full_name()));
740 EXPECT_TRUE(reflection->FindKnownExtensionByName(
"no_such_ext") ==
nullptr);
744 EXPECT_TRUE(unittest::TestAllTypes::default_instance()
746 ->FindKnownExtensionByName(extension1->full_name()) ==
751 TEST(GeneratedMessageReflectionTest, SetAllocatedMessageTest) {
752 unittest::TestAllTypes from_message1;
753 unittest::TestAllTypes from_message2;
754 unittest::TestAllTypes to_message;
755 TestUtil::ReflectionTester reflection_tester(
757 reflection_tester.SetAllFieldsViaReflection(&from_message1);
758 reflection_tester.SetAllFieldsViaReflection(&from_message2);
761 reflection_tester.ExpectMessagesReleasedViaReflection(
765 reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
766 &from_message1, &to_message);
767 reflection_tester.ExpectMessagesReleasedViaReflection(
771 reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
772 &from_message2, &to_message);
773 reflection_tester.ExpectMessagesReleasedViaReflection(
778 reflection_tester.SetAllocatedOptionalMessageFieldsToNullViaReflection(
780 reflection_tester.ExpectMessagesReleasedViaReflection(
784 TEST(GeneratedMessageReflectionTest, SetAllocatedMessageOnArenaTest) {
785 unittest::TestAllTypes from_message1;
786 unittest::TestAllTypes from_message2;
788 unittest::TestAllTypes* to_message =
789 Arena::CreateMessage<unittest::TestAllTypes>(&
arena);
790 TestUtil::ReflectionTester reflection_tester(
792 reflection_tester.SetAllFieldsViaReflection(&from_message1);
793 reflection_tester.SetAllFieldsViaReflection(&from_message2);
796 reflection_tester.ExpectMessagesReleasedViaReflection(
800 reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
801 &from_message1, to_message);
802 reflection_tester.ExpectMessagesReleasedViaReflection(
806 reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
807 &from_message2, to_message);
808 reflection_tester.ExpectMessagesReleasedViaReflection(
813 reflection_tester.SetAllocatedOptionalMessageFieldsToNullViaReflection(
815 reflection_tester.ExpectMessagesReleasedViaReflection(
819 TEST(GeneratedMessageReflectionTest, SetAllocatedExtensionMessageTest) {
820 unittest::TestAllExtensions from_message1;
821 unittest::TestAllExtensions from_message2;
822 unittest::TestAllExtensions to_message;
823 TestUtil::ReflectionTester reflection_tester(
825 reflection_tester.SetAllFieldsViaReflection(&from_message1);
826 reflection_tester.SetAllFieldsViaReflection(&from_message2);
829 reflection_tester.ExpectMessagesReleasedViaReflection(
833 reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
834 &from_message1, &to_message);
835 reflection_tester.ExpectMessagesReleasedViaReflection(
839 reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
840 &from_message2, &to_message);
841 reflection_tester.ExpectMessagesReleasedViaReflection(
846 reflection_tester.SetAllocatedOptionalMessageFieldsToNullViaReflection(
848 reflection_tester.ExpectMessagesReleasedViaReflection(
852 TEST(GeneratedMessageReflectionTest, SetAllocatedExtensionMessageOnArenaTest) {
854 unittest::TestAllExtensions* to_message =
855 Arena::CreateMessage<unittest::TestAllExtensions>(&
arena);
856 unittest::TestAllExtensions from_message1;
857 unittest::TestAllExtensions from_message2;
858 TestUtil::ReflectionTester reflection_tester(
860 reflection_tester.SetAllFieldsViaReflection(&from_message1);
861 reflection_tester.SetAllFieldsViaReflection(&from_message2);
864 reflection_tester.ExpectMessagesReleasedViaReflection(
868 reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
869 &from_message1, to_message);
870 reflection_tester.ExpectMessagesReleasedViaReflection(
874 reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection(
875 &from_message2, to_message);
876 reflection_tester.ExpectMessagesReleasedViaReflection(
881 reflection_tester.SetAllocatedOptionalMessageFieldsToNullViaReflection(
883 reflection_tester.ExpectMessagesReleasedViaReflection(
887 TEST(GeneratedMessageReflectionTest, AddRepeatedMessage) {
888 unittest::TestAllTypes
message;
890 const Reflection* reflection =
message.GetReflection();
891 const Reflection* nested_reflection =
892 unittest::TestAllTypes::NestedMessage::default_instance().GetReflection();
899 reflection->AddMessage(&
message,
F(
"repeated_nested_message"));
900 nested_reflection->SetInt32(
nested, nested_bb, 11);
905 TEST(GeneratedMessageReflectionTest, MutableRepeatedMessage) {
906 unittest::TestAllTypes
message;
908 const Reflection* reflection =
message.GetReflection();
909 const Reflection* nested_reflection =
910 unittest::TestAllTypes::NestedMessage::default_instance().GetReflection();
916 message.add_repeated_nested_message()->set_bb(12);
919 &
message,
F(
"repeated_nested_message"), 0);
921 nested_reflection->SetInt32(
nested, nested_bb, 13);
925 TEST(GeneratedMessageReflectionTest, AddAllocatedMessage) {
926 unittest::TestAllTypes
message;
928 const Reflection* reflection =
message.GetReflection();
930 unittest::TestAllTypes::NestedMessage*
nested =
931 new unittest::TestAllTypes::NestedMessage();
933 reflection->AddAllocatedMessage(&
message,
F(
"repeated_nested_message"),
939 TEST(GeneratedMessageReflectionTest, ListFieldsOneOf) {
943 const Reflection* reflection =
message.GetReflection();
944 std::vector<const FieldDescriptor*>
fields;
949 TEST(GeneratedMessageReflectionTest,
Oneof) {
952 const Reflection* reflection =
message.GetReflection();
966 unittest::TestOneof2::FOO,
969 EXPECT_EQ(&unittest::TestOneof2::NestedMessage::default_instance(),
970 &reflection->GetMessage(
972 EXPECT_EQ(&unittest::TestOneof2::FooGroup::default_instance(),
973 &reflection->GetMessage(
message,
975 EXPECT_NE(&unittest::TestOneof2::FooGroup::default_instance(),
976 &reflection->GetMessage(
980 EXPECT_EQ(
"STRING", reflection->GetString(
985 reflection->GetString(
987 EXPECT_EQ(
"BYTES", reflection->GetString(
990 unittest::TestOneof2::BAR,
1004 EXPECT_EQ(
"bytes", reflection->GetString(
1011 reflection->SetString(&
message,
1012 descriptor->FindFieldByName(
"bar_string_piece"),
1015 reflection->GetString(
1020 TestUtil::ExpectOneofClear(
message);
1023 TEST(GeneratedMessageReflectionTest, SetAllocatedOneofMessageTest) {
1024 unittest::TestOneof2 from_message1;
1025 unittest::TestOneof2 from_message2;
1026 unittest::TestOneof2 to_message;
1028 const Reflection* reflection = to_message.GetReflection();
1030 Message* released = reflection->ReleaseMessage(
1031 &to_message,
descriptor->FindFieldByName(
"foo_lazy_message"));
1033 released = reflection->ReleaseMessage(
1034 &to_message,
descriptor->FindFieldByName(
"foo_message"));
1043 const Message& sub_message = reflection->GetMessage(
1044 to_message,
descriptor->FindFieldByName(
"foo_lazy_message"));
1046 released = reflection->ReleaseMessage(
1047 &to_message,
descriptor->FindFieldByName(
"foo_lazy_message"));
1054 reflection->MutableMessage(&from_message2,
1061 const Message& sub_message2 = reflection->GetMessage(
1062 to_message,
descriptor->FindFieldByName(
"foo_message"));
1064 released = reflection->ReleaseMessage(
1065 &to_message,
descriptor->FindFieldByName(
"foo_message"));
1071 TEST(GeneratedMessageReflectionTest, SetAllocatedOneofMessageOnArenaTest) {
1072 unittest::TestOneof2 from_message1;
1073 unittest::TestOneof2 from_message2;
1075 unittest::TestOneof2* to_message =
1076 Arena::CreateMessage<unittest::TestOneof2>(&
arena);
1078 const Reflection* reflection = to_message->GetReflection();
1080 Message* released = reflection->ReleaseMessage(
1081 to_message,
descriptor->FindFieldByName(
"foo_lazy_message"));
1083 released = reflection->ReleaseMessage(
1084 to_message,
descriptor->FindFieldByName(
"foo_message"));
1093 const Message& sub_message = reflection->GetMessage(
1094 *to_message,
descriptor->FindFieldByName(
"foo_lazy_message"));
1095 released = reflection->ReleaseMessage(
1096 to_message,
descriptor->FindFieldByName(
"foo_lazy_message"));
1105 reflection->MutableMessage(&from_message2,
1112 const Message& sub_message2 = reflection->GetMessage(
1113 *to_message,
descriptor->FindFieldByName(
"foo_message"));
1114 released = reflection->ReleaseMessage(
1115 to_message,
descriptor->FindFieldByName(
"foo_message"));
1123 TEST(GeneratedMessageReflectionTest, ReleaseMessageTest) {
1124 unittest::TestAllTypes
message;
1125 TestUtil::ReflectionTester reflection_tester(
1129 reflection_tester.ExpectMessagesReleasedViaReflection(
1133 reflection_tester.SetAllFieldsViaReflection(&
message);
1134 reflection_tester.ExpectMessagesReleasedViaReflection(
1139 reflection_tester.SetAllFieldsViaReflection(&
message);
1141 reflection_tester.ExpectMessagesReleasedViaReflection(
1149 TEST(GeneratedMessageReflectionTest, ReleaseExtensionMessageTest) {
1150 unittest::TestAllExtensions
message;
1151 TestUtil::ReflectionTester reflection_tester(
1155 reflection_tester.ExpectMessagesReleasedViaReflection(
1159 reflection_tester.SetAllFieldsViaReflection(&
message);
1160 reflection_tester.ExpectMessagesReleasedViaReflection(
1165 reflection_tester.SetAllFieldsViaReflection(&
message);
1167 reflection_tester.ExpectMessagesReleasedViaReflection(
1172 TestUtil::ExpectAllExtensionsSet(
message);
1175 TEST(GeneratedMessageReflectionTest, ReleaseOneofMessageTest) {
1180 const Reflection* reflection =
message.GetReflection();
1181 const Message& sub_message = reflection->GetMessage(
1184 Message* released = reflection->ReleaseMessage(
1191 released = reflection->ReleaseMessage(
1196 TEST(GeneratedMessageReflectionTest, ArenaReleaseMessageTest) {
1198 unittest::TestAllTypes*
message =
1199 Arena::CreateMessage<unittest::TestAllTypes>(&
arena);
1200 TestUtil::ReflectionTester reflection_tester(
1204 reflection_tester.ExpectMessagesReleasedViaReflection(
1208 reflection_tester.SetAllFieldsViaReflection(
message);
1209 reflection_tester.ExpectMessagesReleasedViaReflection(
1214 reflection_tester.SetAllFieldsViaReflection(
message);
1216 reflection_tester.ExpectMessagesReleasedViaReflection(
1220 TEST(GeneratedMessageReflectionTest, ArenaReleaseExtensionMessageTest) {
1222 unittest::TestAllExtensions*
message =
1223 Arena::CreateMessage<unittest::TestAllExtensions>(&
arena);
1224 TestUtil::ReflectionTester reflection_tester(
1228 reflection_tester.ExpectMessagesReleasedViaReflection(
1232 reflection_tester.SetAllFieldsViaReflection(
message);
1233 reflection_tester.ExpectMessagesReleasedViaReflection(
1238 reflection_tester.SetAllFieldsViaReflection(
message);
1240 reflection_tester.ExpectMessagesReleasedViaReflection(
1244 TEST(GeneratedMessageReflectionTest, ArenaReleaseOneofMessageTest) {
1246 unittest::TestOneof2*
message =
1247 Arena::CreateMessage<unittest::TestOneof2>(&
arena);
1251 const Reflection* reflection =
message->GetReflection();
1252 Message* released = reflection->ReleaseMessage(
1258 released = reflection->ReleaseMessage(
1263 #ifdef PROTOBUF_HAS_DEATH_TEST
1265 TEST(GeneratedMessageReflectionTest, UsageErrors) {
1266 unittest::TestAllTypes
message;
1267 const Reflection* reflection =
message.GetReflection();
1270 #define f(NAME) descriptor->FindFieldByName(NAME)
1276 descriptor->FindFieldByName(
"optional_int64")),
1277 "Protocol Buffer reflection usage error:\n"
1278 " Method : google::protobuf::Reflection::GetInt32\n"
1279 " Message type: protobuf_unittest\\.TestAllTypes\n"
1280 " Field : protobuf_unittest\\.TestAllTypes\\.optional_int64\n"
1281 " Problem : Field is not the right type for this message:\n"
1282 " Expected : CPPTYPE_INT32\n"
1283 " Field type: CPPTYPE_INT64");
1284 EXPECT_DEATH(reflection->GetInt32(
1286 "Protocol Buffer reflection usage error:\n"
1287 " Method : google::protobuf::Reflection::GetInt32\n"
1288 " Message type: protobuf_unittest.TestAllTypes\n"
1289 " Field : protobuf_unittest.TestAllTypes.repeated_int32\n"
1290 " Problem : Field is repeated; the method requires a "
1293 reflection->GetInt32(
1296 "Protocol Buffer reflection usage error:\n"
1297 " Method : google::protobuf::Reflection::GetInt32\n"
1298 " Message type: protobuf_unittest.TestAllTypes\n"
1299 " Field : protobuf_unittest.ForeignMessage.c\n"
1300 " Problem : Field does not match message type.");
1302 reflection->HasField(
1305 "Protocol Buffer reflection usage error:\n"
1306 " Method : google::protobuf::Reflection::HasField\n"
1307 " Message type: protobuf_unittest.TestAllTypes\n"
1308 " Field : protobuf_unittest.ForeignMessage.c\n"
1309 " Problem : Field does not match message type.");
1314 #endif // PROTOBUF_HAS_DEATH_TEST