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


libaditof
Author(s):
autogenerated on Wed May 21 2025 02:06:58