39 #include <google/protobuf/unittest.pb.h>
47 using unittest::ForeignMessage;
48 using unittest::TestAllExtensions;
49 using unittest::TestAllTypes;
53 static int Func(
int i,
int j) {
return i * j; }
61 TEST(RepeatedFieldReflectionTest, RegularFields) {
63 const Reflection* refl =
message.GetReflection();
66 for (
int i = 0;
i < 10; ++
i) {
70 message.add_repeated_foreign_message()->set_c(
Func(
i, 6));
75 desc->FindFieldByName(
"repeated_int32");
77 desc->FindFieldByName(
"repeated_double");
79 desc->FindFieldByName(
"repeated_string");
81 desc->FindFieldByName(
"repeated_foreign_message");
85 refl->GetRepeatedField<
int32>(
message, fd_repeated_int32);
87 refl->GetRepeatedField<
double>(
message, fd_repeated_double);
91 refl->MutableRepeatedField<
int32>(&
message, fd_repeated_int32);
93 refl->MutableRepeatedField<
double>(&
message, fd_repeated_double);
96 const RepeatedPtrField<std::string>& rpf_string =
98 const RepeatedPtrField<ForeignMessage>& rpf_foreign_message =
99 refl->GetRepeatedPtrField<ForeignMessage>(
message,
100 fd_repeated_foreign_message);
101 const RepeatedPtrField<Message>& rpf_message =
102 refl->GetRepeatedPtrField<Message>(
message, fd_repeated_foreign_message);
105 RepeatedPtrField<std::string>* mrpf_string =
107 RepeatedPtrField<ForeignMessage>* mrpf_foreign_message =
108 refl->MutableRepeatedPtrField<ForeignMessage>(
109 &
message, fd_repeated_foreign_message);
110 RepeatedPtrField<Message>* mrpf_message =
111 refl->MutableRepeatedPtrField<Message>(&
message,
112 fd_repeated_foreign_message);
115 for (
int i = 0;
i < 10; ++
i) {
121 EXPECT_EQ(down_cast<const ForeignMessage*>(&rpf_message.Get(
i))->c(),
129 EXPECT_EQ(down_cast<const ForeignMessage*>(&mrpf_message->Get(
i))->c(),
133 mrf_int32->Set(
i,
Func(
i, -1));
134 mrf_double->Set(
i,
Func(
i, -2));
135 mrpf_string->Mutable(
i)->assign(
StrFunc(
i, -5));
136 mrpf_foreign_message->Mutable(
i)->set_c(
Func(
i, -6));
141 down_cast<ForeignMessage*>(mrpf_message->Mutable(
i))->set_c(
Func(
i, 7));
145 #ifdef PROTOBUF_HAS_DEATH_TEST
148 desc->FindFieldByName(
"optional_int32");
149 EXPECT_DEATH(refl->GetRepeatedField<
int32>(
message, fd_optional_int32),
150 "requires a repeated field");
151 EXPECT_DEATH(refl->GetRepeatedField<
double>(
message, fd_repeated_int32),
152 "not the right type");
153 EXPECT_DEATH(refl->GetRepeatedPtrField<TestAllTypes>(
154 message, fd_repeated_foreign_message),
155 "wrong submessage type");
156 #endif // PROTOBUF_HAS_DEATH_TEST
160 TEST(RepeatedFieldReflectionTest, ExtensionFields) {
161 TestAllExtensions extended_message;
162 const Reflection* refl = extended_message.GetReflection();
165 for (
int i = 0;
i < 10; ++
i) {
166 extended_message.AddExtension(unittest::repeated_int64_extension,
171 desc->file()->FindExtensionByName(
"repeated_int64_extension");
175 refl->GetRepeatedField<
int64>(extended_message,
176 fd_repeated_int64_extension);
179 &extended_message, fd_repeated_int64_extension);
181 for (
int i = 0;
i < 10; ++
i) {
183 mrf_int64_extension->Set(
i,
Func(
i, -1));
185 unittest::repeated_int64_extension,
i));
189 template <
typename Ref,
typename MessageType,
typename ValueType>
190 void TestRepeatedFieldRefIteratorForPrimitive(
191 const Ref& handle,
const MessageType&
message,
192 ValueType (MessageType::*GetFunc)(
int)
const) {
194 for (
typename Ref::const_iterator
it = handle.begin();
it != handle.end();
202 template <
typename MessageType,
typename ValueType>
203 void TestRepeatedFieldRefIteratorForString(
204 const RepeatedFieldRef<std::string>& handle,
const MessageType&
message,
205 ValueType (MessageType::*GetFunc)(
int)
const) {
207 for (
typename RepeatedFieldRef<std::string>::const_iterator
it =
209 it != handle.end(); ++
it) {
218 TEST(RepeatedFieldReflectionTest, RepeatedFieldRefForRegularFields) {
220 const Reflection* refl =
message.GetReflection();
223 for (
int i = 0;
i < 10; ++
i) {
227 message.add_repeated_foreign_message()->set_c(
Func(
i, 6));
232 desc->FindFieldByName(
"repeated_int32");
234 desc->FindFieldByName(
"repeated_double");
236 desc->FindFieldByName(
"repeated_string");
238 desc->FindFieldByName(
"repeated_foreign_message");
241 const RepeatedFieldRef<int32> rf_int32 =
242 refl->GetRepeatedFieldRef<
int32>(
message, fd_repeated_int32);
243 const RepeatedFieldRef<double> rf_double =
244 refl->GetRepeatedFieldRef<
double>(
message, fd_repeated_double);
245 const RepeatedFieldRef<std::string> rf_string =
247 const RepeatedFieldRef<ForeignMessage> rf_foreign_message =
248 refl->GetRepeatedFieldRef<ForeignMessage>(
message,
249 fd_repeated_foreign_message);
250 const RepeatedFieldRef<Message> rf_message =
251 refl->GetRepeatedFieldRef<Message>(
message, fd_repeated_foreign_message);
254 const MutableRepeatedFieldRef<int32> mrf_int32 =
255 refl->GetMutableRepeatedFieldRef<
int32>(&
message, fd_repeated_int32);
256 const MutableRepeatedFieldRef<double> mrf_double =
257 refl->GetMutableRepeatedFieldRef<
double>(&
message, fd_repeated_double);
258 const MutableRepeatedFieldRef<std::string> mrf_string =
261 const MutableRepeatedFieldRef<ForeignMessage> mrf_foreign_message =
262 refl->GetMutableRepeatedFieldRef<ForeignMessage>(
263 &
message, fd_repeated_foreign_message);
264 const MutableRepeatedFieldRef<Message> mrf_message =
265 refl->GetMutableRepeatedFieldRef<Message>(&
message,
266 fd_repeated_foreign_message);
274 EXPECT_EQ(
message.repeated_foreign_message_size(), rf_foreign_message.size());
276 mrf_foreign_message.size());
292 for (
int i = 0;
i < 10; ++
i) {
297 ForeignMessage scratch_space;
300 down_cast<const ForeignMessage&>(rf_message.Get(
i, &scratch_space)).c(),
309 down_cast<const ForeignMessage&>(mrf_message.Get(
i, &scratch_space))
314 mrf_int32.Set(
i,
Func(
i, -1));
315 mrf_double.Set(
i,
Func(
i, -2));
317 ForeignMessage foreign_message;
318 foreign_message.set_c(
Func(
i, -6));
319 mrf_foreign_message.Set(
i, foreign_message);
324 foreign_message.set_c(
Func(
i, 7));
325 mrf_message.Set(
i, foreign_message);
330 TestRepeatedFieldRefIteratorForPrimitive(rf_int32,
message,
331 &TestAllTypes::repeated_int32);
332 TestRepeatedFieldRefIteratorForPrimitive(rf_double,
message,
333 &TestAllTypes::repeated_double);
334 TestRepeatedFieldRefIteratorForString(rf_string,
message,
335 &TestAllTypes::repeated_string);
338 typedef RepeatedFieldRef<ForeignMessage>::iterator MessageIterator;
340 for (MessageIterator
it = rf_foreign_message.begin();
341 it != rf_foreign_message.end(); ++
it) {
349 MessageIterator old_it = rf_foreign_message.begin();
350 MessageIterator new_it = old_it++;
353 for (
index = 1; old_it != rf_foreign_message.end(); ++old_it, ++
index) {
359 for (
index = 0; old_it != rf_foreign_message.end(); ++old_it, ++
index) {
364 for (
index = 0; new_it != rf_foreign_message.end(); ++new_it, ++
index) {
371 mrf_double.Add(1234.0);
372 mrf_string.Add(
"1234");
373 ForeignMessage foreign_message;
374 foreign_message.set_c(1234);
375 mrf_foreign_message.Add(foreign_message);
382 mrf_int32.RemoveLast();
383 mrf_double.RemoveLast();
384 mrf_string.RemoveLast();
385 mrf_foreign_message.RemoveLast();
392 mrf_int32.SwapElements(0, 9);
393 mrf_double.SwapElements(0, 9);
394 mrf_string.SwapElements(0, 9);
395 mrf_foreign_message.SwapElements(0, 9);
409 mrf_foreign_message.Clear();
427 #ifdef PROTOBUF_HAS_DEATH_TEST
431 desc->FindFieldByName(
"optional_int32");
432 EXPECT_DEATH(refl->GetRepeatedFieldRef<
int32>(
message, fd_optional_int32),
434 EXPECT_DEATH(refl->GetRepeatedFieldRef<
double>(
message, fd_repeated_int32),
436 EXPECT_DEATH(refl->GetRepeatedFieldRef<TestAllTypes>(
437 message, fd_repeated_foreign_message),
440 #endif // PROTOBUF_HAS_DEATH_TEST
443 TEST(RepeatedFieldReflectionTest, RepeatedFieldRefForEnums) {
445 const Reflection* refl =
message.GetReflection();
448 for (
int i = 0;
i < 10; ++
i) {
449 message.add_repeated_nested_enum(TestAllTypes::BAR);
453 desc->FindFieldByName(
"repeated_nested_enum");
454 const RepeatedFieldRef<TestAllTypes::NestedEnum> enum_ref =
455 refl->GetRepeatedFieldRef<TestAllTypes::NestedEnum>(
456 message, fd_repeated_nested_enum);
457 const MutableRepeatedFieldRef<TestAllTypes::NestedEnum> mutable_enum_ref =
458 refl->GetMutableRepeatedFieldRef<TestAllTypes::NestedEnum>(
459 &
message, fd_repeated_nested_enum);
460 const RepeatedFieldRef<int32> int32_ref =
461 refl->GetRepeatedFieldRef<
int32>(
message, fd_repeated_nested_enum);
462 const MutableRepeatedFieldRef<int32> mutable_int32_ref =
464 fd_repeated_nested_enum);
476 for (
int i = 0;
i < 10; ++
i) {
477 EXPECT_EQ(TestAllTypes::BAR, enum_ref.Get(
i));
478 EXPECT_EQ(TestAllTypes::BAR, mutable_enum_ref.Get(
i));
479 mutable_enum_ref.Set(
i, TestAllTypes::BAZ);
480 EXPECT_EQ(TestAllTypes::BAZ, enum_ref.Get(
i));
483 message.set_repeated_nested_enum(
i, TestAllTypes::BAR);
484 EXPECT_EQ(TestAllTypes::BAR, int32_ref.Get(
i));
485 EXPECT_EQ(TestAllTypes::BAR, mutable_int32_ref.Get(
i));
486 mutable_int32_ref.Set(
i, TestAllTypes::BAZ);
487 EXPECT_EQ(TestAllTypes::BAZ, int32_ref.Get(
i));
491 TestRepeatedFieldRefIteratorForPrimitive(enum_ref,
message,
492 &TestAllTypes::repeated_nested_enum);
493 TestRepeatedFieldRefIteratorForPrimitive(int32_ref,
message,
494 &TestAllTypes::repeated_nested_enum);
497 mutable_enum_ref.Add(TestAllTypes::FOO);
499 mutable_int32_ref.Add(TestAllTypes::BAR);
503 mutable_enum_ref.RemoveLast();
505 mutable_int32_ref.RemoveLast();
509 mutable_enum_ref.Set(0, TestAllTypes::BAR);
510 mutable_enum_ref.Set(9, TestAllTypes::BAZ);
511 mutable_enum_ref.SwapElements(0, 9);
512 EXPECT_EQ(TestAllTypes::BAZ, enum_ref.Get(0));
513 EXPECT_EQ(TestAllTypes::BAR, enum_ref.Get(9));
514 mutable_int32_ref.SwapElements(0, 9);
515 EXPECT_EQ(TestAllTypes::BAR, enum_ref.Get(0));
516 EXPECT_EQ(TestAllTypes::BAZ, enum_ref.Get(9));
519 mutable_enum_ref.Clear();
521 mutable_enum_ref.Add(TestAllTypes::FOO);
523 mutable_int32_ref.Clear();
533 TEST(RepeatedFieldReflectionTest, RepeatedFieldRefForExtensionFields) {
534 TestAllExtensions extended_message;
535 const Reflection* refl = extended_message.GetReflection();
538 for (
int i = 0;
i < 10; ++
i) {
539 extended_message.AddExtension(unittest::repeated_int64_extension,
544 desc->file()->FindExtensionByName(
"repeated_int64_extension");
547 const RepeatedFieldRef<int64> rf_int64_extension =
548 refl->GetRepeatedFieldRef<
int64>(extended_message,
549 fd_repeated_int64_extension);
551 const MutableRepeatedFieldRef<int64> mrf_int64_extension =
552 refl->GetMutableRepeatedFieldRef<
int64>(&extended_message,
553 fd_repeated_int64_extension);
555 for (
int i = 0;
i < 10; ++
i) {
557 mrf_int64_extension.Set(
i,
Func(
i, -1));
559 unittest::repeated_int64_extension,
i));
564 TEST(RepeatedFieldReflectionTest, RepeatedFieldRefMergeFromAndSwap) {
566 TestAllTypes m0, m1, m2;
567 for (
int i = 0;
i < 10; ++
i) {
568 m0.add_repeated_int32(
Func(
i, 1));
569 m0.add_repeated_double(
Func(
i, 2));
570 m0.add_repeated_string(
StrFunc(
i, 5));
571 m0.add_repeated_foreign_message()->set_c(
Func(
i, 6));
572 m0.add_repeated_nested_enum(TestAllTypes::FOO);
573 m1.add_repeated_int32(
Func(
i, 11));
574 m1.add_repeated_double(
Func(
i, 12));
575 m1.add_repeated_string(
StrFunc(
i, 15));
576 m1.add_repeated_foreign_message()->set_c(
Func(
i, 16));
577 m1.add_repeated_nested_enum(TestAllTypes::BAR);
578 m2.add_repeated_int32(
Func(
i, 21));
579 m2.add_repeated_double(
Func(
i, 22));
580 m2.add_repeated_string(
StrFunc(
i, 25));
581 m2.add_repeated_foreign_message()->set_c(
Func(
i, 26));
582 m2.add_repeated_nested_enum(TestAllTypes::BAZ);
585 const Reflection* refl = m0.GetReflection();
590 desc->FindFieldByName(
"repeated_int32");
592 desc->FindFieldByName(
"repeated_double");
594 desc->FindFieldByName(
"repeated_string");
596 desc->FindFieldByName(
"repeated_foreign_message");
598 desc->FindFieldByName(
"repeated_nested_enum");
601 const MutableRepeatedFieldRef<int32> mrf_int32 =
602 refl->GetMutableRepeatedFieldRef<
int32>(&m0, fd_repeated_int32);
603 const MutableRepeatedFieldRef<double> mrf_double =
604 refl->GetMutableRepeatedFieldRef<
double>(&m0, fd_repeated_double);
605 const MutableRepeatedFieldRef<std::string> mrf_string =
606 refl->GetMutableRepeatedFieldRef<
std::string>(&m0, fd_repeated_string);
607 const MutableRepeatedFieldRef<ForeignMessage> mrf_foreign_message =
608 refl->GetMutableRepeatedFieldRef<ForeignMessage>(
609 &m0, fd_repeated_foreign_message);
610 const MutableRepeatedFieldRef<TestAllTypes::NestedEnum> mrf_nested_enum =
611 refl->GetMutableRepeatedFieldRef<TestAllTypes::NestedEnum>(
612 &m0, fd_repeated_nested_enum);
615 mrf_int32.CopyFrom(refl->GetRepeatedFieldRef<
int32>(m1, fd_repeated_int32));
617 refl->GetRepeatedFieldRef<
double>(m1, fd_repeated_double));
619 refl->GetRepeatedFieldRef<
std::string>(m1, fd_repeated_string));
620 mrf_foreign_message.CopyFrom(refl->GetRepeatedFieldRef<ForeignMessage>(
621 m1, fd_repeated_foreign_message));
622 mrf_nested_enum.CopyFrom(refl->GetRepeatedFieldRef<TestAllTypes::NestedEnum>(
623 m1, fd_repeated_nested_enum));
624 for (
int i = 0;
i < 10; ++
i) {
629 EXPECT_EQ(TestAllTypes::BAR, m0.repeated_nested_enum(
i));
633 mrf_int32.MergeFrom(refl->GetRepeatedFieldRef<
int32>(m2, fd_repeated_int32));
634 mrf_double.MergeFrom(
635 refl->GetRepeatedFieldRef<
double>(m2, fd_repeated_double));
636 mrf_string.MergeFrom(
637 refl->GetRepeatedFieldRef<
std::string>(m2, fd_repeated_string));
638 mrf_foreign_message.MergeFrom(refl->GetRepeatedFieldRef<ForeignMessage>(
639 m2, fd_repeated_foreign_message));
640 mrf_nested_enum.MergeFrom(refl->GetRepeatedFieldRef<TestAllTypes::NestedEnum>(
641 m2, fd_repeated_nested_enum));
642 for (
int i = 0;
i < 10; ++
i) {
647 EXPECT_EQ(TestAllTypes::BAZ, m0.repeated_nested_enum(
i + 10));
653 refl->GetMutableRepeatedFieldRef<
int32>(&m2, fd_repeated_int32));
655 refl->GetMutableRepeatedFieldRef<
double>(&m2, fd_repeated_double));
657 refl->GetMutableRepeatedFieldRef<
std::string>(&m2, fd_repeated_string));
658 mrf_foreign_message.Swap(refl->GetMutableRepeatedFieldRef<ForeignMessage>(
659 &m2, fd_repeated_foreign_message));
660 mrf_nested_enum.Swap(
661 refl->GetMutableRepeatedFieldRef<TestAllTypes::NestedEnum>(
662 &m2, fd_repeated_nested_enum));
663 for (
int i = 0;
i < 10; ++
i) {
669 EXPECT_EQ(TestAllTypes::BAZ, m0.repeated_nested_enum(
i));
676 EXPECT_EQ(TestAllTypes::BAR, m2.repeated_nested_enum(
i));
681 EXPECT_EQ(TestAllTypes::BAZ, m2.repeated_nested_enum(
i + 10));
687 TEST(RepeatedFieldReflectionTest, RepeatedFieldRefDynamicMessage) {
695 desc->FindFieldByName(
"repeated_int32");
697 DynamicMessageFactory factory;
698 std::unique_ptr<Message> dynamic_message(factory.GetPrototype(
desc)->New());
699 const Reflection* refl = dynamic_message->GetReflection();
701 MutableRepeatedFieldRef<int32> rf_int32 =
702 refl->GetMutableRepeatedFieldRef<
int32>(dynamic_message.get(),
705 EXPECT_EQ(1, refl->FieldSize(*dynamic_message, fd_repeated_int32));
707 refl->GetRepeatedInt32(*dynamic_message, fd_repeated_int32, 0));