1ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Protocol Buffers - Google's data interchange format 2ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Copyright 2008 Google Inc. All rights reserved. 3ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// http://code.google.com/p/protobuf/ 4ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// 5ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Redistribution and use in source and binary forms, with or without 6ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// modification, are permitted provided that the following conditions are 7ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// met: 8ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// 9ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// * Redistributions of source code must retain the above copyright 10ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// notice, this list of conditions and the following disclaimer. 11ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// * Redistributions in binary form must reproduce the above 12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// copyright notice, this list of conditions and the following disclaimer 13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// in the documentation and/or other materials provided with the 14ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// distribution. 15ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// * Neither the name of Google Inc. nor the names of its 16ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// contributors may be used to endorse or promote products derived from 17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// this software without specific prior written permission. 18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// 19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 31ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Author: tgs@google.com (Tom Szymanski) 32ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// 33ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Test reflection methods for aggregate access to Repeated[Ptr]Fields. 34ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// This test proto2 methods on a proto2 layout. 35ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 36ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include <google/protobuf/stubs/common.h> 37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include <google/protobuf/stubs/stringprintf.h> 38ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include <google/protobuf/unittest.pb.h> 39ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include <google/protobuf/test_util.h> 40ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include <gtest/gtest.h> 41ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 42ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace google { 43ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace protobuf { 44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 45ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochusing unittest::ForeignMessage; 46ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochusing unittest::TestAllTypes; 47ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochusing unittest::TestAllExtensions; 48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace { 50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochstatic int Func(int i, int j) { 52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return i * j; 53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochstatic string StrFunc(int i, int j) { 56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch string str; 57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch SStringPrintf(&str, "%d", Func(i, 4)); 58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return str; 59ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 60ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 61ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 62ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST(RepeatedFieldReflectionTest, RegularFields) { 63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch TestAllTypes message; 64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const Reflection* refl = message.GetReflection(); 65ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const Descriptor* desc = message.GetDescriptor(); 66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch for (int i = 0; i < 10; ++i) { 68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch message.add_repeated_int32(Func(i, 1)); 69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch message.add_repeated_double(Func(i, 2)); 70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch message.add_repeated_string(StrFunc(i, 5)); 71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch message.add_repeated_foreign_message()->set_c(Func(i, 6)); 72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Get FieldDescriptors for all the fields of interest. 75ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const FieldDescriptor* fd_repeated_int32 = 76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch desc->FindFieldByName("repeated_int32"); 77ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const FieldDescriptor* fd_repeated_double = 78ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch desc->FindFieldByName("repeated_double"); 79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const FieldDescriptor* fd_repeated_string = 80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch desc->FindFieldByName("repeated_string"); 81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const FieldDescriptor* fd_repeated_foreign_message = 82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch desc->FindFieldByName("repeated_foreign_message"); 83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Get RepeatedField objects for all fields of interest. 85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const RepeatedField<int32>& rf_int32 = 86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch refl->GetRepeatedField<int32>(message, fd_repeated_int32); 87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const RepeatedField<double>& rf_double = 88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch refl->GetRepeatedField<double>(message, fd_repeated_double); 89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Get mutable RepeatedField objects for all fields of interest. 91ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch RepeatedField<int32>* mrf_int32 = 92ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch refl->MutableRepeatedField<int32>(&message, fd_repeated_int32); 93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch RepeatedField<double>* mrf_double = 94ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch refl->MutableRepeatedField<double>(&message, fd_repeated_double); 95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Get RepeatedPtrField objects for all fields of interest. 97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const RepeatedPtrField<string>& rpf_string = 98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch refl->GetRepeatedPtrField<string>(message, fd_repeated_string); 99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const RepeatedPtrField<ForeignMessage>& rpf_foreign_message = 100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch refl->GetRepeatedPtrField<ForeignMessage>( 101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch message, fd_repeated_foreign_message); 102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const RepeatedPtrField<Message>& rpf_message = 103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch refl->GetRepeatedPtrField<Message>( 104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch message, fd_repeated_foreign_message); 105ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Get mutable RepeatedPtrField objects for all fields of interest. 107ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch RepeatedPtrField<string>* mrpf_string = 108ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch refl->MutableRepeatedPtrField<string>(&message, fd_repeated_string); 109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch RepeatedPtrField<ForeignMessage>* mrpf_foreign_message = 110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch refl->MutableRepeatedPtrField<ForeignMessage>( 111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &message, fd_repeated_foreign_message); 112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch RepeatedPtrField<Message>* mrpf_message = 113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch refl->MutableRepeatedPtrField<Message>( 114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch &message, fd_repeated_foreign_message); 115ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 116ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Make sure we can do get and sets through the Repeated[Ptr]Field objects. 117ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch for (int i = 0; i < 10; ++i) { 118ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Check gets through const objects. 119ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(rf_int32.Get(i), Func(i, 1)); 120ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(rf_double.Get(i), Func(i, 2)); 121ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(rpf_string.Get(i), StrFunc(i, 5)); 122ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(rpf_foreign_message.Get(i).c(), Func(i, 6)); 1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(down_cast<const ForeignMessage*>(&rpf_message.Get(i))->c(), 124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Func(i, 6)); 125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 126ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Check gets through mutable objects. 127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(mrf_int32->Get(i), Func(i, 1)); 128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(mrf_double->Get(i), Func(i, 2)); 129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(mrpf_string->Get(i), StrFunc(i, 5)); 130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(mrpf_foreign_message->Get(i).c(), Func(i, 6)); 1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(down_cast<const ForeignMessage*>(&mrpf_message->Get(i))->c(), 132ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Func(i, 6)); 133ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 134ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Check sets through mutable objects. 135ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch mrf_int32->Set(i, Func(i, -1)); 136ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch mrf_double->Set(i, Func(i, -2)); 137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch mrpf_string->Mutable(i)->assign(StrFunc(i, -5)); 138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch mrpf_foreign_message->Mutable(i)->set_c(Func(i, -6)); 139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(message.repeated_int32(i), Func(i, -1)); 140ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(message.repeated_double(i), Func(i, -2)); 141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(message.repeated_string(i), StrFunc(i, -5)); 142ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(message.repeated_foreign_message(i).c(), Func(i, -6)); 143ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch down_cast<ForeignMessage*>(mrpf_message->Mutable(i))->set_c(Func(i, 7)); 144ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(message.repeated_foreign_message(i).c(), Func(i, 7)); 145ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 146ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#ifdef PROTOBUF_HAS_DEATH_TEST 148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Make sure types are checked correctly at runtime. 149ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const FieldDescriptor* fd_optional_int32 = 150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch desc->FindFieldByName("optional_int32"); 151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_DEATH(refl->GetRepeatedField<int32>( 152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch message, fd_optional_int32), "requires a repeated field"); 153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_DEATH(refl->GetRepeatedField<double>( 154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch message, fd_repeated_int32), "not the right type"); 155ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_DEATH(refl->GetRepeatedPtrField<TestAllTypes>( 156ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch message, fd_repeated_foreign_message), "wrong submessage type"); 1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif // PROTOBUF_HAS_DEATH_TEST 158ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 159ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 160ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 161ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 162ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 163ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST(RepeatedFieldReflectionTest, ExtensionFields) { 164ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch TestAllExtensions extended_message; 165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const Reflection* refl = extended_message.GetReflection(); 166ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const Descriptor* desc = extended_message.GetDescriptor(); 167ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 168ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch for (int i = 0; i < 10; ++i) { 169ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch extended_message.AddExtension( 170ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch unittest::repeated_int64_extension, Func(i, 1)); 171ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 172ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 173ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const FieldDescriptor* fd_repeated_int64_extension = 174ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch desc->file()->FindExtensionByName("repeated_int64_extension"); 175ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GOOGLE_CHECK(fd_repeated_int64_extension != NULL); 176ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 177ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const RepeatedField<int64>& rf_int64_extension = 178ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch refl->GetRepeatedField<int64>(extended_message, 179ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch fd_repeated_int64_extension); 180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch RepeatedField<int64>* mrf_int64_extension = 182ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch refl->MutableRepeatedField<int64>(&extended_message, 183ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch fd_repeated_int64_extension); 184ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 185ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch for (int i = 0; i < 10; ++i) { 186ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(Func(i, 1), rf_int64_extension.Get(i)); 187ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch mrf_int64_extension->Set(i, Func(i, -1)); 188ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(Func(i, -1), 189ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch extended_message.GetExtension(unittest::repeated_int64_extension, i)); 190ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 191ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 192ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 193ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} // namespace 194ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} // namespace protobuf 195ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} // namespace google 196