• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc.  All rights reserved.
3 // https://developers.google.com/protocol-buffers/
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
7 // met:
8 //
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
14 // distribution.
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.
18 //
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.
30 
31 // Author: kenton@google.com (Kenton Varda)
32 //  Based on original Protocol Buffers design by
33 //  Sanjay Ghemawat, Jeff Dean, and others.
34 //
35 // TODO(kenton):  Improve this unittest to bring it up to the standards of
36 //   other proto2 unittests.
37 
38 #include <google/protobuf/repeated_field.h>
39 
40 #include <algorithm>
41 #include <cstdlib>
42 #include <iterator>
43 #include <limits>
44 #include <list>
45 #include <sstream>
46 #include <type_traits>
47 #include <vector>
48 
49 #include <google/protobuf/stubs/logging.h>
50 #include <google/protobuf/stubs/common.h>
51 #include <google/protobuf/unittest.pb.h>
52 #include <google/protobuf/stubs/strutil.h>
53 #include <gmock/gmock.h>
54 #include <google/protobuf/testing/googletest.h>
55 #include <gtest/gtest.h>
56 #include <google/protobuf/stubs/stl_util.h>
57 
58 // Must be included last.
59 #include <google/protobuf/port_def.inc>
60 
61 namespace google {
62 namespace protobuf {
63 namespace {
64 
65 using ::protobuf_unittest::TestAllTypes;
66 using ::testing::ElementsAre;
67 
TEST(RepeatedField,ConstInit)68 TEST(RepeatedField, ConstInit) {
69   PROTOBUF_CONSTINIT static RepeatedField<int> field{};  // NOLINT
70   EXPECT_TRUE(field.empty());
71 }
72 
73 // Test operations on a small RepeatedField.
TEST(RepeatedField,Small)74 TEST(RepeatedField, Small) {
75   RepeatedField<int> field;
76 
77   EXPECT_TRUE(field.empty());
78   EXPECT_EQ(field.size(), 0);
79 
80   field.Add(5);
81 
82   EXPECT_FALSE(field.empty());
83   EXPECT_EQ(field.size(), 1);
84   EXPECT_EQ(field.Get(0), 5);
85   EXPECT_EQ(field.at(0), 5);
86 
87   field.Add(42);
88 
89   EXPECT_FALSE(field.empty());
90   EXPECT_EQ(field.size(), 2);
91   EXPECT_EQ(field.Get(0), 5);
92   EXPECT_EQ(field.at(0), 5);
93   EXPECT_EQ(field.Get(1), 42);
94   EXPECT_EQ(field.at(1), 42);
95 
96   field.Set(1, 23);
97 
98   EXPECT_FALSE(field.empty());
99   EXPECT_EQ(field.size(), 2);
100   EXPECT_EQ(field.Get(0), 5);
101   EXPECT_EQ(field.at(0), 5);
102   EXPECT_EQ(field.Get(1), 23);
103   EXPECT_EQ(field.at(1), 23);
104 
105   field.at(1) = 25;
106 
107   EXPECT_FALSE(field.empty());
108   EXPECT_EQ(field.size(), 2);
109   EXPECT_EQ(field.Get(0), 5);
110   EXPECT_EQ(field.at(0), 5);
111   EXPECT_EQ(field.Get(1), 25);
112   EXPECT_EQ(field.at(1), 25);
113 
114   field.RemoveLast();
115 
116   EXPECT_FALSE(field.empty());
117   EXPECT_EQ(field.size(), 1);
118   EXPECT_EQ(field.Get(0), 5);
119   EXPECT_EQ(field.at(0), 5);
120 
121   field.Clear();
122 
123   EXPECT_TRUE(field.empty());
124   EXPECT_EQ(field.size(), 0);
125   // Additional bytes are for 'struct Rep' header.
126   int expected_usage = 4 * sizeof(int) + sizeof(Arena*);
127   EXPECT_GE(field.SpaceUsedExcludingSelf(), expected_usage);
128 }
129 
130 
131 // Test operations on a RepeatedField which is large enough to allocate a
132 // separate array.
TEST(RepeatedField,Large)133 TEST(RepeatedField, Large) {
134   RepeatedField<int> field;
135 
136   for (int i = 0; i < 16; i++) {
137     field.Add(i * i);
138   }
139 
140   EXPECT_FALSE(field.empty());
141   EXPECT_EQ(field.size(), 16);
142 
143   for (int i = 0; i < 16; i++) {
144     EXPECT_EQ(field.Get(i), i * i);
145   }
146 
147   int expected_usage = 16 * sizeof(int);
148   EXPECT_GE(field.SpaceUsedExcludingSelf(), expected_usage);
149 }
150 
151 // Test swapping between various types of RepeatedFields.
TEST(RepeatedField,SwapSmallSmall)152 TEST(RepeatedField, SwapSmallSmall) {
153   RepeatedField<int> field1;
154   RepeatedField<int> field2;
155 
156   field1.Add(5);
157   field1.Add(42);
158 
159   EXPECT_FALSE(field1.empty());
160   EXPECT_EQ(field1.size(), 2);
161   EXPECT_EQ(field1.Get(0), 5);
162   EXPECT_EQ(field1.Get(1), 42);
163 
164   EXPECT_TRUE(field2.empty());
165   EXPECT_EQ(field2.size(), 0);
166 
167   field1.Swap(&field2);
168 
169   EXPECT_TRUE(field1.empty());
170   EXPECT_EQ(field1.size(), 0);
171 
172   EXPECT_FALSE(field2.empty());
173   EXPECT_EQ(field2.size(), 2);
174   EXPECT_EQ(field2.Get(0), 5);
175   EXPECT_EQ(field2.Get(1), 42);
176 }
177 
TEST(RepeatedField,SwapLargeSmall)178 TEST(RepeatedField, SwapLargeSmall) {
179   RepeatedField<int> field1;
180   RepeatedField<int> field2;
181 
182   for (int i = 0; i < 16; i++) {
183     field1.Add(i * i);
184   }
185   field2.Add(5);
186   field2.Add(42);
187   field1.Swap(&field2);
188 
189   EXPECT_EQ(field1.size(), 2);
190   EXPECT_EQ(field1.Get(0), 5);
191   EXPECT_EQ(field1.Get(1), 42);
192   EXPECT_EQ(field2.size(), 16);
193   for (int i = 0; i < 16; i++) {
194     EXPECT_EQ(field2.Get(i), i * i);
195   }
196 }
197 
TEST(RepeatedField,SwapLargeLarge)198 TEST(RepeatedField, SwapLargeLarge) {
199   RepeatedField<int> field1;
200   RepeatedField<int> field2;
201 
202   field1.Add(5);
203   field1.Add(42);
204   for (int i = 0; i < 16; i++) {
205     field1.Add(i);
206     field2.Add(i * i);
207   }
208   field2.Swap(&field1);
209 
210   EXPECT_EQ(field1.size(), 16);
211   for (int i = 0; i < 16; i++) {
212     EXPECT_EQ(field1.Get(i), i * i);
213   }
214   EXPECT_EQ(field2.size(), 18);
215   EXPECT_EQ(field2.Get(0), 5);
216   EXPECT_EQ(field2.Get(1), 42);
217   for (int i = 2; i < 18; i++) {
218     EXPECT_EQ(field2.Get(i), i - 2);
219   }
220 }
221 
222 // Determines how much space was reserved by the given field by adding elements
223 // to it until it re-allocates its space.
ReservedSpace(RepeatedField<int> * field)224 static int ReservedSpace(RepeatedField<int>* field) {
225   const int* ptr = field->data();
226   do {
227     field->Add(0);
228   } while (field->data() == ptr);
229 
230   return field->size() - 1;
231 }
232 
TEST(RepeatedField,ReserveMoreThanDouble)233 TEST(RepeatedField, ReserveMoreThanDouble) {
234   // Reserve more than double the previous space in the field and expect the
235   // field to reserve exactly the amount specified.
236   RepeatedField<int> field;
237   field.Reserve(20);
238 
239   EXPECT_LE(20, ReservedSpace(&field));
240 }
241 
TEST(RepeatedField,ReserveLessThanDouble)242 TEST(RepeatedField, ReserveLessThanDouble) {
243   // Reserve less than double the previous space in the field and expect the
244   // field to grow by double instead.
245   RepeatedField<int> field;
246   field.Reserve(20);
247   int capacity = field.Capacity();
248   field.Reserve(capacity * 1.5);
249 
250   EXPECT_LE(2 * capacity, ReservedSpace(&field));
251 }
252 
TEST(RepeatedField,ReserveLessThanExisting)253 TEST(RepeatedField, ReserveLessThanExisting) {
254   // Reserve less than the previous space in the field and expect the
255   // field to not re-allocate at all.
256   RepeatedField<int> field;
257   field.Reserve(20);
258   const int* previous_ptr = field.data();
259   field.Reserve(10);
260 
261   EXPECT_EQ(previous_ptr, field.data());
262   EXPECT_LE(20, ReservedSpace(&field));
263 }
264 
TEST(RepeatedField,Resize)265 TEST(RepeatedField, Resize) {
266   RepeatedField<int> field;
267   field.Resize(2, 1);
268   EXPECT_EQ(2, field.size());
269   field.Resize(5, 2);
270   EXPECT_EQ(5, field.size());
271   field.Resize(4, 3);
272   ASSERT_EQ(4, field.size());
273   EXPECT_EQ(1, field.Get(0));
274   EXPECT_EQ(1, field.Get(1));
275   EXPECT_EQ(2, field.Get(2));
276   EXPECT_EQ(2, field.Get(3));
277   field.Resize(0, 4);
278   EXPECT_TRUE(field.empty());
279 }
280 
TEST(RepeatedField,ReserveNothing)281 TEST(RepeatedField, ReserveNothing) {
282   RepeatedField<int> field;
283   EXPECT_EQ(0, field.Capacity());
284 
285   field.Reserve(-1);
286   EXPECT_EQ(0, field.Capacity());
287 }
288 
TEST(RepeatedField,ReserveLowerClamp)289 TEST(RepeatedField, ReserveLowerClamp) {
290   const int clamped_value = internal::CalculateReserveSize(0, 1);
291   EXPECT_EQ(internal::kRepeatedFieldLowerClampLimit, clamped_value);
292   EXPECT_EQ(clamped_value, internal::CalculateReserveSize(clamped_value, 2));
293 }
294 
TEST(RepeatedField,ReserveGrowth)295 TEST(RepeatedField, ReserveGrowth) {
296   // Make sure the field capacity doubles in size on repeated reservation.
297   for (int size = internal::kRepeatedFieldLowerClampLimit, i = 0; i < 4;
298        ++i, size *= 2) {
299     EXPECT_EQ(size * 2, internal::CalculateReserveSize(size, size + 1));
300   }
301 }
302 
TEST(RepeatedField,ReserveLarge)303 TEST(RepeatedField, ReserveLarge) {
304   const int old_size = 10;
305   // This is a size we won't get by doubling:
306   const int new_size = old_size * 3 + 1;
307 
308   // Reserving more than 2x current capacity should grow directly to that size.
309   EXPECT_EQ(new_size, internal::CalculateReserveSize(old_size, new_size));
310 }
311 
TEST(RepeatedField,ReserveHuge)312 TEST(RepeatedField, ReserveHuge) {
313   // Largest value that does not clamp to the large limit:
314   constexpr int non_clamping_limit = std::numeric_limits<int>::max() / 2;
315   ASSERT_LT(2 * non_clamping_limit, std::numeric_limits<int>::max());
316   EXPECT_LT(internal::CalculateReserveSize(non_clamping_limit,
317                                            non_clamping_limit + 1),
318             std::numeric_limits<int>::max());
319 
320   // Smallest size that *will* clamp to the upper limit:
321   constexpr int min_clamping_size = std::numeric_limits<int>::max() / 2 + 1;
322   EXPECT_EQ(
323       internal::CalculateReserveSize(min_clamping_size, min_clamping_size + 1),
324       std::numeric_limits<int>::max());
325 
326 #ifdef PROTOBUF_TEST_ALLOW_LARGE_ALLOC
327   // The rest of this test may allocate several GB of memory, so it is only
328   // built if explicitly requested.
329   RepeatedField<int> huge_field;
330 
331   // Reserve a size for huge_field that will clamp.
332   huge_field.Reserve(min_clamping_size);
333   EXPECT_GE(huge_field.Capacity(), min_clamping_size);
334   ASSERT_LT(huge_field.Capacity(), std::numeric_limits<int>::max() - 1);
335 
336 #ifndef ADDRESS_SANITIZER
337   // The array containing all the fields is, in theory, up to MAXINT-1 in size.
338   // However, some compilers can't handle a struct whose size is larger
339   // than 2GB, and the protocol buffer format doesn't handle more than 2GB of
340   // data at once, either.  So we limit it, but the code below accesses beyond
341   // that limit.
342 
343   // Allocation may return more memory than we requested. However, the updated
344   // size must still be clamped to a valid range.
345   huge_field.Reserve(huge_field.Capacity() + 1);
346   EXPECT_EQ(huge_field.Capacity(), std::numeric_limits<int>::max());
347 #endif
348 #endif  // PROTOBUF_TEST_ALLOW_LARGE_ALLOC
349 }
350 
TEST(RepeatedField,MergeFrom)351 TEST(RepeatedField, MergeFrom) {
352   RepeatedField<int> source, destination;
353   source.Add(4);
354   source.Add(5);
355   destination.Add(1);
356   destination.Add(2);
357   destination.Add(3);
358 
359   destination.MergeFrom(source);
360 
361   ASSERT_EQ(5, destination.size());
362   EXPECT_EQ(1, destination.Get(0));
363   EXPECT_EQ(2, destination.Get(1));
364   EXPECT_EQ(3, destination.Get(2));
365   EXPECT_EQ(4, destination.Get(3));
366   EXPECT_EQ(5, destination.Get(4));
367 }
368 
369 
TEST(RepeatedField,CopyFrom)370 TEST(RepeatedField, CopyFrom) {
371   RepeatedField<int> source, destination;
372   source.Add(4);
373   source.Add(5);
374   destination.Add(1);
375   destination.Add(2);
376   destination.Add(3);
377 
378   destination.CopyFrom(source);
379 
380   ASSERT_EQ(2, destination.size());
381   EXPECT_EQ(4, destination.Get(0));
382   EXPECT_EQ(5, destination.Get(1));
383 }
384 
TEST(RepeatedField,CopyFromSelf)385 TEST(RepeatedField, CopyFromSelf) {
386   RepeatedField<int> me;
387   me.Add(3);
388   me.CopyFrom(me);
389   ASSERT_EQ(1, me.size());
390   EXPECT_EQ(3, me.Get(0));
391 }
392 
TEST(RepeatedField,Erase)393 TEST(RepeatedField, Erase) {
394   RepeatedField<int> me;
395   RepeatedField<int>::iterator it = me.erase(me.begin(), me.end());
396   EXPECT_TRUE(me.begin() == it);
397   EXPECT_EQ(0, me.size());
398 
399   me.Add(1);
400   me.Add(2);
401   me.Add(3);
402   it = me.erase(me.begin(), me.end());
403   EXPECT_TRUE(me.begin() == it);
404   EXPECT_EQ(0, me.size());
405 
406   me.Add(4);
407   me.Add(5);
408   me.Add(6);
409   it = me.erase(me.begin() + 2, me.end());
410   EXPECT_TRUE(me.begin() + 2 == it);
411   EXPECT_EQ(2, me.size());
412   EXPECT_EQ(4, me.Get(0));
413   EXPECT_EQ(5, me.Get(1));
414 
415   me.Add(6);
416   me.Add(7);
417   me.Add(8);
418   it = me.erase(me.begin() + 1, me.begin() + 3);
419   EXPECT_TRUE(me.begin() + 1 == it);
420   EXPECT_EQ(3, me.size());
421   EXPECT_EQ(4, me.Get(0));
422   EXPECT_EQ(7, me.Get(1));
423   EXPECT_EQ(8, me.Get(2));
424 }
425 
426 // Add contents of empty container to an empty field.
TEST(RepeatedField,AddRange1)427 TEST(RepeatedField, AddRange1) {
428   RepeatedField<int> me;
429   std::vector<int> values;
430 
431   me.Add(values.begin(), values.end());
432   ASSERT_EQ(me.size(), 0);
433 }
434 
435 // Add contents of container with one thing to an empty field.
TEST(RepeatedField,AddRange2)436 TEST(RepeatedField, AddRange2) {
437   RepeatedField<int> me;
438   std::vector<int> values;
439   values.push_back(-1);
440 
441   me.Add(values.begin(), values.end());
442   ASSERT_EQ(me.size(), 1);
443   ASSERT_EQ(me.Get(0), values[0]);
444 }
445 
446 // Add contents of container with more than one thing to an empty field.
TEST(RepeatedField,AddRange3)447 TEST(RepeatedField, AddRange3) {
448   RepeatedField<int> me;
449   std::vector<int> values;
450   values.push_back(0);
451   values.push_back(1);
452 
453   me.Add(values.begin(), values.end());
454   ASSERT_EQ(me.size(), 2);
455   ASSERT_EQ(me.Get(0), values[0]);
456   ASSERT_EQ(me.Get(1), values[1]);
457 }
458 
459 // Add contents of container with more than one thing to a non-empty field.
TEST(RepeatedField,AddRange4)460 TEST(RepeatedField, AddRange4) {
461   RepeatedField<int> me;
462   me.Add(0);
463   me.Add(1);
464 
465   std::vector<int> values;
466   values.push_back(2);
467   values.push_back(3);
468 
469   me.Add(values.begin(), values.end());
470   ASSERT_EQ(me.size(), 4);
471   ASSERT_EQ(me.Get(0), 0);
472   ASSERT_EQ(me.Get(1), 1);
473   ASSERT_EQ(me.Get(2), values[0]);
474   ASSERT_EQ(me.Get(3), values[1]);
475 }
476 
477 // Add contents of a stringstream in order to test code paths where there is
478 // an input iterator.
TEST(RepeatedField,AddRange5)479 TEST(RepeatedField, AddRange5) {
480   RepeatedField<int> me;
481 
482   std::stringstream ss;
483   ss << 1 << ' ' << 2;
484 
485   me.Add(std::istream_iterator<int>(ss), std::istream_iterator<int>());
486   ASSERT_EQ(me.size(), 2);
487   ASSERT_EQ(me.Get(0), 1);
488   ASSERT_EQ(me.Get(1), 2);
489 }
490 
TEST(RepeatedField,CopyConstruct)491 TEST(RepeatedField, CopyConstruct) {
492   RepeatedField<int> source;
493   source.Add(1);
494   source.Add(2);
495 
496   RepeatedField<int> destination(source);
497 
498   ASSERT_EQ(2, destination.size());
499   EXPECT_EQ(1, destination.Get(0));
500   EXPECT_EQ(2, destination.Get(1));
501 }
502 
TEST(RepeatedField,IteratorConstruct)503 TEST(RepeatedField, IteratorConstruct) {
504   std::vector<int> values;
505   RepeatedField<int> empty(values.begin(), values.end());
506   ASSERT_EQ(values.size(), empty.size());
507 
508   values.push_back(1);
509   values.push_back(2);
510 
511   RepeatedField<int> field(values.begin(), values.end());
512   ASSERT_EQ(values.size(), field.size());
513   EXPECT_EQ(values[0], field.Get(0));
514   EXPECT_EQ(values[1], field.Get(1));
515 
516   RepeatedField<int> other(field.begin(), field.end());
517   ASSERT_EQ(values.size(), other.size());
518   EXPECT_EQ(values[0], other.Get(0));
519   EXPECT_EQ(values[1], other.Get(1));
520 }
521 
TEST(RepeatedField,CopyAssign)522 TEST(RepeatedField, CopyAssign) {
523   RepeatedField<int> source, destination;
524   source.Add(4);
525   source.Add(5);
526   destination.Add(1);
527   destination.Add(2);
528   destination.Add(3);
529 
530   destination = source;
531 
532   ASSERT_EQ(2, destination.size());
533   EXPECT_EQ(4, destination.Get(0));
534   EXPECT_EQ(5, destination.Get(1));
535 }
536 
TEST(RepeatedField,SelfAssign)537 TEST(RepeatedField, SelfAssign) {
538   // Verify that assignment to self does not destroy data.
539   RepeatedField<int> source, *p;
540   p = &source;
541   source.Add(7);
542   source.Add(8);
543 
544   *p = source;
545 
546   ASSERT_EQ(2, source.size());
547   EXPECT_EQ(7, source.Get(0));
548   EXPECT_EQ(8, source.Get(1));
549 }
550 
TEST(RepeatedField,MoveConstruct)551 TEST(RepeatedField, MoveConstruct) {
552   {
553     RepeatedField<int> source;
554     source.Add(1);
555     source.Add(2);
556     const int* data = source.data();
557     RepeatedField<int> destination = std::move(source);
558     EXPECT_EQ(data, destination.data());
559     EXPECT_THAT(destination, ElementsAre(1, 2));
560     // This property isn't guaranteed but it's useful to have a test that would
561     // catch changes in this area.
562     EXPECT_TRUE(source.empty());
563   }
564   {
565     Arena arena;
566     RepeatedField<int>* source =
567         Arena::CreateMessage<RepeatedField<int>>(&arena);
568     source->Add(1);
569     source->Add(2);
570     RepeatedField<int> destination = std::move(*source);
571     EXPECT_EQ(nullptr, destination.GetArena());
572     EXPECT_THAT(destination, ElementsAre(1, 2));
573     // This property isn't guaranteed but it's useful to have a test that would
574     // catch changes in this area.
575     EXPECT_THAT(*source, ElementsAre(1, 2));
576   }
577 }
578 
TEST(RepeatedField,MoveAssign)579 TEST(RepeatedField, MoveAssign) {
580   {
581     RepeatedField<int> source;
582     source.Add(1);
583     source.Add(2);
584     RepeatedField<int> destination;
585     destination.Add(3);
586     const int* source_data = source.data();
587     const int* destination_data = destination.data();
588     destination = std::move(source);
589     EXPECT_EQ(source_data, destination.data());
590     EXPECT_THAT(destination, ElementsAre(1, 2));
591     // This property isn't guaranteed but it's useful to have a test that would
592     // catch changes in this area.
593     EXPECT_EQ(destination_data, source.data());
594     EXPECT_THAT(source, ElementsAre(3));
595   }
596   {
597     Arena arena;
598     RepeatedField<int>* source =
599         Arena::CreateMessage<RepeatedField<int>>(&arena);
600     source->Add(1);
601     source->Add(2);
602     RepeatedField<int>* destination =
603         Arena::CreateMessage<RepeatedField<int>>(&arena);
604     destination->Add(3);
605     const int* source_data = source->data();
606     const int* destination_data = destination->data();
607     *destination = std::move(*source);
608     EXPECT_EQ(source_data, destination->data());
609     EXPECT_THAT(*destination, ElementsAre(1, 2));
610     // This property isn't guaranteed but it's useful to have a test that would
611     // catch changes in this area.
612     EXPECT_EQ(destination_data, source->data());
613     EXPECT_THAT(*source, ElementsAre(3));
614   }
615   {
616     Arena source_arena;
617     RepeatedField<int>* source =
618         Arena::CreateMessage<RepeatedField<int>>(&source_arena);
619     source->Add(1);
620     source->Add(2);
621     Arena destination_arena;
622     RepeatedField<int>* destination =
623         Arena::CreateMessage<RepeatedField<int>>(&destination_arena);
624     destination->Add(3);
625     *destination = std::move(*source);
626     EXPECT_THAT(*destination, ElementsAre(1, 2));
627     // This property isn't guaranteed but it's useful to have a test that would
628     // catch changes in this area.
629     EXPECT_THAT(*source, ElementsAre(1, 2));
630   }
631   {
632     Arena arena;
633     RepeatedField<int>* source =
634         Arena::CreateMessage<RepeatedField<int>>(&arena);
635     source->Add(1);
636     source->Add(2);
637     RepeatedField<int> destination;
638     destination.Add(3);
639     destination = std::move(*source);
640     EXPECT_THAT(destination, ElementsAre(1, 2));
641     // This property isn't guaranteed but it's useful to have a test that would
642     // catch changes in this area.
643     EXPECT_THAT(*source, ElementsAre(1, 2));
644   }
645   {
646     RepeatedField<int> source;
647     source.Add(1);
648     source.Add(2);
649     Arena arena;
650     RepeatedField<int>* destination =
651         Arena::CreateMessage<RepeatedField<int>>(&arena);
652     destination->Add(3);
653     *destination = std::move(source);
654     EXPECT_THAT(*destination, ElementsAre(1, 2));
655     // This property isn't guaranteed but it's useful to have a test that would
656     // catch changes in this area.
657     EXPECT_THAT(source, ElementsAre(1, 2));
658   }
659   {
660     RepeatedField<int> field;
661     // An alias to defeat -Wself-move.
662     RepeatedField<int>& alias = field;
663     field.Add(1);
664     field.Add(2);
665     const int* data = field.data();
666     field = std::move(alias);
667     EXPECT_EQ(data, field.data());
668     EXPECT_THAT(field, ElementsAre(1, 2));
669   }
670   {
671     Arena arena;
672     RepeatedField<int>* field =
673         Arena::CreateMessage<RepeatedField<int>>(&arena);
674     field->Add(1);
675     field->Add(2);
676     const int* data = field->data();
677     *field = std::move(*field);
678     EXPECT_EQ(data, field->data());
679     EXPECT_THAT(*field, ElementsAre(1, 2));
680   }
681 }
682 
TEST(Movable,Works)683 TEST(Movable, Works) {
684   class NonMoveConstructible {
685    public:
686     NonMoveConstructible(NonMoveConstructible&&) = delete;
687     NonMoveConstructible& operator=(NonMoveConstructible&&) { return *this; }
688   };
689   class NonMoveAssignable {
690    public:
691     NonMoveAssignable(NonMoveAssignable&&) {}
692     NonMoveAssignable& operator=(NonMoveConstructible&&) = delete;
693   };
694   class NonMovable {
695    public:
696     NonMovable(NonMovable&&) = delete;
697     NonMovable& operator=(NonMovable&&) = delete;
698   };
699 
700   EXPECT_TRUE(internal::IsMovable<std::string>::value);
701 
702   EXPECT_FALSE(std::is_move_constructible<NonMoveConstructible>::value);
703   EXPECT_TRUE(std::is_move_assignable<NonMoveConstructible>::value);
704   EXPECT_FALSE(internal::IsMovable<NonMoveConstructible>::value);
705 
706   EXPECT_TRUE(std::is_move_constructible<NonMoveAssignable>::value);
707   EXPECT_FALSE(std::is_move_assignable<NonMoveAssignable>::value);
708   EXPECT_FALSE(internal::IsMovable<NonMoveAssignable>::value);
709 
710   EXPECT_FALSE(internal::IsMovable<NonMovable>::value);
711 }
712 
TEST(RepeatedField,MoveAdd)713 TEST(RepeatedField, MoveAdd) {
714   RepeatedPtrField<TestAllTypes> field;
715   TestAllTypes test_all_types;
716   auto* optional_nested_message =
717       test_all_types.mutable_optional_nested_message();
718   optional_nested_message->set_bb(42);
719   field.Add(std::move(test_all_types));
720 
721   EXPECT_EQ(optional_nested_message,
722             field.Mutable(0)->mutable_optional_nested_message());
723 }
724 
TEST(RepeatedField,MutableDataIsMutable)725 TEST(RepeatedField, MutableDataIsMutable) {
726   RepeatedField<int> field;
727   field.Add(1);
728   EXPECT_EQ(1, field.Get(0));
729   // The fact that this line compiles would be enough, but we'll check the
730   // value anyway.
731   *field.mutable_data() = 2;
732   EXPECT_EQ(2, field.Get(0));
733 }
734 
TEST(RepeatedField,SubscriptOperators)735 TEST(RepeatedField, SubscriptOperators) {
736   RepeatedField<int> field;
737   field.Add(1);
738   EXPECT_EQ(1, field.Get(0));
739   EXPECT_EQ(1, field[0]);
740   EXPECT_EQ(field.Mutable(0), &field[0]);
741   const RepeatedField<int>& const_field = field;
742   EXPECT_EQ(field.data(), &const_field[0]);
743 }
744 
TEST(RepeatedField,Truncate)745 TEST(RepeatedField, Truncate) {
746   RepeatedField<int> field;
747 
748   field.Add(12);
749   field.Add(34);
750   field.Add(56);
751   field.Add(78);
752   EXPECT_EQ(4, field.size());
753 
754   field.Truncate(3);
755   EXPECT_EQ(3, field.size());
756 
757   field.Add(90);
758   EXPECT_EQ(4, field.size());
759   EXPECT_EQ(90, field.Get(3));
760 
761   // Truncations that don't change the size are allowed, but growing is not
762   // allowed.
763   field.Truncate(field.size());
764 #ifdef PROTOBUF_HAS_DEATH_TEST
765   EXPECT_DEBUG_DEATH(field.Truncate(field.size() + 1), "new_size");
766 #endif
767 }
768 
769 
TEST(RepeatedField,ExtractSubrange)770 TEST(RepeatedField, ExtractSubrange) {
771   // Exhaustively test every subrange in arrays of all sizes from 0 through 9.
772   for (int sz = 0; sz < 10; ++sz) {
773     for (int num = 0; num <= sz; ++num) {
774       for (int start = 0; start < sz - num; ++start) {
775         // Create RepeatedField with sz elements having values 0 through sz-1.
776         RepeatedField<int32> field;
777         for (int i = 0; i < sz; ++i) field.Add(i);
778         EXPECT_EQ(field.size(), sz);
779 
780         // Create a catcher array and call ExtractSubrange.
781         int32 catcher[10];
782         for (int i = 0; i < 10; ++i) catcher[i] = -1;
783         field.ExtractSubrange(start, num, catcher);
784 
785         // Does the resulting array have the right size?
786         EXPECT_EQ(field.size(), sz - num);
787 
788         // Were the removed elements extracted into the catcher array?
789         for (int i = 0; i < num; ++i) EXPECT_EQ(catcher[i], start + i);
790         EXPECT_EQ(catcher[num], -1);
791 
792         // Does the resulting array contain the right values?
793         for (int i = 0; i < start; ++i) EXPECT_EQ(field.Get(i), i);
794         for (int i = start; i < field.size(); ++i)
795           EXPECT_EQ(field.Get(i), i + num);
796       }
797     }
798   }
799 }
800 
TEST(RepeatedField,ClearThenReserveMore)801 TEST(RepeatedField, ClearThenReserveMore) {
802   // Test that Reserve properly destroys the old internal array when it's forced
803   // to allocate a new one, even when cleared-but-not-deleted objects are
804   // present. Use a 'string' and > 16 bytes length so that the elements are
805   // non-POD and allocate -- the leak checker will catch any skipped destructor
806   // calls here.
807   RepeatedField<std::string> field;
808   for (int i = 0; i < 32; i++) {
809     field.Add(std::string("abcdefghijklmnopqrstuvwxyz0123456789"));
810   }
811   EXPECT_EQ(32, field.size());
812   field.Clear();
813   EXPECT_EQ(0, field.size());
814   EXPECT_LE(32, field.Capacity());
815 
816   field.Reserve(1024);
817   EXPECT_EQ(0, field.size());
818   EXPECT_LE(1024, field.Capacity());
819   // Finish test -- |field| should destroy the cleared-but-not-yet-destroyed
820   // strings.
821 }
822 
TEST(RepeatedField,TestSAddFromSelf)823 TEST(RepeatedField, TestSAddFromSelf) {
824   RepeatedField<int> field;
825   field.Add(0);
826   for (int i = 0; i < 1000; i++) {
827     field.Add(field[0]);
828   }
829 }
830 
831 // ===================================================================
832 // RepeatedPtrField tests.  These pretty much just mirror the RepeatedField
833 // tests above.
834 
TEST(RepeatedPtrField,ConstInit)835 TEST(RepeatedPtrField, ConstInit) {
836   PROTOBUF_CONSTINIT static RepeatedPtrField<std::string> field{};  // NOLINT
837   EXPECT_TRUE(field.empty());
838 }
839 
TEST(RepeatedPtrField,Small)840 TEST(RepeatedPtrField, Small) {
841   RepeatedPtrField<std::string> field;
842 
843   EXPECT_TRUE(field.empty());
844   EXPECT_EQ(field.size(), 0);
845 
846   field.Add()->assign("foo");
847 
848   EXPECT_FALSE(field.empty());
849   EXPECT_EQ(field.size(), 1);
850   EXPECT_EQ(field.Get(0), "foo");
851   EXPECT_EQ(field.at(0), "foo");
852 
853   field.Add()->assign("bar");
854 
855   EXPECT_FALSE(field.empty());
856   EXPECT_EQ(field.size(), 2);
857   EXPECT_EQ(field.Get(0), "foo");
858   EXPECT_EQ(field.at(0), "foo");
859   EXPECT_EQ(field.Get(1), "bar");
860   EXPECT_EQ(field.at(1), "bar");
861 
862   field.Mutable(1)->assign("baz");
863 
864   EXPECT_FALSE(field.empty());
865   EXPECT_EQ(field.size(), 2);
866   EXPECT_EQ(field.Get(0), "foo");
867   EXPECT_EQ(field.at(0), "foo");
868   EXPECT_EQ(field.Get(1), "baz");
869   EXPECT_EQ(field.at(1), "baz");
870 
871   field.RemoveLast();
872 
873   EXPECT_FALSE(field.empty());
874   EXPECT_EQ(field.size(), 1);
875   EXPECT_EQ(field.Get(0), "foo");
876   EXPECT_EQ(field.at(0), "foo");
877 
878   field.Clear();
879 
880   EXPECT_TRUE(field.empty());
881   EXPECT_EQ(field.size(), 0);
882 }
883 
TEST(RepeatedPtrField,Large)884 TEST(RepeatedPtrField, Large) {
885   RepeatedPtrField<std::string> field;
886 
887   for (int i = 0; i < 16; i++) {
888     *field.Add() += 'a' + i;
889   }
890 
891   EXPECT_EQ(field.size(), 16);
892 
893   for (int i = 0; i < 16; i++) {
894     EXPECT_EQ(field.Get(i).size(), 1);
895     EXPECT_EQ(field.Get(i)[0], 'a' + i);
896   }
897 
898   int min_expected_usage = 16 * sizeof(std::string);
899   EXPECT_GE(field.SpaceUsedExcludingSelf(), min_expected_usage);
900 }
901 
TEST(RepeatedPtrField,SwapSmallSmall)902 TEST(RepeatedPtrField, SwapSmallSmall) {
903   RepeatedPtrField<std::string> field1;
904   RepeatedPtrField<std::string> field2;
905 
906   EXPECT_TRUE(field1.empty());
907   EXPECT_EQ(field1.size(), 0);
908   EXPECT_TRUE(field2.empty());
909   EXPECT_EQ(field2.size(), 0);
910 
911   field1.Add()->assign("foo");
912   field1.Add()->assign("bar");
913 
914   EXPECT_FALSE(field1.empty());
915   EXPECT_EQ(field1.size(), 2);
916   EXPECT_EQ(field1.Get(0), "foo");
917   EXPECT_EQ(field1.Get(1), "bar");
918 
919   EXPECT_TRUE(field2.empty());
920   EXPECT_EQ(field2.size(), 0);
921 
922   field1.Swap(&field2);
923 
924   EXPECT_TRUE(field1.empty());
925   EXPECT_EQ(field1.size(), 0);
926 
927   EXPECT_EQ(field2.size(), 2);
928   EXPECT_EQ(field2.Get(0), "foo");
929   EXPECT_EQ(field2.Get(1), "bar");
930 }
931 
TEST(RepeatedPtrField,SwapLargeSmall)932 TEST(RepeatedPtrField, SwapLargeSmall) {
933   RepeatedPtrField<std::string> field1;
934   RepeatedPtrField<std::string> field2;
935 
936   field2.Add()->assign("foo");
937   field2.Add()->assign("bar");
938   for (int i = 0; i < 16; i++) {
939     *field1.Add() += 'a' + i;
940   }
941   field1.Swap(&field2);
942 
943   EXPECT_EQ(field1.size(), 2);
944   EXPECT_EQ(field1.Get(0), "foo");
945   EXPECT_EQ(field1.Get(1), "bar");
946   EXPECT_EQ(field2.size(), 16);
947   for (int i = 0; i < 16; i++) {
948     EXPECT_EQ(field2.Get(i).size(), 1);
949     EXPECT_EQ(field2.Get(i)[0], 'a' + i);
950   }
951 }
952 
TEST(RepeatedPtrField,SwapLargeLarge)953 TEST(RepeatedPtrField, SwapLargeLarge) {
954   RepeatedPtrField<std::string> field1;
955   RepeatedPtrField<std::string> field2;
956 
957   field1.Add()->assign("foo");
958   field1.Add()->assign("bar");
959   for (int i = 0; i < 16; i++) {
960     *field1.Add() += 'A' + i;
961     *field2.Add() += 'a' + i;
962   }
963   field2.Swap(&field1);
964 
965   EXPECT_EQ(field1.size(), 16);
966   for (int i = 0; i < 16; i++) {
967     EXPECT_EQ(field1.Get(i).size(), 1);
968     EXPECT_EQ(field1.Get(i)[0], 'a' + i);
969   }
970   EXPECT_EQ(field2.size(), 18);
971   EXPECT_EQ(field2.Get(0), "foo");
972   EXPECT_EQ(field2.Get(1), "bar");
973   for (int i = 2; i < 18; i++) {
974     EXPECT_EQ(field2.Get(i).size(), 1);
975     EXPECT_EQ(field2.Get(i)[0], 'A' + i - 2);
976   }
977 }
978 
ReservedSpace(RepeatedPtrField<std::string> * field)979 static int ReservedSpace(RepeatedPtrField<std::string>* field) {
980   const std::string* const* ptr = field->data();
981   do {
982     field->Add();
983   } while (field->data() == ptr);
984 
985   return field->size() - 1;
986 }
987 
TEST(RepeatedPtrField,ReserveMoreThanDouble)988 TEST(RepeatedPtrField, ReserveMoreThanDouble) {
989   RepeatedPtrField<std::string> field;
990   field.Reserve(20);
991 
992   EXPECT_LE(20, ReservedSpace(&field));
993 }
994 
TEST(RepeatedPtrField,ReserveLessThanDouble)995 TEST(RepeatedPtrField, ReserveLessThanDouble) {
996   RepeatedPtrField<std::string> field;
997   field.Reserve(20);
998 
999   int capacity = field.Capacity();
1000   // Grow by 1.5x
1001   field.Reserve(capacity + (capacity >> 2));
1002 
1003   EXPECT_LE(2 * capacity, ReservedSpace(&field));
1004 }
1005 
TEST(RepeatedPtrField,ReserveLessThanExisting)1006 TEST(RepeatedPtrField, ReserveLessThanExisting) {
1007   RepeatedPtrField<std::string> field;
1008   field.Reserve(20);
1009   const std::string* const* previous_ptr = field.data();
1010   field.Reserve(10);
1011 
1012   EXPECT_EQ(previous_ptr, field.data());
1013   EXPECT_LE(20, ReservedSpace(&field));
1014 }
1015 
TEST(RepeatedPtrField,ReserveDoesntLoseAllocated)1016 TEST(RepeatedPtrField, ReserveDoesntLoseAllocated) {
1017   // Check that a bug is fixed:  An earlier implementation of Reserve()
1018   // failed to copy pointers to allocated-but-cleared objects, possibly
1019   // leading to segfaults.
1020   RepeatedPtrField<std::string> field;
1021   std::string* first = field.Add();
1022   field.RemoveLast();
1023 
1024   field.Reserve(20);
1025   EXPECT_EQ(first, field.Add());
1026 }
1027 
1028 // Clearing elements is tricky with RepeatedPtrFields since the memory for
1029 // the elements is retained and reused.
TEST(RepeatedPtrField,ClearedElements)1030 TEST(RepeatedPtrField, ClearedElements) {
1031   RepeatedPtrField<std::string> field;
1032 
1033   std::string* original = field.Add();
1034   *original = "foo";
1035 
1036   EXPECT_EQ(field.ClearedCount(), 0);
1037 
1038   field.RemoveLast();
1039   EXPECT_TRUE(original->empty());
1040   EXPECT_EQ(field.ClearedCount(), 1);
1041 
1042   EXPECT_EQ(field.Add(),
1043             original);  // Should return same string for reuse.
1044 
1045   EXPECT_EQ(field.ReleaseLast(), original);  // We take ownership.
1046   EXPECT_EQ(field.ClearedCount(), 0);
1047 
1048   EXPECT_NE(field.Add(), original);  // Should NOT return the same string.
1049   EXPECT_EQ(field.ClearedCount(), 0);
1050 
1051   field.AddAllocated(original);  // Give ownership back.
1052   EXPECT_EQ(field.ClearedCount(), 0);
1053   EXPECT_EQ(field.Mutable(1), original);
1054 
1055   field.Clear();
1056   EXPECT_EQ(field.ClearedCount(), 2);
1057   EXPECT_EQ(field.ReleaseCleared(), original);  // Take ownership again.
1058   EXPECT_EQ(field.ClearedCount(), 1);
1059   EXPECT_NE(field.Add(), original);
1060   EXPECT_EQ(field.ClearedCount(), 0);
1061   EXPECT_NE(field.Add(), original);
1062   EXPECT_EQ(field.ClearedCount(), 0);
1063 
1064   field.AddCleared(original);  // Give ownership back, but as a cleared object.
1065   EXPECT_EQ(field.ClearedCount(), 1);
1066   EXPECT_EQ(field.Add(), original);
1067   EXPECT_EQ(field.ClearedCount(), 0);
1068 }
1069 
1070 // Test all code paths in AddAllocated().
TEST(RepeatedPtrField,AddAlocated)1071 TEST(RepeatedPtrField, AddAlocated) {
1072   RepeatedPtrField<std::string> field;
1073   while (field.size() < field.Capacity()) {
1074     field.Add()->assign("filler");
1075   }
1076 
1077   int index = field.size();
1078 
1079   // First branch:  Field is at capacity with no cleared objects.
1080   std::string* foo = new std::string("foo");
1081   field.AddAllocated(foo);
1082   EXPECT_EQ(index + 1, field.size());
1083   EXPECT_EQ(0, field.ClearedCount());
1084   EXPECT_EQ(foo, &field.Get(index));
1085 
1086   // Last branch:  Field is not at capacity and there are no cleared objects.
1087   std::string* bar = new std::string("bar");
1088   field.AddAllocated(bar);
1089   ++index;
1090   EXPECT_EQ(index + 1, field.size());
1091   EXPECT_EQ(0, field.ClearedCount());
1092   EXPECT_EQ(bar, &field.Get(index));
1093 
1094   // Third branch:  Field is not at capacity and there are no cleared objects.
1095   field.RemoveLast();
1096   std::string* baz = new std::string("baz");
1097   field.AddAllocated(baz);
1098   EXPECT_EQ(index + 1, field.size());
1099   EXPECT_EQ(1, field.ClearedCount());
1100   EXPECT_EQ(baz, &field.Get(index));
1101 
1102   // Second branch:  Field is at capacity but has some cleared objects.
1103   while (field.size() < field.Capacity()) {
1104     field.Add()->assign("filler2");
1105   }
1106   field.RemoveLast();
1107   index = field.size();
1108   std::string* qux = new std::string("qux");
1109   field.AddAllocated(qux);
1110   EXPECT_EQ(index + 1, field.size());
1111   // We should have discarded the cleared object.
1112   EXPECT_EQ(0, field.ClearedCount());
1113   EXPECT_EQ(qux, &field.Get(index));
1114 }
1115 
TEST(RepeatedPtrField,MergeFrom)1116 TEST(RepeatedPtrField, MergeFrom) {
1117   RepeatedPtrField<std::string> source, destination;
1118   source.Add()->assign("4");
1119   source.Add()->assign("5");
1120   destination.Add()->assign("1");
1121   destination.Add()->assign("2");
1122   destination.Add()->assign("3");
1123 
1124   destination.MergeFrom(source);
1125 
1126   ASSERT_EQ(5, destination.size());
1127   EXPECT_EQ("1", destination.Get(0));
1128   EXPECT_EQ("2", destination.Get(1));
1129   EXPECT_EQ("3", destination.Get(2));
1130   EXPECT_EQ("4", destination.Get(3));
1131   EXPECT_EQ("5", destination.Get(4));
1132 }
1133 
1134 
TEST(RepeatedPtrField,CopyFrom)1135 TEST(RepeatedPtrField, CopyFrom) {
1136   RepeatedPtrField<std::string> source, destination;
1137   source.Add()->assign("4");
1138   source.Add()->assign("5");
1139   destination.Add()->assign("1");
1140   destination.Add()->assign("2");
1141   destination.Add()->assign("3");
1142 
1143   destination.CopyFrom(source);
1144 
1145   ASSERT_EQ(2, destination.size());
1146   EXPECT_EQ("4", destination.Get(0));
1147   EXPECT_EQ("5", destination.Get(1));
1148 }
1149 
TEST(RepeatedPtrField,CopyFromSelf)1150 TEST(RepeatedPtrField, CopyFromSelf) {
1151   RepeatedPtrField<std::string> me;
1152   me.Add()->assign("1");
1153   me.CopyFrom(me);
1154   ASSERT_EQ(1, me.size());
1155   EXPECT_EQ("1", me.Get(0));
1156 }
1157 
TEST(RepeatedPtrField,Erase)1158 TEST(RepeatedPtrField, Erase) {
1159   RepeatedPtrField<std::string> me;
1160   RepeatedPtrField<std::string>::iterator it = me.erase(me.begin(), me.end());
1161   EXPECT_TRUE(me.begin() == it);
1162   EXPECT_EQ(0, me.size());
1163 
1164   *me.Add() = "1";
1165   *me.Add() = "2";
1166   *me.Add() = "3";
1167   it = me.erase(me.begin(), me.end());
1168   EXPECT_TRUE(me.begin() == it);
1169   EXPECT_EQ(0, me.size());
1170 
1171   *me.Add() = "4";
1172   *me.Add() = "5";
1173   *me.Add() = "6";
1174   it = me.erase(me.begin() + 2, me.end());
1175   EXPECT_TRUE(me.begin() + 2 == it);
1176   EXPECT_EQ(2, me.size());
1177   EXPECT_EQ("4", me.Get(0));
1178   EXPECT_EQ("5", me.Get(1));
1179 
1180   *me.Add() = "6";
1181   *me.Add() = "7";
1182   *me.Add() = "8";
1183   it = me.erase(me.begin() + 1, me.begin() + 3);
1184   EXPECT_TRUE(me.begin() + 1 == it);
1185   EXPECT_EQ(3, me.size());
1186   EXPECT_EQ("4", me.Get(0));
1187   EXPECT_EQ("7", me.Get(1));
1188   EXPECT_EQ("8", me.Get(2));
1189 }
1190 
TEST(RepeatedPtrField,CopyConstruct)1191 TEST(RepeatedPtrField, CopyConstruct) {
1192   RepeatedPtrField<std::string> source;
1193   source.Add()->assign("1");
1194   source.Add()->assign("2");
1195 
1196   RepeatedPtrField<std::string> destination(source);
1197 
1198   ASSERT_EQ(2, destination.size());
1199   EXPECT_EQ("1", destination.Get(0));
1200   EXPECT_EQ("2", destination.Get(1));
1201 }
1202 
TEST(RepeatedPtrField,IteratorConstruct_String)1203 TEST(RepeatedPtrField, IteratorConstruct_String) {
1204   std::vector<std::string> values;
1205   values.push_back("1");
1206   values.push_back("2");
1207 
1208   RepeatedPtrField<std::string> field(values.begin(), values.end());
1209   ASSERT_EQ(values.size(), field.size());
1210   EXPECT_EQ(values[0], field.Get(0));
1211   EXPECT_EQ(values[1], field.Get(1));
1212 
1213   RepeatedPtrField<std::string> other(field.begin(), field.end());
1214   ASSERT_EQ(values.size(), other.size());
1215   EXPECT_EQ(values[0], other.Get(0));
1216   EXPECT_EQ(values[1], other.Get(1));
1217 }
1218 
TEST(RepeatedPtrField,IteratorConstruct_Proto)1219 TEST(RepeatedPtrField, IteratorConstruct_Proto) {
1220   typedef TestAllTypes::NestedMessage Nested;
1221   std::vector<Nested> values;
1222   values.push_back(Nested());
1223   values.back().set_bb(1);
1224   values.push_back(Nested());
1225   values.back().set_bb(2);
1226 
1227   RepeatedPtrField<Nested> field(values.begin(), values.end());
1228   ASSERT_EQ(values.size(), field.size());
1229   EXPECT_EQ(values[0].bb(), field.Get(0).bb());
1230   EXPECT_EQ(values[1].bb(), field.Get(1).bb());
1231 
1232   RepeatedPtrField<Nested> other(field.begin(), field.end());
1233   ASSERT_EQ(values.size(), other.size());
1234   EXPECT_EQ(values[0].bb(), other.Get(0).bb());
1235   EXPECT_EQ(values[1].bb(), other.Get(1).bb());
1236 }
1237 
TEST(RepeatedPtrField,CopyAssign)1238 TEST(RepeatedPtrField, CopyAssign) {
1239   RepeatedPtrField<std::string> source, destination;
1240   source.Add()->assign("4");
1241   source.Add()->assign("5");
1242   destination.Add()->assign("1");
1243   destination.Add()->assign("2");
1244   destination.Add()->assign("3");
1245 
1246   destination = source;
1247 
1248   ASSERT_EQ(2, destination.size());
1249   EXPECT_EQ("4", destination.Get(0));
1250   EXPECT_EQ("5", destination.Get(1));
1251 }
1252 
TEST(RepeatedPtrField,SelfAssign)1253 TEST(RepeatedPtrField, SelfAssign) {
1254   // Verify that assignment to self does not destroy data.
1255   RepeatedPtrField<std::string> source, *p;
1256   p = &source;
1257   source.Add()->assign("7");
1258   source.Add()->assign("8");
1259 
1260   *p = source;
1261 
1262   ASSERT_EQ(2, source.size());
1263   EXPECT_EQ("7", source.Get(0));
1264   EXPECT_EQ("8", source.Get(1));
1265 }
1266 
TEST(RepeatedPtrField,MoveConstruct)1267 TEST(RepeatedPtrField, MoveConstruct) {
1268   {
1269     RepeatedPtrField<std::string> source;
1270     *source.Add() = "1";
1271     *source.Add() = "2";
1272     const std::string* const* data = source.data();
1273     RepeatedPtrField<std::string> destination = std::move(source);
1274     EXPECT_EQ(data, destination.data());
1275     EXPECT_THAT(destination, ElementsAre("1", "2"));
1276     // This property isn't guaranteed but it's useful to have a test that would
1277     // catch changes in this area.
1278     EXPECT_TRUE(source.empty());
1279   }
1280   {
1281     Arena arena;
1282     RepeatedPtrField<std::string>* source =
1283         Arena::CreateMessage<RepeatedPtrField<std::string>>(&arena);
1284     *source->Add() = "1";
1285     *source->Add() = "2";
1286     RepeatedPtrField<std::string> destination = std::move(*source);
1287     EXPECT_EQ(nullptr, destination.GetArena());
1288     EXPECT_THAT(destination, ElementsAre("1", "2"));
1289     // This property isn't guaranteed but it's useful to have a test that would
1290     // catch changes in this area.
1291     EXPECT_THAT(*source, ElementsAre("1", "2"));
1292   }
1293 }
1294 
TEST(RepeatedPtrField,MoveAssign)1295 TEST(RepeatedPtrField, MoveAssign) {
1296   {
1297     RepeatedPtrField<std::string> source;
1298     *source.Add() = "1";
1299     *source.Add() = "2";
1300     RepeatedPtrField<std::string> destination;
1301     *destination.Add() = "3";
1302     const std::string* const* source_data = source.data();
1303     const std::string* const* destination_data = destination.data();
1304     destination = std::move(source);
1305     EXPECT_EQ(source_data, destination.data());
1306     EXPECT_THAT(destination, ElementsAre("1", "2"));
1307     // This property isn't guaranteed but it's useful to have a test that would
1308     // catch changes in this area.
1309     EXPECT_EQ(destination_data, source.data());
1310     EXPECT_THAT(source, ElementsAre("3"));
1311   }
1312   {
1313     Arena arena;
1314     RepeatedPtrField<std::string>* source =
1315         Arena::CreateMessage<RepeatedPtrField<std::string>>(&arena);
1316     *source->Add() = "1";
1317     *source->Add() = "2";
1318     RepeatedPtrField<std::string>* destination =
1319         Arena::CreateMessage<RepeatedPtrField<std::string>>(&arena);
1320     *destination->Add() = "3";
1321     const std::string* const* source_data = source->data();
1322     const std::string* const* destination_data = destination->data();
1323     *destination = std::move(*source);
1324     EXPECT_EQ(source_data, destination->data());
1325     EXPECT_THAT(*destination, ElementsAre("1", "2"));
1326     // This property isn't guaranteed but it's useful to have a test that would
1327     // catch changes in this area.
1328     EXPECT_EQ(destination_data, source->data());
1329     EXPECT_THAT(*source, ElementsAre("3"));
1330   }
1331   {
1332     Arena source_arena;
1333     RepeatedPtrField<std::string>* source =
1334         Arena::CreateMessage<RepeatedPtrField<std::string>>(&source_arena);
1335     *source->Add() = "1";
1336     *source->Add() = "2";
1337     Arena destination_arena;
1338     RepeatedPtrField<std::string>* destination =
1339         Arena::CreateMessage<RepeatedPtrField<std::string>>(&destination_arena);
1340     *destination->Add() = "3";
1341     *destination = std::move(*source);
1342     EXPECT_THAT(*destination, ElementsAre("1", "2"));
1343     // This property isn't guaranteed but it's useful to have a test that would
1344     // catch changes in this area.
1345     EXPECT_THAT(*source, ElementsAre("1", "2"));
1346   }
1347   {
1348     Arena arena;
1349     RepeatedPtrField<std::string>* source =
1350         Arena::CreateMessage<RepeatedPtrField<std::string>>(&arena);
1351     *source->Add() = "1";
1352     *source->Add() = "2";
1353     RepeatedPtrField<std::string> destination;
1354     *destination.Add() = "3";
1355     destination = std::move(*source);
1356     EXPECT_THAT(destination, ElementsAre("1", "2"));
1357     // This property isn't guaranteed but it's useful to have a test that would
1358     // catch changes in this area.
1359     EXPECT_THAT(*source, ElementsAre("1", "2"));
1360   }
1361   {
1362     RepeatedPtrField<std::string> source;
1363     *source.Add() = "1";
1364     *source.Add() = "2";
1365     Arena arena;
1366     RepeatedPtrField<std::string>* destination =
1367         Arena::CreateMessage<RepeatedPtrField<std::string>>(&arena);
1368     *destination->Add() = "3";
1369     *destination = std::move(source);
1370     EXPECT_THAT(*destination, ElementsAre("1", "2"));
1371     // This property isn't guaranteed but it's useful to have a test that would
1372     // catch changes in this area.
1373     EXPECT_THAT(source, ElementsAre("1", "2"));
1374   }
1375   {
1376     RepeatedPtrField<std::string> field;
1377     // An alias to defeat -Wself-move.
1378     RepeatedPtrField<std::string>& alias = field;
1379     *field.Add() = "1";
1380     *field.Add() = "2";
1381     const std::string* const* data = field.data();
1382     field = std::move(alias);
1383     EXPECT_EQ(data, field.data());
1384     EXPECT_THAT(field, ElementsAre("1", "2"));
1385   }
1386   {
1387     Arena arena;
1388     RepeatedPtrField<std::string>* field =
1389         Arena::CreateMessage<RepeatedPtrField<std::string>>(&arena);
1390     *field->Add() = "1";
1391     *field->Add() = "2";
1392     const std::string* const* data = field->data();
1393     *field = std::move(*field);
1394     EXPECT_EQ(data, field->data());
1395     EXPECT_THAT(*field, ElementsAre("1", "2"));
1396   }
1397 }
1398 
TEST(RepeatedPtrField,MutableDataIsMutable)1399 TEST(RepeatedPtrField, MutableDataIsMutable) {
1400   RepeatedPtrField<std::string> field;
1401   *field.Add() = "1";
1402   EXPECT_EQ("1", field.Get(0));
1403   // The fact that this line compiles would be enough, but we'll check the
1404   // value anyway.
1405   std::string** data = field.mutable_data();
1406   **data = "2";
1407   EXPECT_EQ("2", field.Get(0));
1408 }
1409 
TEST(RepeatedPtrField,SubscriptOperators)1410 TEST(RepeatedPtrField, SubscriptOperators) {
1411   RepeatedPtrField<std::string> field;
1412   *field.Add() = "1";
1413   EXPECT_EQ("1", field.Get(0));
1414   EXPECT_EQ("1", field[0]);
1415   EXPECT_EQ(field.Mutable(0), &field[0]);
1416   const RepeatedPtrField<std::string>& const_field = field;
1417   EXPECT_EQ(*field.data(), &const_field[0]);
1418 }
1419 
TEST(RepeatedPtrField,ExtractSubrange)1420 TEST(RepeatedPtrField, ExtractSubrange) {
1421   // Exhaustively test every subrange in arrays of all sizes from 0 through 9
1422   // with 0 through 3 cleared elements at the end.
1423   for (int sz = 0; sz < 10; ++sz) {
1424     for (int num = 0; num <= sz; ++num) {
1425       for (int start = 0; start < sz - num; ++start) {
1426         for (int extra = 0; extra < 4; ++extra) {
1427           std::vector<std::string*> subject;
1428 
1429           // Create an array with "sz" elements and "extra" cleared elements.
1430           RepeatedPtrField<std::string> field;
1431           for (int i = 0; i < sz + extra; ++i) {
1432             subject.push_back(new std::string());
1433             field.AddAllocated(subject[i]);
1434           }
1435           EXPECT_EQ(field.size(), sz + extra);
1436           for (int i = 0; i < extra; ++i) field.RemoveLast();
1437           EXPECT_EQ(field.size(), sz);
1438           EXPECT_EQ(field.ClearedCount(), extra);
1439 
1440           // Create a catcher array and call ExtractSubrange.
1441           std::string* catcher[10];
1442           for (int i = 0; i < 10; ++i) catcher[i] = NULL;
1443           field.ExtractSubrange(start, num, catcher);
1444 
1445           // Does the resulting array have the right size?
1446           EXPECT_EQ(field.size(), sz - num);
1447 
1448           // Were the removed elements extracted into the catcher array?
1449           for (int i = 0; i < num; ++i)
1450             EXPECT_EQ(catcher[i], subject[start + i]);
1451           EXPECT_EQ(NULL, catcher[num]);
1452 
1453           // Does the resulting array contain the right values?
1454           for (int i = 0; i < start; ++i)
1455             EXPECT_EQ(field.Mutable(i), subject[i]);
1456           for (int i = start; i < field.size(); ++i)
1457             EXPECT_EQ(field.Mutable(i), subject[i + num]);
1458 
1459           // Reinstate the cleared elements.
1460           EXPECT_EQ(field.ClearedCount(), extra);
1461           for (int i = 0; i < extra; ++i) field.Add();
1462           EXPECT_EQ(field.ClearedCount(), 0);
1463           EXPECT_EQ(field.size(), sz - num + extra);
1464 
1465           // Make sure the extra elements are all there (in some order).
1466           for (int i = sz; i < sz + extra; ++i) {
1467             int count = 0;
1468             for (int j = sz; j < sz + extra; ++j) {
1469               if (field.Mutable(j - num) == subject[i]) count += 1;
1470             }
1471             EXPECT_EQ(count, 1);
1472           }
1473 
1474           // Release the caught elements.
1475           for (int i = 0; i < num; ++i) delete catcher[i];
1476         }
1477       }
1478     }
1479   }
1480 }
1481 
TEST(RepeatedPtrField,DeleteSubrange)1482 TEST(RepeatedPtrField, DeleteSubrange) {
1483   // DeleteSubrange is a trivial extension of ExtendSubrange.
1484 }
1485 
1486 // ===================================================================
1487 
1488 // Iterator tests stolen from net/proto/proto-array_unittest.
1489 class RepeatedFieldIteratorTest : public testing::Test {
1490  protected:
SetUp()1491   virtual void SetUp() {
1492     for (int i = 0; i < 3; ++i) {
1493       proto_array_.Add(i);
1494     }
1495   }
1496 
1497   RepeatedField<int> proto_array_;
1498 };
1499 
TEST_F(RepeatedFieldIteratorTest,Convertible)1500 TEST_F(RepeatedFieldIteratorTest, Convertible) {
1501   RepeatedField<int>::iterator iter = proto_array_.begin();
1502   RepeatedField<int>::const_iterator c_iter = iter;
1503   RepeatedField<int>::value_type value = *c_iter;
1504   EXPECT_EQ(0, value);
1505 }
1506 
TEST_F(RepeatedFieldIteratorTest,MutableIteration)1507 TEST_F(RepeatedFieldIteratorTest, MutableIteration) {
1508   RepeatedField<int>::iterator iter = proto_array_.begin();
1509   EXPECT_EQ(0, *iter);
1510   ++iter;
1511   EXPECT_EQ(1, *iter++);
1512   EXPECT_EQ(2, *iter);
1513   ++iter;
1514   EXPECT_TRUE(proto_array_.end() == iter);
1515 
1516   EXPECT_EQ(2, *(proto_array_.end() - 1));
1517 }
1518 
TEST_F(RepeatedFieldIteratorTest,ConstIteration)1519 TEST_F(RepeatedFieldIteratorTest, ConstIteration) {
1520   const RepeatedField<int>& const_proto_array = proto_array_;
1521   RepeatedField<int>::const_iterator iter = const_proto_array.begin();
1522   EXPECT_EQ(0, *iter);
1523   ++iter;
1524   EXPECT_EQ(1, *iter++);
1525   EXPECT_EQ(2, *iter);
1526   ++iter;
1527   EXPECT_TRUE(proto_array_.end() == iter);
1528   EXPECT_EQ(2, *(proto_array_.end() - 1));
1529 }
1530 
TEST_F(RepeatedFieldIteratorTest,Mutation)1531 TEST_F(RepeatedFieldIteratorTest, Mutation) {
1532   RepeatedField<int>::iterator iter = proto_array_.begin();
1533   *iter = 7;
1534   EXPECT_EQ(7, proto_array_.Get(0));
1535 }
1536 
1537 // -------------------------------------------------------------------
1538 
1539 class RepeatedPtrFieldIteratorTest : public testing::Test {
1540  protected:
SetUp()1541   virtual void SetUp() {
1542     proto_array_.Add()->assign("foo");
1543     proto_array_.Add()->assign("bar");
1544     proto_array_.Add()->assign("baz");
1545   }
1546 
1547   RepeatedPtrField<std::string> proto_array_;
1548 };
1549 
TEST_F(RepeatedPtrFieldIteratorTest,Convertible)1550 TEST_F(RepeatedPtrFieldIteratorTest, Convertible) {
1551   RepeatedPtrField<std::string>::iterator iter = proto_array_.begin();
1552   RepeatedPtrField<std::string>::const_iterator c_iter = iter;
1553   RepeatedPtrField<std::string>::value_type value = *c_iter;
1554   EXPECT_EQ("foo", value);
1555 }
1556 
TEST_F(RepeatedPtrFieldIteratorTest,MutableIteration)1557 TEST_F(RepeatedPtrFieldIteratorTest, MutableIteration) {
1558   RepeatedPtrField<std::string>::iterator iter = proto_array_.begin();
1559   EXPECT_EQ("foo", *iter);
1560   ++iter;
1561   EXPECT_EQ("bar", *(iter++));
1562   EXPECT_EQ("baz", *iter);
1563   ++iter;
1564   EXPECT_TRUE(proto_array_.end() == iter);
1565   EXPECT_EQ("baz", *(--proto_array_.end()));
1566 }
1567 
TEST_F(RepeatedPtrFieldIteratorTest,ConstIteration)1568 TEST_F(RepeatedPtrFieldIteratorTest, ConstIteration) {
1569   const RepeatedPtrField<std::string>& const_proto_array = proto_array_;
1570   RepeatedPtrField<std::string>::const_iterator iter =
1571       const_proto_array.begin();
1572   EXPECT_EQ("foo", *iter);
1573   ++iter;
1574   EXPECT_EQ("bar", *(iter++));
1575   EXPECT_EQ("baz", *iter);
1576   ++iter;
1577   EXPECT_TRUE(const_proto_array.end() == iter);
1578   EXPECT_EQ("baz", *(--const_proto_array.end()));
1579 }
1580 
TEST_F(RepeatedPtrFieldIteratorTest,MutableReverseIteration)1581 TEST_F(RepeatedPtrFieldIteratorTest, MutableReverseIteration) {
1582   RepeatedPtrField<std::string>::reverse_iterator iter = proto_array_.rbegin();
1583   EXPECT_EQ("baz", *iter);
1584   ++iter;
1585   EXPECT_EQ("bar", *(iter++));
1586   EXPECT_EQ("foo", *iter);
1587   ++iter;
1588   EXPECT_TRUE(proto_array_.rend() == iter);
1589   EXPECT_EQ("foo", *(--proto_array_.rend()));
1590 }
1591 
TEST_F(RepeatedPtrFieldIteratorTest,ConstReverseIteration)1592 TEST_F(RepeatedPtrFieldIteratorTest, ConstReverseIteration) {
1593   const RepeatedPtrField<std::string>& const_proto_array = proto_array_;
1594   RepeatedPtrField<std::string>::const_reverse_iterator iter =
1595       const_proto_array.rbegin();
1596   EXPECT_EQ("baz", *iter);
1597   ++iter;
1598   EXPECT_EQ("bar", *(iter++));
1599   EXPECT_EQ("foo", *iter);
1600   ++iter;
1601   EXPECT_TRUE(const_proto_array.rend() == iter);
1602   EXPECT_EQ("foo", *(--const_proto_array.rend()));
1603 }
1604 
TEST_F(RepeatedPtrFieldIteratorTest,RandomAccess)1605 TEST_F(RepeatedPtrFieldIteratorTest, RandomAccess) {
1606   RepeatedPtrField<std::string>::iterator iter = proto_array_.begin();
1607   RepeatedPtrField<std::string>::iterator iter2 = iter;
1608   ++iter2;
1609   ++iter2;
1610   EXPECT_TRUE(iter + 2 == iter2);
1611   EXPECT_TRUE(iter == iter2 - 2);
1612   EXPECT_EQ("baz", iter[2]);
1613   EXPECT_EQ("baz", *(iter + 2));
1614   EXPECT_EQ(3, proto_array_.end() - proto_array_.begin());
1615 }
1616 
TEST_F(RepeatedPtrFieldIteratorTest,Comparable)1617 TEST_F(RepeatedPtrFieldIteratorTest, Comparable) {
1618   RepeatedPtrField<std::string>::const_iterator iter = proto_array_.begin();
1619   RepeatedPtrField<std::string>::const_iterator iter2 = iter + 1;
1620   EXPECT_TRUE(iter == iter);
1621   EXPECT_TRUE(iter != iter2);
1622   EXPECT_TRUE(iter < iter2);
1623   EXPECT_TRUE(iter <= iter2);
1624   EXPECT_TRUE(iter <= iter);
1625   EXPECT_TRUE(iter2 > iter);
1626   EXPECT_TRUE(iter2 >= iter);
1627   EXPECT_TRUE(iter >= iter);
1628 }
1629 
1630 // Uninitialized iterator does not point to any of the RepeatedPtrField.
TEST_F(RepeatedPtrFieldIteratorTest,UninitializedIterator)1631 TEST_F(RepeatedPtrFieldIteratorTest, UninitializedIterator) {
1632   RepeatedPtrField<std::string>::iterator iter;
1633   EXPECT_TRUE(iter != proto_array_.begin());
1634   EXPECT_TRUE(iter != proto_array_.begin() + 1);
1635   EXPECT_TRUE(iter != proto_array_.begin() + 2);
1636   EXPECT_TRUE(iter != proto_array_.begin() + 3);
1637   EXPECT_TRUE(iter != proto_array_.end());
1638 }
1639 
TEST_F(RepeatedPtrFieldIteratorTest,STLAlgorithms_lower_bound)1640 TEST_F(RepeatedPtrFieldIteratorTest, STLAlgorithms_lower_bound) {
1641   proto_array_.Clear();
1642   proto_array_.Add()->assign("a");
1643   proto_array_.Add()->assign("c");
1644   proto_array_.Add()->assign("d");
1645   proto_array_.Add()->assign("n");
1646   proto_array_.Add()->assign("p");
1647   proto_array_.Add()->assign("x");
1648   proto_array_.Add()->assign("y");
1649 
1650   std::string v = "f";
1651   RepeatedPtrField<std::string>::const_iterator it =
1652       std::lower_bound(proto_array_.begin(), proto_array_.end(), v);
1653 
1654   EXPECT_EQ(*it, "n");
1655   EXPECT_TRUE(it == proto_array_.begin() + 3);
1656 }
1657 
TEST_F(RepeatedPtrFieldIteratorTest,Mutation)1658 TEST_F(RepeatedPtrFieldIteratorTest, Mutation) {
1659   RepeatedPtrField<std::string>::iterator iter = proto_array_.begin();
1660   *iter = "qux";
1661   EXPECT_EQ("qux", proto_array_.Get(0));
1662 }
1663 
1664 // -------------------------------------------------------------------
1665 
1666 class RepeatedPtrFieldPtrsIteratorTest : public testing::Test {
1667  protected:
SetUp()1668   virtual void SetUp() {
1669     proto_array_.Add()->assign("foo");
1670     proto_array_.Add()->assign("bar");
1671     proto_array_.Add()->assign("baz");
1672     const_proto_array_ = &proto_array_;
1673   }
1674 
1675   RepeatedPtrField<std::string> proto_array_;
1676   const RepeatedPtrField<std::string>* const_proto_array_;
1677 };
1678 
TEST_F(RepeatedPtrFieldPtrsIteratorTest,ConvertiblePtr)1679 TEST_F(RepeatedPtrFieldPtrsIteratorTest, ConvertiblePtr) {
1680   RepeatedPtrField<std::string>::pointer_iterator iter =
1681       proto_array_.pointer_begin();
1682   static_cast<void>(iter);
1683 }
1684 
TEST_F(RepeatedPtrFieldPtrsIteratorTest,ConvertibleConstPtr)1685 TEST_F(RepeatedPtrFieldPtrsIteratorTest, ConvertibleConstPtr) {
1686   RepeatedPtrField<std::string>::const_pointer_iterator iter =
1687       const_proto_array_->pointer_begin();
1688   static_cast<void>(iter);
1689 }
1690 
TEST_F(RepeatedPtrFieldPtrsIteratorTest,MutablePtrIteration)1691 TEST_F(RepeatedPtrFieldPtrsIteratorTest, MutablePtrIteration) {
1692   RepeatedPtrField<std::string>::pointer_iterator iter =
1693       proto_array_.pointer_begin();
1694   EXPECT_EQ("foo", **iter);
1695   ++iter;
1696   EXPECT_EQ("bar", **(iter++));
1697   EXPECT_EQ("baz", **iter);
1698   ++iter;
1699   EXPECT_TRUE(proto_array_.pointer_end() == iter);
1700   EXPECT_EQ("baz", **(--proto_array_.pointer_end()));
1701 }
1702 
TEST_F(RepeatedPtrFieldPtrsIteratorTest,MutableConstPtrIteration)1703 TEST_F(RepeatedPtrFieldPtrsIteratorTest, MutableConstPtrIteration) {
1704   RepeatedPtrField<std::string>::const_pointer_iterator iter =
1705       const_proto_array_->pointer_begin();
1706   EXPECT_EQ("foo", **iter);
1707   ++iter;
1708   EXPECT_EQ("bar", **(iter++));
1709   EXPECT_EQ("baz", **iter);
1710   ++iter;
1711   EXPECT_TRUE(const_proto_array_->pointer_end() == iter);
1712   EXPECT_EQ("baz", **(--const_proto_array_->pointer_end()));
1713 }
1714 
TEST_F(RepeatedPtrFieldPtrsIteratorTest,RandomPtrAccess)1715 TEST_F(RepeatedPtrFieldPtrsIteratorTest, RandomPtrAccess) {
1716   RepeatedPtrField<std::string>::pointer_iterator iter =
1717       proto_array_.pointer_begin();
1718   RepeatedPtrField<std::string>::pointer_iterator iter2 = iter;
1719   ++iter2;
1720   ++iter2;
1721   EXPECT_TRUE(iter + 2 == iter2);
1722   EXPECT_TRUE(iter == iter2 - 2);
1723   EXPECT_EQ("baz", *iter[2]);
1724   EXPECT_EQ("baz", **(iter + 2));
1725   EXPECT_EQ(3, proto_array_.end() - proto_array_.begin());
1726 }
1727 
TEST_F(RepeatedPtrFieldPtrsIteratorTest,RandomConstPtrAccess)1728 TEST_F(RepeatedPtrFieldPtrsIteratorTest, RandomConstPtrAccess) {
1729   RepeatedPtrField<std::string>::const_pointer_iterator iter =
1730       const_proto_array_->pointer_begin();
1731   RepeatedPtrField<std::string>::const_pointer_iterator iter2 = iter;
1732   ++iter2;
1733   ++iter2;
1734   EXPECT_TRUE(iter + 2 == iter2);
1735   EXPECT_TRUE(iter == iter2 - 2);
1736   EXPECT_EQ("baz", *iter[2]);
1737   EXPECT_EQ("baz", **(iter + 2));
1738   EXPECT_EQ(3, const_proto_array_->end() - const_proto_array_->begin());
1739 }
1740 
TEST_F(RepeatedPtrFieldPtrsIteratorTest,ComparablePtr)1741 TEST_F(RepeatedPtrFieldPtrsIteratorTest, ComparablePtr) {
1742   RepeatedPtrField<std::string>::pointer_iterator iter =
1743       proto_array_.pointer_begin();
1744   RepeatedPtrField<std::string>::pointer_iterator iter2 = iter + 1;
1745   EXPECT_TRUE(iter == iter);
1746   EXPECT_TRUE(iter != iter2);
1747   EXPECT_TRUE(iter < iter2);
1748   EXPECT_TRUE(iter <= iter2);
1749   EXPECT_TRUE(iter <= iter);
1750   EXPECT_TRUE(iter2 > iter);
1751   EXPECT_TRUE(iter2 >= iter);
1752   EXPECT_TRUE(iter >= iter);
1753 }
1754 
TEST_F(RepeatedPtrFieldPtrsIteratorTest,ComparableConstPtr)1755 TEST_F(RepeatedPtrFieldPtrsIteratorTest, ComparableConstPtr) {
1756   RepeatedPtrField<std::string>::const_pointer_iterator iter =
1757       const_proto_array_->pointer_begin();
1758   RepeatedPtrField<std::string>::const_pointer_iterator iter2 = iter + 1;
1759   EXPECT_TRUE(iter == iter);
1760   EXPECT_TRUE(iter != iter2);
1761   EXPECT_TRUE(iter < iter2);
1762   EXPECT_TRUE(iter <= iter2);
1763   EXPECT_TRUE(iter <= iter);
1764   EXPECT_TRUE(iter2 > iter);
1765   EXPECT_TRUE(iter2 >= iter);
1766   EXPECT_TRUE(iter >= iter);
1767 }
1768 
1769 // Uninitialized iterator does not point to any of the RepeatedPtrOverPtrs.
1770 // Dereferencing an uninitialized iterator crashes the process.
TEST_F(RepeatedPtrFieldPtrsIteratorTest,UninitializedPtrIterator)1771 TEST_F(RepeatedPtrFieldPtrsIteratorTest, UninitializedPtrIterator) {
1772   RepeatedPtrField<std::string>::pointer_iterator iter;
1773   EXPECT_TRUE(iter != proto_array_.pointer_begin());
1774   EXPECT_TRUE(iter != proto_array_.pointer_begin() + 1);
1775   EXPECT_TRUE(iter != proto_array_.pointer_begin() + 2);
1776   EXPECT_TRUE(iter != proto_array_.pointer_begin() + 3);
1777   EXPECT_TRUE(iter != proto_array_.pointer_end());
1778 }
1779 
TEST_F(RepeatedPtrFieldPtrsIteratorTest,UninitializedConstPtrIterator)1780 TEST_F(RepeatedPtrFieldPtrsIteratorTest, UninitializedConstPtrIterator) {
1781   RepeatedPtrField<std::string>::const_pointer_iterator iter;
1782   EXPECT_TRUE(iter != const_proto_array_->pointer_begin());
1783   EXPECT_TRUE(iter != const_proto_array_->pointer_begin() + 1);
1784   EXPECT_TRUE(iter != const_proto_array_->pointer_begin() + 2);
1785   EXPECT_TRUE(iter != const_proto_array_->pointer_begin() + 3);
1786   EXPECT_TRUE(iter != const_proto_array_->pointer_end());
1787 }
1788 
1789 // This comparison functor is required by the tests for RepeatedPtrOverPtrs.
1790 // They operate on strings and need to compare strings as strings in
1791 // any stl algorithm, even though the iterator returns a pointer to a
1792 // string
1793 // - i.e. *iter has type std::string*.
1794 struct StringLessThan {
operator ()google::protobuf::__anon82af10e50111::StringLessThan1795   bool operator()(const std::string* z, const std::string* y) const {
1796     return *z < *y;
1797   }
1798 };
1799 
TEST_F(RepeatedPtrFieldPtrsIteratorTest,PtrSTLAlgorithms_lower_bound)1800 TEST_F(RepeatedPtrFieldPtrsIteratorTest, PtrSTLAlgorithms_lower_bound) {
1801   proto_array_.Clear();
1802   proto_array_.Add()->assign("a");
1803   proto_array_.Add()->assign("c");
1804   proto_array_.Add()->assign("d");
1805   proto_array_.Add()->assign("n");
1806   proto_array_.Add()->assign("p");
1807   proto_array_.Add()->assign("x");
1808   proto_array_.Add()->assign("y");
1809 
1810   {
1811     std::string v = "f";
1812     RepeatedPtrField<std::string>::pointer_iterator it =
1813         std::lower_bound(proto_array_.pointer_begin(),
1814                          proto_array_.pointer_end(), &v, StringLessThan());
1815 
1816     GOOGLE_CHECK(*it != NULL);
1817 
1818     EXPECT_EQ(**it, "n");
1819     EXPECT_TRUE(it == proto_array_.pointer_begin() + 3);
1820   }
1821   {
1822     std::string v = "f";
1823     RepeatedPtrField<std::string>::const_pointer_iterator it = std::lower_bound(
1824         const_proto_array_->pointer_begin(), const_proto_array_->pointer_end(),
1825         &v, StringLessThan());
1826 
1827     GOOGLE_CHECK(*it != NULL);
1828 
1829     EXPECT_EQ(**it, "n");
1830     EXPECT_TRUE(it == const_proto_array_->pointer_begin() + 3);
1831   }
1832 }
1833 
TEST_F(RepeatedPtrFieldPtrsIteratorTest,PtrMutation)1834 TEST_F(RepeatedPtrFieldPtrsIteratorTest, PtrMutation) {
1835   RepeatedPtrField<std::string>::pointer_iterator iter =
1836       proto_array_.pointer_begin();
1837   **iter = "qux";
1838   EXPECT_EQ("qux", proto_array_.Get(0));
1839 
1840   EXPECT_EQ("bar", proto_array_.Get(1));
1841   EXPECT_EQ("baz", proto_array_.Get(2));
1842   ++iter;
1843   delete *iter;
1844   *iter = new std::string("a");
1845   ++iter;
1846   delete *iter;
1847   *iter = new std::string("b");
1848   EXPECT_EQ("a", proto_array_.Get(1));
1849   EXPECT_EQ("b", proto_array_.Get(2));
1850 }
1851 
TEST_F(RepeatedPtrFieldPtrsIteratorTest,Sort)1852 TEST_F(RepeatedPtrFieldPtrsIteratorTest, Sort) {
1853   proto_array_.Add()->assign("c");
1854   proto_array_.Add()->assign("d");
1855   proto_array_.Add()->assign("n");
1856   proto_array_.Add()->assign("p");
1857   proto_array_.Add()->assign("a");
1858   proto_array_.Add()->assign("y");
1859   proto_array_.Add()->assign("x");
1860   EXPECT_EQ("foo", proto_array_.Get(0));
1861   EXPECT_EQ("n", proto_array_.Get(5));
1862   EXPECT_EQ("x", proto_array_.Get(9));
1863   std::sort(proto_array_.pointer_begin(), proto_array_.pointer_end(),
1864             StringLessThan());
1865   EXPECT_EQ("a", proto_array_.Get(0));
1866   EXPECT_EQ("baz", proto_array_.Get(2));
1867   EXPECT_EQ("y", proto_array_.Get(9));
1868 }
1869 
1870 // -----------------------------------------------------------------------------
1871 // Unit-tests for the insert iterators
1872 // google::protobuf::RepeatedFieldBackInserter,
1873 // google::protobuf::AllocatedRepeatedPtrFieldBackInserter
1874 // Ported from util/gtl/proto-array-iterators_unittest.
1875 
1876 class RepeatedFieldInsertionIteratorsTest : public testing::Test {
1877  protected:
1878   std::list<double> halves;
1879   std::list<int> fibonacci;
1880   std::vector<std::string> words;
1881   typedef TestAllTypes::NestedMessage Nested;
1882   Nested nesteds[2];
1883   std::vector<Nested*> nested_ptrs;
1884   TestAllTypes protobuffer;
1885 
SetUp()1886   virtual void SetUp() {
1887     fibonacci.push_back(1);
1888     fibonacci.push_back(1);
1889     fibonacci.push_back(2);
1890     fibonacci.push_back(3);
1891     fibonacci.push_back(5);
1892     fibonacci.push_back(8);
1893     std::copy(fibonacci.begin(), fibonacci.end(),
1894               RepeatedFieldBackInserter(protobuffer.mutable_repeated_int32()));
1895 
1896     halves.push_back(1.0);
1897     halves.push_back(0.5);
1898     halves.push_back(0.25);
1899     halves.push_back(0.125);
1900     halves.push_back(0.0625);
1901     std::copy(halves.begin(), halves.end(),
1902               RepeatedFieldBackInserter(protobuffer.mutable_repeated_double()));
1903 
1904     words.push_back("Able");
1905     words.push_back("was");
1906     words.push_back("I");
1907     words.push_back("ere");
1908     words.push_back("I");
1909     words.push_back("saw");
1910     words.push_back("Elba");
1911     std::copy(words.begin(), words.end(),
1912               RepeatedFieldBackInserter(protobuffer.mutable_repeated_string()));
1913 
1914     nesteds[0].set_bb(17);
1915     nesteds[1].set_bb(4711);
1916     std::copy(&nesteds[0], &nesteds[2],
1917               RepeatedFieldBackInserter(
1918                   protobuffer.mutable_repeated_nested_message()));
1919 
1920     nested_ptrs.push_back(new Nested);
1921     nested_ptrs.back()->set_bb(170);
1922     nested_ptrs.push_back(new Nested);
1923     nested_ptrs.back()->set_bb(47110);
1924     std::copy(nested_ptrs.begin(), nested_ptrs.end(),
1925               RepeatedFieldBackInserter(
1926                   protobuffer.mutable_repeated_nested_message()));
1927   }
1928 
TearDown()1929   virtual void TearDown() {
1930     for (auto ptr : nested_ptrs) {
1931       delete ptr;
1932     }
1933   }
1934 };
1935 
TEST_F(RepeatedFieldInsertionIteratorsTest,Fibonacci)1936 TEST_F(RepeatedFieldInsertionIteratorsTest, Fibonacci) {
1937   EXPECT_TRUE(std::equal(fibonacci.begin(), fibonacci.end(),
1938                          protobuffer.repeated_int32().begin()));
1939   EXPECT_TRUE(std::equal(protobuffer.repeated_int32().begin(),
1940                          protobuffer.repeated_int32().end(),
1941                          fibonacci.begin()));
1942 }
1943 
TEST_F(RepeatedFieldInsertionIteratorsTest,Halves)1944 TEST_F(RepeatedFieldInsertionIteratorsTest, Halves) {
1945   EXPECT_TRUE(std::equal(halves.begin(), halves.end(),
1946                          protobuffer.repeated_double().begin()));
1947   EXPECT_TRUE(std::equal(protobuffer.repeated_double().begin(),
1948                          protobuffer.repeated_double().end(), halves.begin()));
1949 }
1950 
TEST_F(RepeatedFieldInsertionIteratorsTest,Words)1951 TEST_F(RepeatedFieldInsertionIteratorsTest, Words) {
1952   ASSERT_EQ(words.size(), protobuffer.repeated_string_size());
1953   for (int i = 0; i < words.size(); ++i)
1954     EXPECT_EQ(words.at(i), protobuffer.repeated_string(i));
1955 }
1956 
TEST_F(RepeatedFieldInsertionIteratorsTest,Words2)1957 TEST_F(RepeatedFieldInsertionIteratorsTest, Words2) {
1958   words.clear();
1959   words.push_back("sing");
1960   words.push_back("a");
1961   words.push_back("song");
1962   words.push_back("of");
1963   words.push_back("six");
1964   words.push_back("pence");
1965   protobuffer.mutable_repeated_string()->Clear();
1966   std::copy(
1967       words.begin(), words.end(),
1968       RepeatedPtrFieldBackInserter(protobuffer.mutable_repeated_string()));
1969   ASSERT_EQ(words.size(), protobuffer.repeated_string_size());
1970   for (int i = 0; i < words.size(); ++i)
1971     EXPECT_EQ(words.at(i), protobuffer.repeated_string(i));
1972 }
1973 
TEST_F(RepeatedFieldInsertionIteratorsTest,Nesteds)1974 TEST_F(RepeatedFieldInsertionIteratorsTest, Nesteds) {
1975   ASSERT_EQ(protobuffer.repeated_nested_message_size(), 4);
1976   EXPECT_EQ(protobuffer.repeated_nested_message(0).bb(), 17);
1977   EXPECT_EQ(protobuffer.repeated_nested_message(1).bb(), 4711);
1978   EXPECT_EQ(protobuffer.repeated_nested_message(2).bb(), 170);
1979   EXPECT_EQ(protobuffer.repeated_nested_message(3).bb(), 47110);
1980 }
1981 
TEST_F(RepeatedFieldInsertionIteratorsTest,AllocatedRepeatedPtrFieldWithStringIntData)1982 TEST_F(RepeatedFieldInsertionIteratorsTest,
1983        AllocatedRepeatedPtrFieldWithStringIntData) {
1984   std::vector<Nested*> data;
1985   TestAllTypes goldenproto;
1986   for (int i = 0; i < 10; ++i) {
1987     Nested* new_data = new Nested;
1988     new_data->set_bb(i);
1989     data.push_back(new_data);
1990 
1991     new_data = goldenproto.add_repeated_nested_message();
1992     new_data->set_bb(i);
1993   }
1994   TestAllTypes testproto;
1995   std::copy(data.begin(), data.end(),
1996             AllocatedRepeatedPtrFieldBackInserter(
1997                 testproto.mutable_repeated_nested_message()));
1998   EXPECT_EQ(testproto.DebugString(), goldenproto.DebugString());
1999 }
2000 
TEST_F(RepeatedFieldInsertionIteratorsTest,AllocatedRepeatedPtrFieldWithString)2001 TEST_F(RepeatedFieldInsertionIteratorsTest,
2002        AllocatedRepeatedPtrFieldWithString) {
2003   std::vector<std::string*> data;
2004   TestAllTypes goldenproto;
2005   for (int i = 0; i < 10; ++i) {
2006     std::string* new_data = new std::string;
2007     *new_data = "name-" + StrCat(i);
2008     data.push_back(new_data);
2009 
2010     new_data = goldenproto.add_repeated_string();
2011     *new_data = "name-" + StrCat(i);
2012   }
2013   TestAllTypes testproto;
2014   std::copy(data.begin(), data.end(),
2015             AllocatedRepeatedPtrFieldBackInserter(
2016                 testproto.mutable_repeated_string()));
2017   EXPECT_EQ(testproto.DebugString(), goldenproto.DebugString());
2018 }
2019 
TEST_F(RepeatedFieldInsertionIteratorsTest,UnsafeArenaAllocatedRepeatedPtrFieldWithStringIntData)2020 TEST_F(RepeatedFieldInsertionIteratorsTest,
2021        UnsafeArenaAllocatedRepeatedPtrFieldWithStringIntData) {
2022   std::vector<Nested*> data;
2023   TestAllTypes goldenproto;
2024   for (int i = 0; i < 10; ++i) {
2025     Nested* new_data = new Nested;
2026     new_data->set_bb(i);
2027     data.push_back(new_data);
2028 
2029     new_data = goldenproto.add_repeated_nested_message();
2030     new_data->set_bb(i);
2031   }
2032   TestAllTypes testproto;
2033   std::copy(data.begin(), data.end(),
2034             UnsafeArenaAllocatedRepeatedPtrFieldBackInserter(
2035                 testproto.mutable_repeated_nested_message()));
2036   EXPECT_EQ(testproto.DebugString(), goldenproto.DebugString());
2037 }
2038 
TEST_F(RepeatedFieldInsertionIteratorsTest,UnsafeArenaAllocatedRepeatedPtrFieldWithString)2039 TEST_F(RepeatedFieldInsertionIteratorsTest,
2040        UnsafeArenaAllocatedRepeatedPtrFieldWithString) {
2041   std::vector<std::string*> data;
2042   TestAllTypes goldenproto;
2043   for (int i = 0; i < 10; ++i) {
2044     std::string* new_data = new std::string;
2045     *new_data = "name-" + StrCat(i);
2046     data.push_back(new_data);
2047 
2048     new_data = goldenproto.add_repeated_string();
2049     *new_data = "name-" + StrCat(i);
2050   }
2051   TestAllTypes testproto;
2052   std::copy(data.begin(), data.end(),
2053             UnsafeArenaAllocatedRepeatedPtrFieldBackInserter(
2054                 testproto.mutable_repeated_string()));
2055   EXPECT_EQ(testproto.DebugString(), goldenproto.DebugString());
2056 }
2057 
TEST_F(RepeatedFieldInsertionIteratorsTest,MoveStrings)2058 TEST_F(RepeatedFieldInsertionIteratorsTest, MoveStrings) {
2059   std::vector<std::string> src = {"a", "b", "c", "d"};
2060   std::vector<std::string> copy =
2061       src;  // copy since move leaves in undefined state
2062   TestAllTypes testproto;
2063   std::move(copy.begin(), copy.end(),
2064             RepeatedFieldBackInserter(testproto.mutable_repeated_string()));
2065 
2066   ASSERT_THAT(testproto.repeated_string(), testing::ElementsAreArray(src));
2067 }
2068 
TEST_F(RepeatedFieldInsertionIteratorsTest,MoveProtos)2069 TEST_F(RepeatedFieldInsertionIteratorsTest, MoveProtos) {
2070   auto make_nested = [](int32 x) {
2071     Nested ret;
2072     ret.set_bb(x);
2073     return ret;
2074   };
2075   std::vector<Nested> src = {make_nested(3), make_nested(5), make_nested(7)};
2076   std::vector<Nested> copy = src;  // copy since move leaves in undefined state
2077   TestAllTypes testproto;
2078   std::move(
2079       copy.begin(), copy.end(),
2080       RepeatedFieldBackInserter(testproto.mutable_repeated_nested_message()));
2081 
2082   ASSERT_EQ(src.size(), testproto.repeated_nested_message_size());
2083   for (int i = 0; i < src.size(); ++i) {
2084     EXPECT_EQ(src[i].DebugString(),
2085               testproto.repeated_nested_message(i).DebugString());
2086   }
2087 }
2088 
2089 }  // namespace
2090 
2091 }  // namespace protobuf
2092 }  // namespace google
2093