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