36 #include <google/protobuf/stubs/casts.h>
37 #include <google/protobuf/stubs/stringprintf.h>
38 #include <google/protobuf/test_util.h>
39 #include <google/protobuf/unittest.pb.h>
40 #include <google/protobuf/dynamic_message.h>
41 #include <google/protobuf/reflection.h>
42 #include <gtest/gtest.h>
47 using unittest::ForeignMessage;
48 using unittest::TestAllExtensions;
49 using unittest::TestAllTypes;
53 static int Func(
int i,
int j) {
return i *
j; }
57 TEST(RepeatedFieldReflectionTest, RegularFields) {
59 const Reflection* refl =
message.GetReflection();
62 for (
int i = 0;
i < 10; ++
i) {
66 message.add_repeated_foreign_message()->set_c(
Func(i, 6));
71 desc->FindFieldByName(
"repeated_int32");
73 desc->FindFieldByName(
"repeated_double");
75 desc->FindFieldByName(
"repeated_string");
77 desc->FindFieldByName(
"repeated_foreign_message");
81 refl->GetRepeatedField<
int32>(
message, fd_repeated_int32);
83 refl->GetRepeatedField<
double>(
message, fd_repeated_double);
87 refl->MutableRepeatedField<
int32>(&
message, fd_repeated_int32);
89 refl->MutableRepeatedField<
double>(&
message, fd_repeated_double);
92 const RepeatedPtrField<std::string>& rpf_string =
94 const RepeatedPtrField<ForeignMessage>& rpf_foreign_message =
95 refl->GetRepeatedPtrField<ForeignMessage>(
message,
96 fd_repeated_foreign_message);
97 const RepeatedPtrField<Message>& rpf_message =
98 refl->GetRepeatedPtrField<
Message>(
message, fd_repeated_foreign_message);
101 RepeatedPtrField<std::string>* mrpf_string =
103 RepeatedPtrField<ForeignMessage>* mrpf_foreign_message =
104 refl->MutableRepeatedPtrField<ForeignMessage>(
105 &
message, fd_repeated_foreign_message);
106 RepeatedPtrField<Message>* mrpf_message =
108 fd_repeated_foreign_message);
111 for (
int i = 0;
i < 10; ++
i) {
117 EXPECT_EQ(down_cast<const ForeignMessage*>(&rpf_message.Get(i))->c(),
125 EXPECT_EQ(down_cast<const ForeignMessage*>(&mrpf_message->Get(i))->c(),
129 mrf_int32->Set(i,
Func(i, -1));
130 mrf_double->Set(i,
Func(i, -2));
131 mrpf_string->Mutable(i)->assign(
StrFunc(i, -5));
132 mrpf_foreign_message->Mutable(i)->set_c(
Func(i, -6));
137 down_cast<ForeignMessage*>(mrpf_message->Mutable(i))->set_c(
Func(i, 7));
141 #ifdef PROTOBUF_HAS_DEATH_TEST
144 desc->FindFieldByName(
"optional_int32");
145 EXPECT_DEATH(refl->GetRepeatedField<
int32>(
message, fd_optional_int32),
146 "requires a repeated field");
147 EXPECT_DEATH(refl->GetRepeatedField<
double>(
message, fd_repeated_int32),
148 "not the right type");
149 EXPECT_DEATH(refl->GetRepeatedPtrField<TestAllTypes>(
150 message, fd_repeated_foreign_message),
151 "wrong submessage type");
152 #endif // PROTOBUF_HAS_DEATH_TEST
156 TEST(RepeatedFieldReflectionTest, ExtensionFields) {
157 TestAllExtensions extended_message;
158 const Reflection* refl = extended_message.GetReflection();
161 for (
int i = 0;
i < 10; ++
i) {
162 extended_message.AddExtension(unittest::repeated_int64_extension,
167 desc->file()->FindExtensionByName(
"repeated_int64_extension");
171 refl->GetRepeatedField<
int64>(extended_message,
172 fd_repeated_int64_extension);
175 &extended_message, fd_repeated_int64_extension);
177 for (
int i = 0;
i < 10; ++
i) {
179 mrf_int64_extension->Set(i,
Func(i, -1));
181 unittest::repeated_int64_extension, i));
185 template <
typename Ref,
typename MessageType,
typename ValueType>
186 void TestRepeatedFieldRefIteratorForPrimitive(
188 ValueType (MessageType::*GetFunc)(
int)
const) {
198 template <
typename MessageType,
typename ValueType>
199 void TestRepeatedFieldRefIteratorForString(
200 const RepeatedFieldRef<std::string>&
handle,
const MessageType&
message,
201 ValueType (MessageType::*GetFunc)(
int)
const) {
203 for (
typename RepeatedFieldRef<std::string>::const_iterator
it =
214 TEST(RepeatedFieldReflectionTest, RepeatedFieldRefForRegularFields) {
216 const Reflection* refl =
message.GetReflection();
219 for (
int i = 0;
i < 10; ++
i) {
223 message.add_repeated_foreign_message()->set_c(
Func(i, 6));
228 desc->FindFieldByName(
"repeated_int32");
230 desc->FindFieldByName(
"repeated_double");
232 desc->FindFieldByName(
"repeated_string");
234 desc->FindFieldByName(
"repeated_foreign_message");
237 const RepeatedFieldRef<int32> rf_int32 =
238 refl->GetRepeatedFieldRef<
int32>(
message, fd_repeated_int32);
239 const RepeatedFieldRef<double> rf_double =
240 refl->GetRepeatedFieldRef<
double>(
message, fd_repeated_double);
241 const RepeatedFieldRef<std::string> rf_string =
243 const RepeatedFieldRef<ForeignMessage> rf_foreign_message =
244 refl->GetRepeatedFieldRef<ForeignMessage>(
message,
245 fd_repeated_foreign_message);
246 const RepeatedFieldRef<Message> rf_message =
247 refl->GetRepeatedFieldRef<
Message>(
message, fd_repeated_foreign_message);
250 const MutableRepeatedFieldRef<int32> mrf_int32 =
251 refl->GetMutableRepeatedFieldRef<
int32>(&
message, fd_repeated_int32);
252 const MutableRepeatedFieldRef<double> mrf_double =
253 refl->GetMutableRepeatedFieldRef<
double>(&
message, fd_repeated_double);
254 const MutableRepeatedFieldRef<std::string> mrf_string =
257 const MutableRepeatedFieldRef<ForeignMessage> mrf_foreign_message =
258 refl->GetMutableRepeatedFieldRef<ForeignMessage>(
259 &
message, fd_repeated_foreign_message);
260 const MutableRepeatedFieldRef<Message> mrf_message =
262 fd_repeated_foreign_message);
270 EXPECT_EQ(
message.repeated_foreign_message_size(), rf_foreign_message.size());
272 mrf_foreign_message.size());
288 for (
int i = 0;
i < 10; ++
i) {
293 ForeignMessage scratch_space;
294 EXPECT_EQ(rf_foreign_message.Get(i, &scratch_space).c(),
Func(i, 6));
296 down_cast<const ForeignMessage&>(rf_message.Get(i, &scratch_space)).c(),
303 EXPECT_EQ(mrf_foreign_message.Get(i, &scratch_space).c(),
Func(i, 6));
305 down_cast<const ForeignMessage&>(mrf_message.Get(i, &scratch_space))
310 mrf_int32.Set(i,
Func(i, -1));
311 mrf_double.Set(i,
Func(i, -2));
312 mrf_string.Set(i,
StrFunc(i, -5));
313 ForeignMessage foreign_message;
314 foreign_message.set_c(
Func(i, -6));
315 mrf_foreign_message.Set(i, foreign_message);
320 foreign_message.set_c(
Func(i, 7));
321 mrf_message.Set(i, foreign_message);
326 TestRepeatedFieldRefIteratorForPrimitive(rf_int32,
message,
327 &TestAllTypes::repeated_int32);
328 TestRepeatedFieldRefIteratorForPrimitive(rf_double,
message,
329 &TestAllTypes::repeated_double);
330 TestRepeatedFieldRefIteratorForString(rf_string,
message,
331 &TestAllTypes::repeated_string);
336 for (MessageIterator
it = rf_foreign_message.begin();
337 it != rf_foreign_message.end(); ++
it) {
345 MessageIterator old_it = rf_foreign_message.begin();
346 MessageIterator new_it = old_it++;
349 for (
index = 1; old_it != rf_foreign_message.end(); ++old_it, ++
index) {
355 for (
index = 0; old_it != rf_foreign_message.end(); ++old_it, ++
index) {
360 for (
index = 0; new_it != rf_foreign_message.end(); ++new_it, ++
index) {
367 mrf_double.Add(1234.0);
368 mrf_string.Add(
"1234");
369 ForeignMessage foreign_message;
370 foreign_message.set_c(1234);
371 mrf_foreign_message.Add(foreign_message);
378 mrf_int32.RemoveLast();
379 mrf_double.RemoveLast();
380 mrf_string.RemoveLast();
381 mrf_foreign_message.RemoveLast();
388 mrf_int32.SwapElements(0, 9);
389 mrf_double.SwapElements(0, 9);
390 mrf_string.SwapElements(0, 9);
391 mrf_foreign_message.SwapElements(0, 9);
405 mrf_foreign_message.Clear();
423 #ifdef PROTOBUF_HAS_DEATH_TEST
427 desc->FindFieldByName(
"optional_int32");
428 EXPECT_DEATH(refl->GetRepeatedFieldRef<
int32>(
message, fd_optional_int32),
430 EXPECT_DEATH(refl->GetRepeatedFieldRef<
double>(
message, fd_repeated_int32),
432 EXPECT_DEATH(refl->GetRepeatedFieldRef<TestAllTypes>(
433 message, fd_repeated_foreign_message),
436 #endif // PROTOBUF_HAS_DEATH_TEST
439 TEST(RepeatedFieldReflectionTest, RepeatedFieldRefForEnums) {
441 const Reflection* refl =
message.GetReflection();
444 for (
int i = 0;
i < 10; ++
i) {
445 message.add_repeated_nested_enum(TestAllTypes::BAR);
449 desc->FindFieldByName(
"repeated_nested_enum");
450 const RepeatedFieldRef<TestAllTypes::NestedEnum> enum_ref =
451 refl->GetRepeatedFieldRef<TestAllTypes::NestedEnum>(
452 message, fd_repeated_nested_enum);
453 const MutableRepeatedFieldRef<TestAllTypes::NestedEnum> mutable_enum_ref =
454 refl->GetMutableRepeatedFieldRef<TestAllTypes::NestedEnum>(
455 &
message, fd_repeated_nested_enum);
456 const RepeatedFieldRef<int32> int32_ref =
457 refl->GetRepeatedFieldRef<
int32>(
message, fd_repeated_nested_enum);
458 const MutableRepeatedFieldRef<int32> mutable_int32_ref =
460 fd_repeated_nested_enum);
472 for (
int i = 0;
i < 10; ++
i) {
473 EXPECT_EQ(TestAllTypes::BAR, enum_ref.Get(i));
474 EXPECT_EQ(TestAllTypes::BAR, mutable_enum_ref.Get(i));
475 mutable_enum_ref.Set(i, TestAllTypes::BAZ);
476 EXPECT_EQ(TestAllTypes::BAZ, enum_ref.Get(i));
479 message.set_repeated_nested_enum(i, TestAllTypes::BAR);
480 EXPECT_EQ(TestAllTypes::BAR, int32_ref.Get(i));
481 EXPECT_EQ(TestAllTypes::BAR, mutable_int32_ref.Get(i));
482 mutable_int32_ref.Set(i, TestAllTypes::BAZ);
483 EXPECT_EQ(TestAllTypes::BAZ, int32_ref.Get(i));
487 TestRepeatedFieldRefIteratorForPrimitive(enum_ref,
message,
488 &TestAllTypes::repeated_nested_enum);
489 TestRepeatedFieldRefIteratorForPrimitive(int32_ref,
message,
490 &TestAllTypes::repeated_nested_enum);
493 mutable_enum_ref.Add(TestAllTypes::FOO);
495 mutable_int32_ref.Add(TestAllTypes::BAR);
499 mutable_enum_ref.RemoveLast();
501 mutable_int32_ref.RemoveLast();
505 mutable_enum_ref.Set(0, TestAllTypes::BAR);
506 mutable_enum_ref.Set(9, TestAllTypes::BAZ);
507 mutable_enum_ref.SwapElements(0, 9);
508 EXPECT_EQ(TestAllTypes::BAZ, enum_ref.Get(0));
509 EXPECT_EQ(TestAllTypes::BAR, enum_ref.Get(9));
510 mutable_int32_ref.SwapElements(0, 9);
511 EXPECT_EQ(TestAllTypes::BAR, enum_ref.Get(0));
512 EXPECT_EQ(TestAllTypes::BAZ, enum_ref.Get(9));
515 mutable_enum_ref.Clear();
517 mutable_enum_ref.Add(TestAllTypes::FOO);
519 mutable_int32_ref.Clear();
529 TEST(RepeatedFieldReflectionTest, RepeatedFieldRefForExtensionFields) {
530 TestAllExtensions extended_message;
531 const Reflection* refl = extended_message.GetReflection();
534 for (
int i = 0;
i < 10; ++
i) {
535 extended_message.AddExtension(unittest::repeated_int64_extension,
540 desc->file()->FindExtensionByName(
"repeated_int64_extension");
543 const RepeatedFieldRef<int64> rf_int64_extension =
544 refl->GetRepeatedFieldRef<
int64>(extended_message,
545 fd_repeated_int64_extension);
547 const MutableRepeatedFieldRef<int64> mrf_int64_extension =
548 refl->GetMutableRepeatedFieldRef<
int64>(&extended_message,
549 fd_repeated_int64_extension);
551 for (
int i = 0;
i < 10; ++
i) {
553 mrf_int64_extension.Set(i,
Func(i, -1));
555 unittest::repeated_int64_extension, i));
560 TEST(RepeatedFieldReflectionTest, RepeatedFieldRefMergeFromAndSwap) {
562 TestAllTypes m0, m1, m2;
563 for (
int i = 0;
i < 10; ++
i) {
564 m0.add_repeated_int32(
Func(i, 1));
565 m0.add_repeated_double(
Func(i, 2));
566 m0.add_repeated_string(
StrFunc(i, 5));
567 m0.add_repeated_foreign_message()->set_c(
Func(i, 6));
568 m0.add_repeated_nested_enum(TestAllTypes::FOO);
569 m1.add_repeated_int32(
Func(i, 11));
570 m1.add_repeated_double(
Func(i, 12));
571 m1.add_repeated_string(
StrFunc(i, 15));
572 m1.add_repeated_foreign_message()->set_c(
Func(i, 16));
573 m1.add_repeated_nested_enum(TestAllTypes::BAR);
574 m2.add_repeated_int32(
Func(i, 21));
575 m2.add_repeated_double(
Func(i, 22));
576 m2.add_repeated_string(
StrFunc(i, 25));
577 m2.add_repeated_foreign_message()->set_c(
Func(i, 26));
578 m2.add_repeated_nested_enum(TestAllTypes::BAZ);
581 const Reflection* refl = m0.GetReflection();
586 desc->FindFieldByName(
"repeated_int32");
588 desc->FindFieldByName(
"repeated_double");
590 desc->FindFieldByName(
"repeated_string");
592 desc->FindFieldByName(
"repeated_foreign_message");
594 desc->FindFieldByName(
"repeated_nested_enum");
597 const MutableRepeatedFieldRef<int32> mrf_int32 =
598 refl->GetMutableRepeatedFieldRef<
int32>(&m0, fd_repeated_int32);
599 const MutableRepeatedFieldRef<double> mrf_double =
600 refl->GetMutableRepeatedFieldRef<
double>(&m0, fd_repeated_double);
601 const MutableRepeatedFieldRef<std::string> mrf_string =
602 refl->GetMutableRepeatedFieldRef<
std::string>(&m0, fd_repeated_string);
603 const MutableRepeatedFieldRef<ForeignMessage> mrf_foreign_message =
604 refl->GetMutableRepeatedFieldRef<ForeignMessage>(
605 &m0, fd_repeated_foreign_message);
606 const MutableRepeatedFieldRef<TestAllTypes::NestedEnum> mrf_nested_enum =
607 refl->GetMutableRepeatedFieldRef<TestAllTypes::NestedEnum>(
608 &m0, fd_repeated_nested_enum);
611 mrf_int32.CopyFrom(refl->GetRepeatedFieldRef<
int32>(m1, fd_repeated_int32));
613 refl->GetRepeatedFieldRef<
double>(m1, fd_repeated_double));
615 refl->GetRepeatedFieldRef<
std::string>(m1, fd_repeated_string));
616 mrf_foreign_message.CopyFrom(refl->GetRepeatedFieldRef<ForeignMessage>(
617 m1, fd_repeated_foreign_message));
618 mrf_nested_enum.CopyFrom(refl->GetRepeatedFieldRef<TestAllTypes::NestedEnum>(
619 m1, fd_repeated_nested_enum));
620 for (
int i = 0;
i < 10; ++
i) {
625 EXPECT_EQ(TestAllTypes::BAR, m0.repeated_nested_enum(i));
629 mrf_int32.MergeFrom(refl->GetRepeatedFieldRef<
int32>(m2, fd_repeated_int32));
630 mrf_double.MergeFrom(
631 refl->GetRepeatedFieldRef<
double>(m2, fd_repeated_double));
632 mrf_string.MergeFrom(
633 refl->GetRepeatedFieldRef<
std::string>(m2, fd_repeated_string));
634 mrf_foreign_message.MergeFrom(refl->GetRepeatedFieldRef<ForeignMessage>(
635 m2, fd_repeated_foreign_message));
636 mrf_nested_enum.MergeFrom(refl->GetRepeatedFieldRef<TestAllTypes::NestedEnum>(
637 m2, fd_repeated_nested_enum));
638 for (
int i = 0;
i < 10; ++
i) {
642 EXPECT_EQ(
Func(i, 26), m0.repeated_foreign_message(i + 10).c());
643 EXPECT_EQ(TestAllTypes::BAZ, m0.repeated_nested_enum(i + 10));
649 refl->GetMutableRepeatedFieldRef<
int32>(&m2, fd_repeated_int32));
651 refl->GetMutableRepeatedFieldRef<
double>(&m2, fd_repeated_double));
653 refl->GetMutableRepeatedFieldRef<
std::string>(&m2, fd_repeated_string));
654 mrf_foreign_message.Swap(refl->GetMutableRepeatedFieldRef<ForeignMessage>(
655 &m2, fd_repeated_foreign_message));
656 mrf_nested_enum.Swap(
657 refl->GetMutableRepeatedFieldRef<TestAllTypes::NestedEnum>(
658 &m2, fd_repeated_nested_enum));
659 for (
int i = 0;
i < 10; ++
i) {
665 EXPECT_EQ(TestAllTypes::BAZ, m0.repeated_nested_enum(i));
672 EXPECT_EQ(TestAllTypes::BAR, m2.repeated_nested_enum(i));
676 EXPECT_EQ(
Func(i, 26), m2.repeated_foreign_message(i + 10).c());
677 EXPECT_EQ(TestAllTypes::BAZ, m2.repeated_nested_enum(i + 10));
683 TEST(RepeatedFieldReflectionTest, RepeatedFieldRefDynamicMessage) {
691 desc->FindFieldByName(
"repeated_int32");
694 std::unique_ptr<Message> dynamic_message(factory.GetPrototype(
desc)->New());
695 const Reflection* refl = dynamic_message->GetReflection();
697 MutableRepeatedFieldRef<int32> rf_int32 =
698 refl->GetMutableRepeatedFieldRef<
int32>(dynamic_message.get(),
701 EXPECT_EQ(1, refl->FieldSize(*dynamic_message, fd_repeated_int32));
703 refl->GetRepeatedInt32(*dynamic_message, fd_repeated_int32, 0));