OLD | NEW |
1 // Protocol Buffers - Google's data interchange format | 1 // Protocol Buffers - Google's data interchange format |
2 // Copyright 2008 Google Inc. All rights reserved. | 2 // Copyright 2008 Google Inc. All rights reserved. |
3 // https://developers.google.com/protocol-buffers/ | 3 // https://developers.google.com/protocol-buffers/ |
4 // | 4 // |
5 // Redistribution and use in source and binary forms, with or without | 5 // Redistribution and use in source and binary forms, with or without |
6 // modification, are permitted provided that the following conditions are | 6 // modification, are permitted provided that the following conditions are |
7 // met: | 7 // met: |
8 // | 8 // |
9 // * Redistributions of source code must retain the above copyright | 9 // * Redistributions of source code must retain the above copyright |
10 // notice, this list of conditions and the following disclaimer. | 10 // notice, this list of conditions and the following disclaimer. |
(...skipping 13 matching lines...) Expand all Loading... |
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 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. | 29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
30 | 30 |
31 package com.google.protobuf; | 31 package com.google.protobuf; |
32 | 32 |
33 import com.google.protobuf.Descriptors.FieldDescriptor; | 33 import com.google.protobuf.Descriptors.FieldDescriptor; |
34 import map_test.MapForProto2TestProto.BizarroTestMap; | |
35 import map_test.MapForProto2TestProto.ReservedAsMapField; | |
36 import map_test.MapForProto2TestProto.ReservedAsMapFieldWithEnumValue; | |
37 import map_test.MapForProto2TestProto.TestMap; | 34 import map_test.MapForProto2TestProto.TestMap; |
38 import map_test.MapForProto2TestProto.TestMap.MessageValue; | 35 import map_test.MapForProto2TestProto.TestMap.MessageValue; |
39 import map_test.MapForProto2TestProto.TestMap.MessageWithRequiredFields; | 36 import map_test.MapForProto2TestProto.TestMap.MessageWithRequiredFields; |
40 import map_test.MapForProto2TestProto.TestMapOrBuilder; | |
41 import map_test.MapForProto2TestProto.TestRecursiveMap; | 37 import map_test.MapForProto2TestProto.TestRecursiveMap; |
42 import map_test.MapForProto2TestProto.TestUnknownEnumValue; | 38 import map_test.MapForProto2TestProto.TestUnknownEnumValue; |
43 import java.io.ByteArrayOutputStream; | 39 import junit.framework.TestCase; |
44 import java.io.IOException; | 40 |
45 import java.util.ArrayList; | 41 import java.util.ArrayList; |
46 import java.util.Arrays; | 42 import java.util.Arrays; |
47 import java.util.HashMap; | 43 import java.util.HashMap; |
48 import java.util.List; | 44 import java.util.List; |
49 import java.util.Map; | 45 import java.util.Map; |
50 import junit.framework.TestCase; | |
51 | 46 |
52 /** | 47 /** |
53 * Unit tests for map fields in proto2 protos. | 48 * Unit tests for map fields in proto2 protos. |
54 */ | 49 */ |
55 public class MapForProto2Test extends TestCase { | 50 public class MapForProto2Test extends TestCase { |
56 | 51 private void setMapValues(TestMap.Builder builder) { |
57 private void setMapValuesUsingMutableMap(TestMap.Builder builder) { | |
58 builder.getMutableInt32ToInt32Field().put(1, 11); | 52 builder.getMutableInt32ToInt32Field().put(1, 11); |
59 builder.getMutableInt32ToInt32Field().put(2, 22); | 53 builder.getMutableInt32ToInt32Field().put(2, 22); |
60 builder.getMutableInt32ToInt32Field().put(3, 33); | 54 builder.getMutableInt32ToInt32Field().put(3, 33); |
61 // | 55 |
62 builder.getMutableInt32ToStringField().put(1, "11"); | 56 builder.getMutableInt32ToStringField().put(1, "11"); |
63 builder.getMutableInt32ToStringField().put(2, "22"); | 57 builder.getMutableInt32ToStringField().put(2, "22"); |
64 builder.getMutableInt32ToStringField().put(3, "33"); | 58 builder.getMutableInt32ToStringField().put(3, "33"); |
65 // | 59 |
66 builder.getMutableInt32ToBytesField().put(1, TestUtil.toBytes("11")); | 60 builder.getMutableInt32ToBytesField().put(1, TestUtil.toBytes("11")); |
67 builder.getMutableInt32ToBytesField().put(2, TestUtil.toBytes("22")); | 61 builder.getMutableInt32ToBytesField().put(2, TestUtil.toBytes("22")); |
68 builder.getMutableInt32ToBytesField().put(3, TestUtil.toBytes("33")); | 62 builder.getMutableInt32ToBytesField().put(3, TestUtil.toBytes("33")); |
69 // | 63 |
70 builder.getMutableInt32ToEnumField().put(1, TestMap.EnumValue.FOO); | 64 builder.getMutableInt32ToEnumField().put(1, TestMap.EnumValue.FOO); |
71 builder.getMutableInt32ToEnumField().put(2, TestMap.EnumValue.BAR); | 65 builder.getMutableInt32ToEnumField().put(2, TestMap.EnumValue.BAR); |
72 builder.getMutableInt32ToEnumField().put(3, TestMap.EnumValue.BAZ); | 66 builder.getMutableInt32ToEnumField().put(3, TestMap.EnumValue.BAZ); |
73 // | 67 |
74 builder.getMutableInt32ToMessageField().put( | 68 builder.getMutableInt32ToMessageField().put( |
75 1, MessageValue.newBuilder().setValue(11).build()); | 69 1, MessageValue.newBuilder().setValue(11).build()); |
76 builder.getMutableInt32ToMessageField().put( | 70 builder.getMutableInt32ToMessageField().put( |
77 2, MessageValue.newBuilder().setValue(22).build()); | 71 2, MessageValue.newBuilder().setValue(22).build()); |
78 builder.getMutableInt32ToMessageField().put( | 72 builder.getMutableInt32ToMessageField().put( |
79 3, MessageValue.newBuilder().setValue(33).build()); | 73 3, MessageValue.newBuilder().setValue(33).build()); |
80 // | 74 |
81 builder.getMutableStringToInt32Field().put("1", 11); | 75 builder.getMutableStringToInt32Field().put("1", 11); |
82 builder.getMutableStringToInt32Field().put("2", 22); | 76 builder.getMutableStringToInt32Field().put("2", 22); |
83 builder.getMutableStringToInt32Field().put("3", 33); | 77 builder.getMutableStringToInt32Field().put("3", 33); |
84 } | 78 } |
85 | 79 |
86 private void setMapValuesUsingAccessors(TestMap.Builder builder) { | |
87 builder | |
88 .putInt32ToInt32Field(1, 11) | |
89 .putInt32ToInt32Field(2, 22) | |
90 .putInt32ToInt32Field(3, 33) | |
91 | |
92 .putInt32ToStringField(1, "11") | |
93 .putInt32ToStringField(2, "22") | |
94 .putInt32ToStringField(3, "33") | |
95 | |
96 .putInt32ToBytesField(1, TestUtil.toBytes("11")) | |
97 .putInt32ToBytesField(2, TestUtil.toBytes("22")) | |
98 .putInt32ToBytesField(3, TestUtil.toBytes("33")) | |
99 | |
100 .putInt32ToEnumField(1, TestMap.EnumValue.FOO) | |
101 .putInt32ToEnumField(2, TestMap.EnumValue.BAR) | |
102 .putInt32ToEnumField(3, TestMap.EnumValue.BAZ) | |
103 | |
104 .putInt32ToMessageField(1, MessageValue.newBuilder().setValue(11).build(
)) | |
105 .putInt32ToMessageField(2, MessageValue.newBuilder().setValue(22).build(
)) | |
106 .putInt32ToMessageField(3, MessageValue.newBuilder().setValue(33).build(
)) | |
107 | |
108 .putStringToInt32Field("1", 11) | |
109 .putStringToInt32Field("2", 22) | |
110 .putStringToInt32Field("3", 33); | |
111 } | |
112 | |
113 public void testSetMapValues() { | |
114 TestMap.Builder usingMutableMapBuilder = TestMap.newBuilder(); | |
115 setMapValuesUsingMutableMap(usingMutableMapBuilder); | |
116 TestMap usingMutableMap = usingMutableMapBuilder.build(); | |
117 assertMapValuesSet(usingMutableMap); | |
118 | |
119 TestMap.Builder usingAccessorsBuilder = TestMap.newBuilder(); | |
120 setMapValuesUsingAccessors(usingAccessorsBuilder); | |
121 TestMap usingAccessors = usingAccessorsBuilder.build(); | |
122 assertMapValuesSet(usingAccessors); | |
123 | |
124 assertEquals(usingAccessors, usingMutableMap); | |
125 } | |
126 | |
127 private void copyMapValues(TestMap source, TestMap.Builder destination) { | 80 private void copyMapValues(TestMap source, TestMap.Builder destination) { |
128 destination | 81 destination |
129 .putAllInt32ToInt32Field(source.getInt32ToInt32Field()) | 82 .putAllInt32ToInt32Field(source.getInt32ToInt32Field()) |
130 .putAllInt32ToStringField(source.getInt32ToStringField()) | 83 .putAllInt32ToStringField(source.getInt32ToStringField()) |
131 .putAllInt32ToBytesField(source.getInt32ToBytesField()) | 84 .putAllInt32ToBytesField(source.getInt32ToBytesField()) |
132 .putAllInt32ToEnumField(source.getInt32ToEnumField()) | 85 .putAllInt32ToEnumField(source.getInt32ToEnumField()) |
133 .putAllInt32ToMessageField(source.getInt32ToMessageField()) | 86 .putAllInt32ToMessageField(source.getInt32ToMessageField()) |
134 .putAllStringToInt32Field(source.getStringToInt32Field()); | 87 .putAllStringToInt32Field(source.getStringToInt32Field()); |
135 } | 88 } |
136 | 89 |
137 private void assertMapValuesSet(TestMapOrBuilder message) { | 90 private void assertMapValuesSet(TestMap message) { |
138 assertEquals(3, message.getInt32ToInt32Field().size()); | 91 assertEquals(3, message.getInt32ToInt32Field().size()); |
139 assertEquals(11, message.getInt32ToInt32Field().get(1).intValue()); | 92 assertEquals(11, message.getInt32ToInt32Field().get(1).intValue()); |
140 assertEquals(22, message.getInt32ToInt32Field().get(2).intValue()); | 93 assertEquals(22, message.getInt32ToInt32Field().get(2).intValue()); |
141 assertEquals(33, message.getInt32ToInt32Field().get(3).intValue()); | 94 assertEquals(33, message.getInt32ToInt32Field().get(3).intValue()); |
142 | 95 |
143 assertEquals(3, message.getInt32ToStringField().size()); | 96 assertEquals(3, message.getInt32ToStringField().size()); |
144 assertEquals("11", message.getInt32ToStringField().get(1)); | 97 assertEquals("11", message.getInt32ToStringField().get(1)); |
145 assertEquals("22", message.getInt32ToStringField().get(2)); | 98 assertEquals("22", message.getInt32ToStringField().get(2)); |
146 assertEquals("33", message.getInt32ToStringField().get(3)); | 99 assertEquals("33", message.getInt32ToStringField().get(3)); |
147 | 100 |
148 assertEquals(3, message.getInt32ToBytesField().size()); | 101 assertEquals(3, message.getInt32ToBytesField().size()); |
149 assertEquals(TestUtil.toBytes("11"), message.getInt32ToBytesField().get(1)); | 102 assertEquals(TestUtil.toBytes("11"), message.getInt32ToBytesField().get(1)); |
150 assertEquals(TestUtil.toBytes("22"), message.getInt32ToBytesField().get(2)); | 103 assertEquals(TestUtil.toBytes("22"), message.getInt32ToBytesField().get(2)); |
151 assertEquals(TestUtil.toBytes("33"), message.getInt32ToBytesField().get(3)); | 104 assertEquals(TestUtil.toBytes("33"), message.getInt32ToBytesField().get(3)); |
152 | 105 |
153 assertEquals(3, message.getInt32ToEnumField().size()); | 106 assertEquals(3, message.getInt32ToEnumField().size()); |
154 assertEquals(TestMap.EnumValue.FOO, message.getInt32ToEnumField().get(1)); | 107 assertEquals(TestMap.EnumValue.FOO, message.getInt32ToEnumField().get(1)); |
155 assertEquals(TestMap.EnumValue.BAR, message.getInt32ToEnumField().get(2)); | 108 assertEquals(TestMap.EnumValue.BAR, message.getInt32ToEnumField().get(2)); |
156 assertEquals(TestMap.EnumValue.BAZ, message.getInt32ToEnumField().get(3)); | 109 assertEquals(TestMap.EnumValue.BAZ, message.getInt32ToEnumField().get(3)); |
157 | 110 |
158 assertEquals(3, message.getInt32ToMessageField().size()); | 111 assertEquals(3, message.getInt32ToMessageField().size()); |
159 assertEquals(11, message.getInt32ToMessageField().get(1).getValue()); | 112 assertEquals(11, message.getInt32ToMessageField().get(1).getValue()); |
160 assertEquals(22, message.getInt32ToMessageField().get(2).getValue()); | 113 assertEquals(22, message.getInt32ToMessageField().get(2).getValue()); |
161 assertEquals(33, message.getInt32ToMessageField().get(3).getValue()); | 114 assertEquals(33, message.getInt32ToMessageField().get(3).getValue()); |
162 | 115 |
163 assertEquals(3, message.getStringToInt32Field().size()); | 116 assertEquals(3, message.getStringToInt32Field().size()); |
164 assertEquals(11, message.getStringToInt32Field().get("1").intValue()); | 117 assertEquals(11, message.getStringToInt32Field().get("1").intValue()); |
165 assertEquals(22, message.getStringToInt32Field().get("2").intValue()); | 118 assertEquals(22, message.getStringToInt32Field().get("2").intValue()); |
166 assertEquals(33, message.getStringToInt32Field().get("3").intValue()); | 119 assertEquals(33, message.getStringToInt32Field().get("3").intValue()); |
167 } | 120 } |
168 | 121 |
169 private void updateMapValuesUsingMutableMap(TestMap.Builder builder) { | 122 private void updateMapValues(TestMap.Builder builder) { |
170 builder.getMutableInt32ToInt32Field().put(1, 111); | 123 builder.getMutableInt32ToInt32Field().put(1, 111); |
171 builder.getMutableInt32ToInt32Field().remove(2); | 124 builder.getMutableInt32ToInt32Field().remove(2); |
172 builder.getMutableInt32ToInt32Field().put(4, 44); | 125 builder.getMutableInt32ToInt32Field().put(4, 44); |
173 // | 126 |
174 builder.getMutableInt32ToStringField().put(1, "111"); | 127 builder.getMutableInt32ToStringField().put(1, "111"); |
175 builder.getMutableInt32ToStringField().remove(2); | 128 builder.getMutableInt32ToStringField().remove(2); |
176 builder.getMutableInt32ToStringField().put(4, "44"); | 129 builder.getMutableInt32ToStringField().put(4, "44"); |
177 // | 130 |
178 builder.getMutableInt32ToBytesField().put(1, TestUtil.toBytes("111")); | 131 builder.getMutableInt32ToBytesField().put(1, TestUtil.toBytes("111")); |
179 builder.getMutableInt32ToBytesField().remove(2); | 132 builder.getMutableInt32ToBytesField().remove(2); |
180 builder.getMutableInt32ToBytesField().put(4, TestUtil.toBytes("44")); | 133 builder.getMutableInt32ToBytesField().put(4, TestUtil.toBytes("44")); |
181 // | 134 |
182 builder.getMutableInt32ToEnumField().put(1, TestMap.EnumValue.BAR); | 135 builder.getMutableInt32ToEnumField().put(1, TestMap.EnumValue.BAR); |
183 builder.getMutableInt32ToEnumField().remove(2); | 136 builder.getMutableInt32ToEnumField().remove(2); |
184 builder.getMutableInt32ToEnumField().put(4, TestMap.EnumValue.QUX); | 137 builder.getMutableInt32ToEnumField().put(4, TestMap.EnumValue.QUX); |
185 // | 138 |
186 builder.getMutableInt32ToMessageField().put( | 139 builder.getMutableInt32ToMessageField().put( |
187 1, MessageValue.newBuilder().setValue(111).build()); | 140 1, MessageValue.newBuilder().setValue(111).build()); |
188 builder.getMutableInt32ToMessageField().remove(2); | 141 builder.getMutableInt32ToMessageField().remove(2); |
189 builder.getMutableInt32ToMessageField().put( | 142 builder.getMutableInt32ToMessageField().put( |
190 4, MessageValue.newBuilder().setValue(44).build()); | 143 4, MessageValue.newBuilder().setValue(44).build()); |
191 // | 144 |
192 builder.getMutableStringToInt32Field().put("1", 111); | 145 builder.getMutableStringToInt32Field().put("1", 111); |
193 builder.getMutableStringToInt32Field().remove("2"); | 146 builder.getMutableStringToInt32Field().remove("2"); |
194 builder.getMutableStringToInt32Field().put("4", 44); | 147 builder.getMutableStringToInt32Field().put("4", 44); |
195 } | 148 } |
196 | 149 |
197 private void updateMapValuesUsingAccessors(TestMap.Builder builder) { | |
198 builder | |
199 .putInt32ToInt32Field(1, 111) | |
200 .removeInt32ToInt32Field(2) | |
201 .putInt32ToInt32Field(4, 44) | |
202 | |
203 .putInt32ToStringField(1, "111") | |
204 .removeInt32ToStringField(2) | |
205 .putInt32ToStringField(4, "44") | |
206 | |
207 .putInt32ToBytesField(1, TestUtil.toBytes("111")) | |
208 .removeInt32ToBytesField(2) | |
209 .putInt32ToBytesField(4, TestUtil.toBytes("44")) | |
210 | |
211 .putInt32ToEnumField(1, TestMap.EnumValue.BAR) | |
212 .removeInt32ToEnumField(2) | |
213 .putInt32ToEnumField(4, TestMap.EnumValue.QUX) | |
214 | |
215 .putInt32ToMessageField(1, MessageValue.newBuilder().setValue(111).build
()) | |
216 .removeInt32ToMessageField(2) | |
217 .putInt32ToMessageField(4, MessageValue.newBuilder().setValue(44).build(
)) | |
218 | |
219 .putStringToInt32Field("1", 111) | |
220 .removeStringToInt32Field("2") | |
221 .putStringToInt32Field("4", 44); | |
222 } | |
223 | |
224 public void testUpdateMapValues() { | |
225 TestMap.Builder usingMutableMapBuilder = TestMap.newBuilder(); | |
226 setMapValuesUsingMutableMap(usingMutableMapBuilder); | |
227 TestMap usingMutableMap = usingMutableMapBuilder.build(); | |
228 assertMapValuesSet(usingMutableMap); | |
229 | |
230 TestMap.Builder usingAccessorsBuilder = TestMap.newBuilder(); | |
231 setMapValuesUsingAccessors(usingAccessorsBuilder); | |
232 TestMap usingAccessors = usingAccessorsBuilder.build(); | |
233 assertMapValuesSet(usingAccessors); | |
234 | |
235 assertEquals(usingAccessors, usingMutableMap); | |
236 // | |
237 usingMutableMapBuilder = usingMutableMap.toBuilder(); | |
238 updateMapValuesUsingMutableMap(usingMutableMapBuilder); | |
239 usingMutableMap = usingMutableMapBuilder.build(); | |
240 assertMapValuesUpdated(usingMutableMap); | |
241 | |
242 usingAccessorsBuilder = usingAccessors.toBuilder(); | |
243 updateMapValuesUsingAccessors(usingAccessorsBuilder); | |
244 usingAccessors = usingAccessorsBuilder.build(); | |
245 assertMapValuesUpdated(usingAccessors); | |
246 | |
247 assertEquals(usingAccessors, usingMutableMap); | |
248 } | |
249 | |
250 private void assertMapValuesUpdated(TestMap message) { | 150 private void assertMapValuesUpdated(TestMap message) { |
251 assertEquals(3, message.getInt32ToInt32Field().size()); | 151 assertEquals(3, message.getInt32ToInt32Field().size()); |
252 assertEquals(111, message.getInt32ToInt32Field().get(1).intValue()); | 152 assertEquals(111, message.getInt32ToInt32Field().get(1).intValue()); |
253 assertEquals(33, message.getInt32ToInt32Field().get(3).intValue()); | 153 assertEquals(33, message.getInt32ToInt32Field().get(3).intValue()); |
254 assertEquals(44, message.getInt32ToInt32Field().get(4).intValue()); | 154 assertEquals(44, message.getInt32ToInt32Field().get(4).intValue()); |
255 | 155 |
256 assertEquals(3, message.getInt32ToStringField().size()); | 156 assertEquals(3, message.getInt32ToStringField().size()); |
257 assertEquals("111", message.getInt32ToStringField().get(1)); | 157 assertEquals("111", message.getInt32ToStringField().get(1)); |
258 assertEquals("33", message.getInt32ToStringField().get(3)); | 158 assertEquals("33", message.getInt32ToStringField().get(3)); |
259 assertEquals("44", message.getInt32ToStringField().get(4)); | 159 assertEquals("44", message.getInt32ToStringField().get(4)); |
260 | 160 |
261 assertEquals(3, message.getInt32ToBytesField().size()); | 161 assertEquals(3, message.getInt32ToBytesField().size()); |
262 assertEquals(TestUtil.toBytes("111"), message.getInt32ToBytesField().get(1))
; | 162 assertEquals(TestUtil.toBytes("111"), message.getInt32ToBytesField().get(1))
; |
263 assertEquals(TestUtil.toBytes("33"), message.getInt32ToBytesField().get(3)); | 163 assertEquals(TestUtil.toBytes("33"), message.getInt32ToBytesField().get(3)); |
264 assertEquals(TestUtil.toBytes("44"), message.getInt32ToBytesField().get(4)); | 164 assertEquals(TestUtil.toBytes("44"), message.getInt32ToBytesField().get(4)); |
265 | 165 |
266 assertEquals(3, message.getInt32ToEnumField().size()); | 166 assertEquals(3, message.getInt32ToEnumField().size()); |
267 assertEquals(TestMap.EnumValue.BAR, message.getInt32ToEnumField().get(1)); | 167 assertEquals(TestMap.EnumValue.BAR, message.getInt32ToEnumField().get(1)); |
268 assertEquals(TestMap.EnumValue.BAZ, message.getInt32ToEnumField().get(3)); | 168 assertEquals(TestMap.EnumValue.BAZ, message.getInt32ToEnumField().get(3)); |
269 assertEquals(TestMap.EnumValue.QUX, message.getInt32ToEnumField().get(4)); | 169 assertEquals(TestMap.EnumValue.QUX, message.getInt32ToEnumField().get(4)); |
270 | 170 |
271 assertEquals(3, message.getInt32ToMessageField().size()); | 171 assertEquals(3, message.getInt32ToMessageField().size()); |
272 assertEquals(111, message.getInt32ToMessageField().get(1).getValue()); | 172 assertEquals(111, message.getInt32ToMessageField().get(1).getValue()); |
273 assertEquals(33, message.getInt32ToMessageField().get(3).getValue()); | 173 assertEquals(33, message.getInt32ToMessageField().get(3).getValue()); |
274 assertEquals(44, message.getInt32ToMessageField().get(4).getValue()); | 174 assertEquals(44, message.getInt32ToMessageField().get(4).getValue()); |
275 | 175 |
276 assertEquals(3, message.getStringToInt32Field().size()); | 176 assertEquals(3, message.getStringToInt32Field().size()); |
277 assertEquals(111, message.getStringToInt32Field().get("1").intValue()); | 177 assertEquals(111, message.getStringToInt32Field().get("1").intValue()); |
278 assertEquals(33, message.getStringToInt32Field().get("3").intValue()); | 178 assertEquals(33, message.getStringToInt32Field().get("3").intValue()); |
279 assertEquals(44, message.getStringToInt32Field().get("4").intValue()); | 179 assertEquals(44, message.getStringToInt32Field().get("4").intValue()); |
280 } | 180 } |
281 | 181 |
282 private void assertMapValuesCleared(TestMapOrBuilder testMapOrBuilder) { | 182 private void assertMapValuesCleared(TestMap message) { |
283 assertEquals(0, testMapOrBuilder.getInt32ToInt32Field().size()); | 183 assertEquals(0, message.getInt32ToInt32Field().size()); |
284 assertEquals(0, testMapOrBuilder.getInt32ToInt32FieldCount()); | 184 assertEquals(0, message.getInt32ToStringField().size()); |
285 assertEquals(0, testMapOrBuilder.getInt32ToStringField().size()); | 185 assertEquals(0, message.getInt32ToBytesField().size()); |
286 assertEquals(0, testMapOrBuilder.getInt32ToStringFieldCount()); | 186 assertEquals(0, message.getInt32ToEnumField().size()); |
287 assertEquals(0, testMapOrBuilder.getInt32ToBytesField().size()); | 187 assertEquals(0, message.getInt32ToMessageField().size()); |
288 assertEquals(0, testMapOrBuilder.getInt32ToBytesFieldCount()); | 188 assertEquals(0, message.getStringToInt32Field().size()); |
289 assertEquals(0, testMapOrBuilder.getInt32ToEnumField().size()); | |
290 assertEquals(0, testMapOrBuilder.getInt32ToEnumFieldCount()); | |
291 assertEquals(0, testMapOrBuilder.getInt32ToMessageField().size()); | |
292 assertEquals(0, testMapOrBuilder.getInt32ToMessageFieldCount()); | |
293 assertEquals(0, testMapOrBuilder.getStringToInt32Field().size()); | |
294 assertEquals(0, testMapOrBuilder.getStringToInt32FieldCount()); | |
295 } | 189 } |
296 | 190 |
297 public void testGetMapIsImmutable() { | |
298 TestMap.Builder builder = TestMap.newBuilder(); | |
299 assertMapsAreImmutable(builder); | |
300 assertMapsAreImmutable(builder.build()); | |
301 | |
302 setMapValuesUsingAccessors(builder); | |
303 assertMapsAreImmutable(builder); | |
304 assertMapsAreImmutable(builder.build()); | |
305 } | |
306 | |
307 private void assertMapsAreImmutable(TestMapOrBuilder testMapOrBuilder) { | |
308 assertImmutable(testMapOrBuilder.getInt32ToInt32Field(), 1, 2); | |
309 assertImmutable(testMapOrBuilder.getInt32ToStringField(), 1, "2"); | |
310 assertImmutable(testMapOrBuilder.getInt32ToBytesField(), 1, TestUtil.toBytes
("2")); | |
311 assertImmutable(testMapOrBuilder.getInt32ToEnumField(), 1, TestMap.EnumValue
.FOO); | |
312 assertImmutable( | |
313 testMapOrBuilder.getInt32ToMessageField(), 1, MessageValue.getDefaultIns
tance()); | |
314 assertImmutable(testMapOrBuilder.getStringToInt32Field(), "1", 2); | |
315 } | |
316 | |
317 private <K, V> void assertImmutable(Map<K, V> map, K key, V value) { | |
318 try { | |
319 map.put(key, value); | |
320 fail(); | |
321 } catch (UnsupportedOperationException e) { | |
322 // expected | |
323 } | |
324 } | |
325 | |
326 public void testMutableMapLifecycle() { | 191 public void testMutableMapLifecycle() { |
327 TestMap.Builder builder = TestMap.newBuilder(); | 192 TestMap.Builder builder = TestMap.newBuilder(); |
328 Map<Integer, Integer> intMap = builder.getMutableInt32ToInt32Field(); | 193 Map<Integer, Integer> intMap = builder.getMutableInt32ToInt32Field(); |
329 intMap.put(1, 2); | 194 intMap.put(1, 2); |
330 assertEquals(newMap(1, 2), builder.build().getInt32ToInt32Field()); | 195 assertEquals(newMap(1, 2), builder.build().getInt32ToInt32Field()); |
331 try { | 196 try { |
332 intMap.put(2, 3); | 197 intMap.put(2, 3); |
333 fail(); | 198 fail(); |
334 } catch (UnsupportedOperationException e) { | 199 } catch (UnsupportedOperationException e) { |
335 // expected | 200 // expected |
336 } | 201 } |
337 assertEquals(newMap(1, 2), builder.getInt32ToInt32Field()); | 202 assertEquals(newMap(1, 2), builder.getInt32ToInt32Field()); |
338 builder.getMutableInt32ToInt32Field().put(2, 3); | 203 builder.getMutableInt32ToInt32Field().put(2, 3); |
339 assertEquals(newMap(1, 2, 2, 3), builder.getInt32ToInt32Field()); | 204 assertEquals(newMap(1, 2, 2, 3), builder.getInt32ToInt32Field()); |
340 // | 205 |
341 Map<Integer, TestMap.EnumValue> enumMap = builder.getMutableInt32ToEnumField
(); | 206 Map<Integer, TestMap.EnumValue> enumMap = builder.getMutableInt32ToEnumField
(); |
342 enumMap.put(1, TestMap.EnumValue.BAR); | 207 enumMap.put(1, TestMap.EnumValue.BAR); |
343 assertEquals(newMap(1, TestMap.EnumValue.BAR), builder.build().getInt32ToEnu
mField()); | 208 assertEquals(newMap(1, TestMap.EnumValue.BAR), builder.build().getInt32ToEnu
mField()); |
344 try { | 209 try { |
345 enumMap.put(2, TestMap.EnumValue.FOO); | 210 enumMap.put(2, TestMap.EnumValue.FOO); |
346 fail(); | 211 fail(); |
347 } catch (UnsupportedOperationException e) { | 212 } catch (UnsupportedOperationException e) { |
348 // expected | 213 // expected |
349 } | 214 } |
350 assertEquals(newMap(1, TestMap.EnumValue.BAR), builder.getInt32ToEnumField()
); | 215 assertEquals(newMap(1, TestMap.EnumValue.BAR), builder.getInt32ToEnumField()
); |
351 builder.getMutableInt32ToEnumField().put(2, TestMap.EnumValue.FOO); | 216 builder.getMutableInt32ToEnumField().put(2, TestMap.EnumValue.FOO); |
352 assertEquals( | 217 assertEquals( |
353 newMap(1, TestMap.EnumValue.BAR, 2, TestMap.EnumValue.FOO), | 218 newMap(1, TestMap.EnumValue.BAR, 2, TestMap.EnumValue.FOO), |
354 builder.getInt32ToEnumField()); | 219 builder.getInt32ToEnumField()); |
355 // | 220 |
356 Map<Integer, String> stringMap = builder.getMutableInt32ToStringField(); | 221 Map<Integer, String> stringMap = builder.getMutableInt32ToStringField(); |
357 stringMap.put(1, "1"); | 222 stringMap.put(1, "1"); |
358 assertEquals(newMap(1, "1"), builder.build().getInt32ToStringField()); | 223 assertEquals(newMap(1, "1"), builder.build().getInt32ToStringField()); |
359 try { | 224 try { |
360 stringMap.put(2, "2"); | 225 stringMap.put(2, "2"); |
361 fail(); | 226 fail(); |
362 } catch (UnsupportedOperationException e) { | 227 } catch (UnsupportedOperationException e) { |
363 // expected | 228 // expected |
364 } | 229 } |
365 assertEquals(newMap(1, "1"), builder.getInt32ToStringField()); | 230 assertEquals(newMap(1, "1"), builder.getInt32ToStringField()); |
366 builder.getMutableInt32ToStringField().put(2, "2"); | 231 builder.getMutableInt32ToStringField().put(2, "2"); |
367 assertEquals( | 232 assertEquals( |
368 newMap(1, "1", 2, "2"), | 233 newMap(1, "1", 2, "2"), |
369 builder.getInt32ToStringField()); | 234 builder.getInt32ToStringField()); |
370 // | 235 |
371 Map<Integer, TestMap.MessageValue> messageMap = builder.getMutableInt32ToMes
sageField(); | 236 Map<Integer, TestMap.MessageValue> messageMap = builder.getMutableInt32ToMes
sageField(); |
372 messageMap.put(1, TestMap.MessageValue.getDefaultInstance()); | 237 messageMap.put(1, TestMap.MessageValue.getDefaultInstance()); |
373 assertEquals(newMap(1, TestMap.MessageValue.getDefaultInstance()), | 238 assertEquals(newMap(1, TestMap.MessageValue.getDefaultInstance()), |
374 builder.build().getInt32ToMessageField()); | 239 builder.build().getInt32ToMessageField()); |
375 try { | 240 try { |
376 messageMap.put(2, TestMap.MessageValue.getDefaultInstance()); | 241 messageMap.put(2, TestMap.MessageValue.getDefaultInstance()); |
377 fail(); | 242 fail(); |
378 } catch (UnsupportedOperationException e) { | 243 } catch (UnsupportedOperationException e) { |
379 // expected | 244 // expected |
380 } | 245 } |
381 assertEquals(newMap(1, TestMap.MessageValue.getDefaultInstance()), | 246 assertEquals(newMap(1, TestMap.MessageValue.getDefaultInstance()), |
382 builder.getInt32ToMessageField()); | 247 builder.getInt32ToMessageField()); |
383 builder.getMutableInt32ToMessageField().put(2, TestMap.MessageValue.getDefau
ltInstance()); | 248 builder.getMutableInt32ToMessageField().put(2, TestMap.MessageValue.getDefau
ltInstance()); |
384 assertEquals( | 249 assertEquals( |
385 newMap(1, TestMap.MessageValue.getDefaultInstance(), | 250 newMap(1, TestMap.MessageValue.getDefaultInstance(), |
386 2, TestMap.MessageValue.getDefaultInstance()), | 251 2, TestMap.MessageValue.getDefaultInstance()), |
387 builder.getInt32ToMessageField()); | 252 builder.getInt32ToMessageField()); |
388 } | 253 } |
389 // | 254 |
390 public void testMutableMapLifecycle_collections() { | 255 public void testMutableMapLifecycle_collections() { |
391 TestMap.Builder builder = TestMap.newBuilder(); | 256 TestMap.Builder builder = TestMap.newBuilder(); |
392 Map<Integer, Integer> intMap = builder.getMutableInt32ToInt32Field(); | 257 Map<Integer, Integer> intMap = builder.getMutableInt32ToInt32Field(); |
393 intMap.put(1, 2); | 258 intMap.put(1, 2); |
394 assertEquals(newMap(1, 2), builder.build().getInt32ToInt32Field()); | 259 assertEquals(newMap(1, 2), builder.build().getInt32ToInt32Field()); |
395 try { | 260 try { |
396 intMap.remove(2); | 261 intMap.remove(2); |
397 fail(); | 262 fail(); |
398 } catch (UnsupportedOperationException e) { | 263 } catch (UnsupportedOperationException e) { |
399 // expected | 264 // expected |
(...skipping 26 matching lines...) Expand all Loading... |
426 intMap.values().iterator().remove(); | 291 intMap.values().iterator().remove(); |
427 fail(); | 292 fail(); |
428 } catch (UnsupportedOperationException e) { | 293 } catch (UnsupportedOperationException e) { |
429 // expected | 294 // expected |
430 } | 295 } |
431 assertEquals(newMap(1, 2), intMap); | 296 assertEquals(newMap(1, 2), intMap); |
432 assertEquals(newMap(1, 2), builder.getInt32ToInt32Field()); | 297 assertEquals(newMap(1, 2), builder.getInt32ToInt32Field()); |
433 assertEquals(newMap(1, 2), builder.build().getInt32ToInt32Field()); | 298 assertEquals(newMap(1, 2), builder.build().getInt32ToInt32Field()); |
434 } | 299 } |
435 | 300 |
436 | |
437 public void testGettersAndSetters() throws Exception { | 301 public void testGettersAndSetters() throws Exception { |
438 TestMap.Builder builder = TestMap.newBuilder(); | 302 TestMap.Builder builder = TestMap.newBuilder(); |
439 TestMap message = builder.build(); | 303 TestMap message = builder.build(); |
440 assertMapValuesCleared(message); | 304 assertMapValuesCleared(message); |
441 | 305 |
442 builder = message.toBuilder(); | 306 builder = message.toBuilder(); |
443 setMapValuesUsingAccessors(builder); | 307 setMapValues(builder); |
444 message = builder.build(); | 308 message = builder.build(); |
445 assertMapValuesSet(message); | 309 assertMapValuesSet(message); |
446 | 310 |
447 builder = message.toBuilder(); | 311 builder = message.toBuilder(); |
448 updateMapValuesUsingAccessors(builder); | 312 updateMapValues(builder); |
449 message = builder.build(); | 313 message = builder.build(); |
450 assertMapValuesUpdated(message); | 314 assertMapValuesUpdated(message); |
451 | 315 |
452 builder = message.toBuilder(); | 316 builder = message.toBuilder(); |
453 builder.clear(); | 317 builder.clear(); |
454 assertMapValuesCleared(builder); | |
455 message = builder.build(); | 318 message = builder.build(); |
456 assertMapValuesCleared(message); | 319 assertMapValuesCleared(message); |
457 } | 320 } |
458 | 321 |
459 public void testPutAll() throws Exception { | 322 public void testPutAll() throws Exception { |
460 TestMap.Builder sourceBuilder = TestMap.newBuilder(); | 323 TestMap.Builder sourceBuilder = TestMap.newBuilder(); |
461 setMapValuesUsingAccessors(sourceBuilder); | 324 setMapValues(sourceBuilder); |
462 TestMap source = sourceBuilder.build(); | 325 TestMap source = sourceBuilder.build(); |
463 assertMapValuesSet(source); | |
464 | 326 |
465 TestMap.Builder destination = TestMap.newBuilder(); | 327 TestMap.Builder destination = TestMap.newBuilder(); |
466 copyMapValues(source, destination); | 328 copyMapValues(source, destination); |
467 assertMapValuesSet(destination.build()); | 329 assertMapValuesSet(destination.build()); |
468 | |
469 assertEquals(3, destination.getInt32ToEnumFieldCount()); | |
470 } | |
471 | |
472 public void testPutChecksNullKeysAndValues() throws Exception { | |
473 TestMap.Builder builder = TestMap.newBuilder(); | |
474 | |
475 try { | |
476 builder.putInt32ToStringField(1, null); | |
477 fail(); | |
478 } catch (NullPointerException e) { | |
479 // expected. | |
480 } | |
481 | |
482 try { | |
483 builder.putInt32ToBytesField(1, null); | |
484 fail(); | |
485 } catch (NullPointerException e) { | |
486 // expected. | |
487 } | |
488 | |
489 try { | |
490 builder.putInt32ToEnumField(1, null); | |
491 fail(); | |
492 } catch (NullPointerException e) { | |
493 // expected. | |
494 } | |
495 | |
496 try { | |
497 builder.putInt32ToMessageField(1, null); | |
498 fail(); | |
499 } catch (NullPointerException e) { | |
500 // expected. | |
501 } | |
502 | |
503 try { | |
504 builder.putStringToInt32Field(null, 1); | |
505 fail(); | |
506 } catch (NullPointerException e) { | |
507 // expected. | |
508 } | |
509 } | 330 } |
510 | 331 |
511 public void testSerializeAndParse() throws Exception { | 332 public void testSerializeAndParse() throws Exception { |
512 TestMap.Builder builder = TestMap.newBuilder(); | 333 TestMap.Builder builder = TestMap.newBuilder(); |
513 setMapValuesUsingAccessors(builder); | 334 setMapValues(builder); |
514 TestMap message = builder.build(); | 335 TestMap message = builder.build(); |
515 assertEquals(message.getSerializedSize(), message.toByteString().size()); | 336 assertEquals(message.getSerializedSize(), message.toByteString().size()); |
516 message = TestMap.parser().parseFrom(message.toByteString()); | 337 message = TestMap.parser().parseFrom(message.toByteString()); |
517 assertMapValuesSet(message); | 338 assertMapValuesSet(message); |
518 | 339 |
519 builder = message.toBuilder(); | 340 builder = message.toBuilder(); |
520 updateMapValuesUsingAccessors(builder); | 341 updateMapValues(builder); |
521 message = builder.build(); | 342 message = builder.build(); |
522 assertEquals(message.getSerializedSize(), message.toByteString().size()); | 343 assertEquals(message.getSerializedSize(), message.toByteString().size()); |
523 message = TestMap.parser().parseFrom(message.toByteString()); | 344 message = TestMap.parser().parseFrom(message.toByteString()); |
524 assertMapValuesUpdated(message); | 345 assertMapValuesUpdated(message); |
525 | 346 |
526 builder = message.toBuilder(); | 347 builder = message.toBuilder(); |
527 builder.clear(); | 348 builder.clear(); |
528 message = builder.build(); | 349 message = builder.build(); |
529 assertEquals(message.getSerializedSize(), message.toByteString().size()); | 350 assertEquals(message.getSerializedSize(), message.toByteString().size()); |
530 message = TestMap.parser().parseFrom(message.toByteString()); | 351 message = TestMap.parser().parseFrom(message.toByteString()); |
531 assertMapValuesCleared(message); | 352 assertMapValuesCleared(message); |
532 } | 353 } |
533 | 354 |
534 private TestMap tryParseTestMap(BizarroTestMap bizarroMap) throws IOException
{ | |
535 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); | |
536 CodedOutputStream output = CodedOutputStream.newInstance(byteArrayOutputStre
am); | |
537 bizarroMap.writeTo(output); | |
538 output.flush(); | |
539 return TestMap.parser().parseFrom(ByteString.copyFrom(byteArrayOutputStream.
toByteArray())); | |
540 } | |
541 | |
542 public void testParseError() throws Exception { | |
543 ByteString bytes = TestUtil.toBytes("SOME BYTES"); | |
544 String stringKey = "a string key"; | |
545 | |
546 TestMap map = tryParseTestMap(BizarroTestMap.newBuilder() | |
547 .putInt32ToInt32Field(5, bytes) | |
548 .build()); | |
549 assertEquals(map.getInt32ToInt32FieldOrDefault(5, -1), 0); | |
550 | |
551 map = tryParseTestMap(BizarroTestMap.newBuilder() | |
552 .putInt32ToStringField(stringKey, 5) | |
553 .build()); | |
554 assertEquals(map.getInt32ToStringFieldOrDefault(0, null), ""); | |
555 | |
556 map = tryParseTestMap(BizarroTestMap.newBuilder() | |
557 .putInt32ToBytesField(stringKey, 5) | |
558 .build()); | |
559 assertEquals(map.getInt32ToBytesFieldOrDefault(0, null), ByteString.EMPTY); | |
560 | |
561 map = tryParseTestMap(BizarroTestMap.newBuilder() | |
562 .putInt32ToEnumField(stringKey, bytes) | |
563 .build()); | |
564 assertEquals(map.getInt32ToEnumFieldOrDefault(0, null), TestMap.EnumValue.FO
O); | |
565 | |
566 try { | |
567 tryParseTestMap(BizarroTestMap.newBuilder() | |
568 .putInt32ToMessageField(stringKey, bytes) | |
569 .build()); | |
570 fail(); | |
571 } catch (InvalidProtocolBufferException expected) { | |
572 assertTrue(expected.getUnfinishedMessage() instanceof TestMap); | |
573 map = (TestMap) expected.getUnfinishedMessage(); | |
574 assertTrue(map.getInt32ToMessageField().isEmpty()); | |
575 } | |
576 | |
577 map = tryParseTestMap(BizarroTestMap.newBuilder() | |
578 .putStringToInt32Field(stringKey, bytes) | |
579 .build()); | |
580 assertEquals(map.getStringToInt32FieldOrDefault(stringKey, -1), 0); | |
581 } | |
582 | |
583 public void testMergeFrom() throws Exception { | 355 public void testMergeFrom() throws Exception { |
584 TestMap.Builder builder = TestMap.newBuilder(); | 356 TestMap.Builder builder = TestMap.newBuilder(); |
585 setMapValuesUsingAccessors(builder); | 357 setMapValues(builder); |
586 TestMap message = builder.build(); | 358 TestMap message = builder.build(); |
587 | 359 |
588 TestMap.Builder other = TestMap.newBuilder(); | 360 TestMap.Builder other = TestMap.newBuilder(); |
589 other.mergeFrom(message); | 361 other.mergeFrom(message); |
590 assertMapValuesSet(other.build()); | 362 assertMapValuesSet(other.build()); |
591 } | 363 } |
592 | 364 |
593 public void testEqualsAndHashCode() throws Exception { | 365 public void testEqualsAndHashCode() throws Exception { |
594 // Test that generated equals() and hashCode() will disregard the order | 366 // Test that generated equals() and hashCode() will disregard the order |
595 // of map entries when comparing/hashing map fields. | 367 // of map entries when comparing/hashing map fields. |
596 | 368 |
597 // We can't control the order of elements in a HashMap. The best we can do | 369 // We can't control the order of elements in a HashMap. The best we can do |
598 // here is to add elements in different order. | 370 // here is to add elements in different order. |
599 TestMap.Builder b1 = TestMap.newBuilder(); | 371 TestMap.Builder b1 = TestMap.newBuilder(); |
600 b1.putInt32ToInt32Field(1, 2); | 372 b1.getMutableInt32ToInt32Field().put(1, 2); |
601 b1.putInt32ToInt32Field(3, 4); | 373 b1.getMutableInt32ToInt32Field().put(3, 4); |
602 b1.putInt32ToInt32Field(5, 6); | 374 b1.getMutableInt32ToInt32Field().put(5, 6); |
603 TestMap m1 = b1.build(); | 375 TestMap m1 = b1.build(); |
604 | 376 |
605 TestMap.Builder b2 = TestMap.newBuilder(); | 377 TestMap.Builder b2 = TestMap.newBuilder(); |
606 b2.putInt32ToInt32Field(5, 6); | 378 b2.getMutableInt32ToInt32Field().put(5, 6); |
607 b2.putInt32ToInt32Field(1, 2); | 379 b2.getMutableInt32ToInt32Field().put(1, 2); |
608 b2.putInt32ToInt32Field(3, 4); | 380 b2.getMutableInt32ToInt32Field().put(3, 4); |
609 TestMap m2 = b2.build(); | 381 TestMap m2 = b2.build(); |
610 | 382 |
611 assertEquals(m1, m2); | 383 assertEquals(m1, m2); |
612 assertEquals(m1.hashCode(), m2.hashCode()); | 384 assertEquals(m1.hashCode(), m2.hashCode()); |
613 | 385 |
614 // Make sure we did compare map fields. | 386 // Make sure we did compare map fields. |
615 b2.putInt32ToInt32Field(1, 0); | 387 b2.getMutableInt32ToInt32Field().put(1, 0); |
616 m2 = b2.build(); | 388 m2 = b2.build(); |
617 assertFalse(m1.equals(m2)); | 389 assertFalse(m1.equals(m2)); |
618 // Don't check m1.hashCode() != m2.hashCode() because it's not guaranteed | 390 // Don't check m1.hashCode() != m2.hashCode() because it's not guaranteed |
619 // to be different. | 391 // to be different. |
620 } | 392 } |
621 | 393 |
622 | 394 |
623 // The following methods are used to test reflection API. | 395 // The following methods are used to test reflection API. |
624 | 396 |
625 private static FieldDescriptor f(String name) { | 397 private static FieldDescriptor f(String name) { |
626 return TestMap.getDescriptor().findFieldByName(name); | 398 return TestMap.getDescriptor().findFieldByName(name); |
627 } | 399 } |
628 | 400 |
629 private static Object getFieldValue(Message mapEntry, String name) { | 401 private static Object getFieldValue(Message mapEntry, String name) { |
630 FieldDescriptor field = mapEntry.getDescriptorForType().findFieldByName(name
); | 402 FieldDescriptor field = mapEntry.getDescriptorForType().findFieldByName(name
); |
631 return mapEntry.getField(field); | 403 return mapEntry.getField(field); |
632 } | 404 } |
633 | 405 |
634 private static Message.Builder setFieldValue( | 406 private static Message.Builder setFieldValue( |
635 Message.Builder mapEntry, String name, Object value) { | 407 Message.Builder mapEntry, String name, Object value) { |
636 FieldDescriptor field = mapEntry.getDescriptorForType().findFieldByName(name
); | 408 FieldDescriptor field = mapEntry.getDescriptorForType().findFieldByName(name
); |
637 mapEntry.setField(field, value); | 409 mapEntry.setField(field, value); |
638 return mapEntry; | 410 return mapEntry; |
639 } | 411 } |
640 | 412 |
641 private static void assertHasMapValues(Message message, String name, Map<?, ?>
values) { | 413 private static void assertHasMapValues(Message message, String name, Map<?, ?>
values) { |
642 FieldDescriptor field = f(name); | 414 FieldDescriptor field = f(name); |
643 for (Object entry : (List<?>) message.getField(field)) { | 415 for (Object entry : (List<?>) message.getField(field)) { |
644 Message mapEntry = (Message) entry; | 416 Message mapEntry = (Message) entry; |
645 Object key = getFieldValue(mapEntry, "key"); | 417 Object key = getFieldValue(mapEntry, "key"); |
646 Object value = getFieldValue(mapEntry, "value"); | 418 Object value = getFieldValue(mapEntry, "value"); |
647 assertTrue(values.containsKey(key)); | 419 assertTrue(values.containsKey(key)); |
648 assertEquals(value, values.get(key)); | 420 assertEquals(value, values.get(key)); |
649 } | 421 } |
650 assertEquals(values.size(), message.getRepeatedFieldCount(field)); | 422 assertEquals(values.size(), message.getRepeatedFieldCount(field)); |
651 for (int i = 0; i < message.getRepeatedFieldCount(field); i++) { | 423 for (int i = 0; i < message.getRepeatedFieldCount(field); i++) { |
652 Message mapEntry = (Message) message.getRepeatedField(field, i); | 424 Message mapEntry = (Message) message.getRepeatedField(field, i); |
653 Object key = getFieldValue(mapEntry, "key"); | 425 Object key = getFieldValue(mapEntry, "key"); |
654 Object value = getFieldValue(mapEntry, "value"); | 426 Object value = getFieldValue(mapEntry, "value"); |
655 assertTrue(values.containsKey(key)); | 427 assertTrue(values.containsKey(key)); |
656 assertEquals(value, values.get(key)); | 428 assertEquals(value, values.get(key)); |
657 } | 429 } |
658 } | 430 } |
659 | 431 |
660 private static <KeyType, ValueType> | 432 private static <KeyType, ValueType> |
661 Message newMapEntry(Message.Builder builder, String name, KeyType key, ValueTy
pe value) { | 433 Message newMapEntry(Message.Builder builder, String name, KeyType key, ValueTy
pe value) { |
662 FieldDescriptor field = builder.getDescriptorForType().findFieldByName(name)
; | 434 FieldDescriptor field = builder.getDescriptorForType().findFieldByName(name)
; |
663 Message.Builder entryBuilder = builder.newBuilderForField(field); | 435 Message.Builder entryBuilder = builder.newBuilderForField(field); |
664 FieldDescriptor keyField = entryBuilder.getDescriptorForType().findFieldByNa
me("key"); | 436 FieldDescriptor keyField = entryBuilder.getDescriptorForType().findFieldByNa
me("key"); |
665 FieldDescriptor valueField = entryBuilder.getDescriptorForType().findFieldBy
Name("value"); | 437 FieldDescriptor valueField = entryBuilder.getDescriptorForType().findFieldBy
Name("value"); |
666 entryBuilder.setField(keyField, key); | 438 entryBuilder.setField(keyField, key); |
667 entryBuilder.setField(valueField, value); | 439 entryBuilder.setField(valueField, value); |
668 return entryBuilder.build(); | 440 return entryBuilder.build(); |
669 } | 441 } |
670 | 442 |
671 private static void setMapValues(Message.Builder builder, String name, Map<?,
?> values) { | 443 private static void setMapValues(Message.Builder builder, String name, Map<?,
?> values) { |
672 List<Message> entryList = new ArrayList<Message>(); | 444 List<Message> entryList = new ArrayList<Message>(); |
673 for (Map.Entry<?, ?> entry : values.entrySet()) { | 445 for (Map.Entry<?, ?> entry : values.entrySet()) { |
674 entryList.add(newMapEntry(builder, name, entry.getKey(), entry.getValue())
); | 446 entryList.add(newMapEntry(builder, name, entry.getKey(), entry.getValue())
); |
675 } | 447 } |
676 FieldDescriptor field = builder.getDescriptorForType().findFieldByName(name)
; | 448 FieldDescriptor field = builder.getDescriptorForType().findFieldByName(name)
; |
677 builder.setField(field, entryList); | 449 builder.setField(field, entryList); |
678 } | 450 } |
679 | 451 |
680 private static <KeyType, ValueType> Map<KeyType, ValueType> mapForValues( | 452 private static <KeyType, ValueType> |
| 453 Map<KeyType, ValueType> mapForValues( |
681 KeyType key1, ValueType value1, KeyType key2, ValueType value2) { | 454 KeyType key1, ValueType value1, KeyType key2, ValueType value2) { |
682 Map<KeyType, ValueType> map = new HashMap<KeyType, ValueType>(); | 455 Map<KeyType, ValueType> map = new HashMap<KeyType, ValueType>(); |
683 map.put(key1, value1); | 456 map.put(key1, value1); |
684 map.put(key2, value2); | 457 map.put(key2, value2); |
685 return map; | 458 return map; |
686 } | 459 } |
687 | 460 |
688 public void testReflectionApi() throws Exception { | 461 public void testReflectionApi() throws Exception { |
689 // In reflection API, map fields are just repeated message fields. | 462 // In reflection API, map fields are just repeated message fields. |
690 TestMap.Builder builder = TestMap.newBuilder() | 463 TestMap.Builder builder = TestMap.newBuilder(); |
691 .putInt32ToInt32Field(1, 2) | 464 builder.getMutableInt32ToInt32Field().put(1, 2); |
692 .putInt32ToInt32Field(3, 4) | 465 builder.getMutableInt32ToInt32Field().put(3, 4); |
693 .putInt32ToMessageField(11, MessageValue.newBuilder().setValue(22).build
()) | 466 builder.getMutableInt32ToMessageField().put( |
694 .putInt32ToMessageField(33, MessageValue.newBuilder().setValue(44).build
()); | 467 11, MessageValue.newBuilder().setValue(22).build()); |
| 468 builder.getMutableInt32ToMessageField().put( |
| 469 33, MessageValue.newBuilder().setValue(44).build()); |
695 TestMap message = builder.build(); | 470 TestMap message = builder.build(); |
696 | 471 |
697 // Test getField(), getRepeatedFieldCount(), getRepeatedField(). | 472 // Test getField(), getRepeatedFieldCount(), getRepeatedField(). |
698 assertHasMapValues(message, "int32_to_int32_field", | 473 assertHasMapValues(message, "int32_to_int32_field", |
699 mapForValues(1, 2, 3, 4)); | 474 mapForValues(1, 2, 3, 4)); |
700 assertHasMapValues(message, "int32_to_message_field", | 475 assertHasMapValues(message, "int32_to_message_field", |
701 mapForValues( | 476 mapForValues( |
702 11, MessageValue.newBuilder().setValue(22).build(), | 477 11, MessageValue.newBuilder().setValue(22).build(), |
703 33, MessageValue.newBuilder().setValue(44).build())); | 478 33, MessageValue.newBuilder().setValue(44).build())); |
704 | 479 |
705 // Test clearField() | 480 // Test clearField() |
706 builder.clearField(f("int32_to_int32_field")); | 481 builder.clearField(f("int32_to_int32_field")); |
707 builder.clearField(f("int32_to_message_field")); | 482 builder.clearField(f("int32_to_message_field")); |
708 message = builder.build(); | 483 message = builder.build(); |
709 assertEquals(0, message.getInt32ToInt32Field().size()); | 484 assertEquals(0, message.getInt32ToInt32Field().size()); |
710 assertEquals(0, message.getInt32ToMessageField().size()); | 485 assertEquals(0, message.getInt32ToMessageField().size()); |
711 | 486 |
712 // Test setField() | 487 // Test setField() |
713 setMapValues(builder, "int32_to_int32_field", | 488 setMapValues(builder, "int32_to_int32_field", |
714 mapForValues(11, 22, 33, 44)); | 489 mapForValues(11, 22, 33, 44)); |
715 setMapValues(builder, "int32_to_message_field", | 490 setMapValues(builder, "int32_to_message_field", |
716 mapForValues( | 491 mapForValues( |
717 111, MessageValue.newBuilder().setValue(222).build(), | 492 111, MessageValue.newBuilder().setValue(222).build(), |
718 333, MessageValue.newBuilder().setValue(444).build())); | 493 333, MessageValue.newBuilder().setValue(444).build())); |
719 message = builder.build(); | 494 message = builder.build(); |
720 assertEquals(22, message.getInt32ToInt32Field().get(11).intValue()); | 495 assertEquals(22, message.getInt32ToInt32Field().get(11).intValue()); |
721 assertEquals(44, message.getInt32ToInt32Field().get(33).intValue()); | 496 assertEquals(44, message.getInt32ToInt32Field().get(33).intValue()); |
722 assertEquals(222, message.getInt32ToMessageField().get(111).getValue()); | 497 assertEquals(222, message.getInt32ToMessageField().get(111).getValue()); |
723 assertEquals(444, message.getInt32ToMessageField().get(333).getValue()); | 498 assertEquals(444, message.getInt32ToMessageField().get(333).getValue()); |
724 | 499 |
725 // Test addRepeatedField | 500 // Test addRepeatedField |
726 builder.addRepeatedField(f("int32_to_int32_field"), | 501 builder.addRepeatedField(f("int32_to_int32_field"), |
727 newMapEntry(builder, "int32_to_int32_field", 55, 66)); | 502 newMapEntry(builder, "int32_to_int32_field", 55, 66)); |
728 builder.addRepeatedField(f("int32_to_message_field"), | 503 builder.addRepeatedField(f("int32_to_message_field"), |
729 newMapEntry(builder, "int32_to_message_field", 555, | 504 newMapEntry(builder, "int32_to_message_field", 555, |
730 MessageValue.newBuilder().setValue(666).build())); | 505 MessageValue.newBuilder().setValue(666).build())); |
731 message = builder.build(); | 506 message = builder.build(); |
732 assertEquals(66, message.getInt32ToInt32Field().get(55).intValue()); | 507 assertEquals(66, message.getInt32ToInt32Field().get(55).intValue()); |
733 assertEquals(666, message.getInt32ToMessageField().get(555).getValue()); | 508 assertEquals(666, message.getInt32ToMessageField().get(555).getValue()); |
734 | 509 |
735 // Test addRepeatedField (overriding existing values) | 510 // Test addRepeatedField (overriding existing values) |
736 builder.addRepeatedField(f("int32_to_int32_field"), | 511 builder.addRepeatedField(f("int32_to_int32_field"), |
737 newMapEntry(builder, "int32_to_int32_field", 55, 55)); | 512 newMapEntry(builder, "int32_to_int32_field", 55, 55)); |
738 builder.addRepeatedField(f("int32_to_message_field"), | 513 builder.addRepeatedField(f("int32_to_message_field"), |
739 newMapEntry(builder, "int32_to_message_field", 555, | 514 newMapEntry(builder, "int32_to_message_field", 555, |
740 MessageValue.newBuilder().setValue(555).build())); | 515 MessageValue.newBuilder().setValue(555).build())); |
741 message = builder.build(); | 516 message = builder.build(); |
742 assertEquals(55, message.getInt32ToInt32Field().get(55).intValue()); | 517 assertEquals(55, message.getInt32ToInt32Field().get(55).intValue()); |
743 assertEquals(555, message.getInt32ToMessageField().get(555).getValue()); | 518 assertEquals(555, message.getInt32ToMessageField().get(555).getValue()); |
744 | 519 |
745 // Test setRepeatedField | 520 // Test setRepeatedField |
746 for (int i = 0; i < builder.getRepeatedFieldCount(f("int32_to_int32_field"))
; i++) { | 521 for (int i = 0; i < builder.getRepeatedFieldCount(f("int32_to_int32_field"))
; i++) { |
747 Message mapEntry = (Message) builder.getRepeatedField(f("int32_to_int32_fi
eld"), i); | 522 Message mapEntry = (Message) builder.getRepeatedField(f("int32_to_int32_fi
eld"), i); |
748 int oldKey = ((Integer) getFieldValue(mapEntry, "key")).intValue(); | 523 int oldKey = ((Integer) getFieldValue(mapEntry, "key")).intValue(); |
749 int oldValue = ((Integer) getFieldValue(mapEntry, "value")).intValue(); | 524 int oldValue = ((Integer) getFieldValue(mapEntry, "value")).intValue(); |
750 // Swap key with value for each entry. | 525 // Swap key with value for each entry. |
751 Message.Builder mapEntryBuilder = mapEntry.toBuilder(); | 526 Message.Builder mapEntryBuilder = mapEntry.toBuilder(); |
752 setFieldValue(mapEntryBuilder, "key", oldValue); | 527 setFieldValue(mapEntryBuilder, "key", oldValue); |
753 setFieldValue(mapEntryBuilder, "value", oldKey); | 528 setFieldValue(mapEntryBuilder, "value", oldKey); |
754 builder.setRepeatedField(f("int32_to_int32_field"), i, mapEntryBuilder.bui
ld()); | 529 builder.setRepeatedField(f("int32_to_int32_field"), i, mapEntryBuilder.bui
ld()); |
755 } | 530 } |
756 message = builder.build(); | 531 message = builder.build(); |
757 assertEquals(11, message.getInt32ToInt32Field().get(22).intValue()); | 532 assertEquals(11, message.getInt32ToInt32Field().get(22).intValue()); |
758 assertEquals(33, message.getInt32ToInt32Field().get(44).intValue()); | 533 assertEquals(33, message.getInt32ToInt32Field().get(44).intValue()); |
759 assertEquals(55, message.getInt32ToInt32Field().get(55).intValue()); | 534 assertEquals(55, message.getInt32ToInt32Field().get(55).intValue()); |
760 } | 535 } |
761 | 536 |
762 public void testTextFormat() throws Exception { | 537 public void testTextFormat() throws Exception { |
763 TestMap.Builder builder = TestMap.newBuilder(); | 538 TestMap.Builder builder = TestMap.newBuilder(); |
764 setMapValuesUsingAccessors(builder); | 539 setMapValues(builder); |
765 TestMap message = builder.build(); | 540 TestMap message = builder.build(); |
766 | 541 |
767 String textData = TextFormat.printToString(message); | 542 String textData = TextFormat.printToString(message); |
768 | 543 |
769 builder = TestMap.newBuilder(); | 544 builder = TestMap.newBuilder(); |
770 TextFormat.merge(textData, builder); | 545 TextFormat.merge(textData, builder); |
771 message = builder.build(); | 546 message = builder.build(); |
772 | 547 |
773 assertMapValuesSet(message); | 548 assertMapValuesSet(message); |
774 } | 549 } |
775 | 550 |
776 public void testDynamicMessage() throws Exception { | 551 public void testDynamicMessage() throws Exception { |
777 TestMap.Builder builder = TestMap.newBuilder(); | 552 TestMap.Builder builder = TestMap.newBuilder(); |
778 setMapValuesUsingAccessors(builder); | 553 setMapValues(builder); |
779 TestMap message = builder.build(); | 554 TestMap message = builder.build(); |
780 | 555 |
781 Message dynamicDefaultInstance = | 556 Message dynamicDefaultInstance = |
782 DynamicMessage.getDefaultInstance(TestMap.getDescriptor()); | 557 DynamicMessage.getDefaultInstance(TestMap.getDescriptor()); |
783 Message dynamicMessage = dynamicDefaultInstance | 558 Message dynamicMessage = dynamicDefaultInstance |
784 .newBuilderForType().mergeFrom(message.toByteString()).build(); | 559 .newBuilderForType().mergeFrom(message.toByteString()).build(); |
785 | 560 |
786 assertEquals(message, dynamicMessage); | 561 assertEquals(message, dynamicMessage); |
787 assertEquals(message.hashCode(), dynamicMessage.hashCode()); | 562 assertEquals(message.hashCode(), dynamicMessage.hashCode()); |
788 } | 563 } |
789 | 564 |
790 public void testReflectionEqualsAndHashCode() throws Exception { | 565 public void testReflectionEqualsAndHashCode() throws Exception { |
791 // Test that generated equals() and hashCode() will disregard the order | 566 // Test that generated equals() and hashCode() will disregard the order |
792 // of map entries when comparing/hashing map fields. | 567 // of map entries when comparing/hashing map fields. |
793 | 568 |
794 // We use DynamicMessage to test reflection based equals()/hashCode(). | 569 // We use DynamicMessage to test reflection based equals()/hashCode(). |
795 Message dynamicDefaultInstance = | 570 Message dynamicDefaultInstance = |
796 DynamicMessage.getDefaultInstance(TestMap.getDescriptor()); | 571 DynamicMessage.getDefaultInstance(TestMap.getDescriptor()); |
797 FieldDescriptor field = f("int32_to_int32_field"); | 572 FieldDescriptor field = f("int32_to_int32_field"); |
798 | 573 |
799 Message.Builder b1 = dynamicDefaultInstance.newBuilderForType(); | 574 Message.Builder b1 = dynamicDefaultInstance.newBuilderForType(); |
800 b1.addRepeatedField(field, newMapEntry(b1, "int32_to_int32_field", 1, 2)); | 575 b1.addRepeatedField(field, newMapEntry(b1, "int32_to_int32_field", 1, 2)); |
801 b1.addRepeatedField(field, newMapEntry(b1, "int32_to_int32_field", 3, 4)); | 576 b1.addRepeatedField(field, newMapEntry(b1, "int32_to_int32_field", 3, 4)); |
802 b1.addRepeatedField(field, newMapEntry(b1, "int32_to_int32_field", 5, 6)); | 577 b1.addRepeatedField(field, newMapEntry(b1, "int32_to_int32_field", 5, 6)); |
803 Message m1 = b1.build(); | 578 Message m1 = b1.build(); |
804 | 579 |
805 Message.Builder b2 = dynamicDefaultInstance.newBuilderForType(); | 580 Message.Builder b2 = dynamicDefaultInstance.newBuilderForType(); |
806 b2.addRepeatedField(field, newMapEntry(b2, "int32_to_int32_field", 5, 6)); | 581 b2.addRepeatedField(field, newMapEntry(b2, "int32_to_int32_field", 5, 6)); |
807 b2.addRepeatedField(field, newMapEntry(b2, "int32_to_int32_field", 1, 2)); | 582 b2.addRepeatedField(field, newMapEntry(b2, "int32_to_int32_field", 1, 2)); |
808 b2.addRepeatedField(field, newMapEntry(b2, "int32_to_int32_field", 3, 4)); | 583 b2.addRepeatedField(field, newMapEntry(b2, "int32_to_int32_field", 3, 4)); |
809 Message m2 = b2.build(); | 584 Message m2 = b2.build(); |
810 | 585 |
811 assertEquals(m1, m2); | 586 assertEquals(m1, m2); |
812 assertEquals(m1.hashCode(), m2.hashCode()); | 587 assertEquals(m1.hashCode(), m2.hashCode()); |
813 | 588 |
814 // Make sure we did compare map fields. | 589 // Make sure we did compare map fields. |
815 b2.setRepeatedField(field, 0, newMapEntry(b1, "int32_to_int32_field", 0, 0))
; | 590 b2.setRepeatedField(field, 0, newMapEntry(b1, "int32_to_int32_field", 0, 0))
; |
816 m2 = b2.build(); | 591 m2 = b2.build(); |
817 assertFalse(m1.equals(m2)); | 592 assertFalse(m1.equals(m2)); |
818 // Don't check m1.hashCode() != m2.hashCode() because it's not guaranteed | 593 // Don't check m1.hashCode() != m2.hashCode() because it's not guaranteed |
819 // to be different. | 594 // to be different. |
820 } | 595 } |
821 | 596 |
822 public void testUnknownEnumValues() throws Exception { | 597 public void testUnknownEnumValues() throws Exception { |
823 TestUnknownEnumValue.Builder builder = TestUnknownEnumValue.newBuilder() | 598 TestUnknownEnumValue.Builder builder = |
824 .putInt32ToInt32Field(1, 1) | 599 TestUnknownEnumValue.newBuilder(); |
825 .putInt32ToInt32Field(2, 54321); | 600 builder.getMutableInt32ToInt32Field().put(1, 1); |
| 601 builder.getMutableInt32ToInt32Field().put(2, 54321); |
826 ByteString data = builder.build().toByteString(); | 602 ByteString data = builder.build().toByteString(); |
827 | 603 |
828 TestMap message = TestMap.parseFrom(data); | 604 TestMap message = TestMap.parseFrom(data); |
829 // Entries with unknown enum values will be stored into UnknownFieldSet so | 605 // Entries with unknown enum values will be stored into UnknownFieldSet so |
830 // there is only one entry in the map. | 606 // there is only one entry in the map. |
831 assertEquals(1, message.getInt32ToEnumField().size()); | 607 assertEquals(1, message.getInt32ToEnumField().size()); |
832 assertEquals(TestMap.EnumValue.BAR, message.getInt32ToEnumField().get(1)); | 608 assertEquals(TestMap.EnumValue.BAR, message.getInt32ToEnumField().get(1)); |
833 // UnknownFieldSet should not be empty. | 609 // UnknownFieldSet should not be empty. |
834 assertFalse(message.getUnknownFields().asMap().isEmpty()); | 610 assertFalse(message.getUnknownFields().asMap().isEmpty()); |
835 // Serializing and parsing should preserve the unknown entry. | 611 // Serializing and parsing should preserve the unknown entry. |
836 data = message.toByteString(); | 612 data = message.toByteString(); |
837 TestUnknownEnumValue messageWithUnknownEnums = | 613 TestUnknownEnumValue messageWithUnknownEnums = |
838 TestUnknownEnumValue.parseFrom(data); | 614 TestUnknownEnumValue.parseFrom(data); |
839 assertEquals(2, messageWithUnknownEnums.getInt32ToInt32Field().size()); | 615 assertEquals(2, messageWithUnknownEnums.getInt32ToInt32Field().size()); |
840 assertEquals(1, messageWithUnknownEnums.getInt32ToInt32Field().get(1).intVal
ue()); | 616 assertEquals(1, messageWithUnknownEnums.getInt32ToInt32Field().get(1).intVal
ue()); |
841 assertEquals(54321, messageWithUnknownEnums.getInt32ToInt32Field().get(2).in
tValue()); | 617 assertEquals(54321, messageWithUnknownEnums.getInt32ToInt32Field().get(2).in
tValue()); |
842 } | 618 } |
843 | 619 |
| 620 |
844 public void testRequiredMessage() throws Exception { | 621 public void testRequiredMessage() throws Exception { |
845 TestMap.Builder builder = TestMap.newBuilder(); | 622 TestMap.Builder builder = TestMap.newBuilder(); |
846 builder.putRequiredMessageMap(0, MessageWithRequiredFields.newBuilder().buil
dPartial()); | 623 builder.getMutableRequiredMessageMap().put(0, |
| 624 MessageWithRequiredFields.newBuilder().buildPartial()); |
847 TestMap message = builder.buildPartial(); | 625 TestMap message = builder.buildPartial(); |
848 assertFalse(message.isInitialized()); | 626 assertFalse(message.isInitialized()); |
849 | 627 |
850 builder.putRequiredMessageMap(0, MessageWithRequiredFields.newBuilder().setV
alue(1).build()); | 628 builder.getMutableRequiredMessageMap().put(0, |
| 629 MessageWithRequiredFields.newBuilder().setValue(1).build()); |
851 message = builder.build(); | 630 message = builder.build(); |
852 assertTrue(message.isInitialized()); | 631 assertTrue(message.isInitialized()); |
853 } | 632 } |
854 | 633 |
855 public void testRecursiveMap() throws Exception { | 634 public void testRecursiveMap() throws Exception { |
856 TestRecursiveMap.Builder builder = TestRecursiveMap.newBuilder(); | 635 TestRecursiveMap.Builder builder = TestRecursiveMap.newBuilder(); |
857 builder.putRecursiveMapField(1, TestRecursiveMap.newBuilder().setValue(2).bu
ild()); | 636 builder.getMutableRecursiveMapField().put( |
858 builder.putRecursiveMapField(3, TestRecursiveMap.newBuilder().setValue(4).bu
ild()); | 637 1, TestRecursiveMap.newBuilder().setValue(2).build()); |
| 638 builder.getMutableRecursiveMapField().put( |
| 639 3, TestRecursiveMap.newBuilder().setValue(4).build()); |
859 ByteString data = builder.build().toByteString(); | 640 ByteString data = builder.build().toByteString(); |
860 | 641 |
861 TestRecursiveMap message = TestRecursiveMap.parseFrom(data); | 642 TestRecursiveMap message = TestRecursiveMap.parseFrom(data); |
862 assertEquals(2, message.getRecursiveMapField().get(1).getValue()); | 643 assertEquals(2, message.getRecursiveMapField().get(1).getValue()); |
863 assertEquals(4, message.getRecursiveMapField().get(3).getValue()); | 644 assertEquals(4, message.getRecursiveMapField().get(3).getValue()); |
864 } | 645 } |
865 | 646 |
866 public void testIterationOrder() throws Exception { | 647 public void testIterationOrder() throws Exception { |
867 TestMap.Builder builder = TestMap.newBuilder(); | 648 TestMap.Builder builder = TestMap.newBuilder(); |
868 setMapValuesUsingAccessors(builder); | 649 setMapValues(builder); |
869 TestMap message = builder.build(); | 650 TestMap message = builder.build(); |
870 | 651 |
871 assertEquals(Arrays.asList("1", "2", "3"), | 652 assertEquals(Arrays.asList("1", "2", "3"), |
872 new ArrayList<String>(message.getStringToInt32Field().keySet())); | 653 new ArrayList<String>(message.getStringToInt32Field().keySet())); |
873 } | 654 } |
874 | 655 |
875 public void testContains() { | |
876 TestMap.Builder builder = TestMap.newBuilder(); | |
877 setMapValuesUsingAccessors(builder); | |
878 assertMapContainsSetValues(builder); | |
879 assertMapContainsSetValues(builder.build()); | |
880 } | |
881 | |
882 private void assertMapContainsSetValues(TestMapOrBuilder testMapOrBuilder) { | |
883 assertTrue(testMapOrBuilder.containsInt32ToInt32Field(1)); | |
884 assertTrue(testMapOrBuilder.containsInt32ToInt32Field(2)); | |
885 assertTrue(testMapOrBuilder.containsInt32ToInt32Field(3)); | |
886 assertFalse(testMapOrBuilder.containsInt32ToInt32Field(-1)); | |
887 | |
888 assertTrue(testMapOrBuilder.containsInt32ToStringField(1)); | |
889 assertTrue(testMapOrBuilder.containsInt32ToStringField(2)); | |
890 assertTrue(testMapOrBuilder.containsInt32ToStringField(3)); | |
891 assertFalse(testMapOrBuilder.containsInt32ToStringField(-1)); | |
892 | |
893 assertTrue(testMapOrBuilder.containsInt32ToBytesField(1)); | |
894 assertTrue(testMapOrBuilder.containsInt32ToBytesField(2)); | |
895 assertTrue(testMapOrBuilder.containsInt32ToBytesField(3)); | |
896 assertFalse(testMapOrBuilder.containsInt32ToBytesField(-1)); | |
897 | |
898 assertTrue(testMapOrBuilder.containsInt32ToEnumField(1)); | |
899 assertTrue(testMapOrBuilder.containsInt32ToEnumField(2)); | |
900 assertTrue(testMapOrBuilder.containsInt32ToEnumField(3)); | |
901 assertFalse(testMapOrBuilder.containsInt32ToEnumField(-1)); | |
902 | |
903 assertTrue(testMapOrBuilder.containsInt32ToMessageField(1)); | |
904 assertTrue(testMapOrBuilder.containsInt32ToMessageField(2)); | |
905 assertTrue(testMapOrBuilder.containsInt32ToMessageField(3)); | |
906 assertFalse(testMapOrBuilder.containsInt32ToMessageField(-1)); | |
907 | |
908 assertTrue(testMapOrBuilder.containsStringToInt32Field("1")); | |
909 assertTrue(testMapOrBuilder.containsStringToInt32Field("2")); | |
910 assertTrue(testMapOrBuilder.containsStringToInt32Field("3")); | |
911 assertFalse(testMapOrBuilder.containsStringToInt32Field("-1")); | |
912 } | |
913 | |
914 public void testCount() { | |
915 TestMap.Builder builder = TestMap.newBuilder(); | |
916 assertMapCounts(0, builder); | |
917 | |
918 setMapValuesUsingAccessors(builder); | |
919 assertMapCounts(3, builder); | |
920 | |
921 TestMap message = builder.build(); | |
922 assertMapCounts(3, message); | |
923 | |
924 builder = message.toBuilder().putInt32ToInt32Field(4, 44); | |
925 assertEquals(4, builder.getInt32ToInt32FieldCount()); | |
926 assertEquals(4, builder.build().getInt32ToInt32FieldCount()); | |
927 | |
928 // already present - should be unchanged | |
929 builder.putInt32ToInt32Field(4, 44); | |
930 assertEquals(4, builder.getInt32ToInt32FieldCount()); | |
931 } | |
932 | |
933 private void assertMapCounts(int expectedCount, TestMapOrBuilder testMapOrBuil
der) { | |
934 assertEquals(expectedCount, testMapOrBuilder.getInt32ToInt32FieldCount()); | |
935 assertEquals(expectedCount, testMapOrBuilder.getInt32ToStringFieldCount()); | |
936 assertEquals(expectedCount, testMapOrBuilder.getInt32ToBytesFieldCount()); | |
937 assertEquals(expectedCount, testMapOrBuilder.getInt32ToEnumFieldCount()); | |
938 assertEquals(expectedCount, testMapOrBuilder.getInt32ToMessageFieldCount()); | |
939 assertEquals(expectedCount, testMapOrBuilder.getStringToInt32FieldCount()); | |
940 } | |
941 | |
942 public void testGetOrDefault() { | |
943 TestMap.Builder builder = TestMap.newBuilder(); | |
944 assertMapCounts(0, builder); | |
945 setMapValuesUsingAccessors(builder); | |
946 doTestGetOrDefault(builder); | |
947 doTestGetOrDefault(builder.build()); | |
948 } | |
949 | |
950 public void doTestGetOrDefault(TestMapOrBuilder testMapOrBuilder) { | |
951 assertEquals(11, testMapOrBuilder.getInt32ToInt32FieldOrDefault(1, -11)); | |
952 assertEquals(-11, testMapOrBuilder.getInt32ToInt32FieldOrDefault(-1, -11)); | |
953 | |
954 assertEquals("11", testMapOrBuilder.getInt32ToStringFieldOrDefault(1, "-11")
); | |
955 assertNull("-11", testMapOrBuilder.getInt32ToStringFieldOrDefault(-1, null))
; | |
956 | |
957 assertEquals(TestUtil.toBytes("11"), testMapOrBuilder.getInt32ToBytesFieldOr
Default(1, null)); | |
958 assertNull(testMapOrBuilder.getInt32ToBytesFieldOrDefault(-1, null)); | |
959 | |
960 assertEquals(TestMap.EnumValue.FOO, testMapOrBuilder.getInt32ToEnumFieldOrDe
fault(1, null)); | |
961 assertNull(testMapOrBuilder.getInt32ToEnumFieldOrDefault(-1, null)); | |
962 | |
963 assertEquals(MessageValue.newBuilder().setValue(11).build(), | |
964 testMapOrBuilder.getInt32ToMessageFieldOrDefault(1, null)); | |
965 assertNull(testMapOrBuilder.getInt32ToMessageFieldOrDefault(-1, null)); | |
966 | |
967 assertEquals(11, testMapOrBuilder.getStringToInt32FieldOrDefault("1", -11)); | |
968 assertEquals(-11, testMapOrBuilder.getStringToInt32FieldOrDefault("-1", -11)
); | |
969 | |
970 try { | |
971 testMapOrBuilder.getStringToInt32FieldOrDefault(null, -11); | |
972 fail(); | |
973 } catch (NullPointerException e) { | |
974 // expected | |
975 } | |
976 } | |
977 | |
978 public void testGetOrThrow() { | |
979 TestMap.Builder builder = TestMap.newBuilder(); | |
980 assertMapCounts(0, builder); | |
981 setMapValuesUsingAccessors(builder); | |
982 doTestGetOrDefault(builder); | |
983 doTestGetOrDefault(builder.build()); | |
984 } | |
985 | |
986 public void doTestGetOrThrow(TestMapOrBuilder testMapOrBuilder) { | |
987 assertEquals(11, testMapOrBuilder.getInt32ToInt32FieldOrThrow(1)); | |
988 try { | |
989 testMapOrBuilder.getInt32ToInt32FieldOrThrow(-1); | |
990 fail(); | |
991 } catch (IllegalArgumentException e) { | |
992 // expected | |
993 } | |
994 | |
995 assertEquals("11", testMapOrBuilder.getInt32ToStringFieldOrThrow(1)); | |
996 | |
997 try { | |
998 testMapOrBuilder.getInt32ToStringFieldOrThrow(-1); | |
999 fail(); | |
1000 } catch (IllegalArgumentException e) { | |
1001 // expected | |
1002 } | |
1003 | |
1004 assertEquals(TestUtil.toBytes("11"), testMapOrBuilder.getInt32ToBytesFieldOr
Throw(1)); | |
1005 | |
1006 try { | |
1007 testMapOrBuilder.getInt32ToBytesFieldOrThrow(-1); | |
1008 fail(); | |
1009 } catch (IllegalArgumentException e) { | |
1010 // expected | |
1011 } | |
1012 | |
1013 assertEquals(TestMap.EnumValue.FOO, testMapOrBuilder.getInt32ToEnumFieldOrTh
row(1)); | |
1014 try { | |
1015 testMapOrBuilder.getInt32ToEnumFieldOrThrow(-1); | |
1016 fail(); | |
1017 } catch (IllegalArgumentException e) { | |
1018 // expected | |
1019 } | |
1020 | |
1021 assertEquals(MessageValue.newBuilder().setValue(11).build(), | |
1022 testMapOrBuilder.getInt32ToMessageFieldOrThrow(1)); | |
1023 try { | |
1024 testMapOrBuilder.getInt32ToMessageFieldOrThrow(-1); | |
1025 fail(); | |
1026 } catch (IllegalArgumentException e) { | |
1027 // expected | |
1028 } | |
1029 | |
1030 assertEquals(11, testMapOrBuilder.getStringToInt32FieldOrThrow("1")); | |
1031 try { | |
1032 testMapOrBuilder.getStringToInt32FieldOrThrow("-1"); | |
1033 fail(); | |
1034 } catch (IllegalArgumentException e) { | |
1035 // expected | |
1036 } | |
1037 | |
1038 try { | |
1039 testMapOrBuilder.getStringToInt32FieldOrThrow(null); | |
1040 fail(); | |
1041 } catch (NullPointerException e) { | |
1042 // expected | |
1043 } | |
1044 } | |
1045 | |
1046 public void testPut() { | |
1047 TestMap.Builder builder = TestMap.newBuilder(); | |
1048 builder.putInt32ToInt32Field(1, 11); | |
1049 assertEquals(11, builder.getInt32ToInt32FieldOrThrow(1)); | |
1050 | |
1051 builder.putInt32ToStringField(1, "a"); | |
1052 assertEquals("a", builder.getInt32ToStringFieldOrThrow(1)); | |
1053 try { | |
1054 builder.putInt32ToStringField(1, null); | |
1055 fail(); | |
1056 } catch (NullPointerException e) { | |
1057 // expected | |
1058 } | |
1059 | |
1060 builder.putInt32ToBytesField(1, TestUtil.toBytes("11")); | |
1061 assertEquals(TestUtil.toBytes("11"), builder.getInt32ToBytesFieldOrThrow(1))
; | |
1062 try { | |
1063 builder.putInt32ToBytesField(1, null); | |
1064 fail(); | |
1065 } catch (NullPointerException e) { | |
1066 // expected | |
1067 } | |
1068 | |
1069 builder.putInt32ToEnumField(1, TestMap.EnumValue.FOO); | |
1070 assertEquals(TestMap.EnumValue.FOO, builder.getInt32ToEnumFieldOrThrow(1)); | |
1071 try { | |
1072 builder.putInt32ToEnumField(1, null); | |
1073 fail(); | |
1074 } catch (NullPointerException e) { | |
1075 // expected | |
1076 } | |
1077 | |
1078 builder.putStringToInt32Field("a", 1); | |
1079 assertEquals(1, builder.getStringToInt32FieldOrThrow("a")); | |
1080 try { | |
1081 builder.putStringToInt32Field(null, -1); | |
1082 } catch (NullPointerException e) { | |
1083 // expected | |
1084 } | |
1085 } | |
1086 | |
1087 public void testRemove() { | |
1088 TestMap.Builder builder = TestMap.newBuilder(); | |
1089 setMapValuesUsingAccessors(builder); | |
1090 assertEquals(11, builder.getInt32ToInt32FieldOrThrow(1)); | |
1091 for (int times = 0; times < 2; times++) { | |
1092 builder.removeInt32ToInt32Field(1); | |
1093 assertEquals(-1, builder.getInt32ToInt32FieldOrDefault(1, -1)); | |
1094 } | |
1095 | |
1096 assertEquals("11", builder.getInt32ToStringFieldOrThrow(1)); | |
1097 for (int times = 0; times < 2; times++) { | |
1098 builder.removeInt32ToStringField(1); | |
1099 assertNull(builder.getInt32ToStringFieldOrDefault(1, null)); | |
1100 } | |
1101 | |
1102 assertEquals(TestUtil.toBytes("11"), builder.getInt32ToBytesFieldOrThrow(1))
; | |
1103 for (int times = 0; times < 2; times++) { | |
1104 builder.removeInt32ToBytesField(1); | |
1105 assertNull(builder.getInt32ToBytesFieldOrDefault(1, null)); | |
1106 } | |
1107 | |
1108 assertEquals(TestMap.EnumValue.FOO, builder.getInt32ToEnumFieldOrThrow(1)); | |
1109 for (int times = 0; times < 2; times++) { | |
1110 builder.removeInt32ToEnumField(1); | |
1111 assertNull(builder.getInt32ToEnumFieldOrDefault(1, null)); | |
1112 } | |
1113 | |
1114 assertEquals(11, builder.getStringToInt32FieldOrThrow("1")); | |
1115 for (int times = 0; times < 2; times++) { | |
1116 builder.removeStringToInt32Field("1"); | |
1117 assertEquals(-1, builder.getStringToInt32FieldOrDefault("1", -1)); | |
1118 } | |
1119 | |
1120 try { | |
1121 builder.removeStringToInt32Field(null); | |
1122 fail(); | |
1123 } catch (NullPointerException e) { | |
1124 // expected | |
1125 } | |
1126 } | |
1127 | |
1128 // Regression test for b/20494788 | 656 // Regression test for b/20494788 |
1129 public void testMapInitializationOrder() throws Exception { | 657 public void testMapInitializationOrder() throws Exception { |
1130 assertEquals("RedactAllTypes", map_test.RedactAllTypes | 658 assertEquals("RedactAllTypes", map_test.RedactAllTypes |
1131 .getDefaultInstance().getDescriptorForType().getName()); | 659 .getDefaultInstance().getDescriptorForType().getName()); |
1132 | 660 |
1133 map_test.Message1.Builder builder = | 661 map_test.Message1.Builder builder = |
1134 map_test.Message1.newBuilder(); | 662 map_test.Message1.newBuilder(); |
1135 builder.putMapField("key", true); | 663 builder.getMutableMapField().put("key", true); |
1136 map_test.Message1 message = builder.build(); | 664 map_test.Message1 message = builder.build(); |
1137 Message mapEntry = (Message) message.getRepeatedField( | 665 Message mapEntry = (Message) message.getRepeatedField( |
1138 message.getDescriptorForType().findFieldByName("map_field"), 0); | 666 message.getDescriptorForType().findFieldByName("map_field"), 0); |
1139 assertEquals(2, mapEntry.getAllFields().size()); | 667 assertEquals(2, mapEntry.getAllFields().size()); |
1140 } | 668 } |
1141 | 669 |
1142 public void testReservedWordsFieldNames() { | |
1143 ReservedAsMapField.newBuilder().build(); | |
1144 ReservedAsMapFieldWithEnumValue.newBuilder().build(); | |
1145 } | |
1146 | |
1147 private static <K, V> Map<K, V> newMap(K key1, V value1) { | 670 private static <K, V> Map<K, V> newMap(K key1, V value1) { |
1148 Map<K, V> map = new HashMap<K, V>(); | 671 Map<K, V> map = new HashMap<K, V>(); |
1149 map.put(key1, value1); | 672 map.put(key1, value1); |
1150 return map; | 673 return map; |
1151 } | 674 } |
1152 | 675 |
1153 private static <K, V> Map<K, V> newMap(K key1, V value1, K key2, V value2) { | 676 private static <K, V> Map<K, V> newMap(K key1, V value1, K key2, V value2) { |
1154 Map<K, V> map = new HashMap<K, V>(); | 677 Map<K, V> map = new HashMap<K, V>(); |
1155 map.put(key1, value1); | 678 map.put(key1, value1); |
1156 map.put(key2, value2); | 679 map.put(key2, value2); |
1157 return map; | 680 return map; |
1158 } | 681 } |
| 682 } |
1159 | 683 |
1160 public void testGetMap() { | |
1161 TestMap.Builder builder = TestMap.newBuilder(); | |
1162 setMapValuesUsingAccessors(builder); | |
1163 assertMapValuesSet(builder); | |
1164 TestMap message = builder.build(); | |
1165 assertEquals( | |
1166 message.getStringToInt32Field(), | |
1167 message.getStringToInt32FieldMap()); | |
1168 assertEquals( | |
1169 message.getInt32ToBytesField(), | |
1170 message.getInt32ToBytesFieldMap()); | |
1171 assertEquals( | |
1172 message.getInt32ToEnumField(), | |
1173 message.getInt32ToEnumFieldMap()); | |
1174 assertEquals( | |
1175 message.getInt32ToMessageField(), | |
1176 message.getInt32ToMessageFieldMap()); | |
1177 } | |
1178 } | |
OLD | NEW |