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; |
34 import map_test.MapForProto2TestProto.TestMap; | 37 import map_test.MapForProto2TestProto.TestMap; |
35 import map_test.MapForProto2TestProto.TestMap.MessageValue; | 38 import map_test.MapForProto2TestProto.TestMap.MessageValue; |
36 import map_test.MapForProto2TestProto.TestMap.MessageWithRequiredFields; | 39 import map_test.MapForProto2TestProto.TestMap.MessageWithRequiredFields; |
| 40 import map_test.MapForProto2TestProto.TestMapOrBuilder; |
37 import map_test.MapForProto2TestProto.TestRecursiveMap; | 41 import map_test.MapForProto2TestProto.TestRecursiveMap; |
38 import map_test.MapForProto2TestProto.TestUnknownEnumValue; | 42 import map_test.MapForProto2TestProto.TestUnknownEnumValue; |
39 import junit.framework.TestCase; | 43 import java.io.ByteArrayOutputStream; |
40 | 44 import java.io.IOException; |
41 import java.util.ArrayList; | 45 import java.util.ArrayList; |
42 import java.util.Arrays; | 46 import java.util.Arrays; |
43 import java.util.HashMap; | 47 import java.util.HashMap; |
44 import java.util.List; | 48 import java.util.List; |
45 import java.util.Map; | 49 import java.util.Map; |
| 50 import junit.framework.TestCase; |
46 | 51 |
47 /** | 52 /** |
48 * Unit tests for map fields in proto2 protos. | 53 * Unit tests for map fields in proto2 protos. |
49 */ | 54 */ |
50 public class MapForProto2Test extends TestCase { | 55 public class MapForProto2Test extends TestCase { |
51 private void setMapValues(TestMap.Builder builder) { | 56 |
| 57 private void setMapValuesUsingMutableMap(TestMap.Builder builder) { |
52 builder.getMutableInt32ToInt32Field().put(1, 11); | 58 builder.getMutableInt32ToInt32Field().put(1, 11); |
53 builder.getMutableInt32ToInt32Field().put(2, 22); | 59 builder.getMutableInt32ToInt32Field().put(2, 22); |
54 builder.getMutableInt32ToInt32Field().put(3, 33); | 60 builder.getMutableInt32ToInt32Field().put(3, 33); |
55 | 61 // |
56 builder.getMutableInt32ToStringField().put(1, "11"); | 62 builder.getMutableInt32ToStringField().put(1, "11"); |
57 builder.getMutableInt32ToStringField().put(2, "22"); | 63 builder.getMutableInt32ToStringField().put(2, "22"); |
58 builder.getMutableInt32ToStringField().put(3, "33"); | 64 builder.getMutableInt32ToStringField().put(3, "33"); |
59 | 65 // |
60 builder.getMutableInt32ToBytesField().put(1, TestUtil.toBytes("11")); | 66 builder.getMutableInt32ToBytesField().put(1, TestUtil.toBytes("11")); |
61 builder.getMutableInt32ToBytesField().put(2, TestUtil.toBytes("22")); | 67 builder.getMutableInt32ToBytesField().put(2, TestUtil.toBytes("22")); |
62 builder.getMutableInt32ToBytesField().put(3, TestUtil.toBytes("33")); | 68 builder.getMutableInt32ToBytesField().put(3, TestUtil.toBytes("33")); |
63 | 69 // |
64 builder.getMutableInt32ToEnumField().put(1, TestMap.EnumValue.FOO); | 70 builder.getMutableInt32ToEnumField().put(1, TestMap.EnumValue.FOO); |
65 builder.getMutableInt32ToEnumField().put(2, TestMap.EnumValue.BAR); | 71 builder.getMutableInt32ToEnumField().put(2, TestMap.EnumValue.BAR); |
66 builder.getMutableInt32ToEnumField().put(3, TestMap.EnumValue.BAZ); | 72 builder.getMutableInt32ToEnumField().put(3, TestMap.EnumValue.BAZ); |
67 | 73 // |
68 builder.getMutableInt32ToMessageField().put( | 74 builder.getMutableInt32ToMessageField().put( |
69 1, MessageValue.newBuilder().setValue(11).build()); | 75 1, MessageValue.newBuilder().setValue(11).build()); |
70 builder.getMutableInt32ToMessageField().put( | 76 builder.getMutableInt32ToMessageField().put( |
71 2, MessageValue.newBuilder().setValue(22).build()); | 77 2, MessageValue.newBuilder().setValue(22).build()); |
72 builder.getMutableInt32ToMessageField().put( | 78 builder.getMutableInt32ToMessageField().put( |
73 3, MessageValue.newBuilder().setValue(33).build()); | 79 3, MessageValue.newBuilder().setValue(33).build()); |
74 | 80 // |
75 builder.getMutableStringToInt32Field().put("1", 11); | 81 builder.getMutableStringToInt32Field().put("1", 11); |
76 builder.getMutableStringToInt32Field().put("2", 22); | 82 builder.getMutableStringToInt32Field().put("2", 22); |
77 builder.getMutableStringToInt32Field().put("3", 33); | 83 builder.getMutableStringToInt32Field().put("3", 33); |
78 } | 84 } |
79 | 85 |
| 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 |
80 private void copyMapValues(TestMap source, TestMap.Builder destination) { | 127 private void copyMapValues(TestMap source, TestMap.Builder destination) { |
81 destination | 128 destination |
82 .putAllInt32ToInt32Field(source.getInt32ToInt32Field()) | 129 .putAllInt32ToInt32Field(source.getInt32ToInt32Field()) |
83 .putAllInt32ToStringField(source.getInt32ToStringField()) | 130 .putAllInt32ToStringField(source.getInt32ToStringField()) |
84 .putAllInt32ToBytesField(source.getInt32ToBytesField()) | 131 .putAllInt32ToBytesField(source.getInt32ToBytesField()) |
85 .putAllInt32ToEnumField(source.getInt32ToEnumField()) | 132 .putAllInt32ToEnumField(source.getInt32ToEnumField()) |
86 .putAllInt32ToMessageField(source.getInt32ToMessageField()) | 133 .putAllInt32ToMessageField(source.getInt32ToMessageField()) |
87 .putAllStringToInt32Field(source.getStringToInt32Field()); | 134 .putAllStringToInt32Field(source.getStringToInt32Field()); |
88 } | 135 } |
89 | 136 |
90 private void assertMapValuesSet(TestMap message) { | 137 private void assertMapValuesSet(TestMapOrBuilder message) { |
91 assertEquals(3, message.getInt32ToInt32Field().size()); | 138 assertEquals(3, message.getInt32ToInt32Field().size()); |
92 assertEquals(11, message.getInt32ToInt32Field().get(1).intValue()); | 139 assertEquals(11, message.getInt32ToInt32Field().get(1).intValue()); |
93 assertEquals(22, message.getInt32ToInt32Field().get(2).intValue()); | 140 assertEquals(22, message.getInt32ToInt32Field().get(2).intValue()); |
94 assertEquals(33, message.getInt32ToInt32Field().get(3).intValue()); | 141 assertEquals(33, message.getInt32ToInt32Field().get(3).intValue()); |
95 | 142 |
96 assertEquals(3, message.getInt32ToStringField().size()); | 143 assertEquals(3, message.getInt32ToStringField().size()); |
97 assertEquals("11", message.getInt32ToStringField().get(1)); | 144 assertEquals("11", message.getInt32ToStringField().get(1)); |
98 assertEquals("22", message.getInt32ToStringField().get(2)); | 145 assertEquals("22", message.getInt32ToStringField().get(2)); |
99 assertEquals("33", message.getInt32ToStringField().get(3)); | 146 assertEquals("33", message.getInt32ToStringField().get(3)); |
100 | 147 |
101 assertEquals(3, message.getInt32ToBytesField().size()); | 148 assertEquals(3, message.getInt32ToBytesField().size()); |
102 assertEquals(TestUtil.toBytes("11"), message.getInt32ToBytesField().get(1)); | 149 assertEquals(TestUtil.toBytes("11"), message.getInt32ToBytesField().get(1)); |
103 assertEquals(TestUtil.toBytes("22"), message.getInt32ToBytesField().get(2)); | 150 assertEquals(TestUtil.toBytes("22"), message.getInt32ToBytesField().get(2)); |
104 assertEquals(TestUtil.toBytes("33"), message.getInt32ToBytesField().get(3)); | 151 assertEquals(TestUtil.toBytes("33"), message.getInt32ToBytesField().get(3)); |
105 | 152 |
106 assertEquals(3, message.getInt32ToEnumField().size()); | 153 assertEquals(3, message.getInt32ToEnumField().size()); |
107 assertEquals(TestMap.EnumValue.FOO, message.getInt32ToEnumField().get(1)); | 154 assertEquals(TestMap.EnumValue.FOO, message.getInt32ToEnumField().get(1)); |
108 assertEquals(TestMap.EnumValue.BAR, message.getInt32ToEnumField().get(2)); | 155 assertEquals(TestMap.EnumValue.BAR, message.getInt32ToEnumField().get(2)); |
109 assertEquals(TestMap.EnumValue.BAZ, message.getInt32ToEnumField().get(3)); | 156 assertEquals(TestMap.EnumValue.BAZ, message.getInt32ToEnumField().get(3)); |
110 | 157 |
111 assertEquals(3, message.getInt32ToMessageField().size()); | 158 assertEquals(3, message.getInt32ToMessageField().size()); |
112 assertEquals(11, message.getInt32ToMessageField().get(1).getValue()); | 159 assertEquals(11, message.getInt32ToMessageField().get(1).getValue()); |
113 assertEquals(22, message.getInt32ToMessageField().get(2).getValue()); | 160 assertEquals(22, message.getInt32ToMessageField().get(2).getValue()); |
114 assertEquals(33, message.getInt32ToMessageField().get(3).getValue()); | 161 assertEquals(33, message.getInt32ToMessageField().get(3).getValue()); |
115 | 162 |
116 assertEquals(3, message.getStringToInt32Field().size()); | 163 assertEquals(3, message.getStringToInt32Field().size()); |
117 assertEquals(11, message.getStringToInt32Field().get("1").intValue()); | 164 assertEquals(11, message.getStringToInt32Field().get("1").intValue()); |
118 assertEquals(22, message.getStringToInt32Field().get("2").intValue()); | 165 assertEquals(22, message.getStringToInt32Field().get("2").intValue()); |
119 assertEquals(33, message.getStringToInt32Field().get("3").intValue()); | 166 assertEquals(33, message.getStringToInt32Field().get("3").intValue()); |
120 } | 167 } |
121 | 168 |
122 private void updateMapValues(TestMap.Builder builder) { | 169 private void updateMapValuesUsingMutableMap(TestMap.Builder builder) { |
123 builder.getMutableInt32ToInt32Field().put(1, 111); | 170 builder.getMutableInt32ToInt32Field().put(1, 111); |
124 builder.getMutableInt32ToInt32Field().remove(2); | 171 builder.getMutableInt32ToInt32Field().remove(2); |
125 builder.getMutableInt32ToInt32Field().put(4, 44); | 172 builder.getMutableInt32ToInt32Field().put(4, 44); |
126 | 173 // |
127 builder.getMutableInt32ToStringField().put(1, "111"); | 174 builder.getMutableInt32ToStringField().put(1, "111"); |
128 builder.getMutableInt32ToStringField().remove(2); | 175 builder.getMutableInt32ToStringField().remove(2); |
129 builder.getMutableInt32ToStringField().put(4, "44"); | 176 builder.getMutableInt32ToStringField().put(4, "44"); |
130 | 177 // |
131 builder.getMutableInt32ToBytesField().put(1, TestUtil.toBytes("111")); | 178 builder.getMutableInt32ToBytesField().put(1, TestUtil.toBytes("111")); |
132 builder.getMutableInt32ToBytesField().remove(2); | 179 builder.getMutableInt32ToBytesField().remove(2); |
133 builder.getMutableInt32ToBytesField().put(4, TestUtil.toBytes("44")); | 180 builder.getMutableInt32ToBytesField().put(4, TestUtil.toBytes("44")); |
134 | 181 // |
135 builder.getMutableInt32ToEnumField().put(1, TestMap.EnumValue.BAR); | 182 builder.getMutableInt32ToEnumField().put(1, TestMap.EnumValue.BAR); |
136 builder.getMutableInt32ToEnumField().remove(2); | 183 builder.getMutableInt32ToEnumField().remove(2); |
137 builder.getMutableInt32ToEnumField().put(4, TestMap.EnumValue.QUX); | 184 builder.getMutableInt32ToEnumField().put(4, TestMap.EnumValue.QUX); |
138 | 185 // |
139 builder.getMutableInt32ToMessageField().put( | 186 builder.getMutableInt32ToMessageField().put( |
140 1, MessageValue.newBuilder().setValue(111).build()); | 187 1, MessageValue.newBuilder().setValue(111).build()); |
141 builder.getMutableInt32ToMessageField().remove(2); | 188 builder.getMutableInt32ToMessageField().remove(2); |
142 builder.getMutableInt32ToMessageField().put( | 189 builder.getMutableInt32ToMessageField().put( |
143 4, MessageValue.newBuilder().setValue(44).build()); | 190 4, MessageValue.newBuilder().setValue(44).build()); |
144 | 191 // |
145 builder.getMutableStringToInt32Field().put("1", 111); | 192 builder.getMutableStringToInt32Field().put("1", 111); |
146 builder.getMutableStringToInt32Field().remove("2"); | 193 builder.getMutableStringToInt32Field().remove("2"); |
147 builder.getMutableStringToInt32Field().put("4", 44); | 194 builder.getMutableStringToInt32Field().put("4", 44); |
148 } | 195 } |
149 | 196 |
| 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 |
150 private void assertMapValuesUpdated(TestMap message) { | 250 private void assertMapValuesUpdated(TestMap message) { |
151 assertEquals(3, message.getInt32ToInt32Field().size()); | 251 assertEquals(3, message.getInt32ToInt32Field().size()); |
152 assertEquals(111, message.getInt32ToInt32Field().get(1).intValue()); | 252 assertEquals(111, message.getInt32ToInt32Field().get(1).intValue()); |
153 assertEquals(33, message.getInt32ToInt32Field().get(3).intValue()); | 253 assertEquals(33, message.getInt32ToInt32Field().get(3).intValue()); |
154 assertEquals(44, message.getInt32ToInt32Field().get(4).intValue()); | 254 assertEquals(44, message.getInt32ToInt32Field().get(4).intValue()); |
155 | 255 |
156 assertEquals(3, message.getInt32ToStringField().size()); | 256 assertEquals(3, message.getInt32ToStringField().size()); |
157 assertEquals("111", message.getInt32ToStringField().get(1)); | 257 assertEquals("111", message.getInt32ToStringField().get(1)); |
158 assertEquals("33", message.getInt32ToStringField().get(3)); | 258 assertEquals("33", message.getInt32ToStringField().get(3)); |
159 assertEquals("44", message.getInt32ToStringField().get(4)); | 259 assertEquals("44", message.getInt32ToStringField().get(4)); |
160 | 260 |
161 assertEquals(3, message.getInt32ToBytesField().size()); | 261 assertEquals(3, message.getInt32ToBytesField().size()); |
162 assertEquals(TestUtil.toBytes("111"), message.getInt32ToBytesField().get(1))
; | 262 assertEquals(TestUtil.toBytes("111"), message.getInt32ToBytesField().get(1))
; |
163 assertEquals(TestUtil.toBytes("33"), message.getInt32ToBytesField().get(3)); | 263 assertEquals(TestUtil.toBytes("33"), message.getInt32ToBytesField().get(3)); |
164 assertEquals(TestUtil.toBytes("44"), message.getInt32ToBytesField().get(4)); | 264 assertEquals(TestUtil.toBytes("44"), message.getInt32ToBytesField().get(4)); |
165 | 265 |
166 assertEquals(3, message.getInt32ToEnumField().size()); | 266 assertEquals(3, message.getInt32ToEnumField().size()); |
167 assertEquals(TestMap.EnumValue.BAR, message.getInt32ToEnumField().get(1)); | 267 assertEquals(TestMap.EnumValue.BAR, message.getInt32ToEnumField().get(1)); |
168 assertEquals(TestMap.EnumValue.BAZ, message.getInt32ToEnumField().get(3)); | 268 assertEquals(TestMap.EnumValue.BAZ, message.getInt32ToEnumField().get(3)); |
169 assertEquals(TestMap.EnumValue.QUX, message.getInt32ToEnumField().get(4)); | 269 assertEquals(TestMap.EnumValue.QUX, message.getInt32ToEnumField().get(4)); |
170 | 270 |
171 assertEquals(3, message.getInt32ToMessageField().size()); | 271 assertEquals(3, message.getInt32ToMessageField().size()); |
172 assertEquals(111, message.getInt32ToMessageField().get(1).getValue()); | 272 assertEquals(111, message.getInt32ToMessageField().get(1).getValue()); |
173 assertEquals(33, message.getInt32ToMessageField().get(3).getValue()); | 273 assertEquals(33, message.getInt32ToMessageField().get(3).getValue()); |
174 assertEquals(44, message.getInt32ToMessageField().get(4).getValue()); | 274 assertEquals(44, message.getInt32ToMessageField().get(4).getValue()); |
175 | 275 |
176 assertEquals(3, message.getStringToInt32Field().size()); | 276 assertEquals(3, message.getStringToInt32Field().size()); |
177 assertEquals(111, message.getStringToInt32Field().get("1").intValue()); | 277 assertEquals(111, message.getStringToInt32Field().get("1").intValue()); |
178 assertEquals(33, message.getStringToInt32Field().get("3").intValue()); | 278 assertEquals(33, message.getStringToInt32Field().get("3").intValue()); |
179 assertEquals(44, message.getStringToInt32Field().get("4").intValue()); | 279 assertEquals(44, message.getStringToInt32Field().get("4").intValue()); |
180 } | 280 } |
181 | 281 |
182 private void assertMapValuesCleared(TestMap message) { | 282 private void assertMapValuesCleared(TestMapOrBuilder testMapOrBuilder) { |
183 assertEquals(0, message.getInt32ToInt32Field().size()); | 283 assertEquals(0, testMapOrBuilder.getInt32ToInt32Field().size()); |
184 assertEquals(0, message.getInt32ToStringField().size()); | 284 assertEquals(0, testMapOrBuilder.getInt32ToInt32FieldCount()); |
185 assertEquals(0, message.getInt32ToBytesField().size()); | 285 assertEquals(0, testMapOrBuilder.getInt32ToStringField().size()); |
186 assertEquals(0, message.getInt32ToEnumField().size()); | 286 assertEquals(0, testMapOrBuilder.getInt32ToStringFieldCount()); |
187 assertEquals(0, message.getInt32ToMessageField().size()); | 287 assertEquals(0, testMapOrBuilder.getInt32ToBytesField().size()); |
188 assertEquals(0, message.getStringToInt32Field().size()); | 288 assertEquals(0, testMapOrBuilder.getInt32ToBytesFieldCount()); |
| 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()); |
189 } | 295 } |
190 | 296 |
| 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 |
191 public void testMutableMapLifecycle() { | 326 public void testMutableMapLifecycle() { |
192 TestMap.Builder builder = TestMap.newBuilder(); | 327 TestMap.Builder builder = TestMap.newBuilder(); |
193 Map<Integer, Integer> intMap = builder.getMutableInt32ToInt32Field(); | 328 Map<Integer, Integer> intMap = builder.getMutableInt32ToInt32Field(); |
194 intMap.put(1, 2); | 329 intMap.put(1, 2); |
195 assertEquals(newMap(1, 2), builder.build().getInt32ToInt32Field()); | 330 assertEquals(newMap(1, 2), builder.build().getInt32ToInt32Field()); |
196 try { | 331 try { |
197 intMap.put(2, 3); | 332 intMap.put(2, 3); |
198 fail(); | 333 fail(); |
199 } catch (UnsupportedOperationException e) { | 334 } catch (UnsupportedOperationException e) { |
200 // expected | 335 // expected |
201 } | 336 } |
202 assertEquals(newMap(1, 2), builder.getInt32ToInt32Field()); | 337 assertEquals(newMap(1, 2), builder.getInt32ToInt32Field()); |
203 builder.getMutableInt32ToInt32Field().put(2, 3); | 338 builder.getMutableInt32ToInt32Field().put(2, 3); |
204 assertEquals(newMap(1, 2, 2, 3), builder.getInt32ToInt32Field()); | 339 assertEquals(newMap(1, 2, 2, 3), builder.getInt32ToInt32Field()); |
205 | 340 // |
206 Map<Integer, TestMap.EnumValue> enumMap = builder.getMutableInt32ToEnumField
(); | 341 Map<Integer, TestMap.EnumValue> enumMap = builder.getMutableInt32ToEnumField
(); |
207 enumMap.put(1, TestMap.EnumValue.BAR); | 342 enumMap.put(1, TestMap.EnumValue.BAR); |
208 assertEquals(newMap(1, TestMap.EnumValue.BAR), builder.build().getInt32ToEnu
mField()); | 343 assertEquals(newMap(1, TestMap.EnumValue.BAR), builder.build().getInt32ToEnu
mField()); |
209 try { | 344 try { |
210 enumMap.put(2, TestMap.EnumValue.FOO); | 345 enumMap.put(2, TestMap.EnumValue.FOO); |
211 fail(); | 346 fail(); |
212 } catch (UnsupportedOperationException e) { | 347 } catch (UnsupportedOperationException e) { |
213 // expected | 348 // expected |
214 } | 349 } |
215 assertEquals(newMap(1, TestMap.EnumValue.BAR), builder.getInt32ToEnumField()
); | 350 assertEquals(newMap(1, TestMap.EnumValue.BAR), builder.getInt32ToEnumField()
); |
216 builder.getMutableInt32ToEnumField().put(2, TestMap.EnumValue.FOO); | 351 builder.getMutableInt32ToEnumField().put(2, TestMap.EnumValue.FOO); |
217 assertEquals( | 352 assertEquals( |
218 newMap(1, TestMap.EnumValue.BAR, 2, TestMap.EnumValue.FOO), | 353 newMap(1, TestMap.EnumValue.BAR, 2, TestMap.EnumValue.FOO), |
219 builder.getInt32ToEnumField()); | 354 builder.getInt32ToEnumField()); |
220 | 355 // |
221 Map<Integer, String> stringMap = builder.getMutableInt32ToStringField(); | 356 Map<Integer, String> stringMap = builder.getMutableInt32ToStringField(); |
222 stringMap.put(1, "1"); | 357 stringMap.put(1, "1"); |
223 assertEquals(newMap(1, "1"), builder.build().getInt32ToStringField()); | 358 assertEquals(newMap(1, "1"), builder.build().getInt32ToStringField()); |
224 try { | 359 try { |
225 stringMap.put(2, "2"); | 360 stringMap.put(2, "2"); |
226 fail(); | 361 fail(); |
227 } catch (UnsupportedOperationException e) { | 362 } catch (UnsupportedOperationException e) { |
228 // expected | 363 // expected |
229 } | 364 } |
230 assertEquals(newMap(1, "1"), builder.getInt32ToStringField()); | 365 assertEquals(newMap(1, "1"), builder.getInt32ToStringField()); |
231 builder.getMutableInt32ToStringField().put(2, "2"); | 366 builder.getMutableInt32ToStringField().put(2, "2"); |
232 assertEquals( | 367 assertEquals( |
233 newMap(1, "1", 2, "2"), | 368 newMap(1, "1", 2, "2"), |
234 builder.getInt32ToStringField()); | 369 builder.getInt32ToStringField()); |
235 | 370 // |
236 Map<Integer, TestMap.MessageValue> messageMap = builder.getMutableInt32ToMes
sageField(); | 371 Map<Integer, TestMap.MessageValue> messageMap = builder.getMutableInt32ToMes
sageField(); |
237 messageMap.put(1, TestMap.MessageValue.getDefaultInstance()); | 372 messageMap.put(1, TestMap.MessageValue.getDefaultInstance()); |
238 assertEquals(newMap(1, TestMap.MessageValue.getDefaultInstance()), | 373 assertEquals(newMap(1, TestMap.MessageValue.getDefaultInstance()), |
239 builder.build().getInt32ToMessageField()); | 374 builder.build().getInt32ToMessageField()); |
240 try { | 375 try { |
241 messageMap.put(2, TestMap.MessageValue.getDefaultInstance()); | 376 messageMap.put(2, TestMap.MessageValue.getDefaultInstance()); |
242 fail(); | 377 fail(); |
243 } catch (UnsupportedOperationException e) { | 378 } catch (UnsupportedOperationException e) { |
244 // expected | 379 // expected |
245 } | 380 } |
246 assertEquals(newMap(1, TestMap.MessageValue.getDefaultInstance()), | 381 assertEquals(newMap(1, TestMap.MessageValue.getDefaultInstance()), |
247 builder.getInt32ToMessageField()); | 382 builder.getInt32ToMessageField()); |
248 builder.getMutableInt32ToMessageField().put(2, TestMap.MessageValue.getDefau
ltInstance()); | 383 builder.getMutableInt32ToMessageField().put(2, TestMap.MessageValue.getDefau
ltInstance()); |
249 assertEquals( | 384 assertEquals( |
250 newMap(1, TestMap.MessageValue.getDefaultInstance(), | 385 newMap(1, TestMap.MessageValue.getDefaultInstance(), |
251 2, TestMap.MessageValue.getDefaultInstance()), | 386 2, TestMap.MessageValue.getDefaultInstance()), |
252 builder.getInt32ToMessageField()); | 387 builder.getInt32ToMessageField()); |
253 } | 388 } |
254 | 389 // |
255 public void testMutableMapLifecycle_collections() { | 390 public void testMutableMapLifecycle_collections() { |
256 TestMap.Builder builder = TestMap.newBuilder(); | 391 TestMap.Builder builder = TestMap.newBuilder(); |
257 Map<Integer, Integer> intMap = builder.getMutableInt32ToInt32Field(); | 392 Map<Integer, Integer> intMap = builder.getMutableInt32ToInt32Field(); |
258 intMap.put(1, 2); | 393 intMap.put(1, 2); |
259 assertEquals(newMap(1, 2), builder.build().getInt32ToInt32Field()); | 394 assertEquals(newMap(1, 2), builder.build().getInt32ToInt32Field()); |
260 try { | 395 try { |
261 intMap.remove(2); | 396 intMap.remove(2); |
262 fail(); | 397 fail(); |
263 } catch (UnsupportedOperationException e) { | 398 } catch (UnsupportedOperationException e) { |
264 // expected | 399 // expected |
(...skipping 26 matching lines...) Expand all Loading... |
291 intMap.values().iterator().remove(); | 426 intMap.values().iterator().remove(); |
292 fail(); | 427 fail(); |
293 } catch (UnsupportedOperationException e) { | 428 } catch (UnsupportedOperationException e) { |
294 // expected | 429 // expected |
295 } | 430 } |
296 assertEquals(newMap(1, 2), intMap); | 431 assertEquals(newMap(1, 2), intMap); |
297 assertEquals(newMap(1, 2), builder.getInt32ToInt32Field()); | 432 assertEquals(newMap(1, 2), builder.getInt32ToInt32Field()); |
298 assertEquals(newMap(1, 2), builder.build().getInt32ToInt32Field()); | 433 assertEquals(newMap(1, 2), builder.build().getInt32ToInt32Field()); |
299 } | 434 } |
300 | 435 |
| 436 |
301 public void testGettersAndSetters() throws Exception { | 437 public void testGettersAndSetters() throws Exception { |
302 TestMap.Builder builder = TestMap.newBuilder(); | 438 TestMap.Builder builder = TestMap.newBuilder(); |
303 TestMap message = builder.build(); | 439 TestMap message = builder.build(); |
304 assertMapValuesCleared(message); | 440 assertMapValuesCleared(message); |
305 | 441 |
306 builder = message.toBuilder(); | 442 builder = message.toBuilder(); |
307 setMapValues(builder); | 443 setMapValuesUsingAccessors(builder); |
308 message = builder.build(); | 444 message = builder.build(); |
309 assertMapValuesSet(message); | 445 assertMapValuesSet(message); |
310 | 446 |
311 builder = message.toBuilder(); | 447 builder = message.toBuilder(); |
312 updateMapValues(builder); | 448 updateMapValuesUsingAccessors(builder); |
313 message = builder.build(); | 449 message = builder.build(); |
314 assertMapValuesUpdated(message); | 450 assertMapValuesUpdated(message); |
315 | 451 |
316 builder = message.toBuilder(); | 452 builder = message.toBuilder(); |
317 builder.clear(); | 453 builder.clear(); |
| 454 assertMapValuesCleared(builder); |
318 message = builder.build(); | 455 message = builder.build(); |
319 assertMapValuesCleared(message); | 456 assertMapValuesCleared(message); |
320 } | 457 } |
321 | 458 |
322 public void testPutAll() throws Exception { | 459 public void testPutAll() throws Exception { |
323 TestMap.Builder sourceBuilder = TestMap.newBuilder(); | 460 TestMap.Builder sourceBuilder = TestMap.newBuilder(); |
324 setMapValues(sourceBuilder); | 461 setMapValuesUsingAccessors(sourceBuilder); |
325 TestMap source = sourceBuilder.build(); | 462 TestMap source = sourceBuilder.build(); |
| 463 assertMapValuesSet(source); |
326 | 464 |
327 TestMap.Builder destination = TestMap.newBuilder(); | 465 TestMap.Builder destination = TestMap.newBuilder(); |
328 copyMapValues(source, destination); | 466 copyMapValues(source, destination); |
329 assertMapValuesSet(destination.build()); | 467 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 } |
330 } | 509 } |
331 | 510 |
332 public void testSerializeAndParse() throws Exception { | 511 public void testSerializeAndParse() throws Exception { |
333 TestMap.Builder builder = TestMap.newBuilder(); | 512 TestMap.Builder builder = TestMap.newBuilder(); |
334 setMapValues(builder); | 513 setMapValuesUsingAccessors(builder); |
335 TestMap message = builder.build(); | 514 TestMap message = builder.build(); |
336 assertEquals(message.getSerializedSize(), message.toByteString().size()); | 515 assertEquals(message.getSerializedSize(), message.toByteString().size()); |
337 message = TestMap.parser().parseFrom(message.toByteString()); | 516 message = TestMap.parser().parseFrom(message.toByteString()); |
338 assertMapValuesSet(message); | 517 assertMapValuesSet(message); |
339 | 518 |
340 builder = message.toBuilder(); | 519 builder = message.toBuilder(); |
341 updateMapValues(builder); | 520 updateMapValuesUsingAccessors(builder); |
342 message = builder.build(); | 521 message = builder.build(); |
343 assertEquals(message.getSerializedSize(), message.toByteString().size()); | 522 assertEquals(message.getSerializedSize(), message.toByteString().size()); |
344 message = TestMap.parser().parseFrom(message.toByteString()); | 523 message = TestMap.parser().parseFrom(message.toByteString()); |
345 assertMapValuesUpdated(message); | 524 assertMapValuesUpdated(message); |
346 | 525 |
347 builder = message.toBuilder(); | 526 builder = message.toBuilder(); |
348 builder.clear(); | 527 builder.clear(); |
349 message = builder.build(); | 528 message = builder.build(); |
350 assertEquals(message.getSerializedSize(), message.toByteString().size()); | 529 assertEquals(message.getSerializedSize(), message.toByteString().size()); |
351 message = TestMap.parser().parseFrom(message.toByteString()); | 530 message = TestMap.parser().parseFrom(message.toByteString()); |
352 assertMapValuesCleared(message); | 531 assertMapValuesCleared(message); |
353 } | 532 } |
354 | 533 |
| 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 |
355 public void testMergeFrom() throws Exception { | 583 public void testMergeFrom() throws Exception { |
356 TestMap.Builder builder = TestMap.newBuilder(); | 584 TestMap.Builder builder = TestMap.newBuilder(); |
357 setMapValues(builder); | 585 setMapValuesUsingAccessors(builder); |
358 TestMap message = builder.build(); | 586 TestMap message = builder.build(); |
359 | 587 |
360 TestMap.Builder other = TestMap.newBuilder(); | 588 TestMap.Builder other = TestMap.newBuilder(); |
361 other.mergeFrom(message); | 589 other.mergeFrom(message); |
362 assertMapValuesSet(other.build()); | 590 assertMapValuesSet(other.build()); |
363 } | 591 } |
364 | 592 |
365 public void testEqualsAndHashCode() throws Exception { | 593 public void testEqualsAndHashCode() throws Exception { |
366 // Test that generated equals() and hashCode() will disregard the order | 594 // Test that generated equals() and hashCode() will disregard the order |
367 // of map entries when comparing/hashing map fields. | 595 // of map entries when comparing/hashing map fields. |
368 | 596 |
369 // We can't control the order of elements in a HashMap. The best we can do | 597 // We can't control the order of elements in a HashMap. The best we can do |
370 // here is to add elements in different order. | 598 // here is to add elements in different order. |
371 TestMap.Builder b1 = TestMap.newBuilder(); | 599 TestMap.Builder b1 = TestMap.newBuilder(); |
372 b1.getMutableInt32ToInt32Field().put(1, 2); | 600 b1.putInt32ToInt32Field(1, 2); |
373 b1.getMutableInt32ToInt32Field().put(3, 4); | 601 b1.putInt32ToInt32Field(3, 4); |
374 b1.getMutableInt32ToInt32Field().put(5, 6); | 602 b1.putInt32ToInt32Field(5, 6); |
375 TestMap m1 = b1.build(); | 603 TestMap m1 = b1.build(); |
376 | 604 |
377 TestMap.Builder b2 = TestMap.newBuilder(); | 605 TestMap.Builder b2 = TestMap.newBuilder(); |
378 b2.getMutableInt32ToInt32Field().put(5, 6); | 606 b2.putInt32ToInt32Field(5, 6); |
379 b2.getMutableInt32ToInt32Field().put(1, 2); | 607 b2.putInt32ToInt32Field(1, 2); |
380 b2.getMutableInt32ToInt32Field().put(3, 4); | 608 b2.putInt32ToInt32Field(3, 4); |
381 TestMap m2 = b2.build(); | 609 TestMap m2 = b2.build(); |
382 | 610 |
383 assertEquals(m1, m2); | 611 assertEquals(m1, m2); |
384 assertEquals(m1.hashCode(), m2.hashCode()); | 612 assertEquals(m1.hashCode(), m2.hashCode()); |
385 | 613 |
386 // Make sure we did compare map fields. | 614 // Make sure we did compare map fields. |
387 b2.getMutableInt32ToInt32Field().put(1, 0); | 615 b2.putInt32ToInt32Field(1, 0); |
388 m2 = b2.build(); | 616 m2 = b2.build(); |
389 assertFalse(m1.equals(m2)); | 617 assertFalse(m1.equals(m2)); |
390 // Don't check m1.hashCode() != m2.hashCode() because it's not guaranteed | 618 // Don't check m1.hashCode() != m2.hashCode() because it's not guaranteed |
391 // to be different. | 619 // to be different. |
392 } | 620 } |
393 | 621 |
394 | 622 |
395 // The following methods are used to test reflection API. | 623 // The following methods are used to test reflection API. |
396 | 624 |
397 private static FieldDescriptor f(String name) { | 625 private static FieldDescriptor f(String name) { |
398 return TestMap.getDescriptor().findFieldByName(name); | 626 return TestMap.getDescriptor().findFieldByName(name); |
399 } | 627 } |
400 | 628 |
401 private static Object getFieldValue(Message mapEntry, String name) { | 629 private static Object getFieldValue(Message mapEntry, String name) { |
402 FieldDescriptor field = mapEntry.getDescriptorForType().findFieldByName(name
); | 630 FieldDescriptor field = mapEntry.getDescriptorForType().findFieldByName(name
); |
403 return mapEntry.getField(field); | 631 return mapEntry.getField(field); |
404 } | 632 } |
405 | 633 |
406 private static Message.Builder setFieldValue( | 634 private static Message.Builder setFieldValue( |
407 Message.Builder mapEntry, String name, Object value) { | 635 Message.Builder mapEntry, String name, Object value) { |
408 FieldDescriptor field = mapEntry.getDescriptorForType().findFieldByName(name
); | 636 FieldDescriptor field = mapEntry.getDescriptorForType().findFieldByName(name
); |
409 mapEntry.setField(field, value); | 637 mapEntry.setField(field, value); |
410 return mapEntry; | 638 return mapEntry; |
411 } | 639 } |
412 | 640 |
413 private static void assertHasMapValues(Message message, String name, Map<?, ?>
values) { | 641 private static void assertHasMapValues(Message message, String name, Map<?, ?>
values) { |
414 FieldDescriptor field = f(name); | 642 FieldDescriptor field = f(name); |
415 for (Object entry : (List<?>) message.getField(field)) { | 643 for (Object entry : (List<?>) message.getField(field)) { |
416 Message mapEntry = (Message) entry; | 644 Message mapEntry = (Message) entry; |
417 Object key = getFieldValue(mapEntry, "key"); | 645 Object key = getFieldValue(mapEntry, "key"); |
418 Object value = getFieldValue(mapEntry, "value"); | 646 Object value = getFieldValue(mapEntry, "value"); |
419 assertTrue(values.containsKey(key)); | 647 assertTrue(values.containsKey(key)); |
420 assertEquals(value, values.get(key)); | 648 assertEquals(value, values.get(key)); |
421 } | 649 } |
422 assertEquals(values.size(), message.getRepeatedFieldCount(field)); | 650 assertEquals(values.size(), message.getRepeatedFieldCount(field)); |
423 for (int i = 0; i < message.getRepeatedFieldCount(field); i++) { | 651 for (int i = 0; i < message.getRepeatedFieldCount(field); i++) { |
424 Message mapEntry = (Message) message.getRepeatedField(field, i); | 652 Message mapEntry = (Message) message.getRepeatedField(field, i); |
425 Object key = getFieldValue(mapEntry, "key"); | 653 Object key = getFieldValue(mapEntry, "key"); |
426 Object value = getFieldValue(mapEntry, "value"); | 654 Object value = getFieldValue(mapEntry, "value"); |
427 assertTrue(values.containsKey(key)); | 655 assertTrue(values.containsKey(key)); |
428 assertEquals(value, values.get(key)); | 656 assertEquals(value, values.get(key)); |
429 } | 657 } |
430 } | 658 } |
431 | 659 |
432 private static <KeyType, ValueType> | 660 private static <KeyType, ValueType> |
433 Message newMapEntry(Message.Builder builder, String name, KeyType key, ValueTy
pe value) { | 661 Message newMapEntry(Message.Builder builder, String name, KeyType key, ValueTy
pe value) { |
434 FieldDescriptor field = builder.getDescriptorForType().findFieldByName(name)
; | 662 FieldDescriptor field = builder.getDescriptorForType().findFieldByName(name)
; |
435 Message.Builder entryBuilder = builder.newBuilderForField(field); | 663 Message.Builder entryBuilder = builder.newBuilderForField(field); |
436 FieldDescriptor keyField = entryBuilder.getDescriptorForType().findFieldByNa
me("key"); | 664 FieldDescriptor keyField = entryBuilder.getDescriptorForType().findFieldByNa
me("key"); |
437 FieldDescriptor valueField = entryBuilder.getDescriptorForType().findFieldBy
Name("value"); | 665 FieldDescriptor valueField = entryBuilder.getDescriptorForType().findFieldBy
Name("value"); |
438 entryBuilder.setField(keyField, key); | 666 entryBuilder.setField(keyField, key); |
439 entryBuilder.setField(valueField, value); | 667 entryBuilder.setField(valueField, value); |
440 return entryBuilder.build(); | 668 return entryBuilder.build(); |
441 } | 669 } |
442 | 670 |
443 private static void setMapValues(Message.Builder builder, String name, Map<?,
?> values) { | 671 private static void setMapValues(Message.Builder builder, String name, Map<?,
?> values) { |
444 List<Message> entryList = new ArrayList<Message>(); | 672 List<Message> entryList = new ArrayList<Message>(); |
445 for (Map.Entry<?, ?> entry : values.entrySet()) { | 673 for (Map.Entry<?, ?> entry : values.entrySet()) { |
446 entryList.add(newMapEntry(builder, name, entry.getKey(), entry.getValue())
); | 674 entryList.add(newMapEntry(builder, name, entry.getKey(), entry.getValue())
); |
447 } | 675 } |
448 FieldDescriptor field = builder.getDescriptorForType().findFieldByName(name)
; | 676 FieldDescriptor field = builder.getDescriptorForType().findFieldByName(name)
; |
449 builder.setField(field, entryList); | 677 builder.setField(field, entryList); |
450 } | 678 } |
451 | 679 |
452 private static <KeyType, ValueType> | 680 private static <KeyType, ValueType> Map<KeyType, ValueType> mapForValues( |
453 Map<KeyType, ValueType> mapForValues( | |
454 KeyType key1, ValueType value1, KeyType key2, ValueType value2) { | 681 KeyType key1, ValueType value1, KeyType key2, ValueType value2) { |
455 Map<KeyType, ValueType> map = new HashMap<KeyType, ValueType>(); | 682 Map<KeyType, ValueType> map = new HashMap<KeyType, ValueType>(); |
456 map.put(key1, value1); | 683 map.put(key1, value1); |
457 map.put(key2, value2); | 684 map.put(key2, value2); |
458 return map; | 685 return map; |
459 } | 686 } |
460 | 687 |
461 public void testReflectionApi() throws Exception { | 688 public void testReflectionApi() throws Exception { |
462 // In reflection API, map fields are just repeated message fields. | 689 // In reflection API, map fields are just repeated message fields. |
463 TestMap.Builder builder = TestMap.newBuilder(); | 690 TestMap.Builder builder = TestMap.newBuilder() |
464 builder.getMutableInt32ToInt32Field().put(1, 2); | 691 .putInt32ToInt32Field(1, 2) |
465 builder.getMutableInt32ToInt32Field().put(3, 4); | 692 .putInt32ToInt32Field(3, 4) |
466 builder.getMutableInt32ToMessageField().put( | 693 .putInt32ToMessageField(11, MessageValue.newBuilder().setValue(22).build
()) |
467 11, MessageValue.newBuilder().setValue(22).build()); | 694 .putInt32ToMessageField(33, MessageValue.newBuilder().setValue(44).build
()); |
468 builder.getMutableInt32ToMessageField().put( | |
469 33, MessageValue.newBuilder().setValue(44).build()); | |
470 TestMap message = builder.build(); | 695 TestMap message = builder.build(); |
471 | 696 |
472 // Test getField(), getRepeatedFieldCount(), getRepeatedField(). | 697 // Test getField(), getRepeatedFieldCount(), getRepeatedField(). |
473 assertHasMapValues(message, "int32_to_int32_field", | 698 assertHasMapValues(message, "int32_to_int32_field", |
474 mapForValues(1, 2, 3, 4)); | 699 mapForValues(1, 2, 3, 4)); |
475 assertHasMapValues(message, "int32_to_message_field", | 700 assertHasMapValues(message, "int32_to_message_field", |
476 mapForValues( | 701 mapForValues( |
477 11, MessageValue.newBuilder().setValue(22).build(), | 702 11, MessageValue.newBuilder().setValue(22).build(), |
478 33, MessageValue.newBuilder().setValue(44).build())); | 703 33, MessageValue.newBuilder().setValue(44).build())); |
479 | 704 |
480 // Test clearField() | 705 // Test clearField() |
481 builder.clearField(f("int32_to_int32_field")); | 706 builder.clearField(f("int32_to_int32_field")); |
482 builder.clearField(f("int32_to_message_field")); | 707 builder.clearField(f("int32_to_message_field")); |
483 message = builder.build(); | 708 message = builder.build(); |
484 assertEquals(0, message.getInt32ToInt32Field().size()); | 709 assertEquals(0, message.getInt32ToInt32Field().size()); |
485 assertEquals(0, message.getInt32ToMessageField().size()); | 710 assertEquals(0, message.getInt32ToMessageField().size()); |
486 | 711 |
487 // Test setField() | 712 // Test setField() |
488 setMapValues(builder, "int32_to_int32_field", | 713 setMapValues(builder, "int32_to_int32_field", |
489 mapForValues(11, 22, 33, 44)); | 714 mapForValues(11, 22, 33, 44)); |
490 setMapValues(builder, "int32_to_message_field", | 715 setMapValues(builder, "int32_to_message_field", |
491 mapForValues( | 716 mapForValues( |
492 111, MessageValue.newBuilder().setValue(222).build(), | 717 111, MessageValue.newBuilder().setValue(222).build(), |
493 333, MessageValue.newBuilder().setValue(444).build())); | 718 333, MessageValue.newBuilder().setValue(444).build())); |
494 message = builder.build(); | 719 message = builder.build(); |
495 assertEquals(22, message.getInt32ToInt32Field().get(11).intValue()); | 720 assertEquals(22, message.getInt32ToInt32Field().get(11).intValue()); |
496 assertEquals(44, message.getInt32ToInt32Field().get(33).intValue()); | 721 assertEquals(44, message.getInt32ToInt32Field().get(33).intValue()); |
497 assertEquals(222, message.getInt32ToMessageField().get(111).getValue()); | 722 assertEquals(222, message.getInt32ToMessageField().get(111).getValue()); |
498 assertEquals(444, message.getInt32ToMessageField().get(333).getValue()); | 723 assertEquals(444, message.getInt32ToMessageField().get(333).getValue()); |
499 | 724 |
500 // Test addRepeatedField | 725 // Test addRepeatedField |
501 builder.addRepeatedField(f("int32_to_int32_field"), | 726 builder.addRepeatedField(f("int32_to_int32_field"), |
502 newMapEntry(builder, "int32_to_int32_field", 55, 66)); | 727 newMapEntry(builder, "int32_to_int32_field", 55, 66)); |
503 builder.addRepeatedField(f("int32_to_message_field"), | 728 builder.addRepeatedField(f("int32_to_message_field"), |
504 newMapEntry(builder, "int32_to_message_field", 555, | 729 newMapEntry(builder, "int32_to_message_field", 555, |
505 MessageValue.newBuilder().setValue(666).build())); | 730 MessageValue.newBuilder().setValue(666).build())); |
506 message = builder.build(); | 731 message = builder.build(); |
507 assertEquals(66, message.getInt32ToInt32Field().get(55).intValue()); | 732 assertEquals(66, message.getInt32ToInt32Field().get(55).intValue()); |
508 assertEquals(666, message.getInt32ToMessageField().get(555).getValue()); | 733 assertEquals(666, message.getInt32ToMessageField().get(555).getValue()); |
509 | 734 |
510 // Test addRepeatedField (overriding existing values) | 735 // Test addRepeatedField (overriding existing values) |
511 builder.addRepeatedField(f("int32_to_int32_field"), | 736 builder.addRepeatedField(f("int32_to_int32_field"), |
512 newMapEntry(builder, "int32_to_int32_field", 55, 55)); | 737 newMapEntry(builder, "int32_to_int32_field", 55, 55)); |
513 builder.addRepeatedField(f("int32_to_message_field"), | 738 builder.addRepeatedField(f("int32_to_message_field"), |
514 newMapEntry(builder, "int32_to_message_field", 555, | 739 newMapEntry(builder, "int32_to_message_field", 555, |
515 MessageValue.newBuilder().setValue(555).build())); | 740 MessageValue.newBuilder().setValue(555).build())); |
516 message = builder.build(); | 741 message = builder.build(); |
517 assertEquals(55, message.getInt32ToInt32Field().get(55).intValue()); | 742 assertEquals(55, message.getInt32ToInt32Field().get(55).intValue()); |
518 assertEquals(555, message.getInt32ToMessageField().get(555).getValue()); | 743 assertEquals(555, message.getInt32ToMessageField().get(555).getValue()); |
519 | 744 |
520 // Test setRepeatedField | 745 // Test setRepeatedField |
521 for (int i = 0; i < builder.getRepeatedFieldCount(f("int32_to_int32_field"))
; i++) { | 746 for (int i = 0; i < builder.getRepeatedFieldCount(f("int32_to_int32_field"))
; i++) { |
522 Message mapEntry = (Message) builder.getRepeatedField(f("int32_to_int32_fi
eld"), i); | 747 Message mapEntry = (Message) builder.getRepeatedField(f("int32_to_int32_fi
eld"), i); |
523 int oldKey = ((Integer) getFieldValue(mapEntry, "key")).intValue(); | 748 int oldKey = ((Integer) getFieldValue(mapEntry, "key")).intValue(); |
524 int oldValue = ((Integer) getFieldValue(mapEntry, "value")).intValue(); | 749 int oldValue = ((Integer) getFieldValue(mapEntry, "value")).intValue(); |
525 // Swap key with value for each entry. | 750 // Swap key with value for each entry. |
526 Message.Builder mapEntryBuilder = mapEntry.toBuilder(); | 751 Message.Builder mapEntryBuilder = mapEntry.toBuilder(); |
527 setFieldValue(mapEntryBuilder, "key", oldValue); | 752 setFieldValue(mapEntryBuilder, "key", oldValue); |
528 setFieldValue(mapEntryBuilder, "value", oldKey); | 753 setFieldValue(mapEntryBuilder, "value", oldKey); |
529 builder.setRepeatedField(f("int32_to_int32_field"), i, mapEntryBuilder.bui
ld()); | 754 builder.setRepeatedField(f("int32_to_int32_field"), i, mapEntryBuilder.bui
ld()); |
530 } | 755 } |
531 message = builder.build(); | 756 message = builder.build(); |
532 assertEquals(11, message.getInt32ToInt32Field().get(22).intValue()); | 757 assertEquals(11, message.getInt32ToInt32Field().get(22).intValue()); |
533 assertEquals(33, message.getInt32ToInt32Field().get(44).intValue()); | 758 assertEquals(33, message.getInt32ToInt32Field().get(44).intValue()); |
534 assertEquals(55, message.getInt32ToInt32Field().get(55).intValue()); | 759 assertEquals(55, message.getInt32ToInt32Field().get(55).intValue()); |
535 } | 760 } |
536 | 761 |
537 public void testTextFormat() throws Exception { | 762 public void testTextFormat() throws Exception { |
538 TestMap.Builder builder = TestMap.newBuilder(); | 763 TestMap.Builder builder = TestMap.newBuilder(); |
539 setMapValues(builder); | 764 setMapValuesUsingAccessors(builder); |
540 TestMap message = builder.build(); | 765 TestMap message = builder.build(); |
541 | 766 |
542 String textData = TextFormat.printToString(message); | 767 String textData = TextFormat.printToString(message); |
543 | 768 |
544 builder = TestMap.newBuilder(); | 769 builder = TestMap.newBuilder(); |
545 TextFormat.merge(textData, builder); | 770 TextFormat.merge(textData, builder); |
546 message = builder.build(); | 771 message = builder.build(); |
547 | 772 |
548 assertMapValuesSet(message); | 773 assertMapValuesSet(message); |
549 } | 774 } |
550 | 775 |
551 public void testDynamicMessage() throws Exception { | 776 public void testDynamicMessage() throws Exception { |
552 TestMap.Builder builder = TestMap.newBuilder(); | 777 TestMap.Builder builder = TestMap.newBuilder(); |
553 setMapValues(builder); | 778 setMapValuesUsingAccessors(builder); |
554 TestMap message = builder.build(); | 779 TestMap message = builder.build(); |
555 | 780 |
556 Message dynamicDefaultInstance = | 781 Message dynamicDefaultInstance = |
557 DynamicMessage.getDefaultInstance(TestMap.getDescriptor()); | 782 DynamicMessage.getDefaultInstance(TestMap.getDescriptor()); |
558 Message dynamicMessage = dynamicDefaultInstance | 783 Message dynamicMessage = dynamicDefaultInstance |
559 .newBuilderForType().mergeFrom(message.toByteString()).build(); | 784 .newBuilderForType().mergeFrom(message.toByteString()).build(); |
560 | 785 |
561 assertEquals(message, dynamicMessage); | 786 assertEquals(message, dynamicMessage); |
562 assertEquals(message.hashCode(), dynamicMessage.hashCode()); | 787 assertEquals(message.hashCode(), dynamicMessage.hashCode()); |
563 } | 788 } |
564 | 789 |
565 public void testReflectionEqualsAndHashCode() throws Exception { | 790 public void testReflectionEqualsAndHashCode() throws Exception { |
566 // Test that generated equals() and hashCode() will disregard the order | 791 // Test that generated equals() and hashCode() will disregard the order |
567 // of map entries when comparing/hashing map fields. | 792 // of map entries when comparing/hashing map fields. |
568 | 793 |
569 // We use DynamicMessage to test reflection based equals()/hashCode(). | 794 // We use DynamicMessage to test reflection based equals()/hashCode(). |
570 Message dynamicDefaultInstance = | 795 Message dynamicDefaultInstance = |
571 DynamicMessage.getDefaultInstance(TestMap.getDescriptor()); | 796 DynamicMessage.getDefaultInstance(TestMap.getDescriptor()); |
572 FieldDescriptor field = f("int32_to_int32_field"); | 797 FieldDescriptor field = f("int32_to_int32_field"); |
573 | 798 |
574 Message.Builder b1 = dynamicDefaultInstance.newBuilderForType(); | 799 Message.Builder b1 = dynamicDefaultInstance.newBuilderForType(); |
575 b1.addRepeatedField(field, newMapEntry(b1, "int32_to_int32_field", 1, 2)); | 800 b1.addRepeatedField(field, newMapEntry(b1, "int32_to_int32_field", 1, 2)); |
576 b1.addRepeatedField(field, newMapEntry(b1, "int32_to_int32_field", 3, 4)); | 801 b1.addRepeatedField(field, newMapEntry(b1, "int32_to_int32_field", 3, 4)); |
577 b1.addRepeatedField(field, newMapEntry(b1, "int32_to_int32_field", 5, 6)); | 802 b1.addRepeatedField(field, newMapEntry(b1, "int32_to_int32_field", 5, 6)); |
578 Message m1 = b1.build(); | 803 Message m1 = b1.build(); |
579 | 804 |
580 Message.Builder b2 = dynamicDefaultInstance.newBuilderForType(); | 805 Message.Builder b2 = dynamicDefaultInstance.newBuilderForType(); |
581 b2.addRepeatedField(field, newMapEntry(b2, "int32_to_int32_field", 5, 6)); | 806 b2.addRepeatedField(field, newMapEntry(b2, "int32_to_int32_field", 5, 6)); |
582 b2.addRepeatedField(field, newMapEntry(b2, "int32_to_int32_field", 1, 2)); | 807 b2.addRepeatedField(field, newMapEntry(b2, "int32_to_int32_field", 1, 2)); |
583 b2.addRepeatedField(field, newMapEntry(b2, "int32_to_int32_field", 3, 4)); | 808 b2.addRepeatedField(field, newMapEntry(b2, "int32_to_int32_field", 3, 4)); |
584 Message m2 = b2.build(); | 809 Message m2 = b2.build(); |
585 | 810 |
586 assertEquals(m1, m2); | 811 assertEquals(m1, m2); |
587 assertEquals(m1.hashCode(), m2.hashCode()); | 812 assertEquals(m1.hashCode(), m2.hashCode()); |
588 | 813 |
589 // Make sure we did compare map fields. | 814 // Make sure we did compare map fields. |
590 b2.setRepeatedField(field, 0, newMapEntry(b1, "int32_to_int32_field", 0, 0))
; | 815 b2.setRepeatedField(field, 0, newMapEntry(b1, "int32_to_int32_field", 0, 0))
; |
591 m2 = b2.build(); | 816 m2 = b2.build(); |
592 assertFalse(m1.equals(m2)); | 817 assertFalse(m1.equals(m2)); |
593 // Don't check m1.hashCode() != m2.hashCode() because it's not guaranteed | 818 // Don't check m1.hashCode() != m2.hashCode() because it's not guaranteed |
594 // to be different. | 819 // to be different. |
595 } | 820 } |
596 | 821 |
597 public void testUnknownEnumValues() throws Exception { | 822 public void testUnknownEnumValues() throws Exception { |
598 TestUnknownEnumValue.Builder builder = | 823 TestUnknownEnumValue.Builder builder = TestUnknownEnumValue.newBuilder() |
599 TestUnknownEnumValue.newBuilder(); | 824 .putInt32ToInt32Field(1, 1) |
600 builder.getMutableInt32ToInt32Field().put(1, 1); | 825 .putInt32ToInt32Field(2, 54321); |
601 builder.getMutableInt32ToInt32Field().put(2, 54321); | |
602 ByteString data = builder.build().toByteString(); | 826 ByteString data = builder.build().toByteString(); |
603 | 827 |
604 TestMap message = TestMap.parseFrom(data); | 828 TestMap message = TestMap.parseFrom(data); |
605 // Entries with unknown enum values will be stored into UnknownFieldSet so | 829 // Entries with unknown enum values will be stored into UnknownFieldSet so |
606 // there is only one entry in the map. | 830 // there is only one entry in the map. |
607 assertEquals(1, message.getInt32ToEnumField().size()); | 831 assertEquals(1, message.getInt32ToEnumField().size()); |
608 assertEquals(TestMap.EnumValue.BAR, message.getInt32ToEnumField().get(1)); | 832 assertEquals(TestMap.EnumValue.BAR, message.getInt32ToEnumField().get(1)); |
609 // UnknownFieldSet should not be empty. | 833 // UnknownFieldSet should not be empty. |
610 assertFalse(message.getUnknownFields().asMap().isEmpty()); | 834 assertFalse(message.getUnknownFields().asMap().isEmpty()); |
611 // Serializing and parsing should preserve the unknown entry. | 835 // Serializing and parsing should preserve the unknown entry. |
612 data = message.toByteString(); | 836 data = message.toByteString(); |
613 TestUnknownEnumValue messageWithUnknownEnums = | 837 TestUnknownEnumValue messageWithUnknownEnums = |
614 TestUnknownEnumValue.parseFrom(data); | 838 TestUnknownEnumValue.parseFrom(data); |
615 assertEquals(2, messageWithUnknownEnums.getInt32ToInt32Field().size()); | 839 assertEquals(2, messageWithUnknownEnums.getInt32ToInt32Field().size()); |
616 assertEquals(1, messageWithUnknownEnums.getInt32ToInt32Field().get(1).intVal
ue()); | 840 assertEquals(1, messageWithUnknownEnums.getInt32ToInt32Field().get(1).intVal
ue()); |
617 assertEquals(54321, messageWithUnknownEnums.getInt32ToInt32Field().get(2).in
tValue()); | 841 assertEquals(54321, messageWithUnknownEnums.getInt32ToInt32Field().get(2).in
tValue()); |
618 } | 842 } |
619 | 843 |
620 | |
621 public void testRequiredMessage() throws Exception { | 844 public void testRequiredMessage() throws Exception { |
622 TestMap.Builder builder = TestMap.newBuilder(); | 845 TestMap.Builder builder = TestMap.newBuilder(); |
623 builder.getMutableRequiredMessageMap().put(0, | 846 builder.putRequiredMessageMap(0, MessageWithRequiredFields.newBuilder().buil
dPartial()); |
624 MessageWithRequiredFields.newBuilder().buildPartial()); | |
625 TestMap message = builder.buildPartial(); | 847 TestMap message = builder.buildPartial(); |
626 assertFalse(message.isInitialized()); | 848 assertFalse(message.isInitialized()); |
627 | 849 |
628 builder.getMutableRequiredMessageMap().put(0, | 850 builder.putRequiredMessageMap(0, MessageWithRequiredFields.newBuilder().setV
alue(1).build()); |
629 MessageWithRequiredFields.newBuilder().setValue(1).build()); | |
630 message = builder.build(); | 851 message = builder.build(); |
631 assertTrue(message.isInitialized()); | 852 assertTrue(message.isInitialized()); |
632 } | 853 } |
633 | 854 |
634 public void testRecursiveMap() throws Exception { | 855 public void testRecursiveMap() throws Exception { |
635 TestRecursiveMap.Builder builder = TestRecursiveMap.newBuilder(); | 856 TestRecursiveMap.Builder builder = TestRecursiveMap.newBuilder(); |
636 builder.getMutableRecursiveMapField().put( | 857 builder.putRecursiveMapField(1, TestRecursiveMap.newBuilder().setValue(2).bu
ild()); |
637 1, TestRecursiveMap.newBuilder().setValue(2).build()); | 858 builder.putRecursiveMapField(3, TestRecursiveMap.newBuilder().setValue(4).bu
ild()); |
638 builder.getMutableRecursiveMapField().put( | |
639 3, TestRecursiveMap.newBuilder().setValue(4).build()); | |
640 ByteString data = builder.build().toByteString(); | 859 ByteString data = builder.build().toByteString(); |
641 | 860 |
642 TestRecursiveMap message = TestRecursiveMap.parseFrom(data); | 861 TestRecursiveMap message = TestRecursiveMap.parseFrom(data); |
643 assertEquals(2, message.getRecursiveMapField().get(1).getValue()); | 862 assertEquals(2, message.getRecursiveMapField().get(1).getValue()); |
644 assertEquals(4, message.getRecursiveMapField().get(3).getValue()); | 863 assertEquals(4, message.getRecursiveMapField().get(3).getValue()); |
645 } | 864 } |
646 | 865 |
647 public void testIterationOrder() throws Exception { | 866 public void testIterationOrder() throws Exception { |
648 TestMap.Builder builder = TestMap.newBuilder(); | 867 TestMap.Builder builder = TestMap.newBuilder(); |
649 setMapValues(builder); | 868 setMapValuesUsingAccessors(builder); |
650 TestMap message = builder.build(); | 869 TestMap message = builder.build(); |
651 | 870 |
652 assertEquals(Arrays.asList("1", "2", "3"), | 871 assertEquals(Arrays.asList("1", "2", "3"), |
653 new ArrayList<String>(message.getStringToInt32Field().keySet())); | 872 new ArrayList<String>(message.getStringToInt32Field().keySet())); |
654 } | 873 } |
655 | 874 |
| 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 |
656 // Regression test for b/20494788 | 1128 // Regression test for b/20494788 |
657 public void testMapInitializationOrder() throws Exception { | 1129 public void testMapInitializationOrder() throws Exception { |
658 assertEquals("RedactAllTypes", map_test.RedactAllTypes | 1130 assertEquals("RedactAllTypes", map_test.RedactAllTypes |
659 .getDefaultInstance().getDescriptorForType().getName()); | 1131 .getDefaultInstance().getDescriptorForType().getName()); |
660 | 1132 |
661 map_test.Message1.Builder builder = | 1133 map_test.Message1.Builder builder = |
662 map_test.Message1.newBuilder(); | 1134 map_test.Message1.newBuilder(); |
663 builder.getMutableMapField().put("key", true); | 1135 builder.putMapField("key", true); |
664 map_test.Message1 message = builder.build(); | 1136 map_test.Message1 message = builder.build(); |
665 Message mapEntry = (Message) message.getRepeatedField( | 1137 Message mapEntry = (Message) message.getRepeatedField( |
666 message.getDescriptorForType().findFieldByName("map_field"), 0); | 1138 message.getDescriptorForType().findFieldByName("map_field"), 0); |
667 assertEquals(2, mapEntry.getAllFields().size()); | 1139 assertEquals(2, mapEntry.getAllFields().size()); |
668 } | 1140 } |
669 | 1141 |
| 1142 public void testReservedWordsFieldNames() { |
| 1143 ReservedAsMapField.newBuilder().build(); |
| 1144 ReservedAsMapFieldWithEnumValue.newBuilder().build(); |
| 1145 } |
| 1146 |
670 private static <K, V> Map<K, V> newMap(K key1, V value1) { | 1147 private static <K, V> Map<K, V> newMap(K key1, V value1) { |
671 Map<K, V> map = new HashMap<K, V>(); | 1148 Map<K, V> map = new HashMap<K, V>(); |
672 map.put(key1, value1); | 1149 map.put(key1, value1); |
673 return map; | 1150 return map; |
674 } | 1151 } |
675 | 1152 |
676 private static <K, V> Map<K, V> newMap(K key1, V value1, K key2, V value2) { | 1153 private static <K, V> Map<K, V> newMap(K key1, V value1, K key2, V value2) { |
677 Map<K, V> map = new HashMap<K, V>(); | 1154 Map<K, V> map = new HashMap<K, V>(); |
678 map.put(key1, value1); | 1155 map.put(key1, value1); |
679 map.put(key2, value2); | 1156 map.put(key2, value2); |
680 return map; | 1157 return map; |
681 } | 1158 } |
| 1159 |
| 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 } |
682 } | 1178 } |
683 | |
OLD | NEW |