1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc. All rights reserved. 3afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson// https://developers.google.com/protocol-buffers/ 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// To test GeneratedMessageReflection, we actually let the protocol compiler 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// generate a full protocol message implementation and then test its 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// reflection interface. This is much easier and more maintainable than 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// trying to create our own Message class for GeneratedMessageReflection 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// to wrap. 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The tests here closely mirror some of the tests in 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// compiler/cpp/unittest, except using the reflection interface 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// rather than generated accessors. 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/generated_message_reflection.h> 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/descriptor.h> 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/test_util.h> 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/unittest.pb.h> 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/common.h> 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/testing/googletest.h> 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <gtest/gtest.h> 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google { 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf { 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace { 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Shorthand to get a FieldDescriptor for a field of unittest::TestAllTypes. 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst FieldDescriptor* F(const string& name) { 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* result = 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes::descriptor()->FindFieldByName(name); 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_CHECK(result != NULL); 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, Defaults) { 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Check that all default values are set correctly in the initial message. 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes message; 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ReflectionTester reflection_tester( 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes::descriptor()); 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection_tester.ExpectClearViaReflection(message); 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Reflection* reflection = message.GetReflection(); 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Messages should return pointers to default instances until first use. 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // (This is not checked by ExpectClear() since it is not actually true after 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the fields have been set and then cleared.) 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(&unittest::TestAllTypes::OptionalGroup::default_instance(), 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &reflection->GetMessage(message, F("optionalgroup"))); 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(&unittest::TestAllTypes::NestedMessage::default_instance(), 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &reflection->GetMessage(message, F("optional_nested_message"))); 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(&unittest::ForeignMessage::default_instance(), 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &reflection->GetMessage(message, F("optional_foreign_message"))); 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(&unittest_import::ImportMessage::default_instance(), 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &reflection->GetMessage(message, F("optional_import_message"))); 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, Accessors) { 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Set every field to a unique value then go back and check all those 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // values. 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes message; 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ReflectionTester reflection_tester( 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes::descriptor()); 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection_tester.SetAllFieldsViaReflection(&message); 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectAllFieldsSet(message); 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection_tester.ExpectAllFieldsSetViaReflection(message); 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection_tester.ModifyRepeatedFieldsViaReflection(&message); 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectRepeatedFieldsModified(message); 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, GetStringReference) { 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test that GetStringReference() returns the underlying string when it is 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // a normal string field. 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes message; 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.set_optional_string("foo"); 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_string("foo"); 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Reflection* reflection = message.GetReflection(); 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string scratch; 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(&message.optional_string(), 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &reflection->GetStringReference(message, F("optional_string"), &scratch)) 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville << "For simple string fields, GetStringReference() should return a " 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "reference to the underlying string."; 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(&message.repeated_string(0), 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &reflection->GetRepeatedStringReference(message, F("repeated_string"), 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 0, &scratch)) 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville << "For simple string fields, GetRepeatedStringReference() should return " 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "a reference to the underlying string."; 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, DefaultsAfterClear) { 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Check that after setting all fields and then clearing, getting an 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // embedded message does NOT return the default instance. 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes message; 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ReflectionTester reflection_tester( 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes::descriptor()); 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::SetAllFields(&message); 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.Clear(); 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Reflection* reflection = message.GetReflection(); 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_NE(&unittest::TestAllTypes::OptionalGroup::default_instance(), 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &reflection->GetMessage(message, F("optionalgroup"))); 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(), 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &reflection->GetMessage(message, F("optional_nested_message"))); 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_NE(&unittest::ForeignMessage::default_instance(), 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &reflection->GetMessage(message, F("optional_foreign_message"))); 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_NE(&unittest_import::ImportMessage::default_instance(), 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &reflection->GetMessage(message, F("optional_import_message"))); 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, Swap) { 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes message1; 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes message2; 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::SetAllFields(&message1); 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Reflection* reflection = message1.GetReflection(); 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection->Swap(&message1, &message2); 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectClear(message1); 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectAllFieldsSet(message2); 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, SwapWithBothSet) { 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes message1; 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes message2; 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::SetAllFields(&message1); 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::SetAllFields(&message2); 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ModifyRepeatedFields(&message2); 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Reflection* reflection = message1.GetReflection(); 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection->Swap(&message1, &message2); 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectRepeatedFieldsModified(message1); 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectAllFieldsSet(message2); 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message1.set_optional_int32(532819); 178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection->Swap(&message1, &message2); 180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(532819, message2.optional_int32()); 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, SwapExtensions) { 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions message1; 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions message2; 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::SetAllExtensions(&message1); 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Reflection* reflection = message1.GetReflection(); 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection->Swap(&message1, &message2); 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectExtensionsClear(message1); 194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectAllExtensionsSet(message2); 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, SwapUnknown) { 198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestEmptyMessage message1, message2; 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message1.mutable_unknown_fields()->AddVarint(1234, 1); 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, message1.unknown_fields().field_count()); 203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, message2.unknown_fields().field_count()); 204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Reflection* reflection = message1.GetReflection(); 205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection->Swap(&message1, &message2); 206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0, message1.unknown_fields().field_count()); 207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, message2.unknown_fields().field_count()); 208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 210a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(GeneratedMessageReflectionTest, SwapFields) { 211a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestAllTypes message1, message2; 212a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message1.set_optional_double(12.3); 213a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message1.mutable_repeated_int32()->Add(10); 214a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message1.mutable_repeated_int32()->Add(20); 215a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 216a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message2.set_optional_string("hello"); 217a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message2.mutable_repeated_int64()->Add(30); 218a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 219a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson vector<const FieldDescriptor*> fields; 220a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Descriptor* descriptor = message1.GetDescriptor(); 221a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson fields.push_back(descriptor->FindFieldByName("optional_double")); 222a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson fields.push_back(descriptor->FindFieldByName("repeated_int32")); 223a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson fields.push_back(descriptor->FindFieldByName("optional_string")); 224a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson fields.push_back(descriptor->FindFieldByName("optional_uint64")); 225a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 226a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Reflection* reflection = message1.GetReflection(); 227a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection->SwapFields(&message1, &message2, fields); 228a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 229a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(message1.has_optional_double()); 230a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(0, message1.repeated_int32_size()); 231a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(message1.has_optional_string()); 232a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("hello", message1.optional_string()); 233a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(0, message1.repeated_int64_size()); 234a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(message1.has_optional_uint64()); 235a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 236a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(message2.has_optional_double()); 237a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(12.3, message2.optional_double()); 238a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(2, message2.repeated_int32_size()); 239a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(10, message2.repeated_int32(0)); 240a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(20, message2.repeated_int32(1)); 241a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(message2.has_optional_string()); 242a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(1, message2.repeated_int64_size()); 243a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_FALSE(message2.has_optional_uint64()); 244a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 245a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 246a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(GeneratedMessageReflectionTest, SwapFieldsAll) { 247a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestAllTypes message1; 248a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestAllTypes message2; 249a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 250a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::SetAllFields(&message2); 251a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 252a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson vector<const FieldDescriptor*> fields; 253a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Reflection* reflection = message1.GetReflection(); 254a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection->ListFields(message2, &fields); 255a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection->SwapFields(&message1, &message2, fields); 256a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 257a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::ExpectAllFieldsSet(message1); 258a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::ExpectClear(message2); 259a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 260a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 261a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(GeneratedMessageReflectionTest, SwapFieldsAllExtension) { 262a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestAllExtensions message1; 263a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestAllExtensions message2; 264a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 265a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::SetAllExtensions(&message1); 266a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 267a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson vector<const FieldDescriptor*> fields; 268a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Reflection* reflection = message1.GetReflection(); 269a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection->ListFields(message1, &fields); 270a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection->SwapFields(&message1, &message2, fields); 271a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 272a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::ExpectExtensionsClear(message1); 273a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::ExpectAllExtensionsSet(message2); 274a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 275a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 276a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(GeneratedMessageReflectionTest, SwapOneof) { 277a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestOneof2 message1, message2; 278a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::SetOneof1(&message1); 279a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 280a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Reflection* reflection = message1.GetReflection(); 281a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection->Swap(&message1, &message2); 282a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 283a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::ExpectOneofClear(message1); 284a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::ExpectOneofSet1(message2); 285a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 286a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 287a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(GeneratedMessageReflectionTest, SwapOneofBothSet) { 288a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestOneof2 message1, message2; 289a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::SetOneof1(&message1); 290a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::SetOneof2(&message2); 291a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 292a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Reflection* reflection = message1.GetReflection(); 293a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection->Swap(&message1, &message2); 294a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 295a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::ExpectOneofSet2(message1); 296a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::ExpectOneofSet1(message2); 297a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 298a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 299a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(GeneratedMessageReflectionTest, SwapFieldsOneof) { 300a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestOneof2 message1, message2; 301a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::SetOneof1(&message1); 302a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 303a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson vector<const FieldDescriptor*> fields; 304a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Descriptor* descriptor = message1.GetDescriptor(); 305a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson for (int i = 0; i < descriptor->field_count(); i++) { 306a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson fields.push_back(descriptor->field(i)); 307a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 308a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Reflection* reflection = message1.GetReflection(); 309a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection->SwapFields(&message1, &message2, fields); 310a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 311a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::ExpectOneofClear(message1); 312a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::ExpectOneofSet1(message2); 313a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 314a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, RemoveLast) { 316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes message; 317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ReflectionTester reflection_tester( 318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes::descriptor()); 319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::SetAllFields(&message); 321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection_tester.RemoveLastRepeatedsViaReflection(&message); 323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectLastRepeatedsRemoved(message); 325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, RemoveLastExtensions) { 328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions message; 329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ReflectionTester reflection_tester( 330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions::descriptor()); 331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::SetAllExtensions(&message); 333a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection_tester.RemoveLastRepeatedsViaReflection(&message); 335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectLastRepeatedExtensionsRemoved(message); 337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 339a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(GeneratedMessageReflectionTest, ReleaseLast) { 340a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestAllTypes message; 341a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Descriptor* descriptor = message.GetDescriptor(); 342a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::ReflectionTester reflection_tester(descriptor); 343a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 344a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::SetAllFields(&message); 345a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 346a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.ReleaseLastRepeatedsViaReflection(&message, false); 347a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 348a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::ExpectLastRepeatedsReleased(message); 349a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 350a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Now test that we actually release the right message. 351a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message.Clear(); 352a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::SetAllFields(&message); 353a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_EQ(2, message.repeated_foreign_message_size()); 354a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const protobuf_unittest::ForeignMessage* expected = 355a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message.mutable_repeated_foreign_message(1); 356a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson scoped_ptr<Message> released(message.GetReflection()->ReleaseLast( 357a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &message, descriptor->FindFieldByName("repeated_foreign_message"))); 358a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(expected, released.get()); 359a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 360a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 361a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(GeneratedMessageReflectionTest, ReleaseLastExtensions) { 362a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestAllExtensions message; 363a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Descriptor* descriptor = message.GetDescriptor(); 364a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::ReflectionTester reflection_tester(descriptor); 365a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 366a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::SetAllExtensions(&message); 367a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 368a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.ReleaseLastRepeatedsViaReflection(&message, true); 369a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 370a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::ExpectLastRepeatedExtensionsReleased(message); 371a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 372a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Now test that we actually release the right message. 373a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message.Clear(); 374a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::SetAllExtensions(&message); 375a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ASSERT_EQ(2, message.ExtensionSize( 376a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::repeated_foreign_message_extension)); 377a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const protobuf_unittest::ForeignMessage* expected = message.MutableExtension( 378a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::repeated_foreign_message_extension, 1); 379a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson scoped_ptr<Message> released(message.GetReflection()->ReleaseLast( 380a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &message, descriptor->file()->FindExtensionByName( 381a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "repeated_foreign_message_extension"))); 382a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(expected, released.get()); 383a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 384a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 385a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, SwapRepeatedElements) { 387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes message; 388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ReflectionTester reflection_tester( 389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes::descriptor()); 390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::SetAllFields(&message); 392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Swap and test that fields are all swapped. 394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection_tester.SwapRepeatedsViaReflection(&message); 395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectRepeatedsSwapped(message); 396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Swap back and test that fields are all back to original values. 398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection_tester.SwapRepeatedsViaReflection(&message); 399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectAllFieldsSet(message); 400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, SwapRepeatedElementsExtension) { 403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions message; 404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ReflectionTester reflection_tester( 405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions::descriptor()); 406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::SetAllExtensions(&message); 408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Swap and test that fields are all swapped. 410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection_tester.SwapRepeatedsViaReflection(&message); 411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectRepeatedExtensionsSwapped(message); 412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Swap back and test that fields are all back to original values. 414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection_tester.SwapRepeatedsViaReflection(&message); 415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectAllExtensionsSet(message); 416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, Extensions) { 419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Set every extension to a unique value then go back and check all those 420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // values. 421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions message; 422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ReflectionTester reflection_tester( 423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions::descriptor()); 424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection_tester.SetAllFieldsViaReflection(&message); 426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectAllExtensionsSet(message); 427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection_tester.ExpectAllFieldsSetViaReflection(message); 428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection_tester.ModifyRepeatedFieldsViaReflection(&message); 430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectRepeatedExtensionsModified(message); 431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, FindExtensionTypeByNumber) { 434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Reflection* reflection = 435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions::default_instance().GetReflection(); 436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* extension1 = 438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName( 439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optional_int32_extension"); 440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* extension2 = 441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName( 442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_string_extension"); 443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(extension1, 445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection->FindKnownExtensionByNumber(extension1->number())); 446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(extension2, 447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection->FindKnownExtensionByNumber(extension2->number())); 448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Non-existent extension. 450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(reflection->FindKnownExtensionByNumber(62341) == NULL); 451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Extensions of TestAllExtensions should not show up as extensions of 453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // other types. 454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(unittest::TestAllTypes::default_instance().GetReflection()-> 455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FindKnownExtensionByNumber(extension1->number()) == NULL); 456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, FindKnownExtensionByName) { 459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Reflection* reflection = 460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions::default_instance().GetReflection(); 461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* extension1 = 463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName( 464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optional_int32_extension"); 465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* extension2 = 466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName( 467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_string_extension"); 468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(extension1, 470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection->FindKnownExtensionByName(extension1->full_name())); 471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(extension2, 472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection->FindKnownExtensionByName(extension2->full_name())); 473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Non-existent extension. 475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(reflection->FindKnownExtensionByName("no_such_ext") == NULL); 476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Extensions of TestAllExtensions should not show up as extensions of 478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // other types. 479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(unittest::TestAllTypes::default_instance().GetReflection()-> 480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FindKnownExtensionByName(extension1->full_name()) == NULL); 481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 483a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(GeneratedMessageReflectionTest, SetAllocatedMessageTest) { 484a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestAllTypes from_message1; 485a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestAllTypes from_message2; 486a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestAllTypes to_message; 487a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::ReflectionTester reflection_tester( 488a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestAllTypes::descriptor()); 489a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.SetAllFieldsViaReflection(&from_message1); 490a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.SetAllFieldsViaReflection(&from_message2); 491a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 492a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Before moving fields, we expect the nested messages to be NULL. 493a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.ExpectMessagesReleasedViaReflection( 494a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &to_message, TestUtil::ReflectionTester::IS_NULL); 495a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 496a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // After fields are moved we should get non-NULL releases. 497a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection( 498a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &from_message1, &to_message); 499a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.ExpectMessagesReleasedViaReflection( 500a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &to_message, TestUtil::ReflectionTester::NOT_NULL); 501a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 502a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Another move to make sure that we can SetAllocated several times. 503a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection( 504a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &from_message2, &to_message); 505a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.ExpectMessagesReleasedViaReflection( 506a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &to_message, TestUtil::ReflectionTester::NOT_NULL); 507a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 508a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // After SetAllocatedOptionalMessageFieldsToNullViaReflection() we expect the 509a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // releases to be NULL again. 510a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.SetAllocatedOptionalMessageFieldsToNullViaReflection( 511a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &to_message); 512a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.ExpectMessagesReleasedViaReflection( 513a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &to_message, TestUtil::ReflectionTester::IS_NULL); 514a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 515a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 516a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(GeneratedMessageReflectionTest, SetAllocatedExtensionMessageTest) { 517a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestAllExtensions from_message1; 518a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestAllExtensions from_message2; 519a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestAllExtensions to_message; 520a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::ReflectionTester reflection_tester( 521a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestAllExtensions::descriptor()); 522a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.SetAllFieldsViaReflection(&from_message1); 523a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.SetAllFieldsViaReflection(&from_message2); 524a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 525a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Before moving fields, we expect the nested messages to be NULL. 526a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.ExpectMessagesReleasedViaReflection( 527a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &to_message, TestUtil::ReflectionTester::IS_NULL); 528a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 529a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // After fields are moved we should get non-NULL releases. 530a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection( 531a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &from_message1, &to_message); 532a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.ExpectMessagesReleasedViaReflection( 533a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &to_message, TestUtil::ReflectionTester::NOT_NULL); 534a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 535a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Another move to make sure that we can SetAllocated several times. 536a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection( 537a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &from_message2, &to_message); 538a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.ExpectMessagesReleasedViaReflection( 539a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &to_message, TestUtil::ReflectionTester::NOT_NULL); 540a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 541a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // After SetAllocatedOptionalMessageFieldsToNullViaReflection() we expect the 542a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // releases to be NULL again. 543a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.SetAllocatedOptionalMessageFieldsToNullViaReflection( 544a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &to_message); 545a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.ExpectMessagesReleasedViaReflection( 546a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &to_message, TestUtil::ReflectionTester::IS_NULL); 547a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 548a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 549a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(GeneratedMessageReflectionTest, ListFieldsOneOf) { 550a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestOneof2 message; 551a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::SetOneof1(&message); 552a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 553a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Reflection* reflection = message.GetReflection(); 554a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson vector<const FieldDescriptor*> fields; 555a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection->ListFields(message, &fields); 556a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(4, fields.size()); 557a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 558a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 559a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(GeneratedMessageReflectionTest, Oneof) { 560a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestOneof2 message; 561a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Descriptor* descriptor = message.GetDescriptor(); 562a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Reflection* reflection = message.GetReflection(); 563a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 564a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Check default values. 565a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(0, reflection->GetInt32( 566a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message, descriptor->FindFieldByName("foo_int"))); 567a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("", reflection->GetString( 568a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message, descriptor->FindFieldByName("foo_string"))); 569a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("", reflection->GetString( 570a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message, descriptor->FindFieldByName("foo_cord"))); 571a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("", reflection->GetString( 572a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message, descriptor->FindFieldByName("foo_string_piece"))); 573a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("", reflection->GetString( 574a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message, descriptor->FindFieldByName("foo_bytes"))); 575a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(unittest::TestOneof2::FOO, reflection->GetEnum( 576a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message, descriptor->FindFieldByName("foo_enum"))->number()); 577a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(&unittest::TestOneof2::NestedMessage::default_instance(), 578a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &reflection->GetMessage( 579a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message, descriptor->FindFieldByName("foo_message"))); 580a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(&unittest::TestOneof2::FooGroup::default_instance(), 581a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &reflection->GetMessage( 582a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message, descriptor->FindFieldByName("foogroup"))); 583a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_NE(&unittest::TestOneof2::FooGroup::default_instance(), 584a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &reflection->GetMessage( 585a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message, descriptor->FindFieldByName("foo_lazy_message"))); 586a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(5, reflection->GetInt32( 587a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message, descriptor->FindFieldByName("bar_int"))); 588a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("STRING", reflection->GetString( 589a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message, descriptor->FindFieldByName("bar_string"))); 590a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("CORD", reflection->GetString( 591a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message, descriptor->FindFieldByName("bar_cord"))); 592a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("SPIECE", reflection->GetString( 593a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message, descriptor->FindFieldByName("bar_string_piece"))); 594a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("BYTES", reflection->GetString( 595a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message, descriptor->FindFieldByName("bar_bytes"))); 596a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(unittest::TestOneof2::BAR, reflection->GetEnum( 597a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message, descriptor->FindFieldByName("bar_enum"))->number()); 598a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 599a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Check Set functions. 600a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection->SetInt32( 601a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &message, descriptor->FindFieldByName("foo_int"), 123); 602a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(123, reflection->GetInt32( 603a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message, descriptor->FindFieldByName("foo_int"))); 604a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection->SetString( 605a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &message, descriptor->FindFieldByName("foo_string"), "abc"); 606a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("abc", reflection->GetString( 607a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message, descriptor->FindFieldByName("foo_string"))); 608a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection->SetString( 609a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &message, descriptor->FindFieldByName("foo_bytes"), "bytes"); 610a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("bytes", reflection->GetString( 611a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message, descriptor->FindFieldByName("foo_bytes"))); 612a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection->SetString( 613a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &message, descriptor->FindFieldByName("bar_cord"), "change_cord"); 614a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("change_cord", reflection->GetString( 615a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message, descriptor->FindFieldByName("bar_cord"))); 616a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection->SetString( 617a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &message, descriptor->FindFieldByName("bar_string_piece"), 618a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "change_spiece"); 619a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ("change_spiece", reflection->GetString( 620a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message, descriptor->FindFieldByName("bar_string_piece"))); 621a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 622a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 623a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(GeneratedMessageReflectionTest, SetAllocatedOneofMessageTest) { 624a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestOneof2 from_message1; 625a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestOneof2 from_message2; 626a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestOneof2 to_message; 627a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Descriptor* descriptor = unittest::TestOneof2::descriptor(); 628a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Reflection* reflection = to_message.GetReflection(); 629a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 630a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Message* released = reflection->ReleaseMessage( 631a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &to_message, descriptor->FindFieldByName("foo_lazy_message")); 632a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(released == NULL); 633a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson released = reflection->ReleaseMessage( 634a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &to_message, descriptor->FindFieldByName("foo_message")); 635a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(released == NULL); 636a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 637a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::ReflectionTester::SetOneofViaReflection(&from_message1); 638a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::ReflectionTester::ExpectOneofSetViaReflection(from_message1); 639a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 640a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::ReflectionTester:: 641a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetAllocatedOptionalMessageFieldsToMessageViaReflection( 642a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &from_message1, &to_message); 643a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Message& sub_message = reflection->GetMessage( 644a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson to_message, descriptor->FindFieldByName("foo_lazy_message")); 645a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson released = reflection->ReleaseMessage( 646a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &to_message, descriptor->FindFieldByName("foo_lazy_message")); 647a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(released != NULL); 648a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(&sub_message, released); 649a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson delete released; 650a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 651a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::ReflectionTester::SetOneofViaReflection(&from_message2); 652a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 653a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection->MutableMessage( 654a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &from_message2, descriptor->FindFieldByName("foo_message")); 655a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 656a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::ReflectionTester:: 657a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetAllocatedOptionalMessageFieldsToMessageViaReflection( 658a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &from_message2, &to_message); 659a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 660a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Message& sub_message2 = reflection->GetMessage( 661a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson to_message, descriptor->FindFieldByName("foo_message")); 662a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson released = reflection->ReleaseMessage( 663a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &to_message, descriptor->FindFieldByName("foo_message")); 664a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(released != NULL); 665a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(&sub_message2, released); 666a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson delete released; 667a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 668a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 669a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(GeneratedMessageReflectionTest, ReleaseMessageTest) { 670a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestAllTypes message; 671a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::ReflectionTester reflection_tester( 672a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestAllTypes::descriptor()); 673a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 674a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // When nothing is set, we expect all released messages to be NULL. 675a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.ExpectMessagesReleasedViaReflection( 676a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &message, TestUtil::ReflectionTester::IS_NULL); 677a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 678a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // After fields are set we should get non-NULL releases. 679a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.SetAllFieldsViaReflection(&message); 680a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.ExpectMessagesReleasedViaReflection( 681a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &message, TestUtil::ReflectionTester::NOT_NULL); 682a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 683a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // After Clear() we may or may not get a message from ReleaseMessage(). 684a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // This is implementation specific. 685a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.SetAllFieldsViaReflection(&message); 686a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message.Clear(); 687a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.ExpectMessagesReleasedViaReflection( 688a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &message, TestUtil::ReflectionTester::CAN_BE_NULL); 689a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 690a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Test a different code path for setting after releasing. 691a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::SetAllFields(&message); 692a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::ExpectAllFieldsSet(message); 693a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 694a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 695a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(GeneratedMessageReflectionTest, ReleaseExtensionMessageTest) { 696a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestAllExtensions message; 697a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::ReflectionTester reflection_tester( 698a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestAllExtensions::descriptor()); 699a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 700a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // When nothing is set, we expect all released messages to be NULL. 701a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.ExpectMessagesReleasedViaReflection( 702a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &message, TestUtil::ReflectionTester::IS_NULL); 703a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 704a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // After fields are set we should get non-NULL releases. 705a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.SetAllFieldsViaReflection(&message); 706a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.ExpectMessagesReleasedViaReflection( 707a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &message, TestUtil::ReflectionTester::NOT_NULL); 708a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 709a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // After Clear() we may or may not get a message from ReleaseMessage(). 710a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // This is implementation specific. 711a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.SetAllFieldsViaReflection(&message); 712a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message.Clear(); 713a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reflection_tester.ExpectMessagesReleasedViaReflection( 714a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &message, TestUtil::ReflectionTester::CAN_BE_NULL); 715a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 716a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Test a different code path for setting after releasing. 717a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::SetAllExtensions(&message); 718a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::ExpectAllExtensionsSet(message); 719a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 720a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 721a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST(GeneratedMessageReflectionTest, ReleaseOneofMessageTest) { 722a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest::TestOneof2 message; 723a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson TestUtil::ReflectionTester::SetOneofViaReflection(&message); 724a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 725a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Descriptor* descriptor = unittest::TestOneof2::descriptor(); 726a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Reflection* reflection = message.GetReflection(); 727a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Message& sub_message = reflection->GetMessage( 728a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message, descriptor->FindFieldByName("foo_lazy_message")); 729a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Message* released = reflection->ReleaseMessage( 730a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &message, descriptor->FindFieldByName("foo_lazy_message")); 731a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 732a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(released != NULL); 733a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_EQ(&sub_message, released); 734a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson delete released; 735a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 736a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson released = reflection->ReleaseMessage( 737a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson &message, descriptor->FindFieldByName("foo_lazy_message")); 738a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson EXPECT_TRUE(released == NULL); 739a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 740a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 741a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#ifdef PROTOBUF_HAS_DEATH_TEST 742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, UsageErrors) { 744fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes message; 745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Reflection* reflection = message.GetReflection(); 746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* descriptor = message.GetDescriptor(); 747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define f(NAME) descriptor->FindFieldByName(NAME) 749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 750fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Testing every single failure mode would be too much work. Let's just 751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // check a few. 752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_DEATH( 753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection->GetInt32( 754fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message, descriptor->FindFieldByName("optional_int64")), 755fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Protocol Buffer reflection usage error:\n" 756fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Method : google::protobuf::Reflection::GetInt32\n" 757fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Message type: protobuf_unittest\\.TestAllTypes\n" 758fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Field : protobuf_unittest\\.TestAllTypes\\.optional_int64\n" 759fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Problem : Field is not the right type for this message:\n" 760fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Expected : CPPTYPE_INT32\n" 761fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Field type: CPPTYPE_INT64"); 762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_DEATH( 763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection->GetInt32( 764fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message, descriptor->FindFieldByName("repeated_int32")), 765fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Protocol Buffer reflection usage error:\n" 766fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Method : google::protobuf::Reflection::GetInt32\n" 767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Message type: protobuf_unittest.TestAllTypes\n" 768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Field : protobuf_unittest.TestAllTypes.repeated_int32\n" 769fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Problem : Field is repeated; the method requires a singular field."); 770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_DEATH( 771fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection->GetInt32( 772fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message, unittest::ForeignMessage::descriptor()->FindFieldByName("c")), 773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Protocol Buffer reflection usage error:\n" 774fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Method : google::protobuf::Reflection::GetInt32\n" 775fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Message type: protobuf_unittest.TestAllTypes\n" 776fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Field : protobuf_unittest.ForeignMessage.c\n" 777fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Problem : Field does not match message type."); 778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_DEATH( 779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville reflection->HasField( 780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message, unittest::ForeignMessage::descriptor()->FindFieldByName("c")), 781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Protocol Buffer reflection usage error:\n" 782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Method : google::protobuf::Reflection::HasField\n" 783fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Message type: protobuf_unittest.TestAllTypes\n" 784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Field : protobuf_unittest.ForeignMessage.c\n" 785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Problem : Field does not match message type."); 786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef f 788fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 789fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 790a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#endif // PROTOBUF_HAS_DEATH_TEST 791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 793fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace 794fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace protobuf 795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace google 796