| 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 |