40 #include <google/protobuf/unittest.pb.h>
41 #include <google/protobuf/unittest_mset.pb.h>
68 TEST(ExtensionSetTest, Defaults) {
70 unittest::TestAllExtensions
message;
72 TestUtil::ExpectExtensionsClear(
message);
77 EXPECT_EQ(&unittest::OptionalGroup_extension::default_instance(),
78 &
message.GetExtension(unittest::optionalgroup_extension));
79 EXPECT_EQ(&unittest::TestAllTypes::NestedMessage::default_instance(),
80 &
message.GetExtension(unittest::optional_nested_message_extension));
82 &unittest::ForeignMessage::default_instance(),
83 &
message.GetExtension(unittest::optional_foreign_message_extension));
84 EXPECT_EQ(&unittest_import::ImportMessage::default_instance(),
85 &
message.GetExtension(unittest::optional_import_message_extension));
88 TEST(ExtensionSetTest, Accessors) {
91 unittest::TestAllExtensions
message;
94 TestUtil::ExpectAllExtensionsSet(
message);
96 TestUtil::ModifyRepeatedExtensions(&
message);
97 TestUtil::ExpectRepeatedExtensionsModified(
message);
103 unittest::TestAllExtensions
message;
107 TestUtil::ExpectExtensionsClear(
message);
113 EXPECT_NE(&unittest::OptionalGroup_extension::default_instance(),
114 &
message.GetExtension(unittest::optionalgroup_extension));
115 EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(),
116 &
message.GetExtension(unittest::optional_nested_message_extension));
118 &unittest::ForeignMessage::default_instance(),
119 &
message.GetExtension(unittest::optional_foreign_message_extension));
120 EXPECT_NE(&unittest_import::ImportMessage::default_instance(),
121 &
message.GetExtension(unittest::optional_import_message_extension));
126 TestUtil::ExpectAllExtensionsSet(
message);
129 TEST(ExtensionSetTest, ClearOneField) {
132 unittest::TestAllExtensions
message;
135 int64 original_value =
136 message.GetExtension(unittest::optional_int64_extension);
139 message.ClearExtension(unittest::optional_int64_extension);
148 message.SetExtension(unittest::optional_int64_extension, original_value);
149 TestUtil::ExpectAllExtensionsSet(
message);
152 TEST(ExtensionSetTest, SetAllocatedExtension) {
153 unittest::TestAllExtensions
message;
155 message.HasExtension(unittest::optional_foreign_message_extension));
157 unittest::ForeignMessage* foreign_message =
new unittest::ForeignMessage();
158 message.SetAllocatedExtension(unittest::optional_foreign_message_extension,
161 message.HasExtension(unittest::optional_foreign_message_extension));
163 unittest::optional_foreign_message_extension));
165 unittest::optional_foreign_message_extension));
169 message.SetAllocatedExtension(unittest::optional_foreign_message_extension,
170 new unittest::ForeignMessage());
173 message.SetAllocatedExtension(unittest::optional_foreign_message_extension,
176 message.HasExtension(unittest::optional_foreign_message_extension));
179 TEST(ExtensionSetTest, ReleaseExtension) {
180 proto2_wireformat_unittest::TestMessageSet
message;
182 unittest::TestMessageSetExtension1::message_set_extension));
184 unittest::TestMessageSetExtension1*
extension =
185 new unittest::TestMessageSetExtension1();
187 unittest::TestMessageSetExtension1::message_set_extension,
extension);
189 unittest::TestMessageSetExtension1::message_set_extension));
191 unittest::TestMessageSetExtension1* released_extension =
193 unittest::TestMessageSetExtension1::message_set_extension);
196 unittest::TestMessageSetExtension1::message_set_extension));
200 unittest::TestMessageSetExtension1::message_set_extension,
extension);
202 unittest::TestMessageSetExtension1::message_set_extension);
203 released_extension =
message.ReleaseExtension(
204 unittest::TestMessageSetExtension1::message_set_extension);
206 delete released_extension;
209 TEST(ExtensionSetTest, ArenaUnsafeArenaSetAllocatedAndRelease) {
211 unittest::TestAllExtensions*
message =
212 Arena::CreateMessage<unittest::TestAllExtensions>(&arena);
214 message->UnsafeArenaSetAllocatedExtension(
215 unittest::optional_foreign_message_extension, &
extension);
217 unittest::ForeignMessage* mutable_extension =
218 message->MutableExtension(unittest::optional_foreign_message_extension);
221 unittest::ForeignMessage* released_extension =
222 message->UnsafeArenaReleaseExtension(
223 unittest::optional_foreign_message_extension);
226 message->HasExtension(unittest::optional_foreign_message_extension));
229 message->UnsafeArenaSetAllocatedExtension(
230 unittest::optional_foreign_message_extension, &
extension);
233 TEST(ExtensionSetTest, UnsafeArenaSetAllocatedAndRelease) {
234 unittest::TestAllExtensions
message;
235 unittest::ForeignMessage*
extension =
new unittest::ForeignMessage();
236 message.UnsafeArenaSetAllocatedExtension(
237 unittest::optional_foreign_message_extension,
extension);
239 unittest::ForeignMessage* mutable_extension =
240 message.MutableExtension(unittest::optional_foreign_message_extension);
243 unittest::ForeignMessage* released_extension =
244 message.UnsafeArenaReleaseExtension(
245 unittest::optional_foreign_message_extension);
248 message.HasExtension(unittest::optional_foreign_message_extension));
251 message.UnsafeArenaSetAllocatedExtension(
252 unittest::optional_foreign_message_extension,
extension);
255 TEST(ExtensionSetTest, ArenaUnsafeArenaReleaseOfHeapAlloc) {
257 unittest::TestAllExtensions*
message =
258 Arena::CreateMessage<unittest::TestAllExtensions>(&arena);
259 unittest::ForeignMessage*
extension =
new unittest::ForeignMessage;
260 message->SetAllocatedExtension(unittest::optional_foreign_message_extension,
264 unittest::ForeignMessage* released_extension =
265 message->UnsafeArenaReleaseExtension(
266 unittest::optional_foreign_message_extension);
269 message->HasExtension(unittest::optional_foreign_message_extension));
274 unittest::TestAllExtensions message1, message2;
277 message2.CopyFrom(message1);
278 TestUtil::ExpectAllExtensionsSet(message2);
279 message2.CopyFrom(message1);
280 TestUtil::ExpectAllExtensionsSet(message2);
283 TEST(ExtensionSetTest, CopyFromPacked) {
284 unittest::TestPackedExtensions message1, message2;
286 TestUtil::SetPackedExtensions(&message1);
287 message2.CopyFrom(message1);
288 TestUtil::ExpectPackedExtensionsSet(message2);
289 message2.CopyFrom(message1);
290 TestUtil::ExpectPackedExtensionsSet(message2);
293 TEST(ExtensionSetTest, CopyFromUpcasted) {
294 unittest::TestAllExtensions message1, message2;
295 const Message& upcasted_message = message1;
298 message2.CopyFrom(upcasted_message);
299 TestUtil::ExpectAllExtensionsSet(message2);
301 message2.CopyFrom(upcasted_message);
302 TestUtil::ExpectAllExtensionsSet(message2);
305 TEST(ExtensionSetTest, SwapWithEmpty) {
306 unittest::TestAllExtensions message1, message2;
309 TestUtil::ExpectAllExtensionsSet(message1);
310 TestUtil::ExpectExtensionsClear(message2);
311 message1.Swap(&message2);
312 TestUtil::ExpectAllExtensionsSet(message2);
313 TestUtil::ExpectExtensionsClear(message1);
316 TEST(ExtensionSetTest, SwapWithSelf) {
317 unittest::TestAllExtensions
message;
320 TestUtil::ExpectAllExtensionsSet(
message);
322 TestUtil::ExpectAllExtensionsSet(
message);
325 TEST(ExtensionSetTest, SwapExtension) {
326 unittest::TestAllExtensions message1;
327 unittest::TestAllExtensions message2;
330 std::vector<const FieldDescriptor*>
fields;
333 const Reflection* reflection = message1.GetReflection();
334 reflection->SwapFields(&message1, &message2,
fields);
335 TestUtil::ExpectAllExtensionsSet(message1);
336 TestUtil::ExpectExtensionsClear(message2);
339 fields.push_back(reflection->FindKnownExtensionByNumber(12));
340 fields.push_back(reflection->FindKnownExtensionByNumber(25));
341 reflection->SwapFields(&message1, &message2,
fields);
343 EXPECT_TRUE(message1.HasExtension(unittest::optional_int32_extension));
344 EXPECT_FALSE(message1.HasExtension(unittest::optional_double_extension));
345 EXPECT_FALSE(message1.HasExtension(unittest::optional_cord_extension));
347 EXPECT_FALSE(message2.HasExtension(unittest::optional_int32_extension));
348 EXPECT_TRUE(message2.HasExtension(unittest::optional_double_extension));
349 EXPECT_TRUE(message2.HasExtension(unittest::optional_cord_extension));
352 TEST(ExtensionSetTest, SwapExtensionWithEmpty) {
353 unittest::TestAllExtensions message1;
354 unittest::TestAllExtensions message2;
355 unittest::TestAllExtensions message3;
359 const Reflection* reflection = message3.GetReflection();
360 std::vector<const FieldDescriptor*>
fields;
361 reflection->ListFields(message3, &
fields);
363 reflection->SwapFields(&message1, &message2,
fields);
365 TestUtil::ExpectExtensionsClear(message1);
366 TestUtil::ExpectExtensionsClear(message2);
369 TEST(ExtensionSetTest, SwapExtensionBothFull) {
370 unittest::TestAllExtensions message1;
371 unittest::TestAllExtensions message2;
376 const Reflection* reflection = message1.GetReflection();
377 std::vector<const FieldDescriptor*>
fields;
378 reflection->ListFields(message1, &
fields);
380 reflection->SwapFields(&message1, &message2,
fields);
382 TestUtil::ExpectAllExtensionsSet(message1);
383 TestUtil::ExpectAllExtensionsSet(message2);
386 TEST(ExtensionSetTest, ArenaSetAllExtension) {
388 unittest::TestAllExtensions* message1 =
389 Arena::CreateMessage<unittest::TestAllExtensions>(&arena1);
391 TestUtil::ExpectAllExtensionsSet(*message1);
394 TEST(ExtensionSetTest, ArenaCopyConstructor) {
396 unittest::TestAllExtensions* message1 =
397 Arena::CreateMessage<unittest::TestAllExtensions>(&arena1);
399 unittest::TestAllExtensions message2(*message1);
401 TestUtil::ExpectAllExtensionsSet(message2);
404 TEST(ExtensionSetTest, ArenaMergeFrom) {
406 unittest::TestAllExtensions* message1 =
407 Arena::CreateMessage<unittest::TestAllExtensions>(&arena1);
409 unittest::TestAllExtensions message2;
410 message2.MergeFrom(*message1);
412 TestUtil::ExpectAllExtensionsSet(message2);
415 TEST(ExtensionSetTest, ArenaSetAllocatedMessageAndRelease) {
417 unittest::TestAllExtensions*
message =
418 Arena::CreateMessage<unittest::TestAllExtensions>(&arena);
420 message->HasExtension(unittest::optional_foreign_message_extension));
422 unittest::ForeignMessage* foreign_message =
new unittest::ForeignMessage();
423 message->SetAllocatedExtension(unittest::optional_foreign_message_extension,
427 unittest::optional_foreign_message_extension));
430 unittest::ForeignMessage* released_message =
431 message->ReleaseExtension(unittest::optional_foreign_message_extension);
432 delete released_message;
434 message->HasExtension(unittest::optional_foreign_message_extension));
437 TEST(ExtensionSetTest, SwapExtensionBothFullWithArena) {
439 std::unique_ptr<Arena> arena2(
new Arena());
441 unittest::TestAllExtensions* message1 =
442 Arena::CreateMessage<unittest::TestAllExtensions>(&arena1);
443 unittest::TestAllExtensions* message2 =
444 Arena::CreateMessage<unittest::TestAllExtensions>(arena2.get());
448 message1->SetExtension(unittest::optional_int32_extension, 1);
449 message2->SetExtension(unittest::optional_int32_extension, 2);
450 message1->Swap(message2);
451 EXPECT_EQ(2, message1->GetExtension(unittest::optional_int32_extension));
452 EXPECT_EQ(1, message2->GetExtension(unittest::optional_int32_extension));
454 message1->SetExtension(unittest::optional_int32_extension, 101);
455 message2->SetExtension(unittest::optional_int32_extension, 101);
456 TestUtil::ExpectAllExtensionsSet(*message1);
457 TestUtil::ExpectAllExtensionsSet(*message2);
459 TestUtil::ExpectAllExtensionsSet(*message1);
461 Arena arena3, arena4;
463 unittest::TestAllExtensions* message3 =
464 Arena::CreateMessage<unittest::TestAllExtensions>(&arena3);
465 unittest::TestAllExtensions* message4 =
466 Arena::CreateMessage<unittest::TestAllExtensions>(&arena4);
468 message3->Swap(message4);
470 TestUtil::ExpectAllExtensionsSet(*message4);
473 TEST(ExtensionSetTest, SwapFieldsOfExtensionBothFullWithArena) {
475 Arena* arena2 =
new Arena();
477 unittest::TestAllExtensions* message1 =
478 Arena::CreateMessage<unittest::TestAllExtensions>(&arena1);
479 unittest::TestAllExtensions* message2 =
480 Arena::CreateMessage<unittest::TestAllExtensions>(arena2);
485 const Reflection* reflection = message1->GetReflection();
486 std::vector<const FieldDescriptor*>
fields;
487 reflection->ListFields(*message1, &
fields);
488 reflection->SwapFields(message1, message2,
fields);
489 TestUtil::ExpectAllExtensionsSet(*message1);
490 TestUtil::ExpectAllExtensionsSet(*message2);
492 TestUtil::ExpectAllExtensionsSet(*message1);
495 TEST(ExtensionSetTest, SwapExtensionWithSelf) {
496 unittest::TestAllExtensions message1;
500 std::vector<const FieldDescriptor*>
fields;
501 const Reflection* reflection = message1.GetReflection();
502 reflection->ListFields(message1, &
fields);
503 reflection->SwapFields(&message1, &message1,
fields);
505 TestUtil::ExpectAllExtensionsSet(message1);
508 TEST(ExtensionSetTest, SerializationToArray) {
515 unittest::TestAllExtensions
source;
516 unittest::TestAllTypes destination;
528 TEST(ExtensionSetTest, SerializationToStream) {
536 unittest::TestAllExtensions
source;
537 unittest::TestAllTypes destination;
544 io::CodedOutputStream output_stream(&array_stream);
545 source.SerializeWithCachedSizes(&output_stream);
552 TEST(ExtensionSetTest, PackedSerializationToArray) {
559 unittest::TestPackedExtensions
source;
560 unittest::TestPackedTypes destination;
561 TestUtil::SetPackedExtensions(&
source);
569 TestUtil::ExpectPackedFieldsSet(destination);
572 TEST(ExtensionSetTest, PackedSerializationToStream) {
580 unittest::TestPackedExtensions
source;
581 unittest::TestPackedTypes destination;
582 TestUtil::SetPackedExtensions(&
source);
588 io::CodedOutputStream output_stream(&array_stream);
589 source.SerializeWithCachedSizes(&output_stream);
593 TestUtil::ExpectPackedFieldsSet(destination);
596 TEST(ExtensionSetTest, NestedExtensionGroup) {
598 unittest::TestGroup
source;
599 unittest::TestGroupExtension destination;
602 source.mutable_optionalgroup()->set_a(117);
603 source.set_optional_foreign_enum(unittest::FOREIGN_BAZ);
608 .GetExtension(unittest::TestNestedExtension::optionalgroup_extension)
612 unittest::TestNestedExtension::optionalgroup_extension)
615 unittest::TestNestedExtension::optional_foreign_enum_extension));
617 unittest::FOREIGN_BAZ,
618 destination.GetExtension(
619 unittest::TestNestedExtension::optional_foreign_enum_extension));
622 TEST(ExtensionSetTest, Parsing) {
624 unittest::TestAllTypes
source;
625 unittest::TestAllExtensions destination;
631 TestUtil::SetOneofFields(&destination);
632 TestUtil::ExpectAllExtensionsSet(destination);
635 TEST(ExtensionSetTest, PackedParsing) {
637 unittest::TestPackedTypes
source;
638 unittest::TestPackedExtensions destination;
641 TestUtil::SetPackedFields(&
source);
644 TestUtil::ExpectPackedExtensionsSet(destination);
647 TEST(ExtensionSetTest, PackedToUnpackedParsing) {
648 unittest::TestPackedTypes
source;
649 unittest::TestUnpackedExtensions destination;
652 TestUtil::SetPackedFields(&
source);
655 TestUtil::ExpectUnpackedExtensionsSet(destination);
658 unittest::TestUnpackedTypes unpacked;
659 TestUtil::SetUnpackedFields(&unpacked);
661 EXPECT_EQ(unpacked.SerializeAsString().size(),
662 destination.SerializeAsString().size());
666 destination.AddExtension(unittest::unpacked_int32_extension, 1);
667 destination.AddExtension(unittest::unpacked_enum_extension,
668 protobuf_unittest::FOREIGN_BAR);
671 TEST(ExtensionSetTest, UnpackedToPackedParsing) {
672 unittest::TestUnpackedTypes
source;
673 unittest::TestPackedExtensions destination;
676 TestUtil::SetUnpackedFields(&
source);
679 TestUtil::ExpectPackedExtensionsSet(destination);
682 unittest::TestPackedTypes packed;
683 TestUtil::SetPackedFields(&packed);
685 EXPECT_EQ(packed.SerializeAsString().size(),
686 destination.SerializeAsString().size());
690 destination.AddExtension(unittest::packed_int32_extension, 1);
691 destination.AddExtension(unittest::packed_enum_extension,
692 protobuf_unittest::FOREIGN_BAR);
698 unittest::TestAllExtensions
message;
702 message.MutableExtension(unittest::TestRequired::single);
705 message.MutableExtension(unittest::TestRequired::single)->set_a(1);
707 message.MutableExtension(unittest::TestRequired::single)->set_b(2);
709 message.MutableExtension(unittest::TestRequired::single)->set_c(3);
712 message.AddExtension(unittest::TestRequired::multi);
715 message.MutableExtension(unittest::TestRequired::multi, 0)->set_a(1);
717 message.MutableExtension(unittest::TestRequired::multi, 0)->set_b(2);
719 message.MutableExtension(unittest::TestRequired::multi, 0)->set_c(3);
723 TEST(ExtensionSetTest, MutableString) {
725 unittest::TestAllExtensions
message;
727 message.MutableExtension(unittest::optional_string_extension)->assign(
"foo");
729 EXPECT_EQ(
"foo",
message.GetExtension(unittest::optional_string_extension));
731 message.AddExtension(unittest::repeated_string_extension)->assign(
"bar");
734 message.GetExtension(unittest::repeated_string_extension, 0));
737 TEST(ExtensionSetTest, SpaceUsedExcludingSelf) {
740 #define TEST_SCALAR_EXTENSIONS_SPACE_USED(type, value) \
742 unittest::TestAllExtensions message; \
743 const int base_size = message.SpaceUsed(); \
744 message.SetExtension(unittest::optional_##type##_extension, value); \
745 int min_expected_size = \
747 sizeof(message.GetExtension(unittest::optional_##type##_extension)); \
748 EXPECT_LE(min_expected_size, message.SpaceUsed()); \
764 #undef TEST_SCALAR_EXTENSIONS_SPACE_USED
766 unittest::TestAllExtensions
message;
767 const int base_size =
message.SpaceUsed();
768 message.SetExtension(unittest::optional_nested_enum_extension,
769 unittest::TestAllTypes::FOO);
770 int min_expected_size =
772 sizeof(
message.GetExtension(unittest::optional_nested_enum_extension));
778 unittest::TestAllExtensions
message;
779 const int base_size =
message.SpaceUsed();
781 "this is a fairly large string that will cause some "
782 "allocation in order to store it in the extension");
783 message.SetExtension(unittest::optional_string_extension, s);
784 int min_expected_size = base_size +
s.length();
789 unittest::TestAllExtensions
message;
790 const int base_size =
message.SpaceUsed();
791 unittest::ForeignMessage foreign;
793 message.MutableExtension(unittest::optional_foreign_message_extension)
795 int min_expected_size = base_size + foreign.SpaceUsed();
809 #define TEST_REPEATED_EXTENSIONS_SPACE_USED(type, cpptype, value) \
811 unittest::TestAllExtensions message; \
812 const int base_size = message.SpaceUsed(); \
813 int min_expected_size = sizeof(RepeatedField<cpptype>) + base_size; \
814 message.AddExtension(unittest::repeated_##type##_extension, value); \
815 message.ClearExtension(unittest::repeated_##type##_extension); \
816 const int empty_repeated_field_size = message.SpaceUsed(); \
817 EXPECT_LE(min_expected_size, empty_repeated_field_size) << #type; \
818 message.AddExtension(unittest::repeated_##type##_extension, value); \
819 message.AddExtension(unittest::repeated_##type##_extension, value); \
820 EXPECT_EQ(empty_repeated_field_size, message.SpaceUsed()) << #type; \
821 message.ClearExtension(unittest::repeated_##type##_extension); \
822 const int old_capacity = \
823 message.GetRepeatedExtension(unittest::repeated_##type##_extension) \
825 EXPECT_GE(old_capacity, kMinRepeatedFieldAllocationSize); \
826 for (int i = 0; i < 16; ++i) { \
827 message.AddExtension(unittest::repeated_##type##_extension, value); \
829 int expected_size = \
832 .GetRepeatedExtension(unittest::repeated_##type##_extension) \
835 empty_repeated_field_size; \
836 EXPECT_LE(expected_size, message.SpaceUsed()) << #type; \
853 unittest::TestAllTypes::FOO);
854 #undef TEST_REPEATED_EXTENSIONS_SPACE_USED
857 unittest::TestAllExtensions
message;
858 const int base_size =
message.SpaceUsed();
859 int min_expected_size =
sizeof(RepeatedPtrField<std::string>) + base_size;
864 for (
int i = 0;
i < 16; ++
i) {
865 message.AddExtension(unittest::repeated_string_extension,
value);
873 unittest::TestAllExtensions
message;
874 const int base_size =
message.SpaceUsed();
875 int min_expected_size =
876 sizeof(RepeatedPtrField<unittest::ForeignMessage>) + base_size;
877 unittest::ForeignMessage prototype;
879 for (
int i = 0;
i < 16; ++
i) {
880 message.AddExtension(unittest::repeated_foreign_message_extension)
881 ->CopyFrom(prototype);
890 template <
typename T,
typename M,
typename ID>
897 for (; iter !=
end; ++iter) {
903 template <
typename T,
typename M,
typename ID>
909 for (; iter !=
end; ++iter) {
914 TEST(ExtensionSetTest, RepeatedFields) {
915 unittest::TestAllExtensions
message;
920 message.GetRepeatedExtension(unittest::repeated_int32_extension).size());
922 0,
message.GetRepeatedExtension(unittest::repeated_nested_enum_extension)
926 message.GetRepeatedExtension(unittest::repeated_string_extension).size());
929 message.GetRepeatedExtension(unittest::repeated_nested_message_extension)
932 unittest::TestAllTypes::NestedMessage nested_message;
933 nested_message.set_bb(42);
934 unittest::TestAllTypes::NestedEnum nested_enum =
935 unittest::TestAllTypes::NestedEnum_MIN;
937 for (
int i = 0;
i < 10; ++
i) {
938 message.AddExtension(unittest::repeated_int32_extension, 1);
939 message.AddExtension(unittest::repeated_int64_extension, 2);
940 message.AddExtension(unittest::repeated_uint32_extension, 3);
941 message.AddExtension(unittest::repeated_uint64_extension, 4);
942 message.AddExtension(unittest::repeated_sint32_extension, 5);
943 message.AddExtension(unittest::repeated_sint64_extension, 6);
944 message.AddExtension(unittest::repeated_fixed32_extension, 7);
945 message.AddExtension(unittest::repeated_fixed64_extension, 8);
946 message.AddExtension(unittest::repeated_sfixed32_extension, 7);
947 message.AddExtension(unittest::repeated_sfixed64_extension, 8);
948 message.AddExtension(unittest::repeated_float_extension, 9.0);
949 message.AddExtension(unittest::repeated_double_extension, 10.0);
950 message.AddExtension(unittest::repeated_bool_extension,
true);
951 message.AddExtension(unittest::repeated_nested_enum_extension, nested_enum);
952 message.AddExtension(unittest::repeated_string_extension,
954 message.AddExtension(unittest::repeated_bytes_extension,
956 message.AddExtension(unittest::repeated_nested_message_extension)
957 ->CopyFrom(nested_message);
958 message.AddExtension(unittest::repeated_nested_enum_extension, nested_enum);
962 unittest::repeated_int32_extension, 0));
963 IncAllExtensions<int32>(&
message, unittest::repeated_int32_extension, 1);
965 unittest::repeated_int32_extension, 0));
968 unittest::repeated_int64_extension, 0));
969 IncAllExtensions<int64>(&
message, unittest::repeated_int64_extension, 1);
971 unittest::repeated_int64_extension, 0));
974 message, unittest::repeated_uint32_extension, 0));
975 IncAllExtensions<uint32>(&
message, unittest::repeated_uint32_extension, 1);
977 message, unittest::repeated_uint32_extension, 0));
980 message, unittest::repeated_uint64_extension, 0));
981 IncAllExtensions<uint64>(&
message, unittest::repeated_uint64_extension, 1);
983 message, unittest::repeated_uint64_extension, 0));
986 message, unittest::repeated_sint32_extension, 0));
987 IncAllExtensions<int32>(&
message, unittest::repeated_sint32_extension, 1);
989 message, unittest::repeated_sint32_extension, 0));
992 message, unittest::repeated_sint64_extension, 0));
993 IncAllExtensions<int64>(&
message, unittest::repeated_sint64_extension, 1);
995 message, unittest::repeated_sint64_extension, 0));
998 message, unittest::repeated_fixed32_extension, 0));
999 IncAllExtensions<uint32>(&
message, unittest::repeated_fixed32_extension, 1);
1001 message, unittest::repeated_fixed32_extension, 0));
1004 message, unittest::repeated_fixed64_extension, 0));
1005 IncAllExtensions<uint64>(&
message, unittest::repeated_fixed64_extension, 1);
1007 message, unittest::repeated_fixed64_extension, 0));
1014 unittest::repeated_float_extension, 0));
1015 IncAllExtensions<float>(&
message, unittest::repeated_float_extension, 1);
1017 message, unittest::repeated_float_extension, 0));
1019 ASSERT_EQ(100, SumAllExtensions<double>(
1020 message, unittest::repeated_double_extension, 0));
1021 IncAllExtensions<double>(&
message, unittest::repeated_double_extension, 1);
1022 ASSERT_EQ(110, SumAllExtensions<double>(
1023 message, unittest::repeated_double_extension, 0));
1029 .MutableRepeatedExtension(unittest::repeated_string_extension)
1033 .MutableRepeatedExtension(unittest::repeated_string_extension)
1035 string_iter != string_end; ++string_iter) {
1036 *string_iter +=
"test";
1040 for (string_const_iter =
1041 message.GetRepeatedExtension(unittest::repeated_string_extension)
1044 message.GetRepeatedExtension(unittest::repeated_string_extension)
1046 string_iter != string_end; ++string_iter) {
1053 .MutableRepeatedExtension(
1054 unittest::repeated_nested_enum_extension)
1057 .MutableRepeatedExtension(
1058 unittest::repeated_nested_enum_extension)
1060 enum_iter != enum_end; ++enum_iter) {
1061 *enum_iter = unittest::TestAllTypes::NestedEnum_MAX;
1067 for (enum_const_iter =
1069 .GetRepeatedExtension(unittest::repeated_nested_enum_extension)
1073 .GetRepeatedExtension(unittest::repeated_nested_enum_extension)
1075 enum_const_iter != enum_const_end; ++enum_const_iter) {
1076 ASSERT_EQ(*enum_const_iter, unittest::TestAllTypes::NestedEnum_MAX);
1082 .MutableRepeatedExtension(
1083 unittest::repeated_nested_message_extension)
1086 .MutableRepeatedExtension(
1087 unittest::repeated_nested_message_extension)
1089 msg_iter !=
msg_end; ++msg_iter) {
1090 msg_iter->set_bb(1234);
1097 .GetRepeatedExtension(
1098 unittest::repeated_nested_message_extension)
1101 .GetRepeatedExtension(
1102 unittest::repeated_nested_message_extension)
1104 msg_const_iter != msg_const_end; ++msg_const_iter) {
1109 #if __cplusplus >= 201103L
1112 *
message.MutableRepeatedExtension(unittest::repeated_int32_extension)) {
1115 for (
const auto&
x :
1116 message.GetRepeatedExtension(unittest::repeated_int32_extension)) {
1121 *
message.MutableRepeatedExtension(unittest::repeated_string_extension)) {
1122 x =
"test_range_based_for";
1124 for (
const auto&
x :
1125 message.GetRepeatedExtension(unittest::repeated_string_extension)) {
1129 for (
auto&
x : *
message.MutableRepeatedExtension(
1130 unittest::repeated_nested_message_extension)) {
1133 for (
const auto&
x : *
message.MutableRepeatedExtension(
1134 unittest::repeated_nested_message_extension)) {
1141 TEST(ExtensionSetTest, AbsentExtension) {
1142 unittest::TestAllExtensions
message;
1143 message.MutableRepeatedExtension(unittest::repeated_nested_message_extension)
1147 message.ExtensionSize(unittest::repeated_nested_message_extension));
1149 message.GetExtension(unittest::repeated_nested_message_extension, 0)
1153 #ifdef PROTOBUF_HAS_DEATH_TEST
1155 TEST(ExtensionSetTest, InvalidEnumDeath) {
1156 unittest::TestAllExtensions
message;
1158 message.SetExtension(unittest::optional_foreign_enum_extension,
1159 static_cast<unittest::ForeignEnum
>(53)),
1163 #endif // PROTOBUF_HAS_DEATH_TEST
1165 TEST(ExtensionSetTest, DynamicExtensions) {
1169 dynamic_proto.
set_name(
"dynamic_extensions_test.proto");
1179 template_descriptor->CopyTo(&template_descriptor_proto);
1185 template_descriptor_proto.
field());
1200 type_name->replace(0,
prefix.size(),
".dynamic_extensions.");
1207 const FileDescriptor* file = dynamic_pool.BuildFile(dynamic_proto);
1209 DynamicMessageFactory dynamic_factory(&dynamic_pool);
1210 dynamic_factory.SetDelegateToGeneratedFactory(
true);
1216 unittest::TestDynamicExtensions dynamic_extension;
1218 unittest::TestDynamicExtensions
message;
1219 message.set_scalar_extension(123);
1220 message.set_enum_extension(unittest::FOREIGN_BAR);
1221 message.set_dynamic_enum_extension(
1222 unittest::TestDynamicExtensions::DYNAMIC_BAZ);
1223 message.mutable_message_extension()->set_c(456);
1224 message.mutable_dynamic_message_extension()->set_dynamic_field(789);
1225 message.add_repeated_extension(
"foo");
1226 message.add_repeated_extension(
"bar");
1227 message.add_packed_extension(12);
1228 message.add_packed_extension(-34);
1229 message.add_packed_extension(56);
1230 message.add_packed_extension(-78);
1235 message.mutable_unknown_fields()->AddVarint(
1236 unittest::TestDynamicExtensions::kDynamicEnumExtensionFieldNumber,
1239 message.mutable_unknown_fields()->AddLengthDelimited(54321,
"unknown");
1246 unittest::TestAllExtensions
message;
1250 input.SetExtensionRegistry(&dynamic_pool, &dynamic_factory);
1257 "[dynamic_extensions.scalar_extension]: 123\n"
1258 "[dynamic_extensions.enum_extension]: FOREIGN_BAR\n"
1259 "[dynamic_extensions.dynamic_enum_extension]: DYNAMIC_BAZ\n"
1260 "[dynamic_extensions.message_extension] {\n"
1263 "[dynamic_extensions.dynamic_message_extension] {\n"
1264 " dynamic_field: 789\n"
1266 "[dynamic_extensions.repeated_extension]: \"foo\"\n"
1267 "[dynamic_extensions.repeated_extension]: \"bar\"\n"
1268 "[dynamic_extensions.packed_extension]: 12\n"
1269 "[dynamic_extensions.packed_extension]: -34\n"
1270 "[dynamic_extensions.packed_extension]: 56\n"
1271 "[dynamic_extensions.packed_extension]: -78\n"
1273 "54321: \"unknown\"\n",
1282 unittest::TestAllExtensions message2;
1285 input.SetExtensionRegistry(&dynamic_pool, &dynamic_factory);
1294 file->FindExtensionByName(
"message_extension");
1296 const Message& sub_message =
1298 const unittest::ForeignMessage* typed_sub_message =
1300 dynamic_cast<const unittest::ForeignMessage*
>(&sub_message);
1302 static_cast<const unittest::ForeignMessage*
>(&sub_message);
1312 file->FindExtensionByName(
"dynamic_message_extension");
1314 const Message& parent = unittest::TestAllExtensions::default_instance();
1315 const Message& sub_message = parent.GetReflection()->GetMessage(
1316 parent, dynamic_message_extension, &dynamic_factory);
1317 const Message* prototype =
1318 dynamic_factory.GetPrototype(dynamic_message_extension->message_type());