generated_message_reflection_unittest.cc revision fbaaef999ba563838ebd00874ed8a1c01fbf286d
1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc.  All rights reserved.
3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// http://code.google.com/p/protobuf/
4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without
6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are
7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met:
8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions of source code must retain the above copyright
10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer.
11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions in binary form must reproduce the above
12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer
13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the
14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution.
15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Neither the name of Google Inc. nor the names of its
16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from
17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission.
18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: kenton@google.com (Kenton Varda)
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  Based on original Protocol Buffers design by
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  Sanjay Ghemawat, Jeff Dean, and others.
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 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
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, RemoveLast) {
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unittest::TestAllTypes message;
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TestUtil::ReflectionTester reflection_tester(
213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    unittest::TestAllTypes::descriptor());
214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TestUtil::SetAllFields(&message);
216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  reflection_tester.RemoveLastRepeatedsViaReflection(&message);
218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TestUtil::ExpectLastRepeatedsRemoved(message);
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, RemoveLastExtensions) {
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unittest::TestAllExtensions message;
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TestUtil::ReflectionTester reflection_tester(
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    unittest::TestAllExtensions::descriptor());
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TestUtil::SetAllExtensions(&message);
228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  reflection_tester.RemoveLastRepeatedsViaReflection(&message);
229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TestUtil::ExpectLastRepeatedExtensionsRemoved(message);
231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, SwapRepeatedElements) {
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unittest::TestAllTypes message;
235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TestUtil::ReflectionTester reflection_tester(
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    unittest::TestAllTypes::descriptor());
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TestUtil::SetAllFields(&message);
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Swap and test that fields are all swapped.
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  reflection_tester.SwapRepeatedsViaReflection(&message);
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TestUtil::ExpectRepeatedsSwapped(message);
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Swap back and test that fields are all back to original values.
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  reflection_tester.SwapRepeatedsViaReflection(&message);
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TestUtil::ExpectAllFieldsSet(message);
247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, SwapRepeatedElementsExtension) {
250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unittest::TestAllExtensions message;
251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TestUtil::ReflectionTester reflection_tester(
252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    unittest::TestAllExtensions::descriptor());
253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TestUtil::SetAllExtensions(&message);
255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Swap and test that fields are all swapped.
257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  reflection_tester.SwapRepeatedsViaReflection(&message);
258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TestUtil::ExpectRepeatedExtensionsSwapped(message);
259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Swap back and test that fields are all back to original values.
261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  reflection_tester.SwapRepeatedsViaReflection(&message);
262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TestUtil::ExpectAllExtensionsSet(message);
263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, Extensions) {
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Set every extension to a unique value then go back and check all those
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // values.
268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unittest::TestAllExtensions message;
269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TestUtil::ReflectionTester reflection_tester(
270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    unittest::TestAllExtensions::descriptor());
271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  reflection_tester.SetAllFieldsViaReflection(&message);
273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TestUtil::ExpectAllExtensionsSet(message);
274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  reflection_tester.ExpectAllFieldsSetViaReflection(message);
275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  reflection_tester.ModifyRepeatedFieldsViaReflection(&message);
277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  TestUtil::ExpectRepeatedExtensionsModified(message);
278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, FindExtensionTypeByNumber) {
281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Reflection* reflection =
282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    unittest::TestAllExtensions::default_instance().GetReflection();
283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldDescriptor* extension1 =
285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName(
286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "optional_int32_extension");
287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldDescriptor* extension2 =
288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName(
289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "repeated_string_extension");
290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(extension1,
292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            reflection->FindKnownExtensionByNumber(extension1->number()));
293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(extension2,
294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            reflection->FindKnownExtensionByNumber(extension2->number()));
295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Non-existent extension.
297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_TRUE(reflection->FindKnownExtensionByNumber(62341) == NULL);
298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Extensions of TestAllExtensions should not show up as extensions of
300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // other types.
301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_TRUE(unittest::TestAllTypes::default_instance().GetReflection()->
302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville              FindKnownExtensionByNumber(extension1->number()) == NULL);
303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, FindKnownExtensionByName) {
306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Reflection* reflection =
307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    unittest::TestAllExtensions::default_instance().GetReflection();
308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldDescriptor* extension1 =
310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName(
311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "optional_int32_extension");
312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldDescriptor* extension2 =
313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName(
314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "repeated_string_extension");
315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(extension1,
317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            reflection->FindKnownExtensionByName(extension1->full_name()));
318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(extension2,
319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            reflection->FindKnownExtensionByName(extension2->full_name()));
320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Non-existent extension.
322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_TRUE(reflection->FindKnownExtensionByName("no_such_ext") == NULL);
323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Extensions of TestAllExtensions should not show up as extensions of
325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // other types.
326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_TRUE(unittest::TestAllTypes::default_instance().GetReflection()->
327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville              FindKnownExtensionByName(extension1->full_name()) == NULL);
328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifdef GTEST_HAS_DEATH_TEST
331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(GeneratedMessageReflectionTest, UsageErrors) {
333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  unittest::TestAllTypes message;
334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Reflection* reflection = message.GetReflection();
335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Descriptor* descriptor = message.GetDescriptor();
336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define f(NAME) descriptor->FindFieldByName(NAME)
338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Testing every single failure mode would be too much work.  Let's just
340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // check a few.
341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_DEATH(
342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    reflection->GetInt32(
343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      message, descriptor->FindFieldByName("optional_int64")),
344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "Protocol Buffer reflection usage error:\n"
345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  Method      : google::protobuf::Reflection::GetInt32\n"
346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  Message type: protobuf_unittest\\.TestAllTypes\n"
347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  Field       : protobuf_unittest\\.TestAllTypes\\.optional_int64\n"
348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  Problem     : Field is not the right type for this message:\n"
349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    Expected  : CPPTYPE_INT32\n"
350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    Field type: CPPTYPE_INT64");
351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_DEATH(
352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    reflection->GetInt32(
353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      message, descriptor->FindFieldByName("repeated_int32")),
354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "Protocol Buffer reflection usage error:\n"
355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  Method      : google::protobuf::Reflection::GetInt32\n"
356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  Message type: protobuf_unittest.TestAllTypes\n"
357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  Field       : protobuf_unittest.TestAllTypes.repeated_int32\n"
358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  Problem     : Field is repeated; the method requires a singular field.");
359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_DEATH(
360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    reflection->GetInt32(
361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      message, unittest::ForeignMessage::descriptor()->FindFieldByName("c")),
362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "Protocol Buffer reflection usage error:\n"
363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  Method      : google::protobuf::Reflection::GetInt32\n"
364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  Message type: protobuf_unittest.TestAllTypes\n"
365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  Field       : protobuf_unittest.ForeignMessage.c\n"
366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  Problem     : Field does not match message type.");
367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_DEATH(
368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    reflection->HasField(
369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      message, unittest::ForeignMessage::descriptor()->FindFieldByName("c")),
370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "Protocol Buffer reflection usage error:\n"
371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  Method      : google::protobuf::Reflection::HasField\n"
372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  Message type: protobuf_unittest.TestAllTypes\n"
373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  Field       : protobuf_unittest.ForeignMessage.c\n"
374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  Problem     : Field does not match message type.");
375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef f
377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif  // GTEST_HAS_DEATH_TEST
380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace
383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace protobuf
384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace google
385