Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(82)

Side by Side Diff: third_party/protobuf/java/core/src/test/java/com/google/protobuf/MapTest.java

Issue 2495533002: third_party/protobuf: Update to HEAD (83d681ee2c) (Closed)
Patch Set: Make chrome settings proto generated file a component Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 12 matching lines...) Expand all
23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
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
33 import com.google.protobuf.Descriptors.Descriptor; 34 import com.google.protobuf.Descriptors.Descriptor;
34 import com.google.protobuf.Descriptors.EnumDescriptor; 35 import com.google.protobuf.Descriptors.EnumDescriptor;
35 import com.google.protobuf.Descriptors.EnumValueDescriptor; 36 import com.google.protobuf.Descriptors.EnumValueDescriptor;
36 import com.google.protobuf.Descriptors.FieldDescriptor; 37 import com.google.protobuf.Descriptors.FieldDescriptor;
38 import map_test.MapTestProto.BizarroTestMap;
39 import map_test.MapTestProto.ReservedAsMapField;
40 import map_test.MapTestProto.ReservedAsMapFieldWithEnumValue;
37 import map_test.MapTestProto.TestMap; 41 import map_test.MapTestProto.TestMap;
38 import map_test.MapTestProto.TestMap.MessageValue; 42 import map_test.MapTestProto.TestMap.MessageValue;
43 import map_test.MapTestProto.TestMapOrBuilder;
39 import map_test.MapTestProto.TestOnChangeEventPropagation; 44 import map_test.MapTestProto.TestOnChangeEventPropagation;
40 import junit.framework.TestCase; 45 import java.io.ByteArrayOutputStream;
41 46 import java.io.IOException;
42 import java.util.ArrayList; 47 import java.util.ArrayList;
43 import java.util.Arrays; 48 import java.util.Arrays;
44 import java.util.HashMap; 49 import java.util.HashMap;
45 import java.util.List; 50 import java.util.List;
46 import java.util.Map; 51 import java.util.Map;
52 import junit.framework.TestCase;
47 53
48 /** 54 /**
49 * Unit tests for map fields. 55 * Unit tests for map fields.
50 */ 56 */
51 public class MapTest extends TestCase { 57 public class MapTest extends TestCase {
52 private void setMapValues(TestMap.Builder builder) { 58
59 private void setMapValuesUsingMutableMap(TestMap.Builder builder) {
53 builder.getMutableInt32ToInt32Field().put(1, 11); 60 builder.getMutableInt32ToInt32Field().put(1, 11);
54 builder.getMutableInt32ToInt32Field().put(2, 22); 61 builder.getMutableInt32ToInt32Field().put(2, 22);
55 builder.getMutableInt32ToInt32Field().put(3, 33); 62 builder.getMutableInt32ToInt32Field().put(3, 33);
56 63 //
57 builder.getMutableInt32ToStringField().put(1, "11"); 64 builder.getMutableInt32ToStringField().put(1, "11");
58 builder.getMutableInt32ToStringField().put(2, "22"); 65 builder.getMutableInt32ToStringField().put(2, "22");
59 builder.getMutableInt32ToStringField().put(3, "33"); 66 builder.getMutableInt32ToStringField().put(3, "33");
60 67 //
61 builder.getMutableInt32ToBytesField().put(1, TestUtil.toBytes("11")); 68 builder.getMutableInt32ToBytesField().put(1, TestUtil.toBytes("11"));
62 builder.getMutableInt32ToBytesField().put(2, TestUtil.toBytes("22")); 69 builder.getMutableInt32ToBytesField().put(2, TestUtil.toBytes("22"));
63 builder.getMutableInt32ToBytesField().put(3, TestUtil.toBytes("33")); 70 builder.getMutableInt32ToBytesField().put(3, TestUtil.toBytes("33"));
64 71 //
65 builder.getMutableInt32ToEnumField().put(1, TestMap.EnumValue.FOO); 72 builder.getMutableInt32ToEnumField().put(1, TestMap.EnumValue.FOO);
66 builder.getMutableInt32ToEnumField().put(2, TestMap.EnumValue.BAR); 73 builder.getMutableInt32ToEnumField().put(2, TestMap.EnumValue.BAR);
67 builder.getMutableInt32ToEnumField().put(3, TestMap.EnumValue.BAZ); 74 builder.getMutableInt32ToEnumField().put(3, TestMap.EnumValue.BAZ);
68 75 //
69 builder.getMutableInt32ToMessageField().put( 76 builder.getMutableInt32ToMessageField().put(
70 1, MessageValue.newBuilder().setValue(11).build()); 77 1, MessageValue.newBuilder().setValue(11).build());
71 builder.getMutableInt32ToMessageField().put( 78 builder.getMutableInt32ToMessageField().put(
72 2, MessageValue.newBuilder().setValue(22).build()); 79 2, MessageValue.newBuilder().setValue(22).build());
73 builder.getMutableInt32ToMessageField().put( 80 builder.getMutableInt32ToMessageField().put(
74 3, MessageValue.newBuilder().setValue(33).build()); 81 3, MessageValue.newBuilder().setValue(33).build());
75 82 //
76 builder.getMutableStringToInt32Field().put("1", 11); 83 builder.getMutableStringToInt32Field().put("1", 11);
77 builder.getMutableStringToInt32Field().put("2", 22); 84 builder.getMutableStringToInt32Field().put("2", 22);
78 builder.getMutableStringToInt32Field().put("3", 33); 85 builder.getMutableStringToInt32Field().put("3", 33);
79 } 86 }
80 87
88 private void setMapValuesUsingAccessors(TestMap.Builder builder) {
89 builder
90 .putInt32ToInt32Field(1, 11)
91 .putInt32ToInt32Field(2, 22)
92 .putInt32ToInt32Field(3, 33)
93
94 .putInt32ToStringField(1, "11")
95 .putInt32ToStringField(2, "22")
96 .putInt32ToStringField(3, "33")
97
98 .putInt32ToBytesField(1, TestUtil.toBytes("11"))
99 .putInt32ToBytesField(2, TestUtil.toBytes("22"))
100 .putInt32ToBytesField(3, TestUtil.toBytes("33"))
101
102 .putInt32ToEnumField(1, TestMap.EnumValue.FOO)
103 .putInt32ToEnumField(2, TestMap.EnumValue.BAR)
104 .putInt32ToEnumField(3, TestMap.EnumValue.BAZ)
105
106 .putInt32ToMessageField(1, MessageValue.newBuilder().setValue(11).build( ))
107 .putInt32ToMessageField(2, MessageValue.newBuilder().setValue(22).build( ))
108 .putInt32ToMessageField(3, MessageValue.newBuilder().setValue(33).build( ))
109
110 .putStringToInt32Field("1", 11)
111 .putStringToInt32Field("2", 22)
112 .putStringToInt32Field("3", 33);
113 }
114
115 public void testSetMapValues() {
116 TestMap.Builder usingMutableMapBuilder = TestMap.newBuilder();
117 setMapValuesUsingMutableMap(usingMutableMapBuilder);
118 TestMap usingMutableMap = usingMutableMapBuilder.build();
119 assertMapValuesSet(usingMutableMap);
120
121 TestMap.Builder usingAccessorsBuilder = TestMap.newBuilder();
122 setMapValuesUsingAccessors(usingAccessorsBuilder);
123 TestMap usingAccessors = usingAccessorsBuilder.build();
124 assertMapValuesSet(usingAccessors);
125
126 assertEquals(usingAccessors, usingMutableMap);
127 }
128
81 private void copyMapValues(TestMap source, TestMap.Builder destination) { 129 private void copyMapValues(TestMap source, TestMap.Builder destination) {
82 destination 130 destination
83 .putAllInt32ToInt32Field(source.getInt32ToInt32Field()) 131 .putAllInt32ToInt32Field(source.getInt32ToInt32Field())
84 .putAllInt32ToStringField(source.getInt32ToStringField()) 132 .putAllInt32ToStringField(source.getInt32ToStringField())
85 .putAllInt32ToBytesField(source.getInt32ToBytesField()) 133 .putAllInt32ToBytesField(source.getInt32ToBytesField())
86 .putAllInt32ToEnumField(source.getInt32ToEnumField()) 134 .putAllInt32ToEnumField(source.getInt32ToEnumField())
87 .putAllInt32ToMessageField(source.getInt32ToMessageField()) 135 .putAllInt32ToMessageField(source.getInt32ToMessageField())
88 .putAllStringToInt32Field(source.getStringToInt32Field()); 136 .putAllStringToInt32Field(source.getStringToInt32Field());
89 } 137 }
90 138
(...skipping 22 matching lines...) Expand all
113 assertEquals(11, message.getInt32ToMessageField().get(1).getValue()); 161 assertEquals(11, message.getInt32ToMessageField().get(1).getValue());
114 assertEquals(22, message.getInt32ToMessageField().get(2).getValue()); 162 assertEquals(22, message.getInt32ToMessageField().get(2).getValue());
115 assertEquals(33, message.getInt32ToMessageField().get(3).getValue()); 163 assertEquals(33, message.getInt32ToMessageField().get(3).getValue());
116 164
117 assertEquals(3, message.getStringToInt32Field().size()); 165 assertEquals(3, message.getStringToInt32Field().size());
118 assertEquals(11, message.getStringToInt32Field().get("1").intValue()); 166 assertEquals(11, message.getStringToInt32Field().get("1").intValue());
119 assertEquals(22, message.getStringToInt32Field().get("2").intValue()); 167 assertEquals(22, message.getStringToInt32Field().get("2").intValue());
120 assertEquals(33, message.getStringToInt32Field().get("3").intValue()); 168 assertEquals(33, message.getStringToInt32Field().get("3").intValue());
121 } 169 }
122 170
123 private void updateMapValues(TestMap.Builder builder) { 171 private void updateMapValuesUsingMutableMap(TestMap.Builder builder) {
124 builder.getMutableInt32ToInt32Field().put(1, 111); 172 builder.getMutableInt32ToInt32Field().put(1, 111);
125 builder.getMutableInt32ToInt32Field().remove(2); 173 builder.getMutableInt32ToInt32Field().remove(2);
126 builder.getMutableInt32ToInt32Field().put(4, 44); 174 builder.getMutableInt32ToInt32Field().put(4, 44);
127 175 //
128 builder.getMutableInt32ToStringField().put(1, "111"); 176 builder.getMutableInt32ToStringField().put(1, "111");
129 builder.getMutableInt32ToStringField().remove(2); 177 builder.getMutableInt32ToStringField().remove(2);
130 builder.getMutableInt32ToStringField().put(4, "44"); 178 builder.getMutableInt32ToStringField().put(4, "44");
131 179 //
132 builder.getMutableInt32ToBytesField().put(1, TestUtil.toBytes("111")); 180 builder.getMutableInt32ToBytesField().put(1, TestUtil.toBytes("111"));
133 builder.getMutableInt32ToBytesField().remove(2); 181 builder.getMutableInt32ToBytesField().remove(2);
134 builder.getMutableInt32ToBytesField().put(4, TestUtil.toBytes("44")); 182 builder.getMutableInt32ToBytesField().put(4, TestUtil.toBytes("44"));
135 183 //
136 builder.getMutableInt32ToEnumField().put(1, TestMap.EnumValue.BAR); 184 builder.getMutableInt32ToEnumField().put(1, TestMap.EnumValue.BAR);
137 builder.getMutableInt32ToEnumField().remove(2); 185 builder.getMutableInt32ToEnumField().remove(2);
138 builder.getMutableInt32ToEnumField().put(4, TestMap.EnumValue.QUX); 186 builder.getMutableInt32ToEnumField().put(4, TestMap.EnumValue.QUX);
139 187 //
140 builder.getMutableInt32ToMessageField().put( 188 builder.getMutableInt32ToMessageField().put(
141 1, MessageValue.newBuilder().setValue(111).build()); 189 1, MessageValue.newBuilder().setValue(111).build());
142 builder.getMutableInt32ToMessageField().remove(2); 190 builder.getMutableInt32ToMessageField().remove(2);
143 builder.getMutableInt32ToMessageField().put( 191 builder.getMutableInt32ToMessageField().put(
144 4, MessageValue.newBuilder().setValue(44).build()); 192 4, MessageValue.newBuilder().setValue(44).build());
145 193 //
146 builder.getMutableStringToInt32Field().put("1", 111); 194 builder.getMutableStringToInt32Field().put("1", 111);
147 builder.getMutableStringToInt32Field().remove("2"); 195 builder.getMutableStringToInt32Field().remove("2");
148 builder.getMutableStringToInt32Field().put("4", 44); 196 builder.getMutableStringToInt32Field().put("4", 44);
149 } 197 }
150 198
199 private void updateMapValuesUsingAccessors(TestMap.Builder builder) {
200 builder
201 .putInt32ToInt32Field(1, 111)
202 .removeInt32ToInt32Field(2)
203 .putInt32ToInt32Field(4, 44)
204
205 .putInt32ToStringField(1, "111")
206 .removeInt32ToStringField(2)
207 .putInt32ToStringField(4, "44")
208
209 .putInt32ToBytesField(1, TestUtil.toBytes("111"))
210 .removeInt32ToBytesField(2)
211 .putInt32ToBytesField(4, TestUtil.toBytes("44"))
212
213 .putInt32ToEnumField(1, TestMap.EnumValue.BAR)
214 .removeInt32ToEnumField(2)
215 .putInt32ToEnumField(4, TestMap.EnumValue.QUX)
216
217 .putInt32ToMessageField(1, MessageValue.newBuilder().setValue(111).build ())
218 .removeInt32ToMessageField(2)
219 .putInt32ToMessageField(4, MessageValue.newBuilder().setValue(44).build( ))
220
221 .putStringToInt32Field("1", 111)
222 .removeStringToInt32Field("2")
223 .putStringToInt32Field("4", 44);
224 }
225
226 public void testUpdateMapValues() {
227 TestMap.Builder usingMutableMapBuilder = TestMap.newBuilder();
228 setMapValuesUsingMutableMap(usingMutableMapBuilder);
229 TestMap usingMutableMap = usingMutableMapBuilder.build();
230 assertMapValuesSet(usingMutableMap);
231
232 TestMap.Builder usingAccessorsBuilder = TestMap.newBuilder();
233 setMapValuesUsingAccessors(usingAccessorsBuilder);
234 TestMap usingAccessors = usingAccessorsBuilder.build();
235 assertMapValuesSet(usingAccessors);
236
237 assertEquals(usingAccessors, usingMutableMap);
238 //
239 usingMutableMapBuilder = usingMutableMap.toBuilder();
240 updateMapValuesUsingMutableMap(usingMutableMapBuilder);
241 usingMutableMap = usingMutableMapBuilder.build();
242 assertMapValuesUpdated(usingMutableMap);
243
244 usingAccessorsBuilder = usingAccessors.toBuilder();
245 updateMapValuesUsingAccessors(usingAccessorsBuilder);
246 usingAccessors = usingAccessorsBuilder.build();
247 assertMapValuesUpdated(usingAccessors);
248
249 assertEquals(usingAccessors, usingMutableMap);
250 }
251
151 private void assertMapValuesUpdated(TestMap message) { 252 private void assertMapValuesUpdated(TestMap message) {
152 assertEquals(3, message.getInt32ToInt32Field().size()); 253 assertEquals(3, message.getInt32ToInt32Field().size());
153 assertEquals(111, message.getInt32ToInt32Field().get(1).intValue()); 254 assertEquals(111, message.getInt32ToInt32Field().get(1).intValue());
154 assertEquals(33, message.getInt32ToInt32Field().get(3).intValue()); 255 assertEquals(33, message.getInt32ToInt32Field().get(3).intValue());
155 assertEquals(44, message.getInt32ToInt32Field().get(4).intValue()); 256 assertEquals(44, message.getInt32ToInt32Field().get(4).intValue());
156 257
157 assertEquals(3, message.getInt32ToStringField().size()); 258 assertEquals(3, message.getInt32ToStringField().size());
158 assertEquals("111", message.getInt32ToStringField().get(1)); 259 assertEquals("111", message.getInt32ToStringField().get(1));
159 assertEquals("33", message.getInt32ToStringField().get(3)); 260 assertEquals("33", message.getInt32ToStringField().get(3));
160 assertEquals("44", message.getInt32ToStringField().get(4)); 261 assertEquals("44", message.getInt32ToStringField().get(4));
(...skipping 12 matching lines...) Expand all
173 assertEquals(111, message.getInt32ToMessageField().get(1).getValue()); 274 assertEquals(111, message.getInt32ToMessageField().get(1).getValue());
174 assertEquals(33, message.getInt32ToMessageField().get(3).getValue()); 275 assertEquals(33, message.getInt32ToMessageField().get(3).getValue());
175 assertEquals(44, message.getInt32ToMessageField().get(4).getValue()); 276 assertEquals(44, message.getInt32ToMessageField().get(4).getValue());
176 277
177 assertEquals(3, message.getStringToInt32Field().size()); 278 assertEquals(3, message.getStringToInt32Field().size());
178 assertEquals(111, message.getStringToInt32Field().get("1").intValue()); 279 assertEquals(111, message.getStringToInt32Field().get("1").intValue());
179 assertEquals(33, message.getStringToInt32Field().get("3").intValue()); 280 assertEquals(33, message.getStringToInt32Field().get("3").intValue());
180 assertEquals(44, message.getStringToInt32Field().get("4").intValue()); 281 assertEquals(44, message.getStringToInt32Field().get("4").intValue());
181 } 282 }
182 283
183 private void assertMapValuesCleared(TestMap message) { 284 private void assertMapValuesCleared(TestMapOrBuilder testMapOrBuilder) {
184 assertEquals(0, message.getInt32ToInt32Field().size()); 285 assertEquals(0, testMapOrBuilder.getInt32ToInt32Field().size());
185 assertEquals(0, message.getInt32ToStringField().size()); 286 assertEquals(0, testMapOrBuilder.getInt32ToInt32FieldCount());
186 assertEquals(0, message.getInt32ToBytesField().size()); 287 assertEquals(0, testMapOrBuilder.getInt32ToStringField().size());
187 assertEquals(0, message.getInt32ToEnumField().size()); 288 assertEquals(0, testMapOrBuilder.getInt32ToStringFieldCount());
188 assertEquals(0, message.getInt32ToMessageField().size()); 289 assertEquals(0, testMapOrBuilder.getInt32ToBytesField().size());
189 assertEquals(0, message.getStringToInt32Field().size()); 290 assertEquals(0, testMapOrBuilder.getInt32ToBytesFieldCount());
291 assertEquals(0, testMapOrBuilder.getInt32ToEnumField().size());
292 assertEquals(0, testMapOrBuilder.getInt32ToEnumFieldCount());
293 assertEquals(0, testMapOrBuilder.getInt32ToMessageField().size());
294 assertEquals(0, testMapOrBuilder.getInt32ToMessageFieldCount());
295 assertEquals(0, testMapOrBuilder.getStringToInt32Field().size());
296 assertEquals(0, testMapOrBuilder.getStringToInt32FieldCount());
190 } 297 }
191 298
299 public void testGetMapIsImmutable() {
300 TestMap.Builder builder = TestMap.newBuilder();
301 assertMapsAreImmutable(builder);
302 assertMapsAreImmutable(builder.build());
303
304 setMapValuesUsingAccessors(builder);
305 assertMapsAreImmutable(builder);
306 assertMapsAreImmutable(builder.build());
307 }
308
309 private void assertMapsAreImmutable(TestMapOrBuilder testMapOrBuilder) {
310 assertImmutable(testMapOrBuilder.getInt32ToInt32Field(), 1, 2);
311 assertImmutable(testMapOrBuilder.getInt32ToStringField(), 1, "2");
312 assertImmutable(testMapOrBuilder.getInt32ToBytesField(), 1, TestUtil.toBytes ("2"));
313 assertImmutable(testMapOrBuilder.getInt32ToEnumField(), 1, TestMap.EnumValue .FOO);
314 assertImmutable(
315 testMapOrBuilder.getInt32ToMessageField(), 1, MessageValue.getDefaultIns tance());
316 assertImmutable(testMapOrBuilder.getStringToInt32Field(), "1", 2);
317 }
318
319 private <K, V> void assertImmutable(Map<K, V> map, K key, V value) {
320 try {
321 map.put(key, value);
322 fail();
323 } catch (UnsupportedOperationException e) {
324 // expected
325 }
326 }
327
192 public void testMutableMapLifecycle() { 328 public void testMutableMapLifecycle() {
193 TestMap.Builder builder = TestMap.newBuilder(); 329 TestMap.Builder builder = TestMap.newBuilder();
194 Map<Integer, Integer> intMap = builder.getMutableInt32ToInt32Field(); 330 Map<Integer, Integer> intMap = builder.getMutableInt32ToInt32Field();
195 intMap.put(1, 2); 331 intMap.put(1, 2);
196 assertEquals(newMap(1, 2), builder.build().getInt32ToInt32Field()); 332 assertEquals(newMap(1, 2), builder.build().getInt32ToInt32Field());
197 try { 333 try {
198 intMap.put(2, 3); 334 intMap.put(2, 3);
199 fail(); 335 fail();
200 } catch (UnsupportedOperationException e) { 336 } catch (UnsupportedOperationException e) {
201 // expected 337 // expected
202 } 338 }
203 assertEquals(newMap(1, 2), builder.getInt32ToInt32Field()); 339 assertEquals(newMap(1, 2), builder.getInt32ToInt32Field());
204 builder.getMutableInt32ToInt32Field().put(2, 3); 340 builder.getMutableInt32ToInt32Field().put(2, 3);
205 assertEquals(newMap(1, 2, 2, 3), builder.getInt32ToInt32Field()); 341 assertEquals(newMap(1, 2, 2, 3), builder.getInt32ToInt32Field());
206 342 //
207 Map<Integer, TestMap.EnumValue> enumMap = builder.getMutableInt32ToEnumField (); 343 Map<Integer, TestMap.EnumValue> enumMap = builder.getMutableInt32ToEnumField ();
208 enumMap.put(1, TestMap.EnumValue.BAR); 344 enumMap.put(1, TestMap.EnumValue.BAR);
209 assertEquals(newMap(1, TestMap.EnumValue.BAR), builder.build().getInt32ToEnu mField()); 345 assertEquals(newMap(1, TestMap.EnumValue.BAR), builder.build().getInt32ToEnu mField());
210 try { 346 try {
211 enumMap.put(2, TestMap.EnumValue.FOO); 347 enumMap.put(2, TestMap.EnumValue.FOO);
212 fail(); 348 fail();
213 } catch (UnsupportedOperationException e) { 349 } catch (UnsupportedOperationException e) {
214 // expected 350 // expected
215 } 351 }
216 assertEquals(newMap(1, TestMap.EnumValue.BAR), builder.getInt32ToEnumField() ); 352 assertEquals(newMap(1, TestMap.EnumValue.BAR), builder.getInt32ToEnumField() );
217 builder.getMutableInt32ToEnumField().put(2, TestMap.EnumValue.FOO); 353 builder.getMutableInt32ToEnumField().put(2, TestMap.EnumValue.FOO);
218 assertEquals( 354 assertEquals(
219 newMap(1, TestMap.EnumValue.BAR, 2, TestMap.EnumValue.FOO), 355 newMap(1, TestMap.EnumValue.BAR, 2, TestMap.EnumValue.FOO),
220 builder.getInt32ToEnumField()); 356 builder.getInt32ToEnumField());
221 357 //
222 Map<Integer, String> stringMap = builder.getMutableInt32ToStringField(); 358 Map<Integer, String> stringMap = builder.getMutableInt32ToStringField();
223 stringMap.put(1, "1"); 359 stringMap.put(1, "1");
224 assertEquals(newMap(1, "1"), builder.build().getInt32ToStringField()); 360 assertEquals(newMap(1, "1"), builder.build().getInt32ToStringField());
225 try { 361 try {
226 stringMap.put(2, "2"); 362 stringMap.put(2, "2");
227 fail(); 363 fail();
228 } catch (UnsupportedOperationException e) { 364 } catch (UnsupportedOperationException e) {
229 // expected 365 // expected
230 } 366 }
231 assertEquals(newMap(1, "1"), builder.getInt32ToStringField()); 367 assertEquals(newMap(1, "1"), builder.getInt32ToStringField());
232 builder.getMutableInt32ToStringField().put(2, "2"); 368 builder.putInt32ToStringField(2, "2");
233 assertEquals( 369 assertEquals(
234 newMap(1, "1", 2, "2"), 370 newMap(1, "1", 2, "2"),
235 builder.getInt32ToStringField()); 371 builder.getInt32ToStringField());
236 372 //
237 Map<Integer, TestMap.MessageValue> messageMap = builder.getMutableInt32ToMes sageField(); 373 Map<Integer, TestMap.MessageValue> messageMap = builder.getMutableInt32ToMes sageField();
238 messageMap.put(1, TestMap.MessageValue.getDefaultInstance()); 374 messageMap.put(1, TestMap.MessageValue.getDefaultInstance());
239 assertEquals(newMap(1, TestMap.MessageValue.getDefaultInstance()), 375 assertEquals(newMap(1, TestMap.MessageValue.getDefaultInstance()),
240 builder.build().getInt32ToMessageField()); 376 builder.build().getInt32ToMessageField());
241 try { 377 try {
242 messageMap.put(2, TestMap.MessageValue.getDefaultInstance()); 378 messageMap.put(2, TestMap.MessageValue.getDefaultInstance());
243 fail(); 379 fail();
244 } catch (UnsupportedOperationException e) { 380 } catch (UnsupportedOperationException e) {
245 // expected 381 // expected
246 } 382 }
247 assertEquals(newMap(1, TestMap.MessageValue.getDefaultInstance()), 383 assertEquals(newMap(1, TestMap.MessageValue.getDefaultInstance()),
248 builder.getInt32ToMessageField()); 384 builder.getInt32ToMessageField());
249 builder.getMutableInt32ToMessageField().put(2, TestMap.MessageValue.getDefau ltInstance()); 385 builder.putInt32ToMessageField(2, TestMap.MessageValue.getDefaultInstance()) ;
250 assertEquals( 386 assertEquals(
251 newMap(1, TestMap.MessageValue.getDefaultInstance(), 387 newMap(1, TestMap.MessageValue.getDefaultInstance(),
252 2, TestMap.MessageValue.getDefaultInstance()), 388 2, TestMap.MessageValue.getDefaultInstance()),
253 builder.getInt32ToMessageField()); 389 builder.getInt32ToMessageField());
254 } 390 }
255 391 //
256 public void testMutableMapLifecycle_collections() { 392 public void testMutableMapLifecycle_collections() {
257 TestMap.Builder builder = TestMap.newBuilder(); 393 TestMap.Builder builder = TestMap.newBuilder();
258 Map<Integer, Integer> intMap = builder.getMutableInt32ToInt32Field(); 394 Map<Integer, Integer> intMap = builder.getMutableInt32ToInt32Field();
259 intMap.put(1, 2); 395 intMap.put(1, 2);
260 assertEquals(newMap(1, 2), builder.build().getInt32ToInt32Field()); 396 assertEquals(newMap(1, 2), builder.build().getInt32ToInt32Field());
261 try { 397 try {
262 intMap.remove(2); 398 intMap.remove(2);
263 fail(); 399 fail();
264 } catch (UnsupportedOperationException e) { 400 } catch (UnsupportedOperationException e) {
265 // expected 401 // expected
(...skipping 25 matching lines...) Expand all
291 try { 427 try {
292 intMap.values().iterator().remove(); 428 intMap.values().iterator().remove();
293 fail(); 429 fail();
294 } catch (UnsupportedOperationException e) { 430 } catch (UnsupportedOperationException e) {
295 // expected 431 // expected
296 } 432 }
297 assertEquals(newMap(1, 2), intMap); 433 assertEquals(newMap(1, 2), intMap);
298 assertEquals(newMap(1, 2), builder.getInt32ToInt32Field()); 434 assertEquals(newMap(1, 2), builder.getInt32ToInt32Field());
299 assertEquals(newMap(1, 2), builder.build().getInt32ToInt32Field()); 435 assertEquals(newMap(1, 2), builder.build().getInt32ToInt32Field());
300 } 436 }
301 437
438
302 public void testGettersAndSetters() throws Exception { 439 public void testGettersAndSetters() throws Exception {
303 TestMap.Builder builder = TestMap.newBuilder(); 440 TestMap.Builder builder = TestMap.newBuilder();
304 TestMap message = builder.build(); 441 TestMap message = builder.build();
305 assertMapValuesCleared(message); 442 assertMapValuesCleared(message);
306 443
307 builder = message.toBuilder(); 444 builder = message.toBuilder();
308 setMapValues(builder); 445 setMapValuesUsingAccessors(builder);
309 message = builder.build(); 446 message = builder.build();
310 assertMapValuesSet(message); 447 assertMapValuesSet(message);
311 448
312 builder = message.toBuilder(); 449 builder = message.toBuilder();
313 updateMapValues(builder); 450 updateMapValuesUsingAccessors(builder);
314 message = builder.build(); 451 message = builder.build();
315 assertMapValuesUpdated(message); 452 assertMapValuesUpdated(message);
316 453
317 builder = message.toBuilder(); 454 builder = message.toBuilder();
318 builder.clear(); 455 builder.clear();
456 assertMapValuesCleared(builder);
319 message = builder.build(); 457 message = builder.build();
320 assertMapValuesCleared(message); 458 assertMapValuesCleared(message);
321 } 459 }
322 460
323 public void testPutAll() throws Exception { 461 public void testPutAll() throws Exception {
324 TestMap.Builder sourceBuilder = TestMap.newBuilder(); 462 TestMap.Builder sourceBuilder = TestMap.newBuilder();
325 setMapValues(sourceBuilder); 463 setMapValuesUsingAccessors(sourceBuilder);
326 TestMap source = sourceBuilder.build(); 464 TestMap source = sourceBuilder.build();
465 assertMapValuesSet(source);
327 466
328 TestMap.Builder destination = TestMap.newBuilder(); 467 TestMap.Builder destination = TestMap.newBuilder();
329 copyMapValues(source, destination); 468 copyMapValues(source, destination);
330 assertMapValuesSet(destination.build()); 469 assertMapValuesSet(destination.build());
331 } 470 }
332 471
333 public void testPutAllForUnknownEnumValues() throws Exception { 472 public void testPutAllForUnknownEnumValues() throws Exception {
334 TestMap.Builder sourceBuilder = TestMap.newBuilder(); 473 TestMap source = TestMap.newBuilder()
335 sourceBuilder.getMutableInt32ToEnumFieldValue().put(0, 0); 474 .putAllInt32ToEnumFieldValue(newMap(
336 sourceBuilder.getMutableInt32ToEnumFieldValue().put(1, 1); 475 0, 0,
337 sourceBuilder.getMutableInt32ToEnumFieldValue().put(2, 1000); // unknown va lue. 476 1, 1,
338 TestMap source = sourceBuilder.build(); 477 2, 1000)) // unknown value.
478 .build();
339 479
340 TestMap.Builder destinationBuilder = TestMap.newBuilder(); 480 TestMap destination = TestMap.newBuilder()
341 destinationBuilder.putAllInt32ToEnumFieldValue(source.getInt32ToEnumFieldVal ue()); 481 .putAllInt32ToEnumFieldValue(source.getInt32ToEnumFieldValue())
342 TestMap destination = destinationBuilder.build(); 482 .build();
343 483
344 assertEquals(0, destination.getInt32ToEnumFieldValue().get(0).intValue()); 484 assertEquals(0, destination.getInt32ToEnumFieldValue().get(0).intValue());
345 assertEquals(1, destination.getInt32ToEnumFieldValue().get(1).intValue()); 485 assertEquals(1, destination.getInt32ToEnumFieldValue().get(1).intValue());
346 assertEquals(1000, destination.getInt32ToEnumFieldValue().get(2).intValue()) ; 486 assertEquals(1000, destination.getInt32ToEnumFieldValue().get(2).intValue()) ;
487 assertEquals(3, destination.getInt32ToEnumFieldCount());
488 }
489
490 public void testPutForUnknownEnumValues() throws Exception {
491 TestMap.Builder builder = TestMap.newBuilder()
492 .putInt32ToEnumFieldValue(0, 0)
493 .putInt32ToEnumFieldValue(1, 1);
494
495 try {
496 builder.putInt32ToEnumFieldValue(2, 1000); // unknown value.
497 fail();
498 } catch (IllegalArgumentException e) {
499 // expected
500 }
501
502 TestMap message = builder.build();
503 assertEquals(0, message.getInt32ToEnumFieldValueOrThrow(0));
504 assertEquals(1, message.getInt32ToEnumFieldValueOrThrow(1));
505 assertEquals(2, message.getInt32ToEnumFieldCount());
506 }
507
508 public void testPutChecksNullKeysAndValues() throws Exception {
509 TestMap.Builder builder = TestMap.newBuilder();
510
511 try {
512 builder.putInt32ToStringField(1, null);
513 fail();
514 } catch (NullPointerException e) {
515 // expected.
516 }
517
518 try {
519 builder.putInt32ToBytesField(1, null);
520 fail();
521 } catch (NullPointerException e) {
522 // expected.
523 }
524
525 try {
526 builder.putInt32ToEnumField(1, null);
527 fail();
528 } catch (NullPointerException e) {
529 // expected.
530 }
531
532 try {
533 builder.putInt32ToMessageField(1, null);
534 fail();
535 } catch (NullPointerException e) {
536 // expected.
537 }
538
539 try {
540 builder.putStringToInt32Field(null, 1);
541 fail();
542 } catch (NullPointerException e) {
543 // expected.
544 }
347 } 545 }
348 546
349 public void testSerializeAndParse() throws Exception { 547 public void testSerializeAndParse() throws Exception {
350 TestMap.Builder builder = TestMap.newBuilder(); 548 TestMap.Builder builder = TestMap.newBuilder();
351 setMapValues(builder); 549 setMapValuesUsingAccessors(builder);
352 TestMap message = builder.build(); 550 TestMap message = builder.build();
353 assertEquals(message.getSerializedSize(), message.toByteString().size()); 551 assertEquals(message.getSerializedSize(), message.toByteString().size());
354 message = TestMap.parser().parseFrom(message.toByteString()); 552 message = TestMap.parser().parseFrom(message.toByteString());
355 assertMapValuesSet(message); 553 assertMapValuesSet(message);
356 554
357 builder = message.toBuilder(); 555 builder = message.toBuilder();
358 updateMapValues(builder); 556 updateMapValuesUsingAccessors(builder);
359 message = builder.build(); 557 message = builder.build();
360 assertEquals(message.getSerializedSize(), message.toByteString().size()); 558 assertEquals(message.getSerializedSize(), message.toByteString().size());
361 message = TestMap.parser().parseFrom(message.toByteString()); 559 message = TestMap.parser().parseFrom(message.toByteString());
362 assertMapValuesUpdated(message); 560 assertMapValuesUpdated(message);
363 561
364 builder = message.toBuilder(); 562 builder = message.toBuilder();
365 builder.clear(); 563 builder.clear();
366 message = builder.build(); 564 message = builder.build();
367 assertEquals(message.getSerializedSize(), message.toByteString().size()); 565 assertEquals(message.getSerializedSize(), message.toByteString().size());
368 message = TestMap.parser().parseFrom(message.toByteString()); 566 message = TestMap.parser().parseFrom(message.toByteString());
369 assertMapValuesCleared(message); 567 assertMapValuesCleared(message);
370 } 568 }
371 569
570 private TestMap tryParseTestMap(BizarroTestMap bizarroMap) throws IOException {
571 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
572 CodedOutputStream output = CodedOutputStream.newInstance(byteArrayOutputStre am);
573 bizarroMap.writeTo(output);
574 output.flush();
575 return TestMap.parser().parseFrom(ByteString.copyFrom(byteArrayOutputStream. toByteArray()));
576 }
577
578 public void testParseError() throws Exception {
579 ByteString bytes = TestUtil.toBytes("SOME BYTES");
580 String stringKey = "a string key";
581
582 TestMap map = tryParseTestMap(BizarroTestMap.newBuilder()
583 .putInt32ToInt32Field(5, bytes)
584 .build());
585 assertEquals(map.getInt32ToInt32FieldOrDefault(5, -1), 0);
586
587 map = tryParseTestMap(BizarroTestMap.newBuilder()
588 .putInt32ToStringField(stringKey, 5)
589 .build());
590 assertEquals(map.getInt32ToStringFieldOrDefault(0, null), "");
591
592 map = tryParseTestMap(BizarroTestMap.newBuilder()
593 .putInt32ToBytesField(stringKey, 5)
594 .build());
595 assertEquals(map.getInt32ToBytesFieldOrDefault(0, null), ByteString.EMPTY);
596
597 map = tryParseTestMap(BizarroTestMap.newBuilder()
598 .putInt32ToEnumField(stringKey, bytes)
599 .build());
600 assertEquals(map.getInt32ToEnumFieldOrDefault(0, null), TestMap.EnumValue.FO O);
601
602 try {
603 tryParseTestMap(BizarroTestMap.newBuilder()
604 .putInt32ToMessageField(stringKey, bytes)
605 .build());
606 fail();
607 } catch (InvalidProtocolBufferException expected) {
608 assertTrue(expected.getUnfinishedMessage() instanceof TestMap);
609 map = (TestMap) expected.getUnfinishedMessage();
610 assertTrue(map.getInt32ToMessageField().isEmpty());
611 }
612
613 map = tryParseTestMap(BizarroTestMap.newBuilder()
614 .putStringToInt32Field(stringKey, bytes)
615 .build());
616 assertEquals(map.getStringToInt32FieldOrDefault(stringKey, -1), 0);
617 }
618
372 public void testMergeFrom() throws Exception { 619 public void testMergeFrom() throws Exception {
373 TestMap.Builder builder = TestMap.newBuilder(); 620 TestMap.Builder builder = TestMap.newBuilder();
374 setMapValues(builder); 621 setMapValuesUsingAccessors(builder);
375 TestMap message = builder.build(); 622 TestMap message = builder.build();
376 623
377 TestMap.Builder other = TestMap.newBuilder(); 624 TestMap.Builder other = TestMap.newBuilder();
378 other.mergeFrom(message); 625 other.mergeFrom(message);
379 assertMapValuesSet(other.build()); 626 assertMapValuesSet(other.build());
380 } 627 }
381 628
382 public void testEqualsAndHashCode() throws Exception { 629 public void testEqualsAndHashCode() throws Exception {
383 // Test that generated equals() and hashCode() will disregard the order 630 // Test that generated equals() and hashCode() will disregard the order
384 // of map entries when comparing/hashing map fields. 631 // of map entries when comparing/hashing map fields.
385 632
386 // We can't control the order of elements in a HashMap. The best we can do 633 // We can't control the order of elements in a HashMap. The best we can do
387 // here is to add elements in different order. 634 // here is to add elements in different order.
388 TestMap.Builder b1 = TestMap.newBuilder(); 635 TestMap.Builder b1 = TestMap.newBuilder()
389 b1.getMutableInt32ToInt32Field().put(1, 2); 636 .putInt32ToInt32Field(1, 2)
390 b1.getMutableInt32ToInt32Field().put(3, 4); 637 .putInt32ToInt32Field(3, 4)
391 b1.getMutableInt32ToInt32Field().put(5, 6); 638 .putInt32ToInt32Field(5, 6);
392 TestMap m1 = b1.build(); 639 TestMap m1 = b1.build();
393 640
394 TestMap.Builder b2 = TestMap.newBuilder(); 641 TestMap.Builder b2 = TestMap.newBuilder()
395 b2.getMutableInt32ToInt32Field().put(5, 6); 642 .putInt32ToInt32Field(5, 6)
396 b2.getMutableInt32ToInt32Field().put(1, 2); 643 .putInt32ToInt32Field(1, 2)
397 b2.getMutableInt32ToInt32Field().put(3, 4); 644 .putInt32ToInt32Field(3, 4);
398 TestMap m2 = b2.build(); 645 TestMap m2 = b2.build();
399 646
400 assertEquals(m1, m2); 647 assertEquals(m1, m2);
401 assertEquals(m1.hashCode(), m2.hashCode()); 648 assertEquals(m1.hashCode(), m2.hashCode());
402 649
403 // Make sure we did compare map fields. 650 // Make sure we did compare map fields.
404 b2.getMutableInt32ToInt32Field().put(1, 0); 651 b2.putInt32ToInt32Field(1, 0);
405 m2 = b2.build(); 652 m2 = b2.build();
406 assertFalse(m1.equals(m2)); 653 assertFalse(m1.equals(m2));
407 // Don't check m1.hashCode() != m2.hashCode() because it's not guaranteed 654 // Don't check m1.hashCode() != m2.hashCode() because it's not guaranteed
408 // to be different. 655 // to be different.
409 656
410 // Regression test for b/18549190: if a map is a subset of the other map, 657 // Regression test for b/18549190: if a map is a subset of the other map,
411 // equals() should return false. 658 // equals() should return false.
412 b2.getMutableInt32ToInt32Field().remove(1); 659 b2.removeInt32ToInt32Field(1);
413 m2 = b2.build(); 660 m2 = b2.build();
414 assertFalse(m1.equals(m2)); 661 assertFalse(m1.equals(m2));
415 assertFalse(m2.equals(m1)); 662 assertFalse(m2.equals(m1));
416 } 663 }
417 664
418 public void testNestedBuilderOnChangeEventPropagation() { 665 public void testNestedBuilderOnChangeEventPropagation() {
419 TestOnChangeEventPropagation.Builder parent = 666 TestOnChangeEventPropagation.Builder parent =
420 TestOnChangeEventPropagation.newBuilder(); 667 TestOnChangeEventPropagation.newBuilder();
421 parent.getOptionalMessageBuilder().getMutableInt32ToInt32Field().put(1, 2); 668 parent.getOptionalMessageBuilder().putInt32ToInt32Field(1, 2);
422 TestOnChangeEventPropagation message = parent.build(); 669 TestOnChangeEventPropagation message = parent.build();
423 assertEquals(2, message.getOptionalMessage().getInt32ToInt32Field().get(1).i ntValue()); 670 assertEquals(2, message.getOptionalMessage().getInt32ToInt32Field().get(1).i ntValue());
424 671
425 // Make a change using nested builder. 672 // Make a change using nested builder.
426 parent.getOptionalMessageBuilder().getMutableInt32ToInt32Field().put(1, 3); 673 parent.getOptionalMessageBuilder().putInt32ToInt32Field(1, 3);
427 674
428 // Should be able to observe the change. 675 // Should be able to observe the change.
429 message = parent.build(); 676 message = parent.build();
430 assertEquals(3, message.getOptionalMessage().getInt32ToInt32Field().get(1).i ntValue()); 677 assertEquals(3, message.getOptionalMessage().getInt32ToInt32Field().get(1).i ntValue());
431 678
432 // Make another change using mergeFrom() 679 // Make another change using mergeFrom()
433 TestMap.Builder other = TestMap.newBuilder(); 680 TestMap.Builder other = TestMap.newBuilder().putInt32ToInt32Field(1, 4);
434 other.getMutableInt32ToInt32Field().put(1, 4);
435 parent.getOptionalMessageBuilder().mergeFrom(other.build()); 681 parent.getOptionalMessageBuilder().mergeFrom(other.build());
436 682
437 // Should be able to observe the change. 683 // Should be able to observe the change.
438 message = parent.build(); 684 message = parent.build();
439 assertEquals(4, message.getOptionalMessage().getInt32ToInt32Field().get(1).i ntValue()); 685 assertEquals(4, message.getOptionalMessage().getInt32ToInt32Field().get(1).i ntValue());
440 686
441 // Make yet another change by clearing the nested builder. 687 // Make yet another change by clearing the nested builder.
442 parent.getOptionalMessageBuilder().clear(); 688 parent.getOptionalMessageBuilder().clear();
443 689
444 // Should be able to observe the change. 690 // Should be able to observe the change.
445 message = parent.build(); 691 message = parent.build();
446 assertEquals(0, message.getOptionalMessage().getInt32ToInt32Field().size()); 692 assertEquals(0, message.getOptionalMessage().getInt32ToInt32Field().size());
447 } 693 }
448 694
449 public void testNestedBuilderOnChangeEventPropagationReflection() { 695 public void testNestedBuilderOnChangeEventPropagationReflection() {
450 FieldDescriptor intMapField = f("int32_to_int32_field"); 696 FieldDescriptor intMapField = f("int32_to_int32_field");
451 // Create an outer message builder with nested builder. 697 // Create an outer message builder with nested builder.
452 TestOnChangeEventPropagation.Builder parentBuilder = 698 TestOnChangeEventPropagation.Builder parentBuilder =
453 TestOnChangeEventPropagation.newBuilder(); 699 TestOnChangeEventPropagation.newBuilder();
454 TestMap.Builder testMapBuilder = parentBuilder.getOptionalMessageBuilder(); 700 TestMap.Builder testMapBuilder = parentBuilder.getOptionalMessageBuilder();
455 701
456 // Create a map entry message. 702 // Create a map entry message.
457 TestMap.Builder entryBuilder = TestMap.newBuilder(); 703 TestMap.Builder entryBuilder = TestMap.newBuilder().putInt32ToInt32Field(1, 1);
458 entryBuilder.getMutableInt32ToInt32Field().put(1, 1);
459 704
460 // Put the entry into the nested builder. 705 // Put the entry into the nested builder.
461 testMapBuilder.addRepeatedField( 706 testMapBuilder.addRepeatedField(
462 intMapField, entryBuilder.getRepeatedField(intMapField, 0)); 707 intMapField, entryBuilder.getRepeatedField(intMapField, 0));
463 708
464 // Should be able to observe the change. 709 // Should be able to observe the change.
465 TestOnChangeEventPropagation message = parentBuilder.build(); 710 TestOnChangeEventPropagation message = parentBuilder.build();
466 assertEquals(1, message.getOptionalMessage().getInt32ToInt32Field().size()); 711 assertEquals(1, message.getOptionalMessage().getInt32ToInt32Field().size());
467 712
468 // Change the entry value. 713 // Change the entry value.
469 entryBuilder.getMutableInt32ToInt32Field().put(1, 4); 714 entryBuilder.putInt32ToInt32Field(1, 4);
470 testMapBuilder = parentBuilder.getOptionalMessageBuilder(); 715 testMapBuilder = parentBuilder.getOptionalMessageBuilder();
471 testMapBuilder.setRepeatedField( 716 testMapBuilder.setRepeatedField(
472 intMapField, 0, entryBuilder.getRepeatedField(intMapField, 0)); 717 intMapField, 0, entryBuilder.getRepeatedField(intMapField, 0));
473 718
474 // Should be able to observe the change. 719 // Should be able to observe the change.
475 message = parentBuilder.build(); 720 message = parentBuilder.build();
476 assertEquals(4, 721 assertEquals(4,
477 message.getOptionalMessage().getInt32ToInt32Field().get(1).intValue()); 722 message.getOptionalMessage().getInt32ToInt32Field().get(1).intValue());
478 723
479 // Clear the nested builder. 724 // Clear the nested builder.
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
546 Map<KeyType, ValueType> mapForValues( 791 Map<KeyType, ValueType> mapForValues(
547 KeyType key1, ValueType value1, KeyType key2, ValueType value2) { 792 KeyType key1, ValueType value1, KeyType key2, ValueType value2) {
548 Map<KeyType, ValueType> map = new HashMap<KeyType, ValueType>(); 793 Map<KeyType, ValueType> map = new HashMap<KeyType, ValueType>();
549 map.put(key1, value1); 794 map.put(key1, value1);
550 map.put(key2, value2); 795 map.put(key2, value2);
551 return map; 796 return map;
552 } 797 }
553 798
554 public void testReflectionApi() throws Exception { 799 public void testReflectionApi() throws Exception {
555 // In reflection API, map fields are just repeated message fields. 800 // In reflection API, map fields are just repeated message fields.
556 TestMap.Builder builder = TestMap.newBuilder(); 801 TestMap.Builder builder = TestMap.newBuilder()
557 builder.getMutableInt32ToInt32Field().put(1, 2); 802 .putInt32ToInt32Field(1, 2)
558 builder.getMutableInt32ToInt32Field().put(3, 4); 803 .putInt32ToInt32Field(3, 4)
559 builder.getMutableInt32ToMessageField().put( 804 .putInt32ToMessageField(11, MessageValue.newBuilder().setValue(22).build ())
560 11, MessageValue.newBuilder().setValue(22).build()); 805 .putInt32ToMessageField(33, MessageValue.newBuilder().setValue(44).build ());
561 builder.getMutableInt32ToMessageField().put(
562 33, MessageValue.newBuilder().setValue(44).build());
563 TestMap message = builder.build(); 806 TestMap message = builder.build();
564 807
565 // Test getField(), getRepeatedFieldCount(), getRepeatedField(). 808 // Test getField(), getRepeatedFieldCount(), getRepeatedField().
566 assertHasMapValues(message, "int32_to_int32_field", 809 assertHasMapValues(message, "int32_to_int32_field",
567 mapForValues(1, 2, 3, 4)); 810 mapForValues(1, 2, 3, 4));
568 assertHasMapValues(message, "int32_to_message_field", 811 assertHasMapValues(message, "int32_to_message_field",
569 mapForValues( 812 mapForValues(
570 11, MessageValue.newBuilder().setValue(22).build(), 813 11, MessageValue.newBuilder().setValue(22).build(),
571 33, MessageValue.newBuilder().setValue(44).build())); 814 33, MessageValue.newBuilder().setValue(44).build()));
572 815
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
622 builder.setRepeatedField(f("int32_to_int32_field"), i, mapEntryBuilder.bui ld()); 865 builder.setRepeatedField(f("int32_to_int32_field"), i, mapEntryBuilder.bui ld());
623 } 866 }
624 message = builder.build(); 867 message = builder.build();
625 assertEquals(11, message.getInt32ToInt32Field().get(22).intValue()); 868 assertEquals(11, message.getInt32ToInt32Field().get(22).intValue());
626 assertEquals(33, message.getInt32ToInt32Field().get(44).intValue()); 869 assertEquals(33, message.getInt32ToInt32Field().get(44).intValue());
627 assertEquals(55, message.getInt32ToInt32Field().get(55).intValue()); 870 assertEquals(55, message.getInt32ToInt32Field().get(55).intValue());
628 } 871 }
629 872
630 public void testTextFormat() throws Exception { 873 public void testTextFormat() throws Exception {
631 TestMap.Builder builder = TestMap.newBuilder(); 874 TestMap.Builder builder = TestMap.newBuilder();
632 setMapValues(builder); 875 setMapValuesUsingAccessors(builder);
633 TestMap message = builder.build(); 876 TestMap message = builder.build();
634 877
635 String textData = TextFormat.printToString(message); 878 String textData = TextFormat.printToString(message);
636 879
637 builder = TestMap.newBuilder(); 880 builder = TestMap.newBuilder();
638 TextFormat.merge(textData, builder); 881 TextFormat.merge(textData, builder);
639 message = builder.build(); 882 message = builder.build();
640 883
641 assertMapValuesSet(message); 884 assertMapValuesSet(message);
642 } 885 }
643 886
644 public void testDynamicMessage() throws Exception { 887 public void testDynamicMessage() throws Exception {
645 TestMap.Builder builder = TestMap.newBuilder(); 888 TestMap.Builder builder = TestMap.newBuilder();
646 setMapValues(builder); 889 setMapValuesUsingAccessors(builder);
647 TestMap message = builder.build(); 890 TestMap message = builder.build();
648 891
649 Message dynamicDefaultInstance = 892 Message dynamicDefaultInstance =
650 DynamicMessage.getDefaultInstance(TestMap.getDescriptor()); 893 DynamicMessage.getDefaultInstance(TestMap.getDescriptor());
651 Message dynamicMessage = dynamicDefaultInstance 894 Message dynamicMessage = dynamicDefaultInstance
652 .newBuilderForType().mergeFrom(message.toByteString()).build(); 895 .newBuilderForType().mergeFrom(message.toByteString()).build();
653 896
654 assertEquals(message, dynamicMessage); 897 assertEquals(message, dynamicMessage);
655 assertEquals(message.hashCode(), dynamicMessage.hashCode()); 898 assertEquals(message.hashCode(), dynamicMessage.hashCode());
656 } 899 }
(...skipping 24 matching lines...) Expand all
681 924
682 // Make sure we did compare map fields. 925 // Make sure we did compare map fields.
683 b2.setRepeatedField(field, 0, newMapEntry(b1, "int32_to_int32_field", 0, 0)) ; 926 b2.setRepeatedField(field, 0, newMapEntry(b1, "int32_to_int32_field", 0, 0)) ;
684 m2 = b2.build(); 927 m2 = b2.build();
685 assertFalse(m1.equals(m2)); 928 assertFalse(m1.equals(m2));
686 // Don't check m1.hashCode() != m2.hashCode() because it's not guaranteed 929 // Don't check m1.hashCode() != m2.hashCode() because it's not guaranteed
687 // to be different. 930 // to be different.
688 } 931 }
689 932
690 public void testUnknownEnumValues() throws Exception { 933 public void testUnknownEnumValues() throws Exception {
691 TestMap.Builder builder = TestMap.newBuilder(); 934 TestMap.Builder builder = TestMap.newBuilder()
692 builder.getMutableInt32ToEnumFieldValue().put(0, 0); 935 .putAllInt32ToEnumFieldValue(newMap(
693 builder.getMutableInt32ToEnumFieldValue().put(1, 1); 936 0, 0,
694 builder.getMutableInt32ToEnumFieldValue().put(2, 1000); // unknown value. 937 1, 1,
938 2, 1000)); // unknown value.
695 TestMap message = builder.build(); 939 TestMap message = builder.build();
696 940
697 assertEquals(TestMap.EnumValue.FOO, 941 assertEquals(TestMap.EnumValue.FOO,
698 message.getInt32ToEnumField().get(0)); 942 message.getInt32ToEnumField().get(0));
699 assertEquals(TestMap.EnumValue.BAR, 943 assertEquals(TestMap.EnumValue.BAR,
700 message.getInt32ToEnumField().get(1)); 944 message.getInt32ToEnumField().get(1));
701 assertEquals(TestMap.EnumValue.UNRECOGNIZED, 945 assertEquals(TestMap.EnumValue.UNRECOGNIZED,
702 message.getInt32ToEnumField().get(2)); 946 message.getInt32ToEnumField().get(2));
703 assertEquals(1000, message.getInt32ToEnumFieldValue().get(2).intValue()); 947 assertEquals(1000, message.getInt32ToEnumFieldValue().get(2).intValue());
704 948
705 // Unknown enum values should be preserved after: 949 // Unknown enum values should be preserved after:
706 // 1. Serialization and parsing. 950 // 1. Serialization and parsing.
707 // 2. toBuild(). 951 // 2. toBuild().
708 // 3. mergeFrom(). 952 // 3. mergeFrom().
709 message = TestMap.parseFrom(message.toByteString()); 953 message = TestMap.parseFrom(message.toByteString());
710 assertEquals(1000, message.getInt32ToEnumFieldValue().get(2).intValue()); 954 assertEquals(1000, message.getInt32ToEnumFieldValue().get(2).intValue());
711 builder = message.toBuilder(); 955 builder = message.toBuilder();
712 assertEquals(1000, builder.getInt32ToEnumFieldValue().get(2).intValue()); 956 assertEquals(1000, builder.getInt32ToEnumFieldValue().get(2).intValue());
713 builder = TestMap.newBuilder().mergeFrom(message); 957 builder = TestMap.newBuilder().mergeFrom(message);
714 assertEquals(1000, builder.getInt32ToEnumFieldValue().get(2).intValue()); 958 assertEquals(1000, builder.getInt32ToEnumFieldValue().get(2).intValue());
715 959
716 // hashCode()/equals() should take unknown enum values into account. 960 // hashCode()/equals() should take unknown enum values into account.
717 builder.getMutableInt32ToEnumFieldValue().put(2, 1001); 961 builder.putAllInt32ToEnumFieldValue(newMap(2, 1001));
718 TestMap message2 = builder.build(); 962 TestMap message2 = builder.build();
719 assertFalse(message.hashCode() == message2.hashCode()); 963 assertFalse(message.hashCode() == message2.hashCode());
720 assertFalse(message.equals(message2)); 964 assertFalse(message.equals(message2));
721 // Unknown values will be converted to UNRECOGNIZED so the resulted enum map 965 // Unknown values will be converted to UNRECOGNIZED so the resulted enum map
722 // should be the same. 966 // should be the same.
723 assertTrue(message.getInt32ToEnumField().equals(message2.getInt32ToEnumField ())); 967 assertTrue(message.getInt32ToEnumField().equals(message2.getInt32ToEnumField ()));
724 } 968 }
725 969
726 public void testUnknownEnumValuesInReflectionApi() throws Exception { 970 public void testUnknownEnumValuesInReflectionApi() throws Exception {
727 Descriptor descriptor = TestMap.getDescriptor(); 971 Descriptor descriptor = TestMap.getDescriptor();
728 EnumDescriptor enumDescriptor = TestMap.EnumValue.getDescriptor(); 972 EnumDescriptor enumDescriptor = TestMap.EnumValue.getDescriptor();
729 FieldDescriptor field = descriptor.findFieldByName("int32_to_enum_field"); 973 FieldDescriptor field = descriptor.findFieldByName("int32_to_enum_field");
730 974
731 Map<Integer, Integer> data = new HashMap<Integer, Integer>(); 975 Map<Integer, Integer> data = newMap(
732 data.put(0, 0); 976 0, 0,
733 data.put(1, 1); 977 1, 1,
734 data.put(2, 1000); // unknown value. 978 2, 1000); // unknown value
735 979
736 TestMap.Builder builder = TestMap.newBuilder(); 980 TestMap.Builder builder = TestMap.newBuilder()
737 for (Map.Entry<Integer, Integer> entry : data.entrySet()) { 981 .putAllInt32ToEnumFieldValue(data);
738 builder.getMutableInt32ToEnumFieldValue().put(entry.getKey(), entry.getVal ue());
739 }
740 982
741 // Try to read unknown enum values using reflection API. 983 // Try to read unknown enum values using reflection API.
742 for (int i = 0; i < builder.getRepeatedFieldCount(field); i++) { 984 for (int i = 0; i < builder.getRepeatedFieldCount(field); i++) {
743 Message mapEntry = (Message) builder.getRepeatedField(field, i); 985 Message mapEntry = (Message) builder.getRepeatedField(field, i);
744 int key = ((Integer) getFieldValue(mapEntry, "key")).intValue(); 986 int key = ((Integer) getFieldValue(mapEntry, "key")).intValue();
745 int value = ((EnumValueDescriptor) getFieldValue(mapEntry, "value")).getNu mber(); 987 int value = ((EnumValueDescriptor) getFieldValue(mapEntry, "value")).getNu mber();
746 assertEquals(data.get(key).intValue(), value); 988 assertEquals(data.get(key).intValue(), value);
747 Message.Builder mapEntryBuilder = mapEntry.toBuilder(); 989 Message.Builder mapEntryBuilder = mapEntry.toBuilder();
748 // Increase the value by 1. 990 // Increase the value by 1.
749 setFieldValue(mapEntryBuilder, "value", 991 setFieldValue(mapEntryBuilder, "value",
750 enumDescriptor.findValueByNumberCreatingIfUnknown(value + 1)); 992 enumDescriptor.findValueByNumberCreatingIfUnknown(value + 1));
751 builder.setRepeatedField(field, i, mapEntryBuilder.build()); 993 builder.setRepeatedField(field, i, mapEntryBuilder.build());
752 } 994 }
753 995
754 // Verify that enum values have been successfully updated. 996 // Verify that enum values have been successfully updated.
755 TestMap message = builder.build(); 997 TestMap message = builder.build();
756 for (Map.Entry<Integer, Integer> entry : message.getInt32ToEnumFieldValue(). entrySet()) { 998 for (Map.Entry<Integer, Integer> entry : message.getInt32ToEnumFieldValue(). entrySet()) {
757 assertEquals(data.get(entry.getKey()) + 1, entry.getValue().intValue()); 999 assertEquals(data.get(entry.getKey()) + 1, entry.getValue().intValue());
758 } 1000 }
759 } 1001 }
760 1002
761 public void testIterationOrder() throws Exception { 1003 public void testIterationOrder() throws Exception {
762 TestMap.Builder builder = TestMap.newBuilder(); 1004 TestMap.Builder builder = TestMap.newBuilder();
763 setMapValues(builder); 1005 setMapValuesUsingAccessors(builder);
764 TestMap message = builder.build(); 1006 TestMap message = builder.build();
765 1007
766 assertEquals(Arrays.asList("1", "2", "3"), 1008 assertEquals(Arrays.asList("1", "2", "3"),
767 new ArrayList<String>(message.getStringToInt32Field().keySet())); 1009 new ArrayList<String>(message.getStringToInt32Field().keySet()));
768 } 1010 }
769 1011
1012 public void testGetMap() {
1013 TestMap.Builder builder = TestMap.newBuilder();
1014 setMapValuesUsingAccessors(builder);
1015 TestMap message = builder.build();
1016 assertEquals(
1017 message.getStringToInt32Field(),
1018 message.getStringToInt32FieldMap());
1019 assertEquals(
1020 message.getInt32ToBytesField(),
1021 message.getInt32ToBytesFieldMap());
1022 assertEquals(
1023 message.getInt32ToEnumField(),
1024 message.getInt32ToEnumFieldMap());
1025 assertEquals(
1026 message.getInt32ToEnumFieldValue(),
1027 message.getInt32ToEnumFieldValueMap());
1028 assertEquals(
1029 message.getInt32ToMessageField(),
1030 message.getInt32ToMessageFieldMap());
1031 }
1032
1033 public void testContains() {
1034 TestMap.Builder builder = TestMap.newBuilder();
1035 setMapValuesUsingAccessors(builder);
1036 assertMapContainsSetValues(builder);
1037 assertMapContainsSetValues(builder.build());
1038 }
1039
1040 private void assertMapContainsSetValues(TestMapOrBuilder testMapOrBuilder) {
1041 assertTrue(testMapOrBuilder.containsInt32ToInt32Field(1));
1042 assertTrue(testMapOrBuilder.containsInt32ToInt32Field(2));
1043 assertTrue(testMapOrBuilder.containsInt32ToInt32Field(3));
1044 assertFalse(testMapOrBuilder.containsInt32ToInt32Field(-1));
1045
1046 assertTrue(testMapOrBuilder.containsInt32ToStringField(1));
1047 assertTrue(testMapOrBuilder.containsInt32ToStringField(2));
1048 assertTrue(testMapOrBuilder.containsInt32ToStringField(3));
1049 assertFalse(testMapOrBuilder.containsInt32ToStringField(-1));
1050
1051 assertTrue(testMapOrBuilder.containsInt32ToBytesField(1));
1052 assertTrue(testMapOrBuilder.containsInt32ToBytesField(2));
1053 assertTrue(testMapOrBuilder.containsInt32ToBytesField(3));
1054 assertFalse(testMapOrBuilder.containsInt32ToBytesField(-1));
1055
1056 assertTrue(testMapOrBuilder.containsInt32ToEnumField(1));
1057 assertTrue(testMapOrBuilder.containsInt32ToEnumField(2));
1058 assertTrue(testMapOrBuilder.containsInt32ToEnumField(3));
1059 assertFalse(testMapOrBuilder.containsInt32ToEnumField(-1));
1060
1061 assertTrue(testMapOrBuilder.containsInt32ToMessageField(1));
1062 assertTrue(testMapOrBuilder.containsInt32ToMessageField(2));
1063 assertTrue(testMapOrBuilder.containsInt32ToMessageField(3));
1064 assertFalse(testMapOrBuilder.containsInt32ToMessageField(-1));
1065
1066 assertTrue(testMapOrBuilder.containsStringToInt32Field("1"));
1067 assertTrue(testMapOrBuilder.containsStringToInt32Field("2"));
1068 assertTrue(testMapOrBuilder.containsStringToInt32Field("3"));
1069 assertFalse(testMapOrBuilder.containsStringToInt32Field("-1"));
1070 }
1071
1072 public void testCount() {
1073 TestMap.Builder builder = TestMap.newBuilder();
1074 assertMapCounts(0, builder);
1075
1076 setMapValuesUsingAccessors(builder);
1077 assertMapCounts(3, builder);
1078
1079 TestMap message = builder.build();
1080 assertMapCounts(3, message);
1081
1082 builder = message.toBuilder().putInt32ToInt32Field(4, 44);
1083 assertEquals(4, builder.getInt32ToInt32FieldCount());
1084 assertEquals(4, builder.build().getInt32ToInt32FieldCount());
1085
1086 // already present - should be unchanged
1087 builder.putInt32ToInt32Field(4, 44);
1088 assertEquals(4, builder.getInt32ToInt32FieldCount());
1089 }
1090
1091 private void assertMapCounts(int expectedCount, TestMapOrBuilder testMapOrBuil der) {
1092 assertEquals(expectedCount, testMapOrBuilder.getInt32ToInt32FieldCount());
1093 assertEquals(expectedCount, testMapOrBuilder.getInt32ToStringFieldCount());
1094 assertEquals(expectedCount, testMapOrBuilder.getInt32ToBytesFieldCount());
1095 assertEquals(expectedCount, testMapOrBuilder.getInt32ToEnumFieldCount());
1096 assertEquals(expectedCount, testMapOrBuilder.getInt32ToMessageFieldCount());
1097 assertEquals(expectedCount, testMapOrBuilder.getStringToInt32FieldCount());
1098 }
1099
1100 public void testGetOrDefault() {
1101 TestMap.Builder builder = TestMap.newBuilder();
1102 assertMapCounts(0, builder);
1103 setMapValuesUsingAccessors(builder);
1104 doTestGetOrDefault(builder);
1105 doTestGetOrDefault(builder.build());
1106 }
1107
1108 public void doTestGetOrDefault(TestMapOrBuilder testMapOrBuilder) {
1109 assertEquals(11, testMapOrBuilder.getInt32ToInt32FieldOrDefault(1, -11));
1110 assertEquals(-11, testMapOrBuilder.getInt32ToInt32FieldOrDefault(-1, -11));
1111
1112 assertEquals("11", testMapOrBuilder.getInt32ToStringFieldOrDefault(1, "-11") );
1113 assertNull("-11", testMapOrBuilder.getInt32ToStringFieldOrDefault(-1, null)) ;
1114
1115 assertEquals(TestUtil.toBytes("11"), testMapOrBuilder.getInt32ToBytesFieldOr Default(1, null));
1116 assertNull(testMapOrBuilder.getInt32ToBytesFieldOrDefault(-1, null));
1117
1118 assertEquals(TestMap.EnumValue.FOO, testMapOrBuilder.getInt32ToEnumFieldOrDe fault(1, null));
1119 assertNull(testMapOrBuilder.getInt32ToEnumFieldOrDefault(-1, null));
1120
1121 assertEquals(
1122 TestMap.EnumValue.BAR.getNumber(),
1123 (int) testMapOrBuilder.getInt32ToEnumFieldValueOrDefault(2, -1));
1124 assertEquals(-1, testMapOrBuilder.getInt32ToEnumFieldValueOrDefault(-1000, - 1));
1125
1126 assertEquals(MessageValue.newBuilder().setValue(11).build(),
1127 testMapOrBuilder.getInt32ToMessageFieldOrDefault(1, null));
1128 assertNull(testMapOrBuilder.getInt32ToMessageFieldOrDefault(-1, null));
1129
1130 assertEquals(11, testMapOrBuilder.getStringToInt32FieldOrDefault("1", -11));
1131 assertEquals(-11, testMapOrBuilder.getStringToInt32FieldOrDefault("-1", -11) );
1132
1133 try {
1134 testMapOrBuilder.getStringToInt32FieldOrDefault(null, -11);
1135 fail();
1136 } catch (NullPointerException e) {
1137 // expected
1138 }
1139 }
1140
1141 public void testGetOrThrow() {
1142 TestMap.Builder builder = TestMap.newBuilder();
1143 assertMapCounts(0, builder);
1144 setMapValuesUsingAccessors(builder);
1145 doTestGetOrDefault(builder);
1146 doTestGetOrDefault(builder.build());
1147 }
1148
1149 public void doTestGetOrThrow(TestMapOrBuilder testMapOrBuilder) {
1150 assertEquals(11, testMapOrBuilder.getInt32ToInt32FieldOrThrow(1));
1151 try {
1152 testMapOrBuilder.getInt32ToInt32FieldOrThrow(-1);
1153 fail();
1154 } catch (IllegalArgumentException e) {
1155 // expected
1156 }
1157
1158 assertEquals("11", testMapOrBuilder.getInt32ToStringFieldOrThrow(1));
1159
1160 try {
1161 testMapOrBuilder.getInt32ToStringFieldOrThrow(-1);
1162 fail();
1163 } catch (IllegalArgumentException e) {
1164 // expected
1165 }
1166
1167 assertEquals(TestUtil.toBytes("11"), testMapOrBuilder.getInt32ToBytesFieldOr Throw(1));
1168
1169 try {
1170 testMapOrBuilder.getInt32ToBytesFieldOrThrow(-1);
1171 fail();
1172 } catch (IllegalArgumentException e) {
1173 // expected
1174 }
1175
1176 assertEquals(TestMap.EnumValue.FOO, testMapOrBuilder.getInt32ToEnumFieldOrTh row(1));
1177 try {
1178 testMapOrBuilder.getInt32ToEnumFieldOrThrow(-1);
1179 fail();
1180 } catch (IllegalArgumentException e) {
1181 // expected
1182 }
1183
1184 assertEquals(
1185 TestMap.EnumValue.BAR.getNumber(), testMapOrBuilder.getInt32ToEnumFieldV alueOrThrow(2));
1186 try {
1187 testMapOrBuilder.getInt32ToEnumFieldValueOrThrow(-1);
1188 fail();
1189 } catch (IllegalArgumentException e) {
1190 // expected
1191 }
1192
1193 assertEquals(MessageValue.newBuilder().setValue(11).build(),
1194 testMapOrBuilder.getInt32ToMessageFieldOrThrow(1));
1195 try {
1196 testMapOrBuilder.getInt32ToMessageFieldOrThrow(-1);
1197 fail();
1198 } catch (IllegalArgumentException e) {
1199 // expected
1200 }
1201
1202 assertEquals(11, testMapOrBuilder.getStringToInt32FieldOrThrow("1"));
1203 try {
1204 testMapOrBuilder.getStringToInt32FieldOrThrow("-1");
1205 fail();
1206 } catch (IllegalArgumentException e) {
1207 // expected
1208 }
1209
1210 try {
1211 testMapOrBuilder.getStringToInt32FieldOrThrow(null);
1212 fail();
1213 } catch (NullPointerException e) {
1214 // expected
1215 }
1216 }
1217
1218 public void testPut() {
1219 TestMap.Builder builder = TestMap.newBuilder();
1220 builder.putInt32ToInt32Field(1, 11);
1221 assertEquals(11, builder.getInt32ToInt32FieldOrThrow(1));
1222
1223 builder.putInt32ToStringField(1, "a");
1224 assertEquals("a", builder.getInt32ToStringFieldOrThrow(1));
1225 try {
1226 builder.putInt32ToStringField(1, null);
1227 fail();
1228 } catch (NullPointerException e) {
1229 // expected
1230 }
1231
1232 builder.putInt32ToBytesField(1, TestUtil.toBytes("11"));
1233 assertEquals(TestUtil.toBytes("11"), builder.getInt32ToBytesFieldOrThrow(1)) ;
1234 try {
1235 builder.putInt32ToBytesField(1, null);
1236 fail();
1237 } catch (NullPointerException e) {
1238 // expected
1239 }
1240
1241 builder.putInt32ToEnumField(1, TestMap.EnumValue.FOO);
1242 assertEquals(TestMap.EnumValue.FOO, builder.getInt32ToEnumFieldOrThrow(1));
1243 try {
1244 builder.putInt32ToEnumField(1, null);
1245 fail();
1246 } catch (NullPointerException e) {
1247 // expected
1248 }
1249
1250 builder.putInt32ToEnumFieldValue(1, TestMap.EnumValue.BAR.getNumber());
1251 assertEquals(
1252 TestMap.EnumValue.BAR.getNumber(), builder.getInt32ToEnumFieldValueOrThr ow(1));
1253 try {
1254 builder.putInt32ToEnumFieldValue(1, -1);
1255 fail();
1256 } catch (IllegalArgumentException e) {
1257 // expected
1258 }
1259
1260 builder.putStringToInt32Field("a", 1);
1261 assertEquals(1, builder.getStringToInt32FieldOrThrow("a"));
1262 try {
1263 builder.putStringToInt32Field(null, -1);
1264 } catch (NullPointerException e) {
1265 // expected
1266 }
1267 }
1268
1269 public void testRemove() {
1270 TestMap.Builder builder = TestMap.newBuilder();
1271 setMapValuesUsingAccessors(builder);
1272 assertEquals(11, builder.getInt32ToInt32FieldOrThrow(1));
1273 for (int times = 0; times < 2; times++) {
1274 builder.removeInt32ToInt32Field(1);
1275 assertEquals(-1, builder.getInt32ToInt32FieldOrDefault(1, -1));
1276 }
1277
1278 assertEquals("11", builder.getInt32ToStringFieldOrThrow(1));
1279 for (int times = 0; times < 2; times++) {
1280 builder.removeInt32ToStringField(1);
1281 assertNull(builder.getInt32ToStringFieldOrDefault(1, null));
1282 }
1283
1284 assertEquals(TestUtil.toBytes("11"), builder.getInt32ToBytesFieldOrThrow(1)) ;
1285 for (int times = 0; times < 2; times++) {
1286 builder.removeInt32ToBytesField(1);
1287 assertNull(builder.getInt32ToBytesFieldOrDefault(1, null));
1288 }
1289
1290 assertEquals(TestMap.EnumValue.FOO, builder.getInt32ToEnumFieldOrThrow(1));
1291 for (int times = 0; times < 2; times++) {
1292 builder.removeInt32ToEnumField(1);
1293 assertNull(builder.getInt32ToEnumFieldOrDefault(1, null));
1294 }
1295
1296 assertEquals(11, builder.getStringToInt32FieldOrThrow("1"));
1297 for (int times = 0; times < 2; times++) {
1298 builder.removeStringToInt32Field("1");
1299 assertEquals(-1, builder.getStringToInt32FieldOrDefault("1", -1));
1300 }
1301
1302 try {
1303 builder.removeStringToInt32Field(null);
1304 fail();
1305 } catch (NullPointerException e) {
1306 // expected
1307 }
1308 }
1309
1310 public void testReservedWordsFieldNames() {
1311 ReservedAsMapField.newBuilder().build();
1312 ReservedAsMapFieldWithEnumValue.newBuilder().build();
1313 }
1314
1315 public void testDeterministicSerialziation() throws Exception {
1316 TestMap.Builder builder = TestMap.newBuilder();
1317 // int32->int32
1318 builder.putInt32ToInt32Field(5, 1);
1319 builder.putInt32ToInt32Field(1, 1);
1320 builder.putInt32ToInt32Field(4, 1);
1321 builder.putInt32ToInt32Field(-2, 1);
1322 builder.putInt32ToInt32Field(0, 1);
1323
1324 // uint32->int32
1325 builder.putUint32ToInt32Field(5, 1);
1326 builder.putUint32ToInt32Field(1, 1);
1327 builder.putUint32ToInt32Field(4, 1);
1328 builder.putUint32ToInt32Field(-2, 1);
1329 builder.putUint32ToInt32Field(0, 1);
1330
1331 // int64->int32
1332 builder.putInt64ToInt32Field(5L, 1);
1333 builder.putInt64ToInt32Field(1L, 1);
1334 builder.putInt64ToInt32Field(4L, 1);
1335 builder.putInt64ToInt32Field(-2L, 1);
1336 builder.putInt64ToInt32Field(0L, 1);
1337
1338 // string->int32
1339 builder.putStringToInt32Field("baz", 1);
1340 builder.putStringToInt32Field("foo", 1);
1341 builder.putStringToInt32Field("bar", 1);
1342 builder.putStringToInt32Field("", 1);
1343 builder.putStringToInt32Field("hello", 1);
1344 builder.putStringToInt32Field("world", 1);
1345
1346 TestMap message = builder.build();
1347 byte[] serialized = new byte[message.getSerializedSize()];
1348 CodedOutputStream output = CodedOutputStream.newInstance(serialized);
1349 output.useDeterministicSerialization();
1350 message.writeTo(output);
1351 output.flush();
1352
1353 CodedInputStream input = CodedInputStream.newInstance(serialized);
1354 List<Integer> int32Keys = new ArrayList<Integer>();
1355 List<Integer> uint32Keys = new ArrayList<Integer>();
1356 List<Long> int64Keys = new ArrayList<Long>();
1357 List<String> stringKeys = new ArrayList<String>();
1358 int tag;
1359 while (true) {
1360 tag = input.readTag();
1361 if (tag == 0) {
1362 break;
1363 }
1364 int length = input.readRawVarint32();
1365 int oldLimit = input.pushLimit(length);
1366 switch (WireFormat.getTagFieldNumber(tag)) {
1367 case TestMap.STRING_TO_INT32_FIELD_FIELD_NUMBER:
1368 stringKeys.add(readMapStringKey(input));
1369 break;
1370 case TestMap.INT32_TO_INT32_FIELD_FIELD_NUMBER:
1371 int32Keys.add(readMapIntegerKey(input));
1372 break;
1373 case TestMap.UINT32_TO_INT32_FIELD_FIELD_NUMBER:
1374 uint32Keys.add(readMapIntegerKey(input));
1375 break;
1376 case TestMap.INT64_TO_INT32_FIELD_FIELD_NUMBER:
1377 int64Keys.add(readMapLongKey(input));
1378 break;
1379 default:
1380 fail("Unexpected fields.");
1381 }
1382 input.popLimit(oldLimit);
1383 }
1384 assertEquals(
1385 Arrays.asList(-2, 0, 1, 4, 5),
1386 int32Keys);
1387 assertEquals(
1388 Arrays.asList(-2, 0, 1, 4, 5),
1389 uint32Keys);
1390 assertEquals(
1391 Arrays.asList(-2L, 0L, 1L, 4L, 5L),
1392 int64Keys);
1393 assertEquals(
1394 Arrays.asList("", "bar", "baz", "foo", "hello", "world"),
1395 stringKeys);
1396 }
1397
1398 public void testInitFromPartialDynamicMessage() {
1399 FieldDescriptor fieldDescriptor =
1400 TestMap.getDescriptor().findFieldByNumber(TestMap.INT32_TO_MESSAGE_FIELD _FIELD_NUMBER);
1401 Descriptor mapEntryType = fieldDescriptor.getMessageType();
1402 FieldDescriptor keyField = mapEntryType.findFieldByNumber(1);
1403 FieldDescriptor valueField = mapEntryType.findFieldByNumber(2);
1404 DynamicMessage dynamicMessage =
1405 DynamicMessage.newBuilder(TestMap.getDescriptor())
1406 .addRepeatedField(
1407 fieldDescriptor,
1408 DynamicMessage.newBuilder(mapEntryType)
1409 .setField(keyField, 10)
1410 .setField(valueField, TestMap.MessageValue.newBuilder().setV alue(10).build())
1411 .build())
1412 .build();
1413 TestMap message = TestMap.newBuilder().mergeFrom(dynamicMessage).build();
1414 assertEquals(
1415 TestMap.MessageValue.newBuilder().setValue(10).build(),
1416 message.getInt32ToMessageFieldMap().get(10));
1417 }
1418
1419 public void testInitFromFullyDynamicMessage() {
1420 FieldDescriptor fieldDescriptor =
1421 TestMap.getDescriptor().findFieldByNumber(TestMap.INT32_TO_MESSAGE_FIELD _FIELD_NUMBER);
1422 Descriptor mapEntryType = fieldDescriptor.getMessageType();
1423 FieldDescriptor keyField = mapEntryType.findFieldByNumber(1);
1424 FieldDescriptor valueField = mapEntryType.findFieldByNumber(2);
1425 DynamicMessage dynamicMessage =
1426 DynamicMessage.newBuilder(TestMap.getDescriptor())
1427 .addRepeatedField(
1428 fieldDescriptor,
1429 DynamicMessage.newBuilder(mapEntryType)
1430 .setField(keyField, 10)
1431 .setField(
1432 valueField,
1433 DynamicMessage.newBuilder(TestMap.MessageValue.getDescri ptor())
1434 .setField(
1435 TestMap.MessageValue.getDescriptor().findFieldBy Name("value"), 10)
1436 .build())
1437 .build())
1438 .build();
1439 TestMap message = TestMap.newBuilder().mergeFrom(dynamicMessage).build();
1440 assertEquals(
1441 TestMap.MessageValue.newBuilder().setValue(10).build(),
1442 message.getInt32ToMessageFieldMap().get(10));
1443 }
1444
1445 private int readMapIntegerKey(CodedInputStream input) throws IOException {
1446 int tag = input.readTag();
1447 assertEquals(WireFormat.makeTag(1, WireFormat.WIRETYPE_VARINT), tag);
1448 int ret = input.readInt32();
1449 // skip the value field.
1450 input.skipField(input.readTag());
1451 assertTrue(input.isAtEnd());
1452 return ret;
1453 }
1454
1455 private long readMapLongKey(CodedInputStream input) throws IOException {
1456 int tag = input.readTag();
1457 assertEquals(WireFormat.makeTag(1, WireFormat.WIRETYPE_VARINT), tag);
1458 long ret = input.readInt64();
1459 // skip the value field.
1460 input.skipField(input.readTag());
1461 assertTrue(input.isAtEnd());
1462 return ret;
1463 }
1464
1465 private String readMapStringKey(CodedInputStream input) throws IOException {
1466 int tag = input.readTag();
1467 assertEquals(WireFormat.makeTag(1, WireFormat.WIRETYPE_LENGTH_DELIMITED), ta g);
1468 String ret = input.readString();
1469 // skip the value field.
1470 input.skipField(input.readTag());
1471 assertTrue(input.isAtEnd());
1472 return ret;
1473 }
1474
770 private static <K, V> Map<K, V> newMap(K key1, V value1) { 1475 private static <K, V> Map<K, V> newMap(K key1, V value1) {
771 Map<K, V> map = new HashMap<K, V>(); 1476 Map<K, V> map = new HashMap<K, V>();
772 map.put(key1, value1); 1477 map.put(key1, value1);
773 return map; 1478 return map;
774 } 1479 }
775 1480
776 private static <K, V> Map<K, V> newMap(K key1, V value1, K key2, V value2) { 1481 private static <K, V> Map<K, V> newMap(K key1, V value1, K key2, V value2) {
777 Map<K, V> map = new HashMap<K, V>(); 1482 Map<K, V> map = new HashMap<K, V>();
778 map.put(key1, value1); 1483 map.put(key1, value1);
779 map.put(key2, value2); 1484 map.put(key2, value2);
780 return map; 1485 return map;
781 } 1486 }
1487
1488 private static <K, V> Map<K, V> newMap(K key1, V value1, K key2, V value2, K k ey3, V value3) {
1489 Map<K, V> map = new HashMap<K, V>();
1490 map.put(key1, value1);
1491 map.put(key2, value2);
1492 map.put(key3, value3);
1493 return map;
1494 }
782 } 1495 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698