blob: dd397619bab66ddcc94c4409e91b8c3bb9b7597e [file] [log] [blame]
Brian Silverman9c614bc2016-02-15 20:20:02 -05001// Protocol Buffers - Google's data interchange format
2// Copyright 2008 Google Inc. All rights reserved.
3// https://developers.google.com/protocol-buffers/
4//
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions are
7// met:
8//
9// * Redistributions of source code must retain the above copyright
10// notice, this list of conditions and the following disclaimer.
11// * Redistributions in binary form must reproduce the above
12// copyright notice, this list of conditions and the following disclaimer
13// in the documentation and/or other materials provided with the
14// distribution.
15// * Neither the name of Google Inc. nor the names of its
16// contributors may be used to endorse or promote products derived from
17// this software without specific prior written permission.
18//
19// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31#ifndef GOOGLE_PROTOBUF_MAP_TEST_UTIL_H__
32#define GOOGLE_PROTOBUF_MAP_TEST_UTIL_H__
33
34#include <google/protobuf/map_unittest.pb.h>
35
36namespace google {
37namespace protobuf {
38
39namespace unittest = ::protobuf_unittest;
40
41class MapTestUtil {
42 public:
43 // Set every field in the TestMap message to a unique value.
44 static void SetMapFields(unittest::TestMap* message);
45
46 // Set every field in the TestArenaMap message to a unique value.
47 static void SetArenaMapFields(unittest::TestArenaMap* message);
48
49 // Set every field in the message to a default value.
50 static void SetMapFieldsInitialized(unittest::TestMap* message);
51
52 // Modify all the map fields of the message (which should already have been
53 // initialized with SetMapFields()).
54 static void ModifyMapFields(unittest::TestMap* message);
55
56 // Check that all fields have the values that they should have after
57 // SetMapFields() is called.
58 static void ExpectMapFieldsSet(const unittest::TestMap& message);
59
60 // Check that all fields have the values that they should have after
61 // SetMapFields() is called for TestArenaMap.
62 static void ExpectArenaMapFieldsSet(const unittest::TestArenaMap& message);
63
64 // Check that all fields have the values that they should have after
65 // SetMapFieldsInitialized() is called.
66 static void ExpectMapFieldsSetInitialized(
67 const unittest::TestMap& message);
68
69 // Expect that the message is modified as would be expected from
70 // ModifyMapFields().
71 static void ExpectMapFieldsModified(const unittest::TestMap& message);
72
73 // Check that all fields are empty.
74 static void ExpectClear(const unittest::TestMap& message);
75
76 // Check that all map fields have the given size.
77 static void ExpectMapsSize(const unittest::TestMap& message, int size);
78
79 // Get pointers of map entries at given index.
80 static std::vector<const Message*> GetMapEntries(
81 const unittest::TestMap& message, int index);
82
83 // Get pointers of map entries from release.
84 static std::vector<const Message*> GetMapEntriesFromRelease(
85 unittest::TestMap* message);
86};
87
88// Like above, but use the reflection interface.
89class MapReflectionTester {
90 public:
91 // base_descriptor must be a descriptor for TestMap, which is used for
92 // MapReflectionTester to fetch the FieldDescriptors needed to use the
93 // reflection interface.
94 explicit MapReflectionTester(const Descriptor* base_descriptor);
95
96 void SetMapFieldsViaReflection(Message* message);
97 void SetMapFieldsViaMapReflection(Message* message);
98 void ClearMapFieldsViaReflection(Message* message);
99 void ModifyMapFieldsViaReflection(Message* message);
100 void RemoveLastMapsViaReflection(Message* message);
101 void ReleaseLastMapsViaReflection(Message* message);
102 void SwapMapsViaReflection(Message* message);
103 void MutableUnknownFieldsOfMapFieldsViaReflection(Message* message);
104 void ExpectMapFieldsSetViaReflection(const Message& message);
105 void ExpectMapFieldsSetViaReflectionIterator(Message* message);
106 void ExpectClearViaReflection(const Message& message);
107 void ExpectClearViaReflectionIterator(Message* message);
108 void ExpectMapEntryClearViaReflection(Message* message);
Austin Schuh40c16522018-10-28 20:27:54 -0700109 void GetMapValueViaMapReflection(Message* message,
110 const string& field_name,
111 const MapKey& map_key, MapValueRef* map_val);
112 Message* GetMapEntryViaReflection(Message* message, const string& field_name,
113 int index);
114 MapIterator MapBegin(Message* message, const string& field_name);
115 MapIterator MapEnd(Message* message, const string& field_name);
Brian Silverman9c614bc2016-02-15 20:20:02 -0500116
117 private:
118 const FieldDescriptor* F(const string& name);
119
120 const Descriptor* base_descriptor_;
121
122 const EnumValueDescriptor* map_enum_bar_;
123 const EnumValueDescriptor* map_enum_baz_;
124 const EnumValueDescriptor* map_enum_foo_;
125
126 const FieldDescriptor* foreign_c_;
127 const FieldDescriptor* map_int32_int32_key_;
128 const FieldDescriptor* map_int32_int32_val_;
129 const FieldDescriptor* map_int64_int64_key_;
130 const FieldDescriptor* map_int64_int64_val_;
131 const FieldDescriptor* map_uint32_uint32_key_;
132 const FieldDescriptor* map_uint32_uint32_val_;
133 const FieldDescriptor* map_uint64_uint64_key_;
134 const FieldDescriptor* map_uint64_uint64_val_;
135 const FieldDescriptor* map_sint32_sint32_key_;
136 const FieldDescriptor* map_sint32_sint32_val_;
137 const FieldDescriptor* map_sint64_sint64_key_;
138 const FieldDescriptor* map_sint64_sint64_val_;
139 const FieldDescriptor* map_fixed32_fixed32_key_;
140 const FieldDescriptor* map_fixed32_fixed32_val_;
141 const FieldDescriptor* map_fixed64_fixed64_key_;
142 const FieldDescriptor* map_fixed64_fixed64_val_;
143 const FieldDescriptor* map_sfixed32_sfixed32_key_;
144 const FieldDescriptor* map_sfixed32_sfixed32_val_;
145 const FieldDescriptor* map_sfixed64_sfixed64_key_;
146 const FieldDescriptor* map_sfixed64_sfixed64_val_;
147 const FieldDescriptor* map_int32_float_key_;
148 const FieldDescriptor* map_int32_float_val_;
149 const FieldDescriptor* map_int32_double_key_;
150 const FieldDescriptor* map_int32_double_val_;
151 const FieldDescriptor* map_bool_bool_key_;
152 const FieldDescriptor* map_bool_bool_val_;
153 const FieldDescriptor* map_string_string_key_;
154 const FieldDescriptor* map_string_string_val_;
155 const FieldDescriptor* map_int32_bytes_key_;
156 const FieldDescriptor* map_int32_bytes_val_;
157 const FieldDescriptor* map_int32_enum_key_;
158 const FieldDescriptor* map_int32_enum_val_;
159 const FieldDescriptor* map_int32_foreign_message_key_;
160 const FieldDescriptor* map_int32_foreign_message_val_;
161};
162
163} // namespace protobuf
164
165} // namespace google
166#endif // GOOGLE_PROTOBUF_MAP_TEST_UTIL_H__