1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc. All rights reserved.
3 // https://developers.google.com/protocol-buffers/
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
9 // * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer.
11 // * Redistributions in binary form must reproduce the above
12 // copyright notice, this list of conditions and the following disclaimer
13 // in the documentation and/or other materials provided with the
15 // * Neither the name of Google Inc. nor the names of its
16 // contributors may be used to endorse or promote products derived from
17 // this software without specific prior written permission.
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 // Author: kenton@google.com (Kenton Varda)
32 // Based on original Protocol Buffers design by
33 // Sanjay Ghemawat, Jeff Dean, and others.
35 // TODO(kenton): Improve this unittest to bring it up to the standards of
36 // other proto2 unittests.
43 #include <google/protobuf/repeated_field.h>
45 #include <google/protobuf/stubs/common.h>
46 #include <google/protobuf/unittest.pb.h>
47 #include <google/protobuf/stubs/strutil.h>
48 #include <google/protobuf/testing/googletest.h>
49 #include <gtest/gtest.h>
50 #include <google/protobuf/stubs/stl_util.h>
53 using protobuf_unittest::TestAllTypes;
58 // Test operations on a small RepeatedField.
59 TEST(RepeatedField, Small) {
60 RepeatedField<int> field;
62 EXPECT_TRUE(field.empty());
63 EXPECT_EQ(field.size(), 0);
67 EXPECT_FALSE(field.empty());
68 EXPECT_EQ(field.size(), 1);
69 EXPECT_EQ(field.Get(0), 5);
73 EXPECT_FALSE(field.empty());
74 EXPECT_EQ(field.size(), 2);
75 EXPECT_EQ(field.Get(0), 5);
76 EXPECT_EQ(field.Get(1), 42);
80 EXPECT_FALSE(field.empty());
81 EXPECT_EQ(field.size(), 2);
82 EXPECT_EQ(field.Get(0), 5);
83 EXPECT_EQ(field.Get(1), 23);
87 EXPECT_FALSE(field.empty());
88 EXPECT_EQ(field.size(), 1);
89 EXPECT_EQ(field.Get(0), 5);
93 EXPECT_TRUE(field.empty());
94 EXPECT_EQ(field.size(), 0);
95 int expected_usage = 4 * sizeof(int);
96 EXPECT_EQ(field.SpaceUsedExcludingSelf(), expected_usage);
100 // Test operations on a RepeatedField which is large enough to allocate a
102 TEST(RepeatedField, Large) {
103 RepeatedField<int> field;
105 for (int i = 0; i < 16; i++) {
109 EXPECT_FALSE(field.empty());
110 EXPECT_EQ(field.size(), 16);
112 for (int i = 0; i < 16; i++) {
113 EXPECT_EQ(field.Get(i), i * i);
116 int expected_usage = 16 * sizeof(int);
117 EXPECT_GE(field.SpaceUsedExcludingSelf(), expected_usage);
120 // Test swapping between various types of RepeatedFields.
121 TEST(RepeatedField, SwapSmallSmall) {
122 RepeatedField<int> field1;
123 RepeatedField<int> field2;
128 EXPECT_FALSE(field1.empty());
129 EXPECT_EQ(field1.size(), 2);
130 EXPECT_EQ(field1.Get(0), 5);
131 EXPECT_EQ(field1.Get(1), 42);
133 EXPECT_TRUE(field2.empty());
134 EXPECT_EQ(field2.size(), 0);
136 field1.Swap(&field2);
138 EXPECT_TRUE(field1.empty());
139 EXPECT_EQ(field1.size(), 0);
141 EXPECT_FALSE(field2.empty());
142 EXPECT_EQ(field2.size(), 2);
143 EXPECT_EQ(field2.Get(0), 5);
144 EXPECT_EQ(field2.Get(1), 42);
147 TEST(RepeatedField, SwapLargeSmall) {
148 RepeatedField<int> field1;
149 RepeatedField<int> field2;
151 for (int i = 0; i < 16; i++) {
156 field1.Swap(&field2);
158 EXPECT_EQ(field1.size(), 2);
159 EXPECT_EQ(field1.Get(0), 5);
160 EXPECT_EQ(field1.Get(1), 42);
161 EXPECT_EQ(field2.size(), 16);
162 for (int i = 0; i < 16; i++) {
163 EXPECT_EQ(field2.Get(i), i * i);
167 TEST(RepeatedField, SwapLargeLarge) {
168 RepeatedField<int> field1;
169 RepeatedField<int> field2;
173 for (int i = 0; i < 16; i++) {
177 field2.Swap(&field1);
179 EXPECT_EQ(field1.size(), 16);
180 for (int i = 0; i < 16; i++) {
181 EXPECT_EQ(field1.Get(i), i * i);
183 EXPECT_EQ(field2.size(), 18);
184 EXPECT_EQ(field2.Get(0), 5);
185 EXPECT_EQ(field2.Get(1), 42);
186 for (int i = 2; i < 18; i++) {
187 EXPECT_EQ(field2.Get(i), i - 2);
191 // Determines how much space was reserved by the given field by adding elements
192 // to it until it re-allocates its space.
193 static int ReservedSpace(RepeatedField<int>* field) {
194 const int* ptr = field->data();
197 } while (field->data() == ptr);
199 return field->size() - 1;
202 TEST(RepeatedField, ReserveMoreThanDouble) {
203 // Reserve more than double the previous space in the field and expect the
204 // field to reserve exactly the amount specified.
205 RepeatedField<int> field;
208 EXPECT_EQ(20, ReservedSpace(&field));
211 TEST(RepeatedField, ReserveLessThanDouble) {
212 // Reserve less than double the previous space in the field and expect the
213 // field to grow by double instead.
214 RepeatedField<int> field;
218 EXPECT_EQ(40, ReservedSpace(&field));
221 TEST(RepeatedField, ReserveLessThanExisting) {
222 // Reserve less than the previous space in the field and expect the
223 // field to not re-allocate at all.
224 RepeatedField<int> field;
226 const int* previous_ptr = field.data();
229 EXPECT_EQ(previous_ptr, field.data());
230 EXPECT_EQ(20, ReservedSpace(&field));
233 TEST(RepeatedField, Resize) {
234 RepeatedField<int> field;
236 EXPECT_EQ(2, field.size());
238 EXPECT_EQ(5, field.size());
240 ASSERT_EQ(4, field.size());
241 EXPECT_EQ(1, field.Get(0));
242 EXPECT_EQ(1, field.Get(1));
243 EXPECT_EQ(2, field.Get(2));
244 EXPECT_EQ(2, field.Get(3));
246 EXPECT_TRUE(field.empty());
249 TEST(RepeatedField, MergeFrom) {
250 RepeatedField<int> source, destination;
257 destination.MergeFrom(source);
259 ASSERT_EQ(5, destination.size());
260 EXPECT_EQ(1, destination.Get(0));
261 EXPECT_EQ(2, destination.Get(1));
262 EXPECT_EQ(3, destination.Get(2));
263 EXPECT_EQ(4, destination.Get(3));
264 EXPECT_EQ(5, destination.Get(4));
267 #ifdef PROTOBUF_HAS_DEATH_TEST
268 TEST(RepeatedField, MergeFromSelf) {
269 RepeatedField<int> me;
271 EXPECT_DEATH(me.MergeFrom(me), "");
273 #endif // PROTOBUF_HAS_DEATH_TEST
275 TEST(RepeatedField, CopyFrom) {
276 RepeatedField<int> source, destination;
283 destination.CopyFrom(source);
285 ASSERT_EQ(2, destination.size());
286 EXPECT_EQ(4, destination.Get(0));
287 EXPECT_EQ(5, destination.Get(1));
290 TEST(RepeatedField, CopyFromSelf) {
291 RepeatedField<int> me;
294 ASSERT_EQ(1, me.size());
295 EXPECT_EQ(3, me.Get(0));
298 TEST(RepeatedField, CopyConstruct) {
299 RepeatedField<int> source;
303 RepeatedField<int> destination(source);
305 ASSERT_EQ(2, destination.size());
306 EXPECT_EQ(1, destination.Get(0));
307 EXPECT_EQ(2, destination.Get(1));
310 TEST(RepeatedField, IteratorConstruct) {
315 RepeatedField<int> field(values.begin(), values.end());
316 ASSERT_EQ(values.size(), field.size());
317 EXPECT_EQ(values[0], field.Get(0));
318 EXPECT_EQ(values[1], field.Get(1));
320 RepeatedField<int> other(field.begin(), field.end());
321 ASSERT_EQ(values.size(), other.size());
322 EXPECT_EQ(values[0], other.Get(0));
323 EXPECT_EQ(values[1], other.Get(1));
326 TEST(RepeatedField, CopyAssign) {
327 RepeatedField<int> source, destination;
334 destination = source;
336 ASSERT_EQ(2, destination.size());
337 EXPECT_EQ(4, destination.Get(0));
338 EXPECT_EQ(5, destination.Get(1));
341 TEST(RepeatedField, SelfAssign) {
342 // Verify that assignment to self does not destroy data.
343 RepeatedField<int> source, *p;
350 ASSERT_EQ(2, source.size());
351 EXPECT_EQ(7, source.Get(0));
352 EXPECT_EQ(8, source.Get(1));
355 TEST(RepeatedField, MutableDataIsMutable) {
356 RepeatedField<int> field;
358 EXPECT_EQ(1, field.Get(0));
359 // The fact that this line compiles would be enough, but we'll check the
361 *field.mutable_data() = 2;
362 EXPECT_EQ(2, field.Get(0));
365 TEST(RepeatedField, Truncate) {
366 RepeatedField<int> field;
372 EXPECT_EQ(4, field.size());
375 EXPECT_EQ(3, field.size());
378 EXPECT_EQ(4, field.size());
379 EXPECT_EQ(90, field.Get(3));
381 // Truncations that don't change the size are allowed, but growing is not
383 field.Truncate(field.size());
384 #ifdef PROTOBUF_HAS_DEATH_TEST
385 EXPECT_DEBUG_DEATH(field.Truncate(field.size() + 1), "new_size");
390 TEST(RepeatedField, ExtractSubrange) {
391 // Exhaustively test every subrange in arrays of all sizes from 0 through 9.
392 for (int sz = 0; sz < 10; ++sz) {
393 for (int num = 0; num <= sz; ++num) {
394 for (int start = 0; start < sz - num; ++start) {
395 // Create RepeatedField with sz elements having values 0 through sz-1.
396 RepeatedField<int32> field;
397 for (int i = 0; i < sz; ++i)
399 EXPECT_EQ(field.size(), sz);
401 // Create a catcher array and call ExtractSubrange.
403 for (int i = 0; i < 10; ++i)
405 field.ExtractSubrange(start, num, catcher);
407 // Does the resulting array have the right size?
408 EXPECT_EQ(field.size(), sz - num);
410 // Were the removed elements extracted into the catcher array?
411 for (int i = 0; i < num; ++i)
412 EXPECT_EQ(catcher[i], start + i);
413 EXPECT_EQ(catcher[num], -1);
415 // Does the resulting array contain the right values?
416 for (int i = 0; i < start; ++i)
417 EXPECT_EQ(field.Get(i), i);
418 for (int i = start; i < field.size(); ++i)
419 EXPECT_EQ(field.Get(i), i + num);
425 // ===================================================================
426 // RepeatedPtrField tests. These pretty much just mirror the RepeatedField
429 TEST(RepeatedPtrField, Small) {
430 RepeatedPtrField<string> field;
432 EXPECT_TRUE(field.empty());
433 EXPECT_EQ(field.size(), 0);
435 field.Add()->assign("foo");
437 EXPECT_FALSE(field.empty());
438 EXPECT_EQ(field.size(), 1);
439 EXPECT_EQ(field.Get(0), "foo");
441 field.Add()->assign("bar");
443 EXPECT_FALSE(field.empty());
444 EXPECT_EQ(field.size(), 2);
445 EXPECT_EQ(field.Get(0), "foo");
446 EXPECT_EQ(field.Get(1), "bar");
448 field.Mutable(1)->assign("baz");
450 EXPECT_FALSE(field.empty());
451 EXPECT_EQ(field.size(), 2);
452 EXPECT_EQ(field.Get(0), "foo");
453 EXPECT_EQ(field.Get(1), "baz");
457 EXPECT_FALSE(field.empty());
458 EXPECT_EQ(field.size(), 1);
459 EXPECT_EQ(field.Get(0), "foo");
463 EXPECT_TRUE(field.empty());
464 EXPECT_EQ(field.size(), 0);
467 TEST(RepeatedPtrField, Large) {
468 RepeatedPtrField<string> field;
470 for (int i = 0; i < 16; i++) {
471 *field.Add() += 'a' + i;
474 EXPECT_EQ(field.size(), 16);
476 for (int i = 0; i < 16; i++) {
477 EXPECT_EQ(field.Get(i).size(), 1);
478 EXPECT_EQ(field.Get(i)[0], 'a' + i);
481 int min_expected_usage = 16 * sizeof(string);
482 EXPECT_GE(field.SpaceUsedExcludingSelf(), min_expected_usage);
485 TEST(RepeatedPtrField, SwapSmallSmall) {
486 RepeatedPtrField<string> field1;
487 RepeatedPtrField<string> field2;
489 EXPECT_TRUE(field1.empty());
490 EXPECT_EQ(field1.size(), 0);
491 EXPECT_TRUE(field2.empty());
492 EXPECT_EQ(field2.size(), 0);
494 field1.Add()->assign("foo");
495 field1.Add()->assign("bar");
497 EXPECT_FALSE(field1.empty());
498 EXPECT_EQ(field1.size(), 2);
499 EXPECT_EQ(field1.Get(0), "foo");
500 EXPECT_EQ(field1.Get(1), "bar");
502 EXPECT_TRUE(field2.empty());
503 EXPECT_EQ(field2.size(), 0);
505 field1.Swap(&field2);
507 EXPECT_TRUE(field1.empty());
508 EXPECT_EQ(field1.size(), 0);
510 EXPECT_EQ(field2.size(), 2);
511 EXPECT_EQ(field2.Get(0), "foo");
512 EXPECT_EQ(field2.Get(1), "bar");
515 TEST(RepeatedPtrField, SwapLargeSmall) {
516 RepeatedPtrField<string> field1;
517 RepeatedPtrField<string> field2;
519 field2.Add()->assign("foo");
520 field2.Add()->assign("bar");
521 for (int i = 0; i < 16; i++) {
522 *field1.Add() += 'a' + i;
524 field1.Swap(&field2);
526 EXPECT_EQ(field1.size(), 2);
527 EXPECT_EQ(field1.Get(0), "foo");
528 EXPECT_EQ(field1.Get(1), "bar");
529 EXPECT_EQ(field2.size(), 16);
530 for (int i = 0; i < 16; i++) {
531 EXPECT_EQ(field2.Get(i).size(), 1);
532 EXPECT_EQ(field2.Get(i)[0], 'a' + i);
536 TEST(RepeatedPtrField, SwapLargeLarge) {
537 RepeatedPtrField<string> field1;
538 RepeatedPtrField<string> field2;
540 field1.Add()->assign("foo");
541 field1.Add()->assign("bar");
542 for (int i = 0; i < 16; i++) {
543 *field1.Add() += 'A' + i;
544 *field2.Add() += 'a' + i;
546 field2.Swap(&field1);
548 EXPECT_EQ(field1.size(), 16);
549 for (int i = 0; i < 16; i++) {
550 EXPECT_EQ(field1.Get(i).size(), 1);
551 EXPECT_EQ(field1.Get(i)[0], 'a' + i);
553 EXPECT_EQ(field2.size(), 18);
554 EXPECT_EQ(field2.Get(0), "foo");
555 EXPECT_EQ(field2.Get(1), "bar");
556 for (int i = 2; i < 18; i++) {
557 EXPECT_EQ(field2.Get(i).size(), 1);
558 EXPECT_EQ(field2.Get(i)[0], 'A' + i - 2);
562 static int ReservedSpace(RepeatedPtrField<string>* field) {
563 const string* const* ptr = field->data();
566 } while (field->data() == ptr);
568 return field->size() - 1;
571 TEST(RepeatedPtrField, ReserveMoreThanDouble) {
572 RepeatedPtrField<string> field;
575 EXPECT_EQ(20, ReservedSpace(&field));
578 TEST(RepeatedPtrField, ReserveLessThanDouble) {
579 RepeatedPtrField<string> field;
583 EXPECT_EQ(40, ReservedSpace(&field));
586 TEST(RepeatedPtrField, ReserveLessThanExisting) {
587 RepeatedPtrField<string> field;
589 const string* const* previous_ptr = field.data();
592 EXPECT_EQ(previous_ptr, field.data());
593 EXPECT_EQ(20, ReservedSpace(&field));
596 TEST(RepeatedPtrField, ReserveDoesntLoseAllocated) {
597 // Check that a bug is fixed: An earlier implementation of Reserve()
598 // failed to copy pointers to allocated-but-cleared objects, possibly
599 // leading to segfaults.
600 RepeatedPtrField<string> field;
601 string* first = field.Add();
605 EXPECT_EQ(first, field.Add());
608 // Clearing elements is tricky with RepeatedPtrFields since the memory for
609 // the elements is retained and reused.
610 TEST(RepeatedPtrField, ClearedElements) {
611 RepeatedPtrField<string> field;
613 string* original = field.Add();
616 EXPECT_EQ(field.ClearedCount(), 0);
619 EXPECT_TRUE(original->empty());
620 EXPECT_EQ(field.ClearedCount(), 1);
622 EXPECT_EQ(field.Add(), original); // Should return same string for reuse.
624 EXPECT_EQ(field.ReleaseLast(), original); // We take ownership.
625 EXPECT_EQ(field.ClearedCount(), 0);
627 EXPECT_NE(field.Add(), original); // Should NOT return the same string.
628 EXPECT_EQ(field.ClearedCount(), 0);
630 field.AddAllocated(original); // Give ownership back.
631 EXPECT_EQ(field.ClearedCount(), 0);
632 EXPECT_EQ(field.Mutable(1), original);
635 EXPECT_EQ(field.ClearedCount(), 2);
636 EXPECT_EQ(field.ReleaseCleared(), original); // Take ownership again.
637 EXPECT_EQ(field.ClearedCount(), 1);
638 EXPECT_NE(field.Add(), original);
639 EXPECT_EQ(field.ClearedCount(), 0);
640 EXPECT_NE(field.Add(), original);
641 EXPECT_EQ(field.ClearedCount(), 0);
643 field.AddCleared(original); // Give ownership back, but as a cleared object.
644 EXPECT_EQ(field.ClearedCount(), 1);
645 EXPECT_EQ(field.Add(), original);
646 EXPECT_EQ(field.ClearedCount(), 0);
649 // Test all code paths in AddAllocated().
650 TEST(RepeatedPtrField, AddAlocated) {
651 RepeatedPtrField<string> field;
652 while (field.size() < field.Capacity()) {
653 field.Add()->assign("filler");
656 int index = field.size();
658 // First branch: Field is at capacity with no cleared objects.
659 string* foo = new string("foo");
660 field.AddAllocated(foo);
661 EXPECT_EQ(index + 1, field.size());
662 EXPECT_EQ(0, field.ClearedCount());
663 EXPECT_EQ(foo, &field.Get(index));
665 // Last branch: Field is not at capacity and there are no cleared objects.
666 string* bar = new string("bar");
667 field.AddAllocated(bar);
669 EXPECT_EQ(index + 1, field.size());
670 EXPECT_EQ(0, field.ClearedCount());
671 EXPECT_EQ(bar, &field.Get(index));
673 // Third branch: Field is not at capacity and there are no cleared objects.
675 string* baz = new string("baz");
676 field.AddAllocated(baz);
677 EXPECT_EQ(index + 1, field.size());
678 EXPECT_EQ(1, field.ClearedCount());
679 EXPECT_EQ(baz, &field.Get(index));
681 // Second branch: Field is at capacity but has some cleared objects.
682 while (field.size() < field.Capacity()) {
683 field.Add()->assign("filler2");
686 index = field.size();
687 string* qux = new string("qux");
688 field.AddAllocated(qux);
689 EXPECT_EQ(index + 1, field.size());
690 // We should have discarded the cleared object.
691 EXPECT_EQ(0, field.ClearedCount());
692 EXPECT_EQ(qux, &field.Get(index));
695 TEST(RepeatedPtrField, MergeFrom) {
696 RepeatedPtrField<string> source, destination;
697 source.Add()->assign("4");
698 source.Add()->assign("5");
699 destination.Add()->assign("1");
700 destination.Add()->assign("2");
701 destination.Add()->assign("3");
703 destination.MergeFrom(source);
705 ASSERT_EQ(5, destination.size());
706 EXPECT_EQ("1", destination.Get(0));
707 EXPECT_EQ("2", destination.Get(1));
708 EXPECT_EQ("3", destination.Get(2));
709 EXPECT_EQ("4", destination.Get(3));
710 EXPECT_EQ("5", destination.Get(4));
713 #ifdef PROTOBUF_HAS_DEATH_TEST
714 TEST(RepeatedPtrField, MergeFromSelf) {
715 RepeatedPtrField<string> me;
716 me.Add()->assign("1");
717 EXPECT_DEATH(me.MergeFrom(me), "");
719 #endif // PROTOBUF_HAS_DEATH_TEST
721 TEST(RepeatedPtrField, CopyFrom) {
722 RepeatedPtrField<string> source, destination;
723 source.Add()->assign("4");
724 source.Add()->assign("5");
725 destination.Add()->assign("1");
726 destination.Add()->assign("2");
727 destination.Add()->assign("3");
729 destination.CopyFrom(source);
731 ASSERT_EQ(2, destination.size());
732 EXPECT_EQ("4", destination.Get(0));
733 EXPECT_EQ("5", destination.Get(1));
736 TEST(RepeatedPtrField, CopyFromSelf) {
737 RepeatedPtrField<string> me;
738 me.Add()->assign("1");
740 ASSERT_EQ(1, me.size());
741 EXPECT_EQ("1", me.Get(0));
744 TEST(RepeatedPtrField, CopyConstruct) {
745 RepeatedPtrField<string> source;
746 source.Add()->assign("1");
747 source.Add()->assign("2");
749 RepeatedPtrField<string> destination(source);
751 ASSERT_EQ(2, destination.size());
752 EXPECT_EQ("1", destination.Get(0));
753 EXPECT_EQ("2", destination.Get(1));
756 TEST(RepeatedPtrField, IteratorConstruct_String) {
757 vector<string> values;
758 values.push_back("1");
759 values.push_back("2");
761 RepeatedPtrField<string> field(values.begin(), values.end());
762 ASSERT_EQ(values.size(), field.size());
763 EXPECT_EQ(values[0], field.Get(0));
764 EXPECT_EQ(values[1], field.Get(1));
766 RepeatedPtrField<string> other(field.begin(), field.end());
767 ASSERT_EQ(values.size(), other.size());
768 EXPECT_EQ(values[0], other.Get(0));
769 EXPECT_EQ(values[1], other.Get(1));
772 TEST(RepeatedPtrField, IteratorConstruct_Proto) {
773 typedef TestAllTypes::NestedMessage Nested;
774 vector<Nested> values;
775 values.push_back(Nested());
776 values.back().set_bb(1);
777 values.push_back(Nested());
778 values.back().set_bb(2);
780 RepeatedPtrField<Nested> field(values.begin(), values.end());
781 ASSERT_EQ(values.size(), field.size());
782 EXPECT_EQ(values[0].bb(), field.Get(0).bb());
783 EXPECT_EQ(values[1].bb(), field.Get(1).bb());
785 RepeatedPtrField<Nested> other(field.begin(), field.end());
786 ASSERT_EQ(values.size(), other.size());
787 EXPECT_EQ(values[0].bb(), other.Get(0).bb());
788 EXPECT_EQ(values[1].bb(), other.Get(1).bb());
791 TEST(RepeatedPtrField, CopyAssign) {
792 RepeatedPtrField<string> source, destination;
793 source.Add()->assign("4");
794 source.Add()->assign("5");
795 destination.Add()->assign("1");
796 destination.Add()->assign("2");
797 destination.Add()->assign("3");
799 destination = source;
801 ASSERT_EQ(2, destination.size());
802 EXPECT_EQ("4", destination.Get(0));
803 EXPECT_EQ("5", destination.Get(1));
806 TEST(RepeatedPtrField, SelfAssign) {
807 // Verify that assignment to self does not destroy data.
808 RepeatedPtrField<string> source, *p;
810 source.Add()->assign("7");
811 source.Add()->assign("8");
815 ASSERT_EQ(2, source.size());
816 EXPECT_EQ("7", source.Get(0));
817 EXPECT_EQ("8", source.Get(1));
820 TEST(RepeatedPtrField, MutableDataIsMutable) {
821 RepeatedPtrField<string> field;
823 EXPECT_EQ("1", field.Get(0));
824 // The fact that this line compiles would be enough, but we'll check the
826 string** data = field.mutable_data();
828 EXPECT_EQ("2", field.Get(0));
831 TEST(RepeatedPtrField, ExtractSubrange) {
832 // Exhaustively test every subrange in arrays of all sizes from 0 through 9
833 // with 0 through 3 cleared elements at the end.
834 for (int sz = 0; sz < 10; ++sz) {
835 for (int num = 0; num <= sz; ++num) {
836 for (int start = 0; start < sz - num; ++start) {
837 for (int extra = 0; extra < 4; ++extra) {
838 vector<string*> subject;
840 // Create an array with "sz" elements and "extra" cleared elements.
841 RepeatedPtrField<string> field;
842 for (int i = 0; i < sz + extra; ++i) {
843 subject.push_back(new string());
844 field.AddAllocated(subject[i]);
846 EXPECT_EQ(field.size(), sz + extra);
847 for (int i = 0; i < extra; ++i)
849 EXPECT_EQ(field.size(), sz);
850 EXPECT_EQ(field.ClearedCount(), extra);
852 // Create a catcher array and call ExtractSubrange.
854 for (int i = 0; i < 10; ++i)
856 field.ExtractSubrange(start, num, catcher);
858 // Does the resulting array have the right size?
859 EXPECT_EQ(field.size(), sz - num);
861 // Were the removed elements extracted into the catcher array?
862 for (int i = 0; i < num; ++i)
863 EXPECT_EQ(catcher[i], subject[start + i]);
864 EXPECT_EQ(NULL, catcher[num]);
866 // Does the resulting array contain the right values?
867 for (int i = 0; i < start; ++i)
868 EXPECT_EQ(field.Mutable(i), subject[i]);
869 for (int i = start; i < field.size(); ++i)
870 EXPECT_EQ(field.Mutable(i), subject[i + num]);
872 // Reinstate the cleared elements.
873 EXPECT_EQ(field.ClearedCount(), extra);
874 for (int i = 0; i < extra; ++i)
876 EXPECT_EQ(field.ClearedCount(), 0);
877 EXPECT_EQ(field.size(), sz - num + extra);
879 // Make sure the extra elements are all there (in some order).
880 for (int i = sz; i < sz + extra; ++i) {
882 for (int j = sz; j < sz + extra; ++j) {
883 if (field.Mutable(j - num) == subject[i])
889 // Release the caught elements.
890 for (int i = 0; i < num; ++i)
898 TEST(RepeatedPtrField, DeleteSubrange) {
899 // DeleteSubrange is a trivial extension of ExtendSubrange.
902 // ===================================================================
904 // Iterator tests stolen from net/proto/proto-array_unittest.
905 class RepeatedFieldIteratorTest : public testing::Test {
907 virtual void SetUp() {
908 for (int i = 0; i < 3; ++i) {
913 RepeatedField<int> proto_array_;
916 TEST_F(RepeatedFieldIteratorTest, Convertible) {
917 RepeatedField<int>::iterator iter = proto_array_.begin();
918 RepeatedField<int>::const_iterator c_iter = iter;
919 RepeatedField<int>::value_type value = *c_iter;
923 TEST_F(RepeatedFieldIteratorTest, MutableIteration) {
924 RepeatedField<int>::iterator iter = proto_array_.begin();
927 EXPECT_EQ(1, *iter++);
930 EXPECT_TRUE(proto_array_.end() == iter);
932 EXPECT_EQ(2, *(proto_array_.end() - 1));
935 TEST_F(RepeatedFieldIteratorTest, ConstIteration) {
936 const RepeatedField<int>& const_proto_array = proto_array_;
937 RepeatedField<int>::const_iterator iter = const_proto_array.begin();
940 EXPECT_EQ(1, *iter++);
943 EXPECT_TRUE(proto_array_.end() == iter);
944 EXPECT_EQ(2, *(proto_array_.end() - 1));
947 TEST_F(RepeatedFieldIteratorTest, Mutation) {
948 RepeatedField<int>::iterator iter = proto_array_.begin();
950 EXPECT_EQ(7, proto_array_.Get(0));
953 // -------------------------------------------------------------------
955 class RepeatedPtrFieldIteratorTest : public testing::Test {
957 virtual void SetUp() {
958 proto_array_.Add()->assign("foo");
959 proto_array_.Add()->assign("bar");
960 proto_array_.Add()->assign("baz");
963 RepeatedPtrField<string> proto_array_;
966 TEST_F(RepeatedPtrFieldIteratorTest, Convertible) {
967 RepeatedPtrField<string>::iterator iter = proto_array_.begin();
968 RepeatedPtrField<string>::const_iterator c_iter = iter;
969 RepeatedPtrField<string>::value_type value = *c_iter;
970 EXPECT_EQ("foo", value);
973 TEST_F(RepeatedPtrFieldIteratorTest, MutableIteration) {
974 RepeatedPtrField<string>::iterator iter = proto_array_.begin();
975 EXPECT_EQ("foo", *iter);
977 EXPECT_EQ("bar", *(iter++));
978 EXPECT_EQ("baz", *iter);
980 EXPECT_TRUE(proto_array_.end() == iter);
981 EXPECT_EQ("baz", *(--proto_array_.end()));
984 TEST_F(RepeatedPtrFieldIteratorTest, ConstIteration) {
985 const RepeatedPtrField<string>& const_proto_array = proto_array_;
986 RepeatedPtrField<string>::const_iterator iter = const_proto_array.begin();
987 EXPECT_EQ("foo", *iter);
989 EXPECT_EQ("bar", *(iter++));
990 EXPECT_EQ("baz", *iter);
992 EXPECT_TRUE(const_proto_array.end() == iter);
993 EXPECT_EQ("baz", *(--const_proto_array.end()));
996 TEST_F(RepeatedPtrFieldIteratorTest, MutableReverseIteration) {
997 RepeatedPtrField<string>::reverse_iterator iter = proto_array_.rbegin();
998 EXPECT_EQ("baz", *iter);
1000 EXPECT_EQ("bar", *(iter++));
1001 EXPECT_EQ("foo", *iter);
1003 EXPECT_TRUE(proto_array_.rend() == iter);
1004 EXPECT_EQ("foo", *(--proto_array_.rend()));
1007 TEST_F(RepeatedPtrFieldIteratorTest, ConstReverseIteration) {
1008 const RepeatedPtrField<string>& const_proto_array = proto_array_;
1009 RepeatedPtrField<string>::const_reverse_iterator iter
1010 = const_proto_array.rbegin();
1011 EXPECT_EQ("baz", *iter);
1013 EXPECT_EQ("bar", *(iter++));
1014 EXPECT_EQ("foo", *iter);
1016 EXPECT_TRUE(const_proto_array.rend() == iter);
1017 EXPECT_EQ("foo", *(--const_proto_array.rend()));
1020 TEST_F(RepeatedPtrFieldIteratorTest, RandomAccess) {
1021 RepeatedPtrField<string>::iterator iter = proto_array_.begin();
1022 RepeatedPtrField<string>::iterator iter2 = iter;
1025 EXPECT_TRUE(iter + 2 == iter2);
1026 EXPECT_TRUE(iter == iter2 - 2);
1027 EXPECT_EQ("baz", iter[2]);
1028 EXPECT_EQ("baz", *(iter + 2));
1029 EXPECT_EQ(3, proto_array_.end() - proto_array_.begin());
1032 TEST_F(RepeatedPtrFieldIteratorTest, Comparable) {
1033 RepeatedPtrField<string>::const_iterator iter = proto_array_.begin();
1034 RepeatedPtrField<string>::const_iterator iter2 = iter + 1;
1035 EXPECT_TRUE(iter == iter);
1036 EXPECT_TRUE(iter != iter2);
1037 EXPECT_TRUE(iter < iter2);
1038 EXPECT_TRUE(iter <= iter2);
1039 EXPECT_TRUE(iter <= iter);
1040 EXPECT_TRUE(iter2 > iter);
1041 EXPECT_TRUE(iter2 >= iter);
1042 EXPECT_TRUE(iter >= iter);
1045 // Uninitialized iterator does not point to any of the RepeatedPtrField.
1046 TEST_F(RepeatedPtrFieldIteratorTest, UninitializedIterator) {
1047 RepeatedPtrField<string>::iterator iter;
1048 EXPECT_TRUE(iter != proto_array_.begin());
1049 EXPECT_TRUE(iter != proto_array_.begin() + 1);
1050 EXPECT_TRUE(iter != proto_array_.begin() + 2);
1051 EXPECT_TRUE(iter != proto_array_.begin() + 3);
1052 EXPECT_TRUE(iter != proto_array_.end());
1055 TEST_F(RepeatedPtrFieldIteratorTest, STLAlgorithms_lower_bound) {
1056 proto_array_.Clear();
1057 proto_array_.Add()->assign("a");
1058 proto_array_.Add()->assign("c");
1059 proto_array_.Add()->assign("d");
1060 proto_array_.Add()->assign("n");
1061 proto_array_.Add()->assign("p");
1062 proto_array_.Add()->assign("x");
1063 proto_array_.Add()->assign("y");
1066 RepeatedPtrField<string>::const_iterator it =
1067 lower_bound(proto_array_.begin(), proto_array_.end(), v);
1069 EXPECT_EQ(*it, "n");
1070 EXPECT_TRUE(it == proto_array_.begin() + 3);
1073 TEST_F(RepeatedPtrFieldIteratorTest, Mutation) {
1074 RepeatedPtrField<string>::iterator iter = proto_array_.begin();
1076 EXPECT_EQ("qux", proto_array_.Get(0));
1079 // -------------------------------------------------------------------
1081 class RepeatedPtrFieldPtrsIteratorTest : public testing::Test {
1083 virtual void SetUp() {
1084 proto_array_.Add()->assign("foo");
1085 proto_array_.Add()->assign("bar");
1086 proto_array_.Add()->assign("baz");
1087 const_proto_array_ = &proto_array_;
1090 RepeatedPtrField<string> proto_array_;
1091 const RepeatedPtrField<string>* const_proto_array_;
1094 TEST_F(RepeatedPtrFieldPtrsIteratorTest, ConvertiblePtr) {
1095 RepeatedPtrField<string>::pointer_iterator iter =
1096 proto_array_.pointer_begin();
1097 static_cast<void>(iter);
1100 TEST_F(RepeatedPtrFieldPtrsIteratorTest, ConvertibleConstPtr) {
1101 RepeatedPtrField<string>::const_pointer_iterator iter =
1102 const_proto_array_->pointer_begin();
1103 static_cast<void>(iter);
1106 TEST_F(RepeatedPtrFieldPtrsIteratorTest, MutablePtrIteration) {
1107 RepeatedPtrField<string>::pointer_iterator iter =
1108 proto_array_.pointer_begin();
1109 EXPECT_EQ("foo", **iter);
1111 EXPECT_EQ("bar", **(iter++));
1112 EXPECT_EQ("baz", **iter);
1114 EXPECT_TRUE(proto_array_.pointer_end() == iter);
1115 EXPECT_EQ("baz", **(--proto_array_.pointer_end()));
1118 TEST_F(RepeatedPtrFieldPtrsIteratorTest, MutableConstPtrIteration) {
1119 RepeatedPtrField<string>::const_pointer_iterator iter =
1120 const_proto_array_->pointer_begin();
1121 EXPECT_EQ("foo", **iter);
1123 EXPECT_EQ("bar", **(iter++));
1124 EXPECT_EQ("baz", **iter);
1126 EXPECT_TRUE(const_proto_array_->pointer_end() == iter);
1127 EXPECT_EQ("baz", **(--const_proto_array_->pointer_end()));
1130 TEST_F(RepeatedPtrFieldPtrsIteratorTest, RandomPtrAccess) {
1131 RepeatedPtrField<string>::pointer_iterator iter =
1132 proto_array_.pointer_begin();
1133 RepeatedPtrField<string>::pointer_iterator iter2 = iter;
1136 EXPECT_TRUE(iter + 2 == iter2);
1137 EXPECT_TRUE(iter == iter2 - 2);
1138 EXPECT_EQ("baz", *iter[2]);
1139 EXPECT_EQ("baz", **(iter + 2));
1140 EXPECT_EQ(3, proto_array_.end() - proto_array_.begin());
1143 TEST_F(RepeatedPtrFieldPtrsIteratorTest, RandomConstPtrAccess) {
1144 RepeatedPtrField<string>::const_pointer_iterator iter =
1145 const_proto_array_->pointer_begin();
1146 RepeatedPtrField<string>::const_pointer_iterator iter2 = iter;
1149 EXPECT_TRUE(iter + 2 == iter2);
1150 EXPECT_TRUE(iter == iter2 - 2);
1151 EXPECT_EQ("baz", *iter[2]);
1152 EXPECT_EQ("baz", **(iter + 2));
1153 EXPECT_EQ(3, const_proto_array_->end() - const_proto_array_->begin());
1156 TEST_F(RepeatedPtrFieldPtrsIteratorTest, ComparablePtr) {
1157 RepeatedPtrField<string>::pointer_iterator iter =
1158 proto_array_.pointer_begin();
1159 RepeatedPtrField<string>::pointer_iterator iter2 = iter + 1;
1160 EXPECT_TRUE(iter == iter);
1161 EXPECT_TRUE(iter != iter2);
1162 EXPECT_TRUE(iter < iter2);
1163 EXPECT_TRUE(iter <= iter2);
1164 EXPECT_TRUE(iter <= iter);
1165 EXPECT_TRUE(iter2 > iter);
1166 EXPECT_TRUE(iter2 >= iter);
1167 EXPECT_TRUE(iter >= iter);
1170 TEST_F(RepeatedPtrFieldPtrsIteratorTest, ComparableConstPtr) {
1171 RepeatedPtrField<string>::const_pointer_iterator iter =
1172 const_proto_array_->pointer_begin();
1173 RepeatedPtrField<string>::const_pointer_iterator iter2 = iter + 1;
1174 EXPECT_TRUE(iter == iter);
1175 EXPECT_TRUE(iter != iter2);
1176 EXPECT_TRUE(iter < iter2);
1177 EXPECT_TRUE(iter <= iter2);
1178 EXPECT_TRUE(iter <= iter);
1179 EXPECT_TRUE(iter2 > iter);
1180 EXPECT_TRUE(iter2 >= iter);
1181 EXPECT_TRUE(iter >= iter);
1184 // Uninitialized iterator does not point to any of the RepeatedPtrOverPtrs.
1185 // Dereferencing an uninitialized iterator crashes the process.
1186 TEST_F(RepeatedPtrFieldPtrsIteratorTest, UninitializedPtrIterator) {
1187 RepeatedPtrField<string>::pointer_iterator iter;
1188 EXPECT_TRUE(iter != proto_array_.pointer_begin());
1189 EXPECT_TRUE(iter != proto_array_.pointer_begin() + 1);
1190 EXPECT_TRUE(iter != proto_array_.pointer_begin() + 2);
1191 EXPECT_TRUE(iter != proto_array_.pointer_begin() + 3);
1192 EXPECT_TRUE(iter != proto_array_.pointer_end());
1195 TEST_F(RepeatedPtrFieldPtrsIteratorTest, UninitializedConstPtrIterator) {
1196 RepeatedPtrField<string>::const_pointer_iterator iter;
1197 EXPECT_TRUE(iter != const_proto_array_->pointer_begin());
1198 EXPECT_TRUE(iter != const_proto_array_->pointer_begin() + 1);
1199 EXPECT_TRUE(iter != const_proto_array_->pointer_begin() + 2);
1200 EXPECT_TRUE(iter != const_proto_array_->pointer_begin() + 3);
1201 EXPECT_TRUE(iter != const_proto_array_->pointer_end());
1204 // This comparison functor is required by the tests for RepeatedPtrOverPtrs.
1205 // They operate on strings and need to compare strings as strings in
1206 // any stl algorithm, even though the iterator returns a pointer to a string
1207 // - i.e. *iter has type string*.
1208 struct StringLessThan {
1209 bool operator()(const string* z, const string& y) {
1212 bool operator()(const string* z, const string* y) const { return *z < *y; }
1215 TEST_F(RepeatedPtrFieldPtrsIteratorTest, PtrSTLAlgorithms_lower_bound) {
1216 proto_array_.Clear();
1217 proto_array_.Add()->assign("a");
1218 proto_array_.Add()->assign("c");
1219 proto_array_.Add()->assign("d");
1220 proto_array_.Add()->assign("n");
1221 proto_array_.Add()->assign("p");
1222 proto_array_.Add()->assign("x");
1223 proto_array_.Add()->assign("y");
1227 RepeatedPtrField<string>::pointer_iterator it =
1228 lower_bound(proto_array_.pointer_begin(), proto_array_.pointer_end(),
1229 &v, StringLessThan());
1231 GOOGLE_CHECK(*it != NULL);
1233 EXPECT_EQ(**it, "n");
1234 EXPECT_TRUE(it == proto_array_.pointer_begin() + 3);
1238 RepeatedPtrField<string>::const_pointer_iterator it =
1239 lower_bound(const_proto_array_->pointer_begin(),
1240 const_proto_array_->pointer_end(),
1241 &v, StringLessThan());
1243 GOOGLE_CHECK(*it != NULL);
1245 EXPECT_EQ(**it, "n");
1246 EXPECT_TRUE(it == const_proto_array_->pointer_begin() + 3);
1250 TEST_F(RepeatedPtrFieldPtrsIteratorTest, PtrMutation) {
1251 RepeatedPtrField<string>::pointer_iterator iter =
1252 proto_array_.pointer_begin();
1254 EXPECT_EQ("qux", proto_array_.Get(0));
1256 EXPECT_EQ("bar", proto_array_.Get(1));
1257 EXPECT_EQ("baz", proto_array_.Get(2));
1260 *iter = new string("a");
1263 *iter = new string("b");
1264 EXPECT_EQ("a", proto_array_.Get(1));
1265 EXPECT_EQ("b", proto_array_.Get(2));
1268 TEST_F(RepeatedPtrFieldPtrsIteratorTest, Sort) {
1269 proto_array_.Add()->assign("c");
1270 proto_array_.Add()->assign("d");
1271 proto_array_.Add()->assign("n");
1272 proto_array_.Add()->assign("p");
1273 proto_array_.Add()->assign("a");
1274 proto_array_.Add()->assign("y");
1275 proto_array_.Add()->assign("x");
1276 EXPECT_EQ("foo", proto_array_.Get(0));
1277 EXPECT_EQ("n", proto_array_.Get(5));
1278 EXPECT_EQ("x", proto_array_.Get(9));
1279 sort(proto_array_.pointer_begin(),
1280 proto_array_.pointer_end(),
1282 EXPECT_EQ("a", proto_array_.Get(0));
1283 EXPECT_EQ("baz", proto_array_.Get(2));
1284 EXPECT_EQ("y", proto_array_.Get(9));
1288 // -----------------------------------------------------------------------------
1289 // Unit-tests for the insert iterators
1290 // google::protobuf::RepeatedFieldBackInserter,
1291 // google::protobuf::AllocatedRepeatedPtrFieldBackInserter
1292 // Ported from util/gtl/proto-array-iterators_unittest.
1294 class RepeatedFieldInsertionIteratorsTest : public testing::Test {
1296 std::list<double> halves;
1297 std::list<int> fibonacci;
1298 std::vector<string> words;
1299 typedef TestAllTypes::NestedMessage Nested;
1301 std::vector<Nested*> nested_ptrs;
1302 TestAllTypes protobuffer;
1304 virtual void SetUp() {
1305 fibonacci.push_back(1);
1306 fibonacci.push_back(1);
1307 fibonacci.push_back(2);
1308 fibonacci.push_back(3);
1309 fibonacci.push_back(5);
1310 fibonacci.push_back(8);
1311 std::copy(fibonacci.begin(), fibonacci.end(),
1312 RepeatedFieldBackInserter(protobuffer.mutable_repeated_int32()));
1314 halves.push_back(1.0);
1315 halves.push_back(0.5);
1316 halves.push_back(0.25);
1317 halves.push_back(0.125);
1318 halves.push_back(0.0625);
1319 std::copy(halves.begin(), halves.end(),
1320 RepeatedFieldBackInserter(protobuffer.mutable_repeated_double()));
1322 words.push_back("Able");
1323 words.push_back("was");
1324 words.push_back("I");
1325 words.push_back("ere");
1326 words.push_back("I");
1327 words.push_back("saw");
1328 words.push_back("Elba");
1329 std::copy(words.begin(), words.end(),
1330 RepeatedFieldBackInserter(protobuffer.mutable_repeated_string()));
1332 nesteds[0].set_bb(17);
1333 nesteds[1].set_bb(4711);
1334 std::copy(&nesteds[0], &nesteds[2],
1335 RepeatedFieldBackInserter(
1336 protobuffer.mutable_repeated_nested_message()));
1338 nested_ptrs.push_back(new Nested);
1339 nested_ptrs.back()->set_bb(170);
1340 nested_ptrs.push_back(new Nested);
1341 nested_ptrs.back()->set_bb(47110);
1342 std::copy(nested_ptrs.begin(), nested_ptrs.end(),
1343 RepeatedFieldBackInserter(
1344 protobuffer.mutable_repeated_nested_message()));
1348 virtual void TearDown() {
1349 STLDeleteContainerPointers(nested_ptrs.begin(), nested_ptrs.end());
1353 TEST_F(RepeatedFieldInsertionIteratorsTest, Fibonacci) {
1354 EXPECT_TRUE(std::equal(fibonacci.begin(),
1356 protobuffer.repeated_int32().begin()));
1357 EXPECT_TRUE(std::equal(protobuffer.repeated_int32().begin(),
1358 protobuffer.repeated_int32().end(),
1359 fibonacci.begin()));
1362 TEST_F(RepeatedFieldInsertionIteratorsTest, Halves) {
1363 EXPECT_TRUE(std::equal(halves.begin(),
1365 protobuffer.repeated_double().begin()));
1366 EXPECT_TRUE(std::equal(protobuffer.repeated_double().begin(),
1367 protobuffer.repeated_double().end(),
1371 TEST_F(RepeatedFieldInsertionIteratorsTest, Words) {
1372 ASSERT_EQ(words.size(), protobuffer.repeated_string_size());
1373 for (int i = 0; i < words.size(); ++i)
1374 EXPECT_EQ(words.at(i), protobuffer.repeated_string(i));
1377 TEST_F(RepeatedFieldInsertionIteratorsTest, Words2) {
1379 words.push_back("sing");
1380 words.push_back("a");
1381 words.push_back("song");
1382 words.push_back("of");
1383 words.push_back("six");
1384 words.push_back("pence");
1385 protobuffer.mutable_repeated_string()->Clear();
1386 std::copy(words.begin(), words.end(), RepeatedPtrFieldBackInserter(
1387 protobuffer.mutable_repeated_string()));
1388 ASSERT_EQ(words.size(), protobuffer.repeated_string_size());
1389 for (int i = 0; i < words.size(); ++i)
1390 EXPECT_EQ(words.at(i), protobuffer.repeated_string(i));
1393 TEST_F(RepeatedFieldInsertionIteratorsTest, Nesteds) {
1394 ASSERT_EQ(protobuffer.repeated_nested_message_size(), 4);
1395 EXPECT_EQ(protobuffer.repeated_nested_message(0).bb(), 17);
1396 EXPECT_EQ(protobuffer.repeated_nested_message(1).bb(), 4711);
1397 EXPECT_EQ(protobuffer.repeated_nested_message(2).bb(), 170);
1398 EXPECT_EQ(protobuffer.repeated_nested_message(3).bb(), 47110);
1401 TEST_F(RepeatedFieldInsertionIteratorsTest,
1402 AllocatedRepeatedPtrFieldWithStringIntData) {
1403 vector<Nested*> data;
1404 TestAllTypes goldenproto;
1405 for (int i = 0; i < 10; ++i) {
1406 Nested* new_data = new Nested;
1407 new_data->set_bb(i);
1408 data.push_back(new_data);
1410 new_data = goldenproto.add_repeated_nested_message();
1411 new_data->set_bb(i);
1413 TestAllTypes testproto;
1414 copy(data.begin(), data.end(),
1415 AllocatedRepeatedPtrFieldBackInserter(
1416 testproto.mutable_repeated_nested_message()));
1417 EXPECT_EQ(testproto.DebugString(), goldenproto.DebugString());
1420 TEST_F(RepeatedFieldInsertionIteratorsTest,
1421 AllocatedRepeatedPtrFieldWithString) {
1422 vector<string*> data;
1423 TestAllTypes goldenproto;
1424 for (int i = 0; i < 10; ++i) {
1425 string* new_data = new string;
1426 *new_data = "name-" + SimpleItoa(i);
1427 data.push_back(new_data);
1429 new_data = goldenproto.add_repeated_string();
1430 *new_data = "name-" + SimpleItoa(i);
1432 TestAllTypes testproto;
1433 copy(data.begin(), data.end(),
1434 AllocatedRepeatedPtrFieldBackInserter(
1435 testproto.mutable_repeated_string()));
1436 EXPECT_EQ(testproto.DebugString(), goldenproto.DebugString());
1441 } // namespace protobuf
1442 } // namespace google