1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc. All rights reserved. 3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// http://code.google.com/p/protobuf/ 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met: 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions of source code must retain the above copyright 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer. 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions in binary form must reproduce the above 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution. 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Neither the name of Google Inc. nor the names of its 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission. 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: kenton@google.com (Kenton Varda) 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Based on original Protocol Buffers design by 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Sanjay Ghemawat, Jeff Dean, and others. 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// TODO(kenton): Improve this unittest to bring it up to the standards of 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// other proto2 unittests. 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <algorithm> 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <list> 40d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#include <vector> 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/repeated_field.h> 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/common.h> 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/unittest.pb.h> 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/strutil.h> 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/testing/googletest.h> 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <gtest/gtest.h> 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/stl_util-inl.h> 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google { 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing protobuf_unittest::TestAllTypes; 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf { 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace { 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Test operations on a RepeatedField which is small enough that it does 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// not allocate a separate array for storage. 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(RepeatedField, Small) { 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedField<int> field; 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.size(), 0); 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.Add(5); 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.size(), 1); 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.Get(0), 5); 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.Add(42); 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.size(), 2); 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.Get(0), 5); 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.Get(1), 42); 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.Set(1, 23); 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.size(), 2); 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.Get(0), 5); 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.Get(1), 23); 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.SpaceUsedExcludingSelf(), 0); 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.RemoveLast(); 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.size(), 1); 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.Get(0), 5); 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.Clear(); 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.size(), 0); 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.SpaceUsedExcludingSelf(), 0); 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Test operations on a RepeatedField which is large enough to allocate a 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// separate array. 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(RepeatedField, Large) { 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedField<int> field; 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < 16; i++) { 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.Add(i * i); 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.size(), 16); 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < 16; i++) { 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.Get(i), i * i); 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int expected_usage = 16 * sizeof(int); 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_GE(field.SpaceUsedExcludingSelf(), expected_usage); 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Test swapping between various types of RepeatedFields. 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(RepeatedField, SwapSmallSmall) { 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedField<int> field1; 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedField<int> field2; 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field1.Add(5); 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field1.Add(42); 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field1.Swap(&field2); 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field1.size(), 0); 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field2.size(), 2); 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field2.Get(0), 5); 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field2.Get(1), 42); 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(RepeatedField, SwapLargeSmall) { 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedField<int> field1; 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedField<int> field2; 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < 16; i++) { 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field1.Add(i * i); 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field2.Add(5); 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field2.Add(42); 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field1.Swap(&field2); 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field1.size(), 2); 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field1.Get(0), 5); 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field1.Get(1), 42); 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field2.size(), 16); 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < 16; i++) { 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field2.Get(i), i * i); 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(RepeatedField, SwapLargeLarge) { 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedField<int> field1; 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedField<int> field2; 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field1.Add(5); 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field1.Add(42); 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < 16; i++) { 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field1.Add(i); 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field2.Add(i * i); 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field2.Swap(&field1); 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field1.size(), 16); 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < 16; i++) { 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field1.Get(i), i * i); 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field2.size(), 18); 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field2.Get(0), 5); 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field2.Get(1), 42); 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 2; i < 18; i++) { 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field2.Get(i), i - 2); 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Determines how much space was reserved by the given field by adding elements 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// to it until it re-allocates its space. 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestatic int ReservedSpace(RepeatedField<int>* field) { 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const int* ptr = field->data(); 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville do { 177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field->Add(0); 178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } while (field->data() == ptr); 179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return field->size() - 1; 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(RepeatedField, ReserveMoreThanDouble) { 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Reserve more than double the previous space in the field and expect the 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // field to reserve exactly the amount specified. 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedField<int> field; 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.Reserve(20); 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(20, ReservedSpace(&field)); 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(RepeatedField, ReserveLessThanDouble) { 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Reserve less than double the previous space in the field and expect the 194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // field to grow by double instead. 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedField<int> field; 196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.Reserve(20); 197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.Reserve(30); 198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(40, ReservedSpace(&field)); 200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(RepeatedField, ReserveLessThanExisting) { 203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Reserve less than the previous space in the field and expect the 204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // field to not re-allocate at all. 205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedField<int> field; 206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.Reserve(20); 207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const int* previous_ptr = field.data(); 208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.Reserve(10); 209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(previous_ptr, field.data()); 211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(20, ReservedSpace(&field)); 212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(RepeatedField, MergeFrom) { 215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedField<int> source, destination; 216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville source.Add(4); 218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville source.Add(5); 219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville destination.Add(1); 221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville destination.Add(2); 222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville destination.Add(3); 223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville destination.MergeFrom(source); 225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(5, destination.size()); 227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, destination.Get(0)); 229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, destination.Get(1)); 230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(3, destination.Get(2)); 231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(4, destination.Get(3)); 232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(5, destination.Get(4)); 233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(RepeatedField, MutableDataIsMutable) { 236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedField<int> field; 237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.Add(1); 238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, field.Get(0)); 239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The fact that this line compiles would be enough, but we'll check the 240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // value anyway. 241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *field.mutable_data() = 2; 242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, field.Get(0)); 243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 245d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleTEST(RepeatedField, Truncate) { 246d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville RepeatedField<int> field; 247d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 248d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field.Add(12); 249d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field.Add(34); 250d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field.Add(56); 251d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field.Add(78); 252d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ(4, field.size()); 253d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 254d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field.Truncate(3); 255d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ(3, field.size()); 256d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 257d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field.Add(90); 258d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ(4, field.size()); 259d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ(90, field.Get(3)); 260d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 261d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Truncations that don't change the size are allowed, but growing is not 262d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // allowed. 263d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field.Truncate(field.size()); 264d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#ifdef GTEST_HAS_DEATH_TEST 265d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_DEBUG_DEATH(field.Truncate(field.size() + 1), "new_size"); 266d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#endif 267d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville} 268d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 269d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// RepeatedPtrField tests. These pretty much just mirror the RepeatedField 272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// tests above. 273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(RepeatedPtrField, Small) { 275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string> field; 276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.size(), 0); 278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.Add()->assign("foo"); 280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.size(), 1); 282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.Get(0), "foo"); 283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.Add()->assign("bar"); 285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.size(), 2); 287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.Get(0), "foo"); 288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.Get(1), "bar"); 289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.Mutable(1)->assign("baz"); 291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.size(), 2); 293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.Get(0), "foo"); 294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.Get(1), "baz"); 295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.RemoveLast(); 297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.size(), 1); 299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.Get(0), "foo"); 300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.Clear(); 302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.size(), 0); 304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(RepeatedPtrField, Large) { 307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string> field; 308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < 16; i++) { 310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *field.Add() += 'a' + i; 311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.size(), 16); 314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < 16; i++) { 316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.Get(i).size(), 1); 317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.Get(i)[0], 'a' + i); 318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int min_expected_usage = 16 * sizeof(string); 321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_GE(field.SpaceUsedExcludingSelf(), min_expected_usage); 322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(RepeatedPtrField, SwapSmallSmall) { 325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string> field1; 326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string> field2; 327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field1.Add()->assign("foo"); 329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field1.Add()->assign("bar"); 330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field1.Swap(&field2); 331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field1.size(), 0); 333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field2.size(), 2); 334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field2.Get(0), "foo"); 335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field2.Get(1), "bar"); 336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(RepeatedPtrField, SwapLargeSmall) { 339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string> field1; 340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string> field2; 341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field2.Add()->assign("foo"); 343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field2.Add()->assign("bar"); 344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < 16; i++) { 345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *field1.Add() += 'a' + i; 346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field1.Swap(&field2); 348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field1.size(), 2); 350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field1.Get(0), "foo"); 351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field1.Get(1), "bar"); 352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field2.size(), 16); 353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < 16; i++) { 354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field2.Get(i).size(), 1); 355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field2.Get(i)[0], 'a' + i); 356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(RepeatedPtrField, SwapLargeLarge) { 360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string> field1; 361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string> field2; 362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field1.Add()->assign("foo"); 364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field1.Add()->assign("bar"); 365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < 16; i++) { 366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *field1.Add() += 'A' + i; 367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *field2.Add() += 'a' + i; 368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field2.Swap(&field1); 370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field1.size(), 16); 372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < 16; i++) { 373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field1.Get(i).size(), 1); 374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field1.Get(i)[0], 'a' + i); 375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field2.size(), 18); 377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field2.Get(0), "foo"); 378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field2.Get(1), "bar"); 379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 2; i < 18; i++) { 380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field2.Get(i).size(), 1); 381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field2.Get(i)[0], 'A' + i - 2); 382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestatic int ReservedSpace(RepeatedPtrField<string>* field) { 386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string* const* ptr = field->data(); 387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville do { 388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field->Add(); 389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } while (field->data() == ptr); 390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return field->size() - 1; 392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(RepeatedPtrField, ReserveMoreThanDouble) { 395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string> field; 396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.Reserve(20); 397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(20, ReservedSpace(&field)); 399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(RepeatedPtrField, ReserveLessThanDouble) { 402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string> field; 403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.Reserve(20); 404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.Reserve(30); 405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(40, ReservedSpace(&field)); 407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(RepeatedPtrField, ReserveLessThanExisting) { 410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string> field; 411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.Reserve(20); 412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string* const* previous_ptr = field.data(); 413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.Reserve(10); 414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(previous_ptr, field.data()); 416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(20, ReservedSpace(&field)); 417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(RepeatedPtrField, ReserveDoesntLoseAllocated) { 420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Check that a bug is fixed: An earlier implementation of Reserve() 421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // failed to copy pointers to allocated-but-cleared objects, possibly 422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // leading to segfaults. 423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string> field; 424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string* first = field.Add(); 425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.RemoveLast(); 426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.Reserve(20); 428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(first, field.Add()); 429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Clearing elements is tricky with RepeatedPtrFields since the memory for 432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// the elements is retained and reused. 433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(RepeatedPtrField, ClearedElements) { 434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string> field; 435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string* original = field.Add(); 437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *original = "foo"; 438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.ClearedCount(), 0); 440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.RemoveLast(); 442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(original->empty()); 443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.ClearedCount(), 1); 444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.Add(), original); // Should return same string for reuse. 446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.ReleaseLast(), original); // We take ownership. 448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.ClearedCount(), 0); 449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_NE(field.Add(), original); // Should NOT return the same string. 451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.ClearedCount(), 0); 452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.AddAllocated(original); // Give ownership back. 454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.ClearedCount(), 0); 455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.Mutable(1), original); 456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.Clear(); 458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.ClearedCount(), 2); 459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.ReleaseCleared(), original); // Take ownership again. 460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.ClearedCount(), 1); 461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_NE(field.Add(), original); 462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.ClearedCount(), 0); 463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_NE(field.Add(), original); 464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.ClearedCount(), 0); 465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field.AddCleared(original); // Give ownership back, but as a cleared object. 467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.ClearedCount(), 1); 468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.Add(), original); 469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(field.ClearedCount(), 0); 470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 472d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// Test all code paths in AddAllocated(). 473d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleTEST(RepeatedPtrField, AddAlocated) { 474d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville RepeatedPtrField<string> field; 475d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville while (field.size() < field.Capacity()) { 476d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field.Add()->assign("filler"); 477d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 478d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 479d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville int index = field.size(); 480d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 481d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // First branch: Field is at capacity with no cleared objects. 482d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville string* foo = new string("foo"); 483d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field.AddAllocated(foo); 484d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ(index + 1, field.size()); 485d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ(0, field.ClearedCount()); 486d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ(foo, &field.Get(index)); 487d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 488d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Last branch: Field is not at capacity and there are no cleared objects. 489d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville string* bar = new string("bar"); 490d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field.AddAllocated(bar); 491d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville ++index; 492d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ(index + 1, field.size()); 493d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ(0, field.ClearedCount()); 494d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ(bar, &field.Get(index)); 495d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 496d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Third branch: Field is not at capacity and there are no cleared objects. 497d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field.RemoveLast(); 498d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville string* baz = new string("baz"); 499d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field.AddAllocated(baz); 500d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ(index + 1, field.size()); 501d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ(1, field.ClearedCount()); 502d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ(baz, &field.Get(index)); 503d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 504d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Second branch: Field is at capacity but has some cleared objects. 505d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville while (field.size() < field.Capacity()) { 506d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field.Add()->assign("filler2"); 507d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 508d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field.RemoveLast(); 509d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville index = field.size(); 510d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville string* qux = new string("qux"); 511d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field.AddAllocated(qux); 512d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ(index + 1, field.size()); 513d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // We should have discarded the cleared object. 514d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ(0, field.ClearedCount()); 515d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ(qux, &field.Get(index)); 516d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville} 517d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(RepeatedPtrField, MergeFrom) { 519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string> source, destination; 520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville source.Add()->assign("4"); 522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville source.Add()->assign("5"); 523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville destination.Add()->assign("1"); 525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville destination.Add()->assign("2"); 526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville destination.Add()->assign("3"); 527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville destination.MergeFrom(source); 529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(5, destination.size()); 531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("1", destination.Get(0)); 533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("2", destination.Get(1)); 534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("3", destination.Get(2)); 535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("4", destination.Get(3)); 536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("5", destination.Get(4)); 537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(RepeatedPtrField, MutableDataIsMutable) { 540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string> field; 541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *field.Add() = "1"; 542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("1", field.Get(0)); 543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The fact that this line compiles would be enough, but we'll check the 544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // value anyway. 545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string** data = field.mutable_data(); 546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville **data = "2"; 547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("2", field.Get(0)); 548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Iterator tests stolen from net/proto/proto-array_unittest. 553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass RepeatedFieldIteratorTest : public testing::Test { 554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetUp() { 556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < 3; ++i) { 557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto_array_.Add(i); 558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedField<int> proto_array_; 562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(RepeatedFieldIteratorTest, Convertible) { 565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedField<int>::iterator iter = proto_array_.begin(); 566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedField<int>::const_iterator c_iter = iter; 567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, *c_iter); 568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(RepeatedFieldIteratorTest, MutableIteration) { 571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedField<int>::iterator iter = proto_array_.begin(); 572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, *iter); 573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ++iter; 574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, *iter++); 575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, *iter); 576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ++iter; 577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(proto_array_.end() == iter); 578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, *(proto_array_.end() - 1)); 580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(RepeatedFieldIteratorTest, ConstIteration) { 583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const RepeatedField<int>& const_proto_array = proto_array_; 584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedField<int>::const_iterator iter = const_proto_array.begin(); 585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, *iter); 586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ++iter; 587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, *iter++); 588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, *iter); 589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ++iter; 590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(proto_array_.end() == iter); 591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, *(proto_array_.end() - 1)); 592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(RepeatedFieldIteratorTest, Mutation) { 595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedField<int>::iterator iter = proto_array_.begin(); 596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *iter = 7; 597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(7, proto_array_.Get(0)); 598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ------------------------------------------------------------------- 601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass RepeatedPtrFieldIteratorTest : public testing::Test { 603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetUp() { 605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto_array_.Add()->assign("foo"); 606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto_array_.Add()->assign("bar"); 607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto_array_.Add()->assign("baz"); 608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string> proto_array_; 611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(RepeatedPtrFieldIteratorTest, Convertible) { 614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string>::iterator iter = proto_array_.begin(); 615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string>::const_iterator c_iter = iter; 616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(RepeatedPtrFieldIteratorTest, MutableIteration) { 619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string>::iterator iter = proto_array_.begin(); 620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo", *iter); 621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ++iter; 622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bar", *(iter++)); 623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("baz", *iter); 624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ++iter; 625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(proto_array_.end() == iter); 626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("baz", *(--proto_array_.end())); 627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(RepeatedPtrFieldIteratorTest, ConstIteration) { 630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const RepeatedPtrField<string>& const_proto_array = proto_array_; 631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string>::const_iterator iter = const_proto_array.begin(); 632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo", *iter); 633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ++iter; 634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("bar", *(iter++)); 635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("baz", *iter); 636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ++iter; 637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(const_proto_array.end() == iter); 638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("baz", *(--const_proto_array.end())); 639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(RepeatedPtrFieldIteratorTest, RandomAccess) { 642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string>::iterator iter = proto_array_.begin(); 643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string>::iterator iter2 = iter; 644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ++iter2; 645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ++iter2; 646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(iter + 2 == iter2); 647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(iter == iter2 - 2); 648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("baz", iter[2]); 649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("baz", *(iter + 2)); 650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(3, proto_array_.end() - proto_array_.begin()); 651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(RepeatedPtrFieldIteratorTest, Comparable) { 654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string>::const_iterator iter = proto_array_.begin(); 655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string>::const_iterator iter2 = iter + 1; 656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(iter == iter); 657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(iter != iter2); 658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(iter < iter2); 659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(iter <= iter2); 660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(iter <= iter); 661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(iter2 > iter); 662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(iter2 >= iter); 663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(iter >= iter); 664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Uninitialized iterator does not point to any of the RepeatedPtrField. 667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(RepeatedPtrFieldIteratorTest, UninitializedIterator) { 668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string>::iterator iter; 669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(iter != proto_array_.begin()); 670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(iter != proto_array_.begin() + 1); 671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(iter != proto_array_.begin() + 2); 672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(iter != proto_array_.begin() + 3); 673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(iter != proto_array_.end()); 674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(RepeatedPtrFieldIteratorTest, STLAlgorithms_lower_bound) { 677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto_array_.Clear(); 678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto_array_.Add()->assign("a"); 679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto_array_.Add()->assign("c"); 680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto_array_.Add()->assign("d"); 681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto_array_.Add()->assign("n"); 682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto_array_.Add()->assign("p"); 683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto_array_.Add()->assign("x"); 684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto_array_.Add()->assign("y"); 685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string v = "f"; 687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string>::const_iterator it = 688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville lower_bound(proto_array_.begin(), proto_array_.end(), v); 689d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(*it, "n"); 691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(it == proto_array_.begin() + 3); 692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(RepeatedPtrFieldIteratorTest, Mutation) { 695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedPtrField<string>::iterator iter = proto_array_.begin(); 696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *iter = "qux"; 697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("qux", proto_array_.Get(0)); 698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 700d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// ------------------------------------------------------------------- 701d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 702d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleclass RepeatedPtrFieldPtrsIteratorTest : public testing::Test { 703d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville protected: 704d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville virtual void SetUp() { 705d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_array_.Add()->assign("foo"); 706d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_array_.Add()->assign("bar"); 707d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_array_.Add()->assign("baz"); 708d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 709d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 710d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville RepeatedPtrField<string> proto_array_; 711d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville}; 712d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 713d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleTEST_F(RepeatedPtrFieldPtrsIteratorTest, ConvertiblePtr) { 714d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville RepeatedPtrField<string>::pointer_iterator iter = 715d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_array_.pointer_begin(); 716d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville} 717d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 718d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleTEST_F(RepeatedPtrFieldPtrsIteratorTest, MutablePtrIteration) { 719d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville RepeatedPtrField<string>::pointer_iterator iter = 720d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_array_.pointer_begin(); 721d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ("foo", **iter); 722d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville ++iter; 723d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ("bar", **(iter++)); 724d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ("baz", **iter); 725d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville ++iter; 726d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_TRUE(proto_array_.pointer_end() == iter); 727d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ("baz", **(--proto_array_.pointer_end())); 728d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville} 729d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 730d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleTEST_F(RepeatedPtrFieldPtrsIteratorTest, RandomPtrAccess) { 731d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville RepeatedPtrField<string>::pointer_iterator iter = 732d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_array_.pointer_begin(); 733d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville RepeatedPtrField<string>::pointer_iterator iter2 = iter; 734d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville ++iter2; 735d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville ++iter2; 736d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_TRUE(iter + 2 == iter2); 737d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_TRUE(iter == iter2 - 2); 738d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ("baz", *iter[2]); 739d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ("baz", **(iter + 2)); 740d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ(3, proto_array_.end() - proto_array_.begin()); 741d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville} 742d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 743d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleTEST_F(RepeatedPtrFieldPtrsIteratorTest, ComparablePtr) { 744d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville RepeatedPtrField<string>::pointer_iterator iter = 745d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_array_.pointer_begin(); 746d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville RepeatedPtrField<string>::pointer_iterator iter2 = iter + 1; 747d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_TRUE(iter == iter); 748d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_TRUE(iter != iter2); 749d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_TRUE(iter < iter2); 750d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_TRUE(iter <= iter2); 751d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_TRUE(iter <= iter); 752d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_TRUE(iter2 > iter); 753d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_TRUE(iter2 >= iter); 754d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_TRUE(iter >= iter); 755d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville} 756d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 757d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// Uninitialized iterator does not point to any of the RepeatedPtrOverPtrs. 758d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// Dereferencing an uninitialized iterator crashes the process. 759d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleTEST_F(RepeatedPtrFieldPtrsIteratorTest, UninitializedPtrIterator) { 760d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville RepeatedPtrField<string>::pointer_iterator iter; 761d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_TRUE(iter != proto_array_.pointer_begin()); 762d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_TRUE(iter != proto_array_.pointer_begin() + 1); 763d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_TRUE(iter != proto_array_.pointer_begin() + 2); 764d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_TRUE(iter != proto_array_.pointer_begin() + 3); 765d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_TRUE(iter != proto_array_.pointer_end()); 766d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville} 767d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 768d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 769d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// This comparison functor is required by the tests for RepeatedPtrOverPtrs. 770d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// They operate on strings and need to compare strings as strings in 771d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// any stl algorithm, even though the iterator returns a pointer to a string 772d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// - i.e. *iter has type string*. 773d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savillestruct StringLessThan { 774d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville bool operator()(const string* z, const string& y) { 775d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville return *z < y; 776d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 777d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville bool operator()(const string* z, const string* y) { 778d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville return *z < *y; 779d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 780d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville}; 781d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 782d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleTEST_F(RepeatedPtrFieldPtrsIteratorTest, PtrSTLAlgorithms_lower_bound) { 783d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_array_.Clear(); 784d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_array_.Add()->assign("a"); 785d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_array_.Add()->assign("c"); 786d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_array_.Add()->assign("d"); 787d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_array_.Add()->assign("n"); 788d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_array_.Add()->assign("p"); 789d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_array_.Add()->assign("x"); 790d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_array_.Add()->assign("y"); 791d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 792d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville RepeatedPtrField<string>::pointer_iterator iter = 793d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_array_.pointer_begin(); 794d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville string v = "f"; 795d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville RepeatedPtrField<string>::pointer_iterator it = 796d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville lower_bound(proto_array_.pointer_begin(), proto_array_.pointer_end(), 797d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville &v, StringLessThan()); 798d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 799d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville GOOGLE_CHECK(*it != NULL); 800d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 801d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ(**it, "n"); 802d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_TRUE(it == proto_array_.pointer_begin() + 3); 803d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville} 804d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 805d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleTEST_F(RepeatedPtrFieldPtrsIteratorTest, PtrMutation) { 806d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville RepeatedPtrField<string>::pointer_iterator iter = 807d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_array_.pointer_begin(); 808d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville **iter = "qux"; 809d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ("qux", proto_array_.Get(0)); 810d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 811d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ("bar", proto_array_.Get(1)); 812d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ("baz", proto_array_.Get(2)); 813d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville ++iter; 814d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville delete *iter; 815d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville *iter = new string("a"); 816d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville ++iter; 817d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville delete *iter; 818d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville *iter = new string("b"); 819d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ("a", proto_array_.Get(1)); 820d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ("b", proto_array_.Get(2)); 821d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville} 822d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 823d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleTEST_F(RepeatedPtrFieldPtrsIteratorTest, Sort) { 824d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_array_.Add()->assign("c"); 825d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_array_.Add()->assign("d"); 826d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_array_.Add()->assign("n"); 827d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_array_.Add()->assign("p"); 828d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_array_.Add()->assign("a"); 829d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_array_.Add()->assign("y"); 830d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_array_.Add()->assign("x"); 831d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ("foo", proto_array_.Get(0)); 832d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ("n", proto_array_.Get(5)); 833d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ("x", proto_array_.Get(9)); 834d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville sort(proto_array_.pointer_begin(), 835d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_array_.pointer_end(), 836d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville StringLessThan()); 837d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ("a", proto_array_.Get(0)); 838d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ("baz", proto_array_.Get(2)); 839d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ("y", proto_array_.Get(9)); 840d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville} 841d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 842d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 843fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ----------------------------------------------------------------------------- 844fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Unit-tests for the insert iterators 845fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// google::protobuf::RepeatedFieldBackInserter, 846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// google::protobuf::AllocatedRepeatedPtrFieldBackInserter 847fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Ported from util/gtl/proto-array-iterators_unittest. 848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass RepeatedFieldInsertionIteratorsTest : public testing::Test { 850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 851fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville std::list<double> halves; 852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville std::list<int> fibonacci; 853fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville std::vector<string> words; 854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville typedef TestAllTypes::NestedMessage Nested; 855fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Nested nesteds[2]; 856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville std::vector<Nested*> nested_ptrs; 857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestAllTypes protobuffer; 858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SetUp() { 860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fibonacci.push_back(1); 861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fibonacci.push_back(1); 862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fibonacci.push_back(2); 863fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fibonacci.push_back(3); 864fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fibonacci.push_back(5); 865fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fibonacci.push_back(8); 866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville std::copy(fibonacci.begin(), fibonacci.end(), 867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedFieldBackInserter(protobuffer.mutable_repeated_int32())); 868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville halves.push_back(1.0); 870fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville halves.push_back(0.5); 871fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville halves.push_back(0.25); 872fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville halves.push_back(0.125); 873fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville halves.push_back(0.0625); 874fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville std::copy(halves.begin(), halves.end(), 875fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedFieldBackInserter(protobuffer.mutable_repeated_double())); 876fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 877fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville words.push_back("Able"); 878fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville words.push_back("was"); 879fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville words.push_back("I"); 880fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville words.push_back("ere"); 881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville words.push_back("I"); 882fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville words.push_back("saw"); 883fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville words.push_back("Elba"); 884fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville std::copy(words.begin(), words.end(), 885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedFieldBackInserter(protobuffer.mutable_repeated_string())); 886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville nesteds[0].set_bb(17); 888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville nesteds[1].set_bb(4711); 889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville std::copy(&nesteds[0], &nesteds[2], 890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedFieldBackInserter( 891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuffer.mutable_repeated_nested_message())); 892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville nested_ptrs.push_back(new Nested); 894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville nested_ptrs.back()->set_bb(170); 895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville nested_ptrs.push_back(new Nested); 896fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville nested_ptrs.back()->set_bb(47110); 897fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville std::copy(nested_ptrs.begin(), nested_ptrs.end(), 898fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RepeatedFieldBackInserter( 899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuffer.mutable_repeated_nested_message())); 900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 901fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 902fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 903fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void TearDown() { 904fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville STLDeleteContainerPointers(nested_ptrs.begin(), nested_ptrs.end()); 905fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 907fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 908fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(RepeatedFieldInsertionIteratorsTest, Fibonacci) { 909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(std::equal(fibonacci.begin(), 910fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fibonacci.end(), 911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuffer.repeated_int32().begin())); 912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(std::equal(protobuffer.repeated_int32().begin(), 913fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuffer.repeated_int32().end(), 914fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fibonacci.begin())); 915fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(RepeatedFieldInsertionIteratorsTest, Halves) { 918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(std::equal(halves.begin(), 919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville halves.end(), 920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuffer.repeated_double().begin())); 921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(std::equal(protobuffer.repeated_double().begin(), 922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuffer.repeated_double().end(), 923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville halves.begin())); 924fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(RepeatedFieldInsertionIteratorsTest, Words) { 927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(words.size(), protobuffer.repeated_string_size()); 928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(words.at(0), protobuffer.repeated_string(0)); 929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(words.at(1), protobuffer.repeated_string(1)); 930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(words.at(2), protobuffer.repeated_string(2)); 931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(words.at(3), protobuffer.repeated_string(3)); 932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(words.at(4), protobuffer.repeated_string(4)); 933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(words.at(5), protobuffer.repeated_string(5)); 934fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(words.at(6), protobuffer.repeated_string(6)); 935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(RepeatedFieldInsertionIteratorsTest, Nesteds) { 938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(protobuffer.repeated_nested_message_size(), 4); 939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(protobuffer.repeated_nested_message(0).bb(), 17); 940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(protobuffer.repeated_nested_message(1).bb(), 4711); 941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(protobuffer.repeated_nested_message(2).bb(), 170); 942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(protobuffer.repeated_nested_message(3).bb(), 47110); 943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 944fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 945fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(RepeatedFieldInsertionIteratorsTest, 946fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AllocatedRepeatedPtrFieldWithStringIntData) { 947fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville vector<Nested*> data; 948fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestAllTypes goldenproto; 949fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < 10; ++i) { 950fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Nested* new_data = new Nested; 951fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville new_data->set_bb(i); 952fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville data.push_back(new_data); 953fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 954fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville new_data = goldenproto.add_repeated_nested_message(); 955fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville new_data->set_bb(i); 956fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 957fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestAllTypes testproto; 958fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville copy(data.begin(), data.end(), 959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AllocatedRepeatedPtrFieldBackInserter( 960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville testproto.mutable_repeated_nested_message())); 961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(testproto.DebugString(), goldenproto.DebugString()); 962fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 963fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 964fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(RepeatedFieldInsertionIteratorsTest, 965fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AllocatedRepeatedPtrFieldWithString) { 966fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville vector<string*> data; 967fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestAllTypes goldenproto; 968fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < 10; ++i) { 969fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string* new_data = new string; 970fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *new_data = "name-" + SimpleItoa(i); 971fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville data.push_back(new_data); 972fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville new_data = goldenproto.add_repeated_string(); 974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *new_data = "name-" + SimpleItoa(i); 975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestAllTypes testproto; 977fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville copy(data.begin(), data.end(), 978fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville AllocatedRepeatedPtrFieldBackInserter( 979fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville testproto.mutable_repeated_string())); 980fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(testproto.DebugString(), goldenproto.DebugString()); 981fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 982fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 983fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace 984fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 985fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace protobuf 986fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace google 987