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