15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Protocol Buffers - Google's data interchange format
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2008 Google Inc.  All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://code.google.com/p/protobuf/
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Redistribution and use in source and binary forms, with or without
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// modification, are permitted provided that the following conditions are
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// met:
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Redistributions of source code must retain the above copyright
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// notice, this list of conditions and the following disclaimer.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Redistributions in binary form must reproduce the above
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// copyright notice, this list of conditions and the following disclaimer
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the documentation and/or other materials provided with the
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// distribution.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Neither the name of Google Inc. nor the names of its
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contributors may be used to endorse or promote products derived from
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this software without specific prior written permission.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author: kenton@google.com (Kenton Varda)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  Based on original Protocol Buffers design by
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  Sanjay Ghemawat, Jeff Dean, and others.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(kenton):  Improve this unittest to bring it up to the standards of
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   other proto2 unittests.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
39ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include <limits>
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list>
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/repeated_field.h>
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/stubs/common.h>
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/unittest.pb.h>
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/stubs/strutil.h>
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/testing/googletest.h>
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <gtest/gtest.h>
50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include <google/protobuf/stubs/stl_util.h>
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace google {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using protobuf_unittest::TestAllTypes;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protobuf {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test operations on a small RepeatedField.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedField, Small) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedField<int> field;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.size(), 0);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Add(5);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.size(), 1);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.Get(0), 5);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Add(42);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.size(), 2);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.Get(0), 5);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.Get(1), 42);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Set(1, 23);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.size(), 2);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.Get(0), 5);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.Get(1), 23);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.RemoveLast();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.size(), 1);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.Get(0), 5);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Clear();
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.size(), 0);
89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  int expected_usage = 4 * sizeof(int);
90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(field.SpaceUsedExcludingSelf(), expected_usage);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test operations on a RepeatedField which is large enough to allocate a
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// separate array.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedField, Large) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedField<int> field;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 16; i++) {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field.Add(i * i);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.size(), 16);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 16; i++) {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(field.Get(i), i * i);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int expected_usage = 16 * sizeof(int);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GE(field.SpaceUsedExcludingSelf(), expected_usage);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test swapping between various types of RepeatedFields.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedField, SwapSmallSmall) {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedField<int> field1;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedField<int> field2;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field1.Add(5);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field1.Add(42);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field1.Swap(&field2);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field1.size(), 0);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field2.size(), 2);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field2.Get(0), 5);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field2.Get(1), 42);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedField, SwapLargeSmall) {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedField<int> field1;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedField<int> field2;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 16; i++) {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field1.Add(i * i);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field2.Add(5);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field2.Add(42);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field1.Swap(&field2);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field1.size(), 2);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field1.Get(0), 5);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field1.Get(1), 42);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field2.size(), 16);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 16; i++) {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(field2.Get(i), i * i);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedField, SwapLargeLarge) {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedField<int> field1;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedField<int> field2;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field1.Add(5);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field1.Add(42);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 16; i++) {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field1.Add(i);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field2.Add(i * i);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field2.Swap(&field1);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field1.size(), 16);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 16; i++) {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(field1.Get(i), i * i);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field2.size(), 18);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field2.Get(0), 5);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field2.Get(1), 42);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 2; i < 18; i++) {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(field2.Get(i), i - 2);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Determines how much space was reserved by the given field by adding elements
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to it until it re-allocates its space.
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ReservedSpace(RepeatedField<int>* field) {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int* ptr = field->data();
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  do {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field->Add(0);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } while (field->data() == ptr);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return field->size() - 1;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedField, ReserveMoreThanDouble) {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reserve more than double the previous space in the field and expect the
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // field to reserve exactly the amount specified.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedField<int> field;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Reserve(20);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(20, ReservedSpace(&field));
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedField, ReserveLessThanDouble) {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reserve less than double the previous space in the field and expect the
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // field to grow by double instead.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedField<int> field;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Reserve(20);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Reserve(30);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(40, ReservedSpace(&field));
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedField, ReserveLessThanExisting) {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reserve less than the previous space in the field and expect the
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // field to not re-allocate at all.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedField<int> field;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Reserve(20);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int* previous_ptr = field.data();
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Reserve(10);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(previous_ptr, field.data());
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(20, ReservedSpace(&field));
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedField, MergeFrom) {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedField<int> source, destination;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source.Add(4);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source.Add(5);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destination.Add(1);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destination.Add(2);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destination.Add(3);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destination.MergeFrom(source);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(5, destination.size());
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, destination.Get(0));
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, destination.Get(1));
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3, destination.Get(2));
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, destination.Get(3));
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5, destination.Get(4));
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedField, CopyFrom) {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedField<int> source, destination;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source.Add(4);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source.Add(5);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destination.Add(1);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destination.Add(2);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destination.Add(3);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destination.CopyFrom(source);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, destination.size());
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, destination.Get(0));
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5, destination.Get(1));
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedField, CopyConstruct) {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedField<int> source;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source.Add(1);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source.Add(2);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedField<int> destination(source);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, destination.size());
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, destination.Get(0));
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, destination.Get(1));
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
260ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST(RepeatedField, IteratorConstruct) {
261ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  vector<int> values;
262ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  values.push_back(1);
263ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  values.push_back(2);
264ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
265ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RepeatedField<int> field(values.begin(), values.end());
266ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_EQ(values.size(), field.size());
267ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(values[0], field.Get(0));
268ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(values[1], field.Get(1));
269ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
270ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RepeatedField<int> other(field.begin(), field.end());
271ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_EQ(values.size(), other.size());
272ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(values[0], other.Get(0));
273ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(values[1], other.Get(1));
274ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
275ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedField, CopyAssign) {
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedField<int> source, destination;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source.Add(4);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source.Add(5);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destination.Add(1);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destination.Add(2);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destination.Add(3);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destination = source;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, destination.size());
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, destination.Get(0));
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5, destination.Get(1));
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
291ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST(RepeatedField, SelfAssign) {
292ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Verify that assignment to self does not destroy data.
293ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RepeatedField<int> source, *p;
294ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  p = &source;
295ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  source.Add(7);
296ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  source.Add(8);
297ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
298ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  *p = source;
299ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
300ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_EQ(2, source.size());
301ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(7, source.Get(0));
302ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(8, source.Get(1));
303ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
304ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedField, MutableDataIsMutable) {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedField<int> field;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Add(1);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, field.Get(0));
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The fact that this line compiles would be enough, but we'll check the
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // value anyway.
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *field.mutable_data() = 2;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, field.Get(0));
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedField, Truncate) {
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedField<int> field;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Add(12);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Add(34);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Add(56);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Add(78);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, field.size());
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Truncate(3);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3, field.size());
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Add(90);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, field.size());
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(90, field.Get(3));
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Truncations that don't change the size are allowed, but growing is not
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // allowed.
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Truncate(field.size());
3343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#ifdef PROTOBUF_HAS_DEATH_TEST
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_DEBUG_DEATH(field.Truncate(field.size() + 1), "new_size");
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
340ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST(RepeatedField, ExtractSubrange) {
341ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Exhaustively test every subrange in arrays of all sizes from 0 through 9.
342ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  for (int sz = 0; sz < 10; ++sz) {
343ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    for (int num = 0; num <= sz; ++num) {
344ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      for (int start = 0; start < sz - num; ++start) {
345ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        // Create RepeatedField with sz elements having values 0 through sz-1.
346ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        RepeatedField<int32> field;
347ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        for (int i = 0; i < sz; ++i)
348ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          field.Add(i);
349ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        EXPECT_EQ(field.size(), sz);
350ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
351ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        // Create a catcher array and call ExtractSubrange.
352ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        int32 catcher[10];
353ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        for (int i = 0; i < 10; ++i)
354ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          catcher[i] = -1;
355ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        field.ExtractSubrange(start, num, catcher);
356ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
357ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        // Does the resulting array have the right size?
358ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        EXPECT_EQ(field.size(), sz - num);
359ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
360ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        // Were the removed elements extracted into the catcher array?
361ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        for (int i = 0; i < num; ++i)
362ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          EXPECT_EQ(catcher[i], start + i);
363ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        EXPECT_EQ(catcher[num], -1);
364ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
365ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        // Does the resulting array contain the right values?
366ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        for (int i = 0; i < start; ++i)
367ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          EXPECT_EQ(field.Get(i), i);
368ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        for (int i = start; i < field.size(); ++i)
369ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          EXPECT_EQ(field.Get(i), i + num);
370ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      }
371ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
372ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
373ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
374ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ===================================================================
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RepeatedPtrField tests.  These pretty much just mirror the RepeatedField
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tests above.
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedPtrField, Small) {
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string> field;
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.size(), 0);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Add()->assign("foo");
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.size(), 1);
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.Get(0), "foo");
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Add()->assign("bar");
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.size(), 2);
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.Get(0), "foo");
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.Get(1), "bar");
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Mutable(1)->assign("baz");
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.size(), 2);
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.Get(0), "foo");
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.Get(1), "baz");
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.RemoveLast();
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.size(), 1);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.Get(0), "foo");
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Clear();
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.size(), 0);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
411ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedPtrField, Large) {
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string> field;
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 16; i++) {
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *field.Add() += 'a' + i;
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.size(), 16);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 16; i++) {
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(field.Get(i).size(), 1);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(field.Get(i)[0], 'a' + i);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int min_expected_usage = 16 * sizeof(string);
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GE(field.SpaceUsedExcludingSelf(), min_expected_usage);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedPtrField, SwapSmallSmall) {
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string> field1;
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string> field2;
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field1.Add()->assign("foo");
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field1.Add()->assign("bar");
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field1.Swap(&field2);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field1.size(), 0);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field2.size(), 2);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field2.Get(0), "foo");
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field2.Get(1), "bar");
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedPtrField, SwapLargeSmall) {
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string> field1;
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string> field2;
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field2.Add()->assign("foo");
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field2.Add()->assign("bar");
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 16; i++) {
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *field1.Add() += 'a' + i;
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field1.Swap(&field2);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field1.size(), 2);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field1.Get(0), "foo");
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field1.Get(1), "bar");
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field2.size(), 16);
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 16; i++) {
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(field2.Get(i).size(), 1);
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(field2.Get(i)[0], 'a' + i);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedPtrField, SwapLargeLarge) {
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string> field1;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string> field2;
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field1.Add()->assign("foo");
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field1.Add()->assign("bar");
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 16; i++) {
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *field1.Add() += 'A' + i;
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *field2.Add() += 'a' + i;
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field2.Swap(&field1);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field1.size(), 16);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 16; i++) {
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(field1.Get(i).size(), 1);
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(field1.Get(i)[0], 'a' + i);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field2.size(), 18);
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field2.Get(0), "foo");
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field2.Get(1), "bar");
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 2; i < 18; i++) {
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(field2.Get(i).size(), 1);
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(field2.Get(i)[0], 'A' + i - 2);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int ReservedSpace(RepeatedPtrField<string>* field) {
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string* const* ptr = field->data();
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  do {
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field->Add();
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } while (field->data() == ptr);
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return field->size() - 1;
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedPtrField, ReserveMoreThanDouble) {
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string> field;
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Reserve(20);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(20, ReservedSpace(&field));
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedPtrField, ReserveLessThanDouble) {
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string> field;
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Reserve(20);
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Reserve(30);
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(40, ReservedSpace(&field));
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedPtrField, ReserveLessThanExisting) {
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string> field;
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Reserve(20);
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string* const* previous_ptr = field.data();
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Reserve(10);
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(previous_ptr, field.data());
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(20, ReservedSpace(&field));
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedPtrField, ReserveDoesntLoseAllocated) {
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that a bug is fixed:  An earlier implementation of Reserve()
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // failed to copy pointers to allocated-but-cleared objects, possibly
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // leading to segfaults.
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string> field;
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string* first = field.Add();
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.RemoveLast();
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Reserve(20);
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(first, field.Add());
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Clearing elements is tricky with RepeatedPtrFields since the memory for
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the elements is retained and reused.
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedPtrField, ClearedElements) {
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string> field;
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string* original = field.Add();
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *original = "foo";
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.ClearedCount(), 0);
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.RemoveLast();
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(original->empty());
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.ClearedCount(), 1);
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.Add(), original);  // Should return same string for reuse.
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.ReleaseLast(), original);  // We take ownership.
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.ClearedCount(), 0);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(field.Add(), original);  // Should NOT return the same string.
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.ClearedCount(), 0);
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.AddAllocated(original);  // Give ownership back.
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.ClearedCount(), 0);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.Mutable(1), original);
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.Clear();
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.ClearedCount(), 2);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.ReleaseCleared(), original);  // Take ownership again.
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.ClearedCount(), 1);
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(field.Add(), original);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.ClearedCount(), 0);
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(field.Add(), original);
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.ClearedCount(), 0);
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.AddCleared(original);  // Give ownership back, but as a cleared object.
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.ClearedCount(), 1);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.Add(), original);
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(field.ClearedCount(), 0);
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test all code paths in AddAllocated().
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedPtrField, AddAlocated) {
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string> field;
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (field.size() < field.Capacity()) {
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field.Add()->assign("filler");
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int index = field.size();
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First branch:  Field is at capacity with no cleared objects.
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string* foo = new string("foo");
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.AddAllocated(foo);
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(index + 1, field.size());
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, field.ClearedCount());
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(foo, &field.Get(index));
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Last branch:  Field is not at capacity and there are no cleared objects.
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string* bar = new string("bar");
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.AddAllocated(bar);
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++index;
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(index + 1, field.size());
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, field.ClearedCount());
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(bar, &field.Get(index));
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Third branch:  Field is not at capacity and there are no cleared objects.
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.RemoveLast();
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string* baz = new string("baz");
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.AddAllocated(baz);
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(index + 1, field.size());
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, field.ClearedCount());
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(baz, &field.Get(index));
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Second branch:  Field is at capacity but has some cleared objects.
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (field.size() < field.Capacity()) {
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field.Add()->assign("filler2");
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.RemoveLast();
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  index = field.size();
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string* qux = new string("qux");
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.AddAllocated(qux);
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(index + 1, field.size());
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have discarded the cleared object.
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, field.ClearedCount());
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(qux, &field.Get(index));
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedPtrField, MergeFrom) {
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string> source, destination;
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source.Add()->assign("4");
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source.Add()->assign("5");
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destination.Add()->assign("1");
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destination.Add()->assign("2");
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destination.Add()->assign("3");
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destination.MergeFrom(source);
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(5, destination.size());
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("1", destination.Get(0));
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("2", destination.Get(1));
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("3", destination.Get(2));
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("4", destination.Get(3));
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("5", destination.Get(4));
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedPtrField, CopyFrom) {
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string> source, destination;
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source.Add()->assign("4");
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source.Add()->assign("5");
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destination.Add()->assign("1");
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destination.Add()->assign("2");
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destination.Add()->assign("3");
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destination.CopyFrom(source);
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, destination.size());
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("4", destination.Get(0));
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("5", destination.Get(1));
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedPtrField, CopyConstruct) {
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string> source;
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source.Add()->assign("1");
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source.Add()->assign("2");
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string> destination(source);
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, destination.size());
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("1", destination.Get(0));
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("2", destination.Get(1));
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
669ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST(RepeatedPtrField, IteratorConstruct_String) {
670ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  vector<string> values;
671ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  values.push_back("1");
672ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  values.push_back("2");
673ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
674ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RepeatedPtrField<string> field(values.begin(), values.end());
675ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_EQ(values.size(), field.size());
676ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(values[0], field.Get(0));
677ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(values[1], field.Get(1));
678ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
679ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RepeatedPtrField<string> other(field.begin(), field.end());
680ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_EQ(values.size(), other.size());
681ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(values[0], other.Get(0));
682ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(values[1], other.Get(1));
683ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
684ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
685ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST(RepeatedPtrField, IteratorConstruct_Proto) {
686ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  typedef TestAllTypes::NestedMessage Nested;
687ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  vector<Nested> values;
688ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  values.push_back(Nested());
689ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  values.back().set_bb(1);
690ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  values.push_back(Nested());
691ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  values.back().set_bb(2);
692ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
693ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RepeatedPtrField<Nested> field(values.begin(), values.end());
694ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_EQ(values.size(), field.size());
695ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(values[0].bb(), field.Get(0).bb());
696ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(values[1].bb(), field.Get(1).bb());
697ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
698ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RepeatedPtrField<Nested> other(field.begin(), field.end());
699ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_EQ(values.size(), other.size());
700ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(values[0].bb(), other.Get(0).bb());
701ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(values[1].bb(), other.Get(1).bb());
702ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
703ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedPtrField, CopyAssign) {
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string> source, destination;
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source.Add()->assign("4");
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source.Add()->assign("5");
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destination.Add()->assign("1");
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destination.Add()->assign("2");
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destination.Add()->assign("3");
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  destination = source;
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, destination.size());
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("4", destination.Get(0));
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("5", destination.Get(1));
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
719ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST(RepeatedPtrField, SelfAssign) {
720ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Verify that assignment to self does not destroy data.
721ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RepeatedPtrField<string> source, *p;
722ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  p = &source;
723ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  source.Add()->assign("7");
724ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  source.Add()->assign("8");
725ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
726ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  *p = source;
727ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
728ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_EQ(2, source.size());
729ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("7", source.Get(0));
730ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("8", source.Get(1));
731ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
732ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(RepeatedPtrField, MutableDataIsMutable) {
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string> field;
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *field.Add() = "1";
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("1", field.Get(0));
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The fact that this line compiles would be enough, but we'll check the
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // value anyway.
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string** data = field.mutable_data();
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **data = "2";
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("2", field.Get(0));
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
744ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST(RepeatedPtrField, ExtractSubrange) {
745ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Exhaustively test every subrange in arrays of all sizes from 0 through 9
746ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // with 0 through 3 cleared elements at the end.
747ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  for (int sz = 0; sz < 10; ++sz) {
748ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    for (int num = 0; num <= sz; ++num) {
749ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      for (int start = 0; start < sz - num; ++start) {
750ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        for (int extra = 0; extra < 4; ++extra) {
751ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          vector<string*> subject;
752ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
753ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          // Create an array with "sz" elements and "extra" cleared elements.
754ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          RepeatedPtrField<string> field;
755ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          for (int i = 0; i < sz + extra; ++i) {
756ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            subject.push_back(new string());
757ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            field.AddAllocated(subject[i]);
758ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          }
759ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          EXPECT_EQ(field.size(), sz + extra);
760ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          for (int i = 0; i < extra; ++i)
761ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            field.RemoveLast();
762ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          EXPECT_EQ(field.size(), sz);
763ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          EXPECT_EQ(field.ClearedCount(), extra);
764ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
765ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          // Create a catcher array and call ExtractSubrange.
766ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          string* catcher[10];
767ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          for (int i = 0; i < 10; ++i)
768ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            catcher[i] = NULL;
769ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          field.ExtractSubrange(start, num, catcher);
770ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
771ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          // Does the resulting array have the right size?
772ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          EXPECT_EQ(field.size(), sz - num);
773ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
774ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          // Were the removed elements extracted into the catcher array?
775ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          for (int i = 0; i < num; ++i)
776ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            EXPECT_EQ(catcher[i], subject[start + i]);
777ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          EXPECT_EQ(NULL, catcher[num]);
778ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
779ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          // Does the resulting array contain the right values?
780ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          for (int i = 0; i < start; ++i)
781ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            EXPECT_EQ(field.Mutable(i), subject[i]);
782ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          for (int i = start; i < field.size(); ++i)
783ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            EXPECT_EQ(field.Mutable(i), subject[i + num]);
784ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
785ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          // Reinstate the cleared elements.
786ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          EXPECT_EQ(field.ClearedCount(), extra);
787ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          for (int i = 0; i < extra; ++i)
788ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            field.Add();
789ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          EXPECT_EQ(field.ClearedCount(), 0);
790ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          EXPECT_EQ(field.size(), sz - num + extra);
791ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
792ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          // Make sure the extra elements are all there (in some order).
793ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          for (int i = sz; i < sz + extra; ++i) {
794ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            int count = 0;
795ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            for (int j = sz; j < sz + extra; ++j) {
796ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch              if (field.Mutable(j - num) == subject[i])
797ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                count += 1;
798ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            }
799ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            EXPECT_EQ(count, 1);
800ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          }
801ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
802ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          // Release the caught elements.
803ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          for (int i = 0; i < num; ++i)
804ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            delete catcher[i];
805ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        }
806ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      }
807ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
808ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
809ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
810ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
811ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST(RepeatedPtrField, DeleteSubrange) {
812ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // DeleteSubrange is a trivial extension of ExtendSubrange.
813ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
814ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ===================================================================
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Iterator tests stolen from net/proto/proto-array_unittest.
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RepeatedFieldIteratorTest : public testing::Test {
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = 0; i < 3; ++i) {
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto_array_.Add(i);
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedField<int> proto_array_;
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RepeatedFieldIteratorTest, Convertible) {
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedField<int>::iterator iter = proto_array_.begin();
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedField<int>::const_iterator c_iter = iter;
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedField<int>::value_type value = *c_iter;
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, value);
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RepeatedFieldIteratorTest, MutableIteration) {
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedField<int>::iterator iter = proto_array_.begin();
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, *iter);
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++iter;
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, *iter++);
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, *iter);
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++iter;
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(proto_array_.end() == iter);
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, *(proto_array_.end() - 1));
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RepeatedFieldIteratorTest, ConstIteration) {
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const RepeatedField<int>& const_proto_array = proto_array_;
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedField<int>::const_iterator iter = const_proto_array.begin();
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, *iter);
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++iter;
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, *iter++);
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, *iter);
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++iter;
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(proto_array_.end() == iter);
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, *(proto_array_.end() - 1));
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RepeatedFieldIteratorTest, Mutation) {
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedField<int>::iterator iter = proto_array_.begin();
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *iter = 7;
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(7, proto_array_.Get(0));
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// -------------------------------------------------------------------
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RepeatedPtrFieldIteratorTest : public testing::Test {
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto_array_.Add()->assign("foo");
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto_array_.Add()->assign("bar");
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto_array_.Add()->assign("baz");
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string> proto_array_;
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RepeatedPtrFieldIteratorTest, Convertible) {
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string>::iterator iter = proto_array_.begin();
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string>::const_iterator c_iter = iter;
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string>::value_type value = *c_iter;
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("foo", value);
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RepeatedPtrFieldIteratorTest, MutableIteration) {
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string>::iterator iter = proto_array_.begin();
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("foo", *iter);
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++iter;
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("bar", *(iter++));
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("baz", *iter);
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++iter;
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(proto_array_.end() == iter);
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("baz", *(--proto_array_.end()));
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RepeatedPtrFieldIteratorTest, ConstIteration) {
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const RepeatedPtrField<string>& const_proto_array = proto_array_;
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string>::const_iterator iter = const_proto_array.begin();
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("foo", *iter);
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++iter;
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("bar", *(iter++));
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("baz", *iter);
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++iter;
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(const_proto_array.end() == iter);
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("baz", *(--const_proto_array.end()));
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
909ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(RepeatedPtrFieldIteratorTest, MutableReverseIteration) {
910ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RepeatedPtrField<string>::reverse_iterator iter = proto_array_.rbegin();
911ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("baz", *iter);
912ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ++iter;
913ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("bar", *(iter++));
914ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("foo", *iter);
915ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ++iter;
916ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(proto_array_.rend() == iter);
917ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("foo", *(--proto_array_.rend()));
918ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
919ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
920ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(RepeatedPtrFieldIteratorTest, ConstReverseIteration) {
921ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const RepeatedPtrField<string>& const_proto_array = proto_array_;
922ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RepeatedPtrField<string>::const_reverse_iterator iter
923ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      = const_proto_array.rbegin();
924ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("baz", *iter);
925ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ++iter;
926ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("bar", *(iter++));
927ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("foo", *iter);
928ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ++iter;
929ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(const_proto_array.rend() == iter);
930ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("foo", *(--const_proto_array.rend()));
931ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
932ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RepeatedPtrFieldIteratorTest, RandomAccess) {
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string>::iterator iter = proto_array_.begin();
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string>::iterator iter2 = iter;
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++iter2;
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++iter2;
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter + 2 == iter2);
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter == iter2 - 2);
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("baz", iter[2]);
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("baz", *(iter + 2));
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3, proto_array_.end() - proto_array_.begin());
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RepeatedPtrFieldIteratorTest, Comparable) {
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string>::const_iterator iter = proto_array_.begin();
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string>::const_iterator iter2 = iter + 1;
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter == iter);
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter != iter2);
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter < iter2);
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter <= iter2);
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter <= iter);
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter2 > iter);
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter2 >= iter);
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter >= iter);
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Uninitialized iterator does not point to any of the RepeatedPtrField.
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RepeatedPtrFieldIteratorTest, UninitializedIterator) {
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string>::iterator iter;
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter != proto_array_.begin());
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter != proto_array_.begin() + 1);
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter != proto_array_.begin() + 2);
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter != proto_array_.begin() + 3);
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter != proto_array_.end());
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RepeatedPtrFieldIteratorTest, STLAlgorithms_lower_bound) {
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proto_array_.Clear();
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proto_array_.Add()->assign("a");
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proto_array_.Add()->assign("c");
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proto_array_.Add()->assign("d");
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proto_array_.Add()->assign("n");
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proto_array_.Add()->assign("p");
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proto_array_.Add()->assign("x");
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proto_array_.Add()->assign("y");
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string v = "f";
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string>::const_iterator it =
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lower_bound(proto_array_.begin(), proto_array_.end(), v);
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(*it, "n");
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(it == proto_array_.begin() + 3);
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RepeatedPtrFieldIteratorTest, Mutation) {
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string>::iterator iter = proto_array_.begin();
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *iter = "qux";
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("qux", proto_array_.Get(0));
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// -------------------------------------------------------------------
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RepeatedPtrFieldPtrsIteratorTest : public testing::Test {
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto_array_.Add()->assign("foo");
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto_array_.Add()->assign("bar");
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    proto_array_.Add()->assign("baz");
1000ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const_proto_array_ = &proto_array_;
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string> proto_array_;
1004ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const RepeatedPtrField<string>* const_proto_array_;
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RepeatedPtrFieldPtrsIteratorTest, ConvertiblePtr) {
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string>::pointer_iterator iter =
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto_array_.pointer_begin();
10103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  (void) iter;
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1013ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(RepeatedPtrFieldPtrsIteratorTest, ConvertibleConstPtr) {
1014ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RepeatedPtrField<string>::const_pointer_iterator iter =
1015ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      const_proto_array_->pointer_begin();
10163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  (void) iter;
1017ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1018ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RepeatedPtrFieldPtrsIteratorTest, MutablePtrIteration) {
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string>::pointer_iterator iter =
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto_array_.pointer_begin();
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("foo", **iter);
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++iter;
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("bar", **(iter++));
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("baz", **iter);
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++iter;
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(proto_array_.pointer_end() == iter);
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("baz", **(--proto_array_.pointer_end()));
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1031ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(RepeatedPtrFieldPtrsIteratorTest, MutableConstPtrIteration) {
1032ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RepeatedPtrField<string>::const_pointer_iterator iter =
1033ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      const_proto_array_->pointer_begin();
1034ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("foo", **iter);
1035ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ++iter;
1036ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("bar", **(iter++));
1037ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("baz", **iter);
1038ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ++iter;
1039ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(const_proto_array_->pointer_end() == iter);
1040ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("baz", **(--const_proto_array_->pointer_end()));
1041ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1042ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RepeatedPtrFieldPtrsIteratorTest, RandomPtrAccess) {
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string>::pointer_iterator iter =
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto_array_.pointer_begin();
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string>::pointer_iterator iter2 = iter;
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++iter2;
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++iter2;
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter + 2 == iter2);
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter == iter2 - 2);
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("baz", *iter[2]);
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("baz", **(iter + 2));
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3, proto_array_.end() - proto_array_.begin());
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1056ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(RepeatedPtrFieldPtrsIteratorTest, RandomConstPtrAccess) {
1057ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RepeatedPtrField<string>::const_pointer_iterator iter =
1058ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      const_proto_array_->pointer_begin();
1059ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RepeatedPtrField<string>::const_pointer_iterator iter2 = iter;
1060ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ++iter2;
1061ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ++iter2;
1062ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(iter + 2 == iter2);
1063ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(iter == iter2 - 2);
1064ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("baz", *iter[2]);
1065ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ("baz", **(iter + 2));
1066ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(3, const_proto_array_->end() - const_proto_array_->begin());
1067ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1068ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RepeatedPtrFieldPtrsIteratorTest, ComparablePtr) {
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string>::pointer_iterator iter =
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto_array_.pointer_begin();
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string>::pointer_iterator iter2 = iter + 1;
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter == iter);
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter != iter2);
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter < iter2);
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter <= iter2);
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter <= iter);
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter2 > iter);
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter2 >= iter);
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter >= iter);
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1083ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(RepeatedPtrFieldPtrsIteratorTest, ComparableConstPtr) {
1084ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RepeatedPtrField<string>::const_pointer_iterator iter =
1085ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      const_proto_array_->pointer_begin();
1086ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RepeatedPtrField<string>::const_pointer_iterator iter2 = iter + 1;
1087ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(iter == iter);
1088ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(iter != iter2);
1089ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(iter < iter2);
1090ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(iter <= iter2);
1091ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(iter <= iter);
1092ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(iter2 > iter);
1093ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(iter2 >= iter);
1094ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(iter >= iter);
1095ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1096ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Uninitialized iterator does not point to any of the RepeatedPtrOverPtrs.
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Dereferencing an uninitialized iterator crashes the process.
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RepeatedPtrFieldPtrsIteratorTest, UninitializedPtrIterator) {
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string>::pointer_iterator iter;
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter != proto_array_.pointer_begin());
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter != proto_array_.pointer_begin() + 1);
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter != proto_array_.pointer_begin() + 2);
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter != proto_array_.pointer_begin() + 3);
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(iter != proto_array_.pointer_end());
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1108ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(RepeatedPtrFieldPtrsIteratorTest, UninitializedConstPtrIterator) {
1109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RepeatedPtrField<string>::const_pointer_iterator iter;
1110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(iter != const_proto_array_->pointer_begin());
1111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(iter != const_proto_array_->pointer_begin() + 1);
1112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(iter != const_proto_array_->pointer_begin() + 2);
1113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(iter != const_proto_array_->pointer_begin() + 3);
1114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(iter != const_proto_array_->pointer_end());
1115ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This comparison functor is required by the tests for RepeatedPtrOverPtrs.
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// They operate on strings and need to compare strings as strings in
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// any stl algorithm, even though the iterator returns a pointer to a string
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - i.e. *iter has type string*.
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct StringLessThan {
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator()(const string* z, const string& y) {
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *z < y;
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator()(const string* z, const string* y) {
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return *z < *y;
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RepeatedPtrFieldPtrsIteratorTest, PtrSTLAlgorithms_lower_bound) {
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proto_array_.Clear();
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proto_array_.Add()->assign("a");
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proto_array_.Add()->assign("c");
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proto_array_.Add()->assign("d");
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proto_array_.Add()->assign("n");
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proto_array_.Add()->assign("p");
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proto_array_.Add()->assign("x");
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proto_array_.Add()->assign("y");
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1140ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  {
1141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    string v = "f";
1142ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    RepeatedPtrField<string>::pointer_iterator it =
1143ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        lower_bound(proto_array_.pointer_begin(), proto_array_.pointer_end(),
1144ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                    &v, StringLessThan());
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1146ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    GOOGLE_CHECK(*it != NULL);
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    EXPECT_EQ(**it, "n");
1149ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    EXPECT_TRUE(it == proto_array_.pointer_begin() + 3);
1150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
1151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  {
1152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    string v = "f";
1153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    RepeatedPtrField<string>::const_pointer_iterator it =
1154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        lower_bound(const_proto_array_->pointer_begin(),
1155ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                    const_proto_array_->pointer_end(),
1156ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                    &v, StringLessThan());
1157ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1158ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    GOOGLE_CHECK(*it != NULL);
1159ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1160ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    EXPECT_EQ(**it, "n");
1161ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    EXPECT_TRUE(it == const_proto_array_->pointer_begin() + 3);
1162ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RepeatedPtrFieldPtrsIteratorTest, PtrMutation) {
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RepeatedPtrField<string>::pointer_iterator iter =
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      proto_array_.pointer_begin();
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **iter = "qux";
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("qux", proto_array_.Get(0));
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("bar", proto_array_.Get(1));
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("baz", proto_array_.Get(2));
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++iter;
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete *iter;
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *iter = new string("a");
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++iter;
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete *iter;
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *iter = new string("b");
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("a", proto_array_.Get(1));
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("b", proto_array_.Get(2));
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RepeatedPtrFieldPtrsIteratorTest, Sort) {
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proto_array_.Add()->assign("c");
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proto_array_.Add()->assign("d");
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proto_array_.Add()->assign("n");
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proto_array_.Add()->assign("p");
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proto_array_.Add()->assign("a");
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proto_array_.Add()->assign("y");
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  proto_array_.Add()->assign("x");
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("foo", proto_array_.Get(0));
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("n", proto_array_.Get(5));
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("x", proto_array_.Get(9));
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sort(proto_array_.pointer_begin(),
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       proto_array_.pointer_end(),
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       StringLessThan());
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("a", proto_array_.Get(0));
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("baz", proto_array_.Get(2));
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("y", proto_array_.Get(9));
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// -----------------------------------------------------------------------------
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Unit-tests for the insert iterators
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// google::protobuf::RepeatedFieldBackInserter,
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// google::protobuf::AllocatedRepeatedPtrFieldBackInserter
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ported from util/gtl/proto-array-iterators_unittest.
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RepeatedFieldInsertionIteratorsTest : public testing::Test {
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::list<double> halves;
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::list<int> fibonacci;
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<string> words;
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef TestAllTypes::NestedMessage Nested;
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Nested nesteds[2];
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<Nested*> nested_ptrs;
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestAllTypes protobuffer;
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fibonacci.push_back(1);
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fibonacci.push_back(1);
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fibonacci.push_back(2);
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fibonacci.push_back(3);
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fibonacci.push_back(5);
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fibonacci.push_back(8);
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::copy(fibonacci.begin(), fibonacci.end(),
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              RepeatedFieldBackInserter(protobuffer.mutable_repeated_int32()));
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    halves.push_back(1.0);
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    halves.push_back(0.5);
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    halves.push_back(0.25);
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    halves.push_back(0.125);
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    halves.push_back(0.0625);
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::copy(halves.begin(), halves.end(),
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              RepeatedFieldBackInserter(protobuffer.mutable_repeated_double()));
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    words.push_back("Able");
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    words.push_back("was");
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    words.push_back("I");
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    words.push_back("ere");
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    words.push_back("I");
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    words.push_back("saw");
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    words.push_back("Elba");
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::copy(words.begin(), words.end(),
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              RepeatedFieldBackInserter(protobuffer.mutable_repeated_string()));
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nesteds[0].set_bb(17);
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nesteds[1].set_bb(4711);
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::copy(&nesteds[0], &nesteds[2],
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              RepeatedFieldBackInserter(
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  protobuffer.mutable_repeated_nested_message()));
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nested_ptrs.push_back(new Nested);
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nested_ptrs.back()->set_bb(170);
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nested_ptrs.push_back(new Nested);
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nested_ptrs.back()->set_bb(47110);
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::copy(nested_ptrs.begin(), nested_ptrs.end(),
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              RepeatedFieldBackInserter(
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  protobuffer.mutable_repeated_nested_message()));
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STLDeleteContainerPointers(nested_ptrs.begin(), nested_ptrs.end());
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RepeatedFieldInsertionIteratorsTest, Fibonacci) {
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(std::equal(fibonacci.begin(),
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         fibonacci.end(),
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         protobuffer.repeated_int32().begin()));
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(std::equal(protobuffer.repeated_int32().begin(),
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         protobuffer.repeated_int32().end(),
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         fibonacci.begin()));
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RepeatedFieldInsertionIteratorsTest, Halves) {
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(std::equal(halves.begin(),
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         halves.end(),
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         protobuffer.repeated_double().begin()));
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(std::equal(protobuffer.repeated_double().begin(),
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         protobuffer.repeated_double().end(),
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         halves.begin()));
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RepeatedFieldInsertionIteratorsTest, Words) {
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(words.size(), protobuffer.repeated_string_size());
1288ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  for (int i = 0; i < words.size(); ++i)
1289ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    EXPECT_EQ(words.at(i), protobuffer.repeated_string(i));
1290ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1291ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1292ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(RepeatedFieldInsertionIteratorsTest, Words2) {
1293ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  words.clear();
1294ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  words.push_back("sing");
1295ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  words.push_back("a");
1296ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  words.push_back("song");
1297ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  words.push_back("of");
1298ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  words.push_back("six");
1299ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  words.push_back("pence");
1300ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  protobuffer.mutable_repeated_string()->Clear();
1301ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::copy(words.begin(), words.end(), RepeatedPtrFieldBackInserter(
1302ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      protobuffer.mutable_repeated_string()));
1303ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_EQ(words.size(), protobuffer.repeated_string_size());
1304ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  for (int i = 0; i < words.size(); ++i)
1305ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    EXPECT_EQ(words.at(i), protobuffer.repeated_string(i));
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RepeatedFieldInsertionIteratorsTest, Nesteds) {
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(protobuffer.repeated_nested_message_size(), 4);
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(protobuffer.repeated_nested_message(0).bb(), 17);
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(protobuffer.repeated_nested_message(1).bb(), 4711);
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(protobuffer.repeated_nested_message(2).bb(), 170);
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(protobuffer.repeated_nested_message(3).bb(), 47110);
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RepeatedFieldInsertionIteratorsTest,
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       AllocatedRepeatedPtrFieldWithStringIntData) {
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  vector<Nested*> data;
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestAllTypes goldenproto;
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 10; ++i) {
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Nested* new_data = new Nested;
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_data->set_bb(i);
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data.push_back(new_data);
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_data = goldenproto.add_repeated_nested_message();
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_data->set_bb(i);
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestAllTypes testproto;
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  copy(data.begin(), data.end(),
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       AllocatedRepeatedPtrFieldBackInserter(
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           testproto.mutable_repeated_nested_message()));
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(testproto.DebugString(), goldenproto.DebugString());
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RepeatedFieldInsertionIteratorsTest,
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       AllocatedRepeatedPtrFieldWithString) {
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  vector<string*> data;
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestAllTypes goldenproto;
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 10; ++i) {
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string* new_data = new string;
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *new_data = "name-" + SimpleItoa(i);
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data.push_back(new_data);
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_data = goldenproto.add_repeated_string();
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *new_data = "name-" + SimpleItoa(i);
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestAllTypes testproto;
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  copy(data.begin(), data.end(),
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       AllocatedRepeatedPtrFieldBackInserter(
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           testproto.mutable_repeated_string()));
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(testproto.DebugString(), goldenproto.DebugString());
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace protobuf
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace google
1358