11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2008 The Guava Authors 31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); 51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License. 61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at 71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0 91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software 111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS, 121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and 141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License. 151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.collect; 181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.testing.SerializableTester.reserialize; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible; 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible; 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Joiner; 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.ImmutableMap.Builder; 257dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.AnEnum; 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.CollectionTestSuiteBuilder; 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.ListTestSuiteBuilder; 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.MapInterfaceTest; 297dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.MapTestSuiteBuilder; 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.MinimalSet; 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.SampleElements.Colliders; 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.SampleElements.Unhashables; 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.UnhashableObject; 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionFeature; 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionSize; 367dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.features.MapFeature; 377dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.google.MapGenerators.ImmutableMapCopyOfEnumMapGenerator; 380888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.collect.testing.google.MapGenerators.ImmutableMapCopyOfGenerator; 397dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.google.MapGenerators.ImmutableMapEntryListGenerator; 407dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.google.MapGenerators.ImmutableMapGenerator; 417dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.google.MapGenerators.ImmutableMapKeyListGenerator; 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.google.MapGenerators.ImmutableMapUnhashableValuesGenerator; 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.google.MapGenerators.ImmutableMapValueListGenerator; 447dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.testing.EqualsTester; 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.NullPointerTester; 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.SerializableTester; 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 480888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.Test; 490888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestCase; 500888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestSuite; 510888a09821a98ac0680fad765217302858e70fa4Paul Duffin 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.Serializable; 531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection; 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections; 557dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.EnumMap; 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.LinkedHashMap; 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map; 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map.Entry; 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests for {@link ImmutableMap}. 621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Jesse Wilson 651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true) 671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class ImmutableMapTest extends TestCase { 681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible("suite") 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static Test suite() { 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert TestSuite suite = new TestSuite(); 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert suite.addTestSuite(ImmutableMapTest.class); 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 747dd252788645e940eada959bdde927426e2531c9Paul Duffin suite.addTest(MapTestSuiteBuilder.using(new ImmutableMapGenerator()) 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .withFeatures( 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert CollectionSize.ANY, 777dd252788645e940eada959bdde927426e2531c9Paul Duffin CollectionFeature.SERIALIZABLE_INCLUDING_VIEWS, 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert CollectionFeature.KNOWN_ORDER, 797dd252788645e940eada959bdde927426e2531c9Paul Duffin MapFeature.REJECTS_DUPLICATES_AT_CREATION, 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert CollectionFeature.ALLOWS_NULL_QUERIES) 817dd252788645e940eada959bdde927426e2531c9Paul Duffin .named("ImmutableMap") 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .createTestSuite()); 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 840888a09821a98ac0680fad765217302858e70fa4Paul Duffin suite.addTest(MapTestSuiteBuilder.using(new ImmutableMapCopyOfGenerator()) 850888a09821a98ac0680fad765217302858e70fa4Paul Duffin .withFeatures( 860888a09821a98ac0680fad765217302858e70fa4Paul Duffin CollectionSize.ANY, 870888a09821a98ac0680fad765217302858e70fa4Paul Duffin CollectionFeature.SERIALIZABLE_INCLUDING_VIEWS, 880888a09821a98ac0680fad765217302858e70fa4Paul Duffin CollectionFeature.KNOWN_ORDER, 890888a09821a98ac0680fad765217302858e70fa4Paul Duffin CollectionFeature.ALLOWS_NULL_QUERIES) 900888a09821a98ac0680fad765217302858e70fa4Paul Duffin .named("ImmutableMap.copyOf") 910888a09821a98ac0680fad765217302858e70fa4Paul Duffin .createTestSuite()); 920888a09821a98ac0680fad765217302858e70fa4Paul Duffin 937dd252788645e940eada959bdde927426e2531c9Paul Duffin suite.addTest(MapTestSuiteBuilder.using(new ImmutableMapCopyOfEnumMapGenerator()) 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .withFeatures( 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert CollectionSize.ANY, 967dd252788645e940eada959bdde927426e2531c9Paul Duffin CollectionFeature.SERIALIZABLE_INCLUDING_VIEWS, 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert CollectionFeature.KNOWN_ORDER, 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert CollectionFeature.ALLOWS_NULL_QUERIES) 997dd252788645e940eada959bdde927426e2531c9Paul Duffin .named("ImmutableMap.copyOf[EnumMap]") 1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .createTestSuite()); 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert suite.addTest(CollectionTestSuiteBuilder.using( 1037dd252788645e940eada959bdde927426e2531c9Paul Duffin new ImmutableMapUnhashableValuesGenerator()) 1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .withFeatures(CollectionSize.ANY, CollectionFeature.KNOWN_ORDER, 1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert CollectionFeature.ALLOWS_NULL_QUERIES) 1067dd252788645e940eada959bdde927426e2531c9Paul Duffin .named("ImmutableMap.values, unhashable") 1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .createTestSuite()); 1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1097dd252788645e940eada959bdde927426e2531c9Paul Duffin suite.addTest(ListTestSuiteBuilder.using( 1107dd252788645e940eada959bdde927426e2531c9Paul Duffin new ImmutableMapKeyListGenerator()) 1117dd252788645e940eada959bdde927426e2531c9Paul Duffin .named("ImmutableMap.keySet.asList") 1127dd252788645e940eada959bdde927426e2531c9Paul Duffin .withFeatures(CollectionSize.ANY, 1137dd252788645e940eada959bdde927426e2531c9Paul Duffin CollectionFeature.SERIALIZABLE, 1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert CollectionFeature.REJECTS_DUPLICATES_AT_CREATION, 1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert CollectionFeature.ALLOWS_NULL_QUERIES) 1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .createTestSuite()); 1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1187dd252788645e940eada959bdde927426e2531c9Paul Duffin suite.addTest(ListTestSuiteBuilder.using( 1197dd252788645e940eada959bdde927426e2531c9Paul Duffin new ImmutableMapEntryListGenerator()) 1207dd252788645e940eada959bdde927426e2531c9Paul Duffin .named("ImmutableMap.entrySet.asList") 1217dd252788645e940eada959bdde927426e2531c9Paul Duffin .withFeatures(CollectionSize.ANY, 1227dd252788645e940eada959bdde927426e2531c9Paul Duffin CollectionFeature.SERIALIZABLE, 1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert CollectionFeature.REJECTS_DUPLICATES_AT_CREATION, 1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert CollectionFeature.ALLOWS_NULL_QUERIES) 1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .createTestSuite()); 1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert suite.addTest(ListTestSuiteBuilder.using( 1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert new ImmutableMapValueListGenerator()) 1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .named("ImmutableMap.values.asList") 1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .withFeatures(CollectionSize.ANY, 1317dd252788645e940eada959bdde927426e2531c9Paul Duffin CollectionFeature.SERIALIZABLE, 1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert CollectionFeature.ALLOWS_NULL_QUERIES) 1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .createTestSuite()); 1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return suite; 1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public abstract static class AbstractMapTests<K, V> 1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert extends MapInterfaceTest<K, V> { 1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public AbstractMapTests() { 1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert super(false, false, false, false, false); 1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Map<K, V> makeEmptyMap() { 1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new UnsupportedOperationException(); 1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final Joiner joiner = Joiner.on(", "); 1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected void assertMoreInvariants(Map<K, V> map) { 1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // TODO: can these be moved to MapInterfaceTest? 1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (Entry<K, V> entry : map.entrySet()) { 1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(entry.getKey() + "=" + entry.getValue(), 1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert entry.toString()); 1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("{" + joiner.join(map.entrySet()) + "}", 1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.toString()); 1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("[" + joiner.join(map.entrySet()) + "]", 1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.entrySet().toString()); 1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("[" + joiner.join(map.keySet()) + "]", 1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.keySet().toString()); 1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("[" + joiner.join(map.values()) + "]", 1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.values().toString()); 1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(MinimalSet.from(map.entrySet()), map.entrySet()); 1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(Sets.newHashSet(map.keySet()), map.keySet()); 1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static class MapTests extends AbstractMapTests<String, Integer> { 1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Map<String, Integer> makeEmptyMap() { 1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return ImmutableMap.of(); 1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Map<String, Integer> makePopulatedMap() { 1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return ImmutableMap.of("one", 1, "two", 2, "three", 3); 1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected String getKeyNotInPopulatedMap() { 1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return "minus one"; 1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Integer getValueNotInPopulatedMap() { 1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return -1; 1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static class SingletonMapTests 1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert extends AbstractMapTests<String, Integer> { 1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Map<String, Integer> makePopulatedMap() { 1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return ImmutableMap.of("one", 1); 1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected String getKeyNotInPopulatedMap() { 1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return "minus one"; 1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Integer getValueNotInPopulatedMap() { 2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return -1; 2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible("SerializableTester") 2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static class ReserializedMapTests 2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert extends AbstractMapTests<String, Integer> { 2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Map<String, Integer> makePopulatedMap() { 2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return SerializableTester.reserialize( 2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableMap.of("one", 1, "two", 2, "three", 3)); 2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected String getKeyNotInPopulatedMap() { 2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return "minus one"; 2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Integer getValueNotInPopulatedMap() { 2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return -1; 2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static class MapTestsWithBadHashes 2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert extends AbstractMapTests<Object, Integer> { 2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Map<Object, Integer> makeEmptyMap() { 2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new UnsupportedOperationException(); 2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Map<Object, Integer> makePopulatedMap() { 2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Colliders colliders = new Colliders(); 2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return ImmutableMap.of( 2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert colliders.e0, 0, 2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert colliders.e1, 1, 2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert colliders.e2, 2, 2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert colliders.e3, 3); 2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Object getKeyNotInPopulatedMap() { 2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new Colliders().e4; 2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Integer getValueNotInPopulatedMap() { 2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return 4; 2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible("GWT's ImmutableMap emulation is backed by java.util.HashMap.") 2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static class MapTestsWithUnhashableValues 2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert extends AbstractMapTests<Integer, UnhashableObject> { 2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Map<Integer, UnhashableObject> makeEmptyMap() { 2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return ImmutableMap.of(); 2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Map<Integer, UnhashableObject> makePopulatedMap() { 2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Unhashables unhashables = new Unhashables(); 2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return ImmutableMap.of( 2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 0, unhashables.e0, 1, unhashables.e1, 2, unhashables.e2); 2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Integer getKeyNotInPopulatedMap() { 2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return 3; 2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected UnhashableObject getValueNotInPopulatedMap() { 2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new Unhashables().e3; 2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible("GWT's ImmutableMap emulation is backed by java.util.HashMap.") 2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static class MapTestsWithSingletonUnhashableValue 2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert extends MapTestsWithUnhashableValues { 2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Map<Integer, UnhashableObject> makePopulatedMap() { 2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Unhashables unhashables = new Unhashables(); 2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return ImmutableMap.of(0, unhashables.e0); 2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static class CreationTests extends TestCase { 2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEmptyBuilder() { 2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableMap<String, Integer> map 2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert = new Builder<String, Integer>().build(); 2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(Collections.<String, Integer>emptyMap(), map); 2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testSingletonBuilder() { 2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableMap<String, Integer> map = new Builder<String, Integer>() 2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .put("one", 1) 2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .build(); 2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertMapEquals(map, "one", 1); 2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testBuilder() { 2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableMap<String, Integer> map = new Builder<String, Integer>() 2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .put("one", 1) 2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .put("two", 2) 2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .put("three", 3) 2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .put("four", 4) 2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .put("five", 5) 2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .build(); 2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertMapEquals(map, 3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert "one", 1, "two", 2, "three", 3, "four", 4, "five", 5); 3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testBuilder_withImmutableEntry() { 3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableMap<String, Integer> map = new Builder<String, Integer>() 3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .put(Maps.immutableEntry("one", 1)) 3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .build(); 3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertMapEquals(map, "one", 1); 3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testBuilder_withImmutableEntryAndNullContents() { 3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Builder<String, Integer> builder = new Builder<String, Integer>(); 3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert builder.put(Maps.immutableEntry("one", (Integer) null)); 3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException expected) { 3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert builder.put(Maps.immutableEntry((String) null, 1)); 3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException expected) { 3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static class StringHolder { 3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert String string; 3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testBuilder_withMutableEntry() { 3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableMap.Builder<String, Integer> builder = 3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert new Builder<String, Integer>(); 3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final StringHolder holder = new StringHolder(); 3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert holder.string = "one"; 3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Entry<String, Integer> entry = new AbstractMapEntry<String, Integer>() { 3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public String getKey() { 3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return holder.string; 3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Integer getValue() { 3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return 1; 3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert builder.put(entry); 3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert holder.string = "two"; 3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertMapEquals(builder.build(), "one", 1); 3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testBuilderPutAllWithEmptyMap() { 3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableMap<String, Integer> map = new Builder<String, Integer>() 3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .putAll(Collections.<String, Integer>emptyMap()) 3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .build(); 3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(Collections.<String, Integer>emptyMap(), map); 3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testBuilderPutAll() { 3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Map<String, Integer> toPut = new LinkedHashMap<String, Integer>(); 3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert toPut.put("one", 1); 3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert toPut.put("two", 2); 3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert toPut.put("three", 3); 3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Map<String, Integer> moreToPut = new LinkedHashMap<String, Integer>(); 3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert moreToPut.put("four", 4); 3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert moreToPut.put("five", 5); 3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableMap<String, Integer> map = new Builder<String, Integer>() 3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .putAll(toPut) 3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .putAll(moreToPut) 3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .build(); 3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertMapEquals(map, 3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert "one", 1, "two", 2, "three", 3, "four", 4, "five", 5); 3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testBuilderReuse() { 3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Builder<String, Integer> builder = new Builder<String, Integer>(); 3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableMap<String, Integer> mapOne = builder 3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .put("one", 1) 3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .put("two", 2) 3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .build(); 3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableMap<String, Integer> mapTwo = builder 3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .put("three", 3) 3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .put("four", 4) 3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .build(); 3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertMapEquals(mapOne, "one", 1, "two", 2); 3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertMapEquals(mapTwo, "one", 1, "two", 2, "three", 3, "four", 4); 3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3860888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testBuilderPutNullKeyFailsAtomically() { 3870888a09821a98ac0680fad765217302858e70fa4Paul Duffin Builder<String, Integer> builder = new Builder<String, Integer>(); 3880888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 3890888a09821a98ac0680fad765217302858e70fa4Paul Duffin builder.put(null, 1); 3900888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail(); 3910888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (NullPointerException expected) {} 3920888a09821a98ac0680fad765217302858e70fa4Paul Duffin builder.put("foo", 2); 3930888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertMapEquals(builder.build(), "foo", 2); 3940888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 3950888a09821a98ac0680fad765217302858e70fa4Paul Duffin 3960888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testBuilderPutImmutableEntryWithNullKeyFailsAtomically() { 3970888a09821a98ac0680fad765217302858e70fa4Paul Duffin Builder<String, Integer> builder = new Builder<String, Integer>(); 3980888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 3990888a09821a98ac0680fad765217302858e70fa4Paul Duffin builder.put(Maps.immutableEntry((String) null, 1)); 4000888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail(); 4010888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (NullPointerException expected) {} 4020888a09821a98ac0680fad765217302858e70fa4Paul Duffin builder.put("foo", 2); 4030888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertMapEquals(builder.build(), "foo", 2); 4040888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 4050888a09821a98ac0680fad765217302858e70fa4Paul Duffin 4060888a09821a98ac0680fad765217302858e70fa4Paul Duffin // for GWT compatibility 4070888a09821a98ac0680fad765217302858e70fa4Paul Duffin static class SimpleEntry<K, V> extends AbstractMapEntry<K, V> { 4080888a09821a98ac0680fad765217302858e70fa4Paul Duffin public K key; 4090888a09821a98ac0680fad765217302858e70fa4Paul Duffin public V value; 4100888a09821a98ac0680fad765217302858e70fa4Paul Duffin 4110888a09821a98ac0680fad765217302858e70fa4Paul Duffin SimpleEntry(K key, V value) { 4120888a09821a98ac0680fad765217302858e70fa4Paul Duffin this.key = key; 4130888a09821a98ac0680fad765217302858e70fa4Paul Duffin this.value = value; 4140888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 4150888a09821a98ac0680fad765217302858e70fa4Paul Duffin 4160888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 4170888a09821a98ac0680fad765217302858e70fa4Paul Duffin public K getKey() { 4180888a09821a98ac0680fad765217302858e70fa4Paul Duffin return key; 4190888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 4200888a09821a98ac0680fad765217302858e70fa4Paul Duffin 4210888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 4220888a09821a98ac0680fad765217302858e70fa4Paul Duffin public V getValue() { 4230888a09821a98ac0680fad765217302858e70fa4Paul Duffin return value; 4240888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 4250888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 4260888a09821a98ac0680fad765217302858e70fa4Paul Duffin 4270888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testBuilderPutMutableEntryWithNullKeyFailsAtomically() { 4280888a09821a98ac0680fad765217302858e70fa4Paul Duffin Builder<String, Integer> builder = new Builder<String, Integer>(); 4290888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 4300888a09821a98ac0680fad765217302858e70fa4Paul Duffin builder.put(new SimpleEntry<String, Integer>(null, 1)); 4310888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail(); 4320888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (NullPointerException expected) {} 4330888a09821a98ac0680fad765217302858e70fa4Paul Duffin builder.put("foo", 2); 4340888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertMapEquals(builder.build(), "foo", 2); 4350888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 4360888a09821a98ac0680fad765217302858e70fa4Paul Duffin 4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testBuilderPutNullKey() { 4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Builder<String, Integer> builder = new Builder<String, Integer>(); 4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert builder.put(null, 1); 4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException expected) { 4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testBuilderPutNullValue() { 4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Builder<String, Integer> builder = new Builder<String, Integer>(); 4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert builder.put("one", null); 4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException expected) { 4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testBuilderPutNullKeyViaPutAll() { 4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Builder<String, Integer> builder = new Builder<String, Integer>(); 4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert builder.putAll(Collections.<String, Integer>singletonMap(null, 1)); 4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException expected) { 4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testBuilderPutNullValueViaPutAll() { 4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Builder<String, Integer> builder = new Builder<String, Integer>(); 4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert builder.putAll(Collections.<String, Integer>singletonMap("one", null)); 4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException expected) { 4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testPuttingTheSameKeyTwiceThrowsOnBuild() { 4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Builder<String, Integer> builder = new Builder<String, Integer>() 4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .put("one", 1) 4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .put("one", 1); // throwing on this line would be even better 4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert builder.build(); 4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IllegalArgumentException expected) { 4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testOf() { 4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertMapEquals( 4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableMap.of("one", 1), 4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert "one", 1); 4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertMapEquals( 4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableMap.of("one", 1, "two", 2), 4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert "one", 1, "two", 2); 4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertMapEquals( 4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableMap.of("one", 1, "two", 2, "three", 3), 4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert "one", 1, "two", 2, "three", 3); 4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertMapEquals( 4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableMap.of("one", 1, "two", 2, "three", 3, "four", 4), 4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert "one", 1, "two", 2, "three", 3, "four", 4); 4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertMapEquals( 4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableMap.of("one", 1, "two", 2, "three", 3, "four", 4, "five", 5), 5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert "one", 1, "two", 2, "three", 3, "four", 4, "five", 5); 5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testOfNullKey() { 5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableMap.of(null, 1); 5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException expected) { 5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableMap.of("one", 1, null, 2); 5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException expected) { 5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testOfNullValue() { 5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableMap.of("one", null); 5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException expected) { 5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableMap.of("one", 1, "two", null); 5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException expected) { 5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testOfWithDuplicateKey() { 5321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableMap.of("one", 1, "one", 1); 5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 5351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IllegalArgumentException expected) { 5361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testCopyOfEmptyMap() { 5401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableMap<String, Integer> copy 5411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert = ImmutableMap.copyOf(Collections.<String, Integer>emptyMap()); 5421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(Collections.<String, Integer>emptyMap(), copy); 5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertSame(copy, ImmutableMap.copyOf(copy)); 5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testCopyOfSingletonMap() { 5471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableMap<String, Integer> copy 5481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert = ImmutableMap.copyOf(Collections.singletonMap("one", 1)); 5491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertMapEquals(copy, "one", 1); 5501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertSame(copy, ImmutableMap.copyOf(copy)); 5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testCopyOf() { 5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Map<String, Integer> original = new LinkedHashMap<String, Integer>(); 5551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert original.put("one", 1); 5561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert original.put("two", 2); 5571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert original.put("three", 3); 5581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableMap<String, Integer> copy = ImmutableMap.copyOf(original); 5601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertMapEquals(copy, "one", 1, "two", 2, "three", 3); 5611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertSame(copy, ImmutableMap.copyOf(copy)); 5621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNullGet() { 5661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableMap<String, Integer> map = ImmutableMap.of("one", 1); 5671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertNull(map.get(null)); 5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5707dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testAsMultimap() { 5717dd252788645e940eada959bdde927426e2531c9Paul Duffin ImmutableMap<String, Integer> map = ImmutableMap.of( 5727dd252788645e940eada959bdde927426e2531c9Paul Duffin "one", 1, "won", 1, "two", 2, "too", 2, "three", 3); 5737dd252788645e940eada959bdde927426e2531c9Paul Duffin ImmutableSetMultimap<String, Integer> expected = ImmutableSetMultimap.of( 5747dd252788645e940eada959bdde927426e2531c9Paul Duffin "one", 1, "won", 1, "two", 2, "too", 2, "three", 3); 5757dd252788645e940eada959bdde927426e2531c9Paul Duffin assertEquals(expected, map.asMultimap()); 5767dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5777dd252788645e940eada959bdde927426e2531c9Paul Duffin 5787dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testAsMultimapWhenEmpty() { 5797dd252788645e940eada959bdde927426e2531c9Paul Duffin ImmutableMap<String, Integer> map = ImmutableMap.of(); 5807dd252788645e940eada959bdde927426e2531c9Paul Duffin ImmutableSetMultimap<String, Integer> expected = ImmutableSetMultimap.of(); 5817dd252788645e940eada959bdde927426e2531c9Paul Duffin assertEquals(expected, map.asMultimap()); 5827dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5837dd252788645e940eada959bdde927426e2531c9Paul Duffin 5847dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testAsMultimapCaches() { 5857dd252788645e940eada959bdde927426e2531c9Paul Duffin ImmutableMap<String, Integer> map = ImmutableMap.of("one", 1); 5867dd252788645e940eada959bdde927426e2531c9Paul Duffin ImmutableSetMultimap<String, Integer> multimap1 = map.asMultimap(); 5877dd252788645e940eada959bdde927426e2531c9Paul Duffin ImmutableSetMultimap<String, Integer> multimap2 = map.asMultimap(); 5880888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(1, multimap1.asMap().size()); 5897dd252788645e940eada959bdde927426e2531c9Paul Duffin assertSame(multimap1, multimap2); 5907dd252788645e940eada959bdde927426e2531c9Paul Duffin } 5917dd252788645e940eada959bdde927426e2531c9Paul Duffin 5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible("NullPointerTester") 5937dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testNullPointers() { 5941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert NullPointerTester tester = new NullPointerTester(); 5951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert tester.testAllPublicStaticMethods(ImmutableMap.class); 5961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert tester.testAllPublicInstanceMethods( 5971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert new ImmutableMap.Builder<Object, Object>()); 5981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert tester.testAllPublicInstanceMethods(ImmutableMap.of()); 5991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert tester.testAllPublicInstanceMethods(ImmutableMap.of("one", 1)); 6001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert tester.testAllPublicInstanceMethods( 6011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableMap.of("one", 1, "two", 2, "three", 3)); 6021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static <K, V> void assertMapEquals(Map<K, V> map, 6051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Object... alternatingKeysAndValues) { 6061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(map.size(), alternatingKeysAndValues.length / 2); 6071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int i = 0; 6081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (Entry<K, V> entry : map.entrySet()) { 6091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(alternatingKeysAndValues[i++], entry.getKey()); 6101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(alternatingKeysAndValues[i++], entry.getValue()); 6111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static class IntHolder implements Serializable { 6151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public int value; 6161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public IntHolder(int value) { 6181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.value = value; 6191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean equals(Object o) { 6221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (o instanceof IntHolder) && ((IntHolder) o).value == value; 6231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int hashCode() { 6261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return value; 6271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final long serialVersionUID = 5; 6301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testMutableValues() { 6331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert IntHolder holderA = new IntHolder(1); 6341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert IntHolder holderB = new IntHolder(2); 6351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Map<String, IntHolder> map = ImmutableMap.of("a", holderA, "b", holderB); 6361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert holderA.value = 3; 6371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.entrySet().contains( 6381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Maps.immutableEntry("a", new IntHolder(3)))); 6391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Map<String, Integer> intMap = ImmutableMap.of("a", 3, "b", 2); 6401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(intMap.hashCode(), map.entrySet().hashCode()); 6411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(intMap.hashCode(), map.hashCode()); 6421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6447dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testCopyOfEnumMap() { 6457dd252788645e940eada959bdde927426e2531c9Paul Duffin EnumMap<AnEnum, String> map = new EnumMap<AnEnum, String>(AnEnum.class); 6467dd252788645e940eada959bdde927426e2531c9Paul Duffin map.put(AnEnum.B, "foo"); 6477dd252788645e940eada959bdde927426e2531c9Paul Duffin map.put(AnEnum.C, "bar"); 6487dd252788645e940eada959bdde927426e2531c9Paul Duffin assertTrue(ImmutableMap.copyOf(map) instanceof ImmutableEnumMap); 6497dd252788645e940eada959bdde927426e2531c9Paul Duffin } 6507dd252788645e940eada959bdde927426e2531c9Paul Duffin 6511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible("SerializableTester") 6521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testViewSerialization() { 6531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Map<String, Integer> map = ImmutableMap.of("one", 1, "two", 2, "three", 3); 6541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LenientSerializableTester.reserializeAndAssertLenient(map.entrySet()); 6551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LenientSerializableTester.reserializeAndAssertLenient(map.keySet()); 6561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Collection<Integer> reserializedValues = reserialize(map.values()); 6581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(Lists.newArrayList(map.values()), 6591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Lists.newArrayList(reserializedValues)); 6601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(reserializedValues instanceof ImmutableCollection); 6611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6627dd252788645e940eada959bdde927426e2531c9Paul Duffin 6637dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testEquals() { 6647dd252788645e940eada959bdde927426e2531c9Paul Duffin new EqualsTester() 6657dd252788645e940eada959bdde927426e2531c9Paul Duffin .addEqualityGroup(ImmutableList.of(), ImmutableList.of()) 6667dd252788645e940eada959bdde927426e2531c9Paul Duffin .addEqualityGroup(ImmutableList.of(1), ImmutableList.of(1)) 6677dd252788645e940eada959bdde927426e2531c9Paul Duffin .addEqualityGroup(ImmutableList.of(1, 2), ImmutableList.of(1, 2)) 6687dd252788645e940eada959bdde927426e2531c9Paul Duffin .addEqualityGroup(ImmutableList.of(1, 2, 3)) 6697dd252788645e940eada959bdde927426e2531c9Paul Duffin .addEqualityGroup(ImmutableList.of(1, 2, 3, 4)) 6707dd252788645e940eada959bdde927426e2531c9Paul Duffin .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5)) 6717dd252788645e940eada959bdde927426e2531c9Paul Duffin .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6)) 6727dd252788645e940eada959bdde927426e2531c9Paul Duffin .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7)) 6737dd252788645e940eada959bdde927426e2531c9Paul Duffin .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 8)) 6747dd252788645e940eada959bdde927426e2531c9Paul Duffin .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 8, 9)) 6757dd252788645e940eada959bdde927426e2531c9Paul Duffin .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)) 6767dd252788645e940eada959bdde927426e2531c9Paul Duffin .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)) 6777dd252788645e940eada959bdde927426e2531c9Paul Duffin .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)) 6787dd252788645e940eada959bdde927426e2531c9Paul Duffin .addEqualityGroup(ImmutableList.of(100, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)) 6797dd252788645e940eada959bdde927426e2531c9Paul Duffin .addEqualityGroup(ImmutableList.of(1, 200, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)) 6807dd252788645e940eada959bdde927426e2531c9Paul Duffin .addEqualityGroup(ImmutableList.of(1, 2, 300, 4, 5, 6, 7, 8, 9, 10, 11, 12)) 6817dd252788645e940eada959bdde927426e2531c9Paul Duffin .addEqualityGroup(ImmutableList.of(1, 2, 3, 400, 5, 6, 7, 8, 9, 10, 11, 12)) 6827dd252788645e940eada959bdde927426e2531c9Paul Duffin .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 500, 6, 7, 8, 9, 10, 11, 12)) 6837dd252788645e940eada959bdde927426e2531c9Paul Duffin .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 600, 7, 8, 9, 10, 11, 12)) 6847dd252788645e940eada959bdde927426e2531c9Paul Duffin .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 700, 8, 9, 10, 11, 12)) 6857dd252788645e940eada959bdde927426e2531c9Paul Duffin .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 800, 9, 10, 11, 12)) 6867dd252788645e940eada959bdde927426e2531c9Paul Duffin .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 8, 900, 10, 11, 12)) 6877dd252788645e940eada959bdde927426e2531c9Paul Duffin .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 1000, 11, 12)) 6887dd252788645e940eada959bdde927426e2531c9Paul Duffin .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1100, 12)) 6897dd252788645e940eada959bdde927426e2531c9Paul Duffin .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1200)) 6907dd252788645e940eada959bdde927426e2531c9Paul Duffin .testEquals(); 6917dd252788645e940eada959bdde927426e2531c9Paul Duffin 6927dd252788645e940eada959bdde927426e2531c9Paul Duffin } 6931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 694