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#ifndef GOOGLE_PROTOBUF_TEST_UTIL_H__
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_PROTOBUF_TEST_UTIL_H__
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <stack>
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <string>
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/message.h>
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/unittest.pb.h>
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google {
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
46a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace unittest = ::protobuf_unittest;
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace unittest_import = protobuf_unittest_import;
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass TestUtil {
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Set every field in the message to a unique value.
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void SetAllFields(unittest::TestAllTypes* message);
53a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  static void SetOptionalFields(unittest::TestAllTypes* message);
54a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  static void AddRepeatedFields1(unittest::TestAllTypes* message);
55a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  static void AddRepeatedFields2(unittest::TestAllTypes* message);
56a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  static void SetDefaultFields(unittest::TestAllTypes* message);
57a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  static void SetOneofFields(unittest::TestAllTypes* message);
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void SetAllExtensions(unittest::TestAllExtensions* message);
59a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  static void SetOneofFields(unittest::TestAllExtensions* message);
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void SetAllFieldsAndExtensions(unittest::TestFieldOrderings* message);
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void SetPackedFields(unittest::TestPackedTypes* message);
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void SetPackedExtensions(unittest::TestPackedExtensions* message);
63d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  static void SetUnpackedFields(unittest::TestUnpackedTypes* message);
64a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  static void SetOneof1(unittest::TestOneof2* message);
65a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  static void SetOneof2(unittest::TestOneof2* message);
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Use the repeated versions of the set_*() accessors to modify all the
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // repeated fields of the messsage (which should already have been
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // initialized with Set*Fields()).  Set*Fields() itself only tests
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // the add_*() accessors.
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void ModifyRepeatedFields(unittest::TestAllTypes* message);
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void ModifyRepeatedExtensions(unittest::TestAllExtensions* message);
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void ModifyPackedFields(unittest::TestPackedTypes* message);
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void ModifyPackedExtensions(unittest::TestPackedExtensions* message);
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Check that all fields have the values that they should have after
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Set*Fields() is called.
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void ExpectAllFieldsSet(const unittest::TestAllTypes& message);
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void ExpectAllExtensionsSet(
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const unittest::TestAllExtensions& message);
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void ExpectPackedFieldsSet(const unittest::TestPackedTypes& message);
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void ExpectPackedExtensionsSet(
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const unittest::TestPackedExtensions& message);
84d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  static void ExpectUnpackedFieldsSet(
85d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      const unittest::TestUnpackedTypes& message);
86a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  static void ExpectUnpackedExtensionsSet(
87a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      const unittest::TestUnpackedExtensions& message);
88a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  static void ExpectOneofSet1(const unittest::TestOneof2& message);
89a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  static void ExpectOneofSet2(const unittest::TestOneof2& message);
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Expect that the message is modified as would be expected from
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Modify*Fields().
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void ExpectRepeatedFieldsModified(
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const unittest::TestAllTypes& message);
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void ExpectRepeatedExtensionsModified(
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const unittest::TestAllExtensions& message);
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void ExpectPackedFieldsModified(
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const unittest::TestPackedTypes& message);
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void ExpectPackedExtensionsModified(
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const unittest::TestPackedExtensions& message);
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Check that all fields have their default values.
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void ExpectClear(const unittest::TestAllTypes& message);
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void ExpectExtensionsClear(const unittest::TestAllExtensions& message);
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void ExpectPackedClear(const unittest::TestPackedTypes& message);
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void ExpectPackedExtensionsClear(
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const unittest::TestPackedExtensions& message);
108a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  static void ExpectOneofClear(const unittest::TestOneof2& message);
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Check that the passed-in serialization is the canonical serialization we
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // expect for a TestFieldOrderings message filled in by
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // SetAllFieldsAndExtensions().
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void ExpectAllFieldsAndExtensionsInOrder(const string& serialized);
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Check that all repeated fields have had their last elements removed.
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void ExpectLastRepeatedsRemoved(
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const unittest::TestAllTypes& message);
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void ExpectLastRepeatedExtensionsRemoved(
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const unittest::TestAllExtensions& message);
120a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  static void ExpectLastRepeatedsReleased(
121a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      const unittest::TestAllTypes& message);
122a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  static void ExpectLastRepeatedExtensionsReleased(
123a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      const unittest::TestAllExtensions& message);
124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Check that all repeated fields have had their first and last elements
126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // swapped.
127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void ExpectRepeatedsSwapped(const unittest::TestAllTypes& message);
128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void ExpectRepeatedExtensionsSwapped(
129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      const unittest::TestAllExtensions& message);
130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
131a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  static void ExpectAtMostOneFieldSetInOneof(
132a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      const unittest::TestOneof2 &message);
133a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Like above, but use the reflection interface.
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  class ReflectionTester {
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   public:
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // base_descriptor must be a descriptor for TestAllTypes or
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // TestAllExtensions.  In the former case, ReflectionTester fetches from
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // it the FieldDescriptors needed to use the reflection interface.  In
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // the latter case, ReflectionTester searches for extension fields in
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // its file.
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    explicit ReflectionTester(const Descriptor* base_descriptor);
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void SetAllFieldsViaReflection(Message* message);
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void ModifyRepeatedFieldsViaReflection(Message* message);
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void ExpectAllFieldsSetViaReflection(const Message& message);
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void ExpectClearViaReflection(const Message& message);
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void SetPackedFieldsViaReflection(Message* message);
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void ModifyPackedFieldsViaReflection(Message* message);
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void ExpectPackedFieldsSetViaReflection(const Message& message);
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void ExpectPackedClearViaReflection(const Message& message);
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void RemoveLastRepeatedsViaReflection(Message* message);
155a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    void ReleaseLastRepeatedsViaReflection(
156a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        Message* message, bool expect_extensions_notnull);
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void SwapRepeatedsViaReflection(Message* message);
158a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    void SetAllocatedOptionalMessageFieldsToNullViaReflection(
159a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        Message* message);
160a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    static void SetAllocatedOptionalMessageFieldsToMessageViaReflection(
161a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        Message* from_message,
162a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        Message* to_message);
163a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
164a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    enum MessageReleaseState {
165a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      IS_NULL,
166a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      CAN_BE_NULL,
167a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      NOT_NULL,
168a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    };
169a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    void ExpectMessagesReleasedViaReflection(
170a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        Message* message, MessageReleaseState expected_release_state);
171a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
172a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // Set and check functions for TestOneof2 messages. No need to construct
173a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // the ReflectionTester by TestAllTypes nor TestAllExtensions.
174a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    static void SetOneofViaReflection(Message* message);
175a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    static void ExpectOneofSetViaReflection(const Message& message);
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   private:
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const FieldDescriptor* F(const string& name);
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const Descriptor* base_descriptor_;
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const FieldDescriptor* group_a_;
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const FieldDescriptor* repeated_group_a_;
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const FieldDescriptor* nested_b_;
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const FieldDescriptor* foreign_c_;
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const FieldDescriptor* import_d_;
187a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const FieldDescriptor* import_e_;
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const EnumValueDescriptor* nested_foo_;
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const EnumValueDescriptor* nested_bar_;
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const EnumValueDescriptor* nested_baz_;
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const EnumValueDescriptor* foreign_foo_;
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const EnumValueDescriptor* foreign_bar_;
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const EnumValueDescriptor* foreign_baz_;
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const EnumValueDescriptor* import_foo_;
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const EnumValueDescriptor* import_bar_;
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    const EnumValueDescriptor* import_baz_;
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // We have to split this into three function otherwise it creates a stack
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // frame so large that it triggers a warning.
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void ExpectAllFieldsSetViaReflection1(const Message& message);
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void ExpectAllFieldsSetViaReflection2(const Message& message);
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    void ExpectAllFieldsSetViaReflection3(const Message& message);
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ReflectionTester);
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  };
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TestUtil);
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace protobuf
213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace google
215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif  // GOOGLE_PROTOBUF_TEST_UTIL_H__
216