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