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