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;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.CollectionTestSuiteBuilder;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.ListTestSuiteBuilder;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.MapInterfaceTest;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.MinimalSet;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.ReserializingTestCollectionGenerator;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.ReserializingTestSetGenerator;
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.SetTestSuiteBuilder;
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.UnhashableObject;
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionFeature;
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionSize;
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.google.MapGenerators.ImmutableMapEntrySetGenerator;
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.google.MapGenerators.ImmutableMapKeySetGenerator;
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.google.MapGenerators.ImmutableMapUnhashableValuesGenerator;
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.google.MapGenerators.ImmutableMapValueListGenerator;
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.google.MapGenerators.ImmutableMapValuesGenerator;
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.NullPointerTester;
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.SerializableTester;
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.Test;
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase;
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestSuite;
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.Serializable;
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.LinkedHashMap;
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map;
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map.Entry;
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests for {@link ImmutableMap}.
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Jesse Wilson
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class ImmutableMapTest extends TestCase {
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("suite")
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static Test suite() {
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TestSuite suite = new TestSuite();
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(ImmutableMapTest.class);
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new ImmutableMapKeySetGenerator())
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionSize.ANY,
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.KNOWN_ORDER,
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.REJECTS_DUPLICATES_AT_CREATION,
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ImmutableMap.keySet")
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(new ImmutableMapEntrySetGenerator())
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionSize.ANY,
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.KNOWN_ORDER,
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.REJECTS_DUPLICATES_AT_CREATION,
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ImmutableMap.entrySet")
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(CollectionTestSuiteBuilder.using(
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new ImmutableMapValuesGenerator())
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY, CollectionFeature.KNOWN_ORDER,
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ImmutableMap.values")
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ReserializingTestSetGenerator.newInstance(
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            new ImmutableMapKeySetGenerator()))
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionSize.ANY,
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.KNOWN_ORDER,
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.REJECTS_DUPLICATES_AT_CREATION,
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ImmutableMap.keySet, reserialized")
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SetTestSuiteBuilder.using(
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ReserializingTestSetGenerator.newInstance(
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            new ImmutableMapKeySetGenerator()))
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionSize.ANY,
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.KNOWN_ORDER,
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.REJECTS_DUPLICATES_AT_CREATION,
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ImmutableMap.entrySet, reserialized")
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(CollectionTestSuiteBuilder.using(
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ReserializingTestCollectionGenerator.newInstance(
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            new ImmutableMapValuesGenerator()))
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY, CollectionFeature.KNOWN_ORDER,
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ImmutableMap.values, reserialized")
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(CollectionTestSuiteBuilder.using(
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            new ImmutableMapUnhashableValuesGenerator())
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY, CollectionFeature.KNOWN_ORDER,
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ImmutableMap.values, unhashable")
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(ListTestSuiteBuilder.using(
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new ImmutableMapValueListGenerator())
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ImmutableMap.values.asList")
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY,
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return suite;
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public abstract static class AbstractMapTests<K, V>
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      extends MapInterfaceTest<K, V> {
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public AbstractMapTests() {
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(false, false, false, false, false);
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<K, V> makeEmptyMap() {
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throw new UnsupportedOperationException();
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private static final Joiner joiner = Joiner.on(", ");
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected void assertMoreInvariants(Map<K, V> map) {
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // TODO: can these be moved to MapInterfaceTest?
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (Entry<K, V> entry : map.entrySet()) {
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(entry.getKey() + "=" + entry.getValue(),
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            entry.toString());
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals("{" + joiner.join(map.entrySet()) + "}",
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          map.toString());
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals("[" + joiner.join(map.entrySet()) + "]",
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          map.entrySet().toString());
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals("[" + joiner.join(map.keySet()) + "]",
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          map.keySet().toString());
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals("[" + joiner.join(map.values()) + "]",
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          map.values().toString());
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(MinimalSet.from(map.entrySet()), map.entrySet());
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Sets.newHashSet(map.keySet()), map.keySet());
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class MapTests extends AbstractMapTests<String, Integer> {
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makeEmptyMap() {
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ImmutableMap.of();
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makePopulatedMap() {
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ImmutableMap.of("one", 1, "two", 2, "three", 3);
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected String getKeyNotInPopulatedMap() {
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "minus one";
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Integer getValueNotInPopulatedMap() {
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return -1;
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class SingletonMapTests
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      extends AbstractMapTests<String, Integer> {
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makePopulatedMap() {
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ImmutableMap.of("one", 1);
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected String getKeyNotInPopulatedMap() {
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "minus one";
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Integer getValueNotInPopulatedMap() {
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return -1;
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class ReserializedMapTests
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      extends AbstractMapTests<String, Integer> {
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<String, Integer> makePopulatedMap() {
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return SerializableTester.reserialize(
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ImmutableMap.of("one", 1, "two", 2, "three", 3));
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected String getKeyNotInPopulatedMap() {
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return "minus one";
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Integer getValueNotInPopulatedMap() {
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return -1;
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class MapTestsWithBadHashes
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      extends AbstractMapTests<Object, Integer> {
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<Object, Integer> makeEmptyMap() {
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throw new UnsupportedOperationException();
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<Object, Integer> makePopulatedMap() {
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Colliders colliders = new Colliders();
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ImmutableMap.of(
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          colliders.e0, 0,
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          colliders.e1, 1,
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          colliders.e2, 2,
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          colliders.e3, 3);
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Object getKeyNotInPopulatedMap() {
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return new Colliders().e4;
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Integer getValueNotInPopulatedMap() {
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return 4;
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("GWT's ImmutableMap emulation is backed by java.util.HashMap.")
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class MapTestsWithUnhashableValues
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      extends AbstractMapTests<Integer, UnhashableObject> {
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<Integer, UnhashableObject> makeEmptyMap() {
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ImmutableMap.of();
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<Integer, UnhashableObject> makePopulatedMap() {
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Unhashables unhashables = new Unhashables();
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ImmutableMap.of(
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          0, unhashables.e0, 1, unhashables.e1, 2, unhashables.e2);
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Integer getKeyNotInPopulatedMap() {
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return 3;
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected UnhashableObject getValueNotInPopulatedMap() {
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return new Unhashables().e3;
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("GWT's ImmutableMap emulation is backed by java.util.HashMap.")
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class MapTestsWithSingletonUnhashableValue
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      extends MapTestsWithUnhashableValues {
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Map<Integer, UnhashableObject> makePopulatedMap() {
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Unhashables unhashables = new Unhashables();
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ImmutableMap.of(0, unhashables.e0);
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class CreationTests extends TestCase {
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testEmptyBuilder() {
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableMap<String, Integer> map
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          = new Builder<String, Integer>().build();
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Collections.<String, Integer>emptyMap(), map);
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testSingletonBuilder() {
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableMap<String, Integer> map = new Builder<String, Integer>()
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .put("one", 1)
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .build();
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(map, "one", 1);
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilder() {
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableMap<String, Integer> map = new Builder<String, Integer>()
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .put("one", 1)
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .put("two", 2)
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .put("three", 3)
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .put("four", 4)
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .put("five", 5)
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .build();
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(map,
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "one", 1, "two", 2, "three", 3, "four", 4, "five", 5);
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilder_withImmutableEntry() {
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableMap<String, Integer> map = new Builder<String, Integer>()
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .put(Maps.immutableEntry("one", 1))
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .build();
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(map, "one", 1);
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilder_withImmutableEntryAndNullContents() {
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Builder<String, Integer> builder = new Builder<String, Integer>();
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        builder.put(Maps.immutableEntry("one", (Integer) null));
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        builder.put(Maps.immutableEntry((String) null, 1));
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private static class StringHolder {
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      String string;
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilder_withMutableEntry() {
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableMap.Builder<String, Integer> builder =
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          new Builder<String, Integer>();
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      final StringHolder holder = new StringHolder();
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      holder.string = "one";
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Entry<String, Integer> entry = new AbstractMapEntry<String, Integer>() {
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        @Override public String getKey() {
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          return holder.string;
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        @Override public Integer getValue() {
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          return 1;
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      };
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.put(entry);
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      holder.string = "two";
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(builder.build(), "one", 1);
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilderPutAllWithEmptyMap() {
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableMap<String, Integer> map = new Builder<String, Integer>()
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .putAll(Collections.<String, Integer>emptyMap())
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .build();
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Collections.<String, Integer>emptyMap(), map);
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilderPutAll() {
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Map<String, Integer> toPut = new LinkedHashMap<String, Integer>();
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      toPut.put("one", 1);
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      toPut.put("two", 2);
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      toPut.put("three", 3);
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Map<String, Integer> moreToPut = new LinkedHashMap<String, Integer>();
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      moreToPut.put("four", 4);
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      moreToPut.put("five", 5);
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableMap<String, Integer> map = new Builder<String, Integer>()
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .putAll(toPut)
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .putAll(moreToPut)
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .build();
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(map,
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "one", 1, "two", 2, "three", 3, "four", 4, "five", 5);
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilderReuse() {
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Builder<String, Integer> builder = new Builder<String, Integer>();
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableMap<String, Integer> mapOne = builder
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .put("one", 1)
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .put("two", 2)
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .build();
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableMap<String, Integer> mapTwo = builder
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .put("three", 3)
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .put("four", 4)
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .build();
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(mapOne, "one", 1, "two", 2);
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(mapTwo, "one", 1, "two", 2, "three", 3, "four", 4);
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilderPutNullKey() {
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Builder<String, Integer> builder = new Builder<String, Integer>();
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        builder.put(null, 1);
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilderPutNullValue() {
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Builder<String, Integer> builder = new Builder<String, Integer>();
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        builder.put("one", null);
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilderPutNullKeyViaPutAll() {
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Builder<String, Integer> builder = new Builder<String, Integer>();
4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        builder.putAll(Collections.<String, Integer>singletonMap(null, 1));
4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilderPutNullValueViaPutAll() {
4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Builder<String, Integer> builder = new Builder<String, Integer>();
4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        builder.putAll(Collections.<String, Integer>singletonMap("one", null));
4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testPuttingTheSameKeyTwiceThrowsOnBuild() {
4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Builder<String, Integer> builder = new Builder<String, Integer>()
4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .put("one", 1)
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .put("one", 1); // throwing on this line would be even better
4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        builder.build();
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (IllegalArgumentException expected) {
4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals("duplicate key: one", expected.getMessage());
4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testOf() {
4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ImmutableMap.of("one", 1),
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "one", 1);
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ImmutableMap.of("one", 1, "two", 2),
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "one", 1, "two", 2);
4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(
4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ImmutableMap.of("one", 1, "two", 2, "three", 3),
4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "one", 1, "two", 2, "three", 3);
4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ImmutableMap.of("one", 1, "two", 2, "three", 3, "four", 4),
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "one", 1, "two", 2, "three", 3, "four", 4);
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(
4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ImmutableMap.of("one", 1, "two", 2, "three", 3, "four", 4, "five", 5),
4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "one", 1, "two", 2, "three", 3, "four", 4, "five", 5);
4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testOfNullKey() {
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableMap.of(null, 1);
4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableMap.of("one", 1, null, 2);
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testOfNullValue() {
4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableMap.of("one", null);
4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableMap.of("one", 1, "two", null);
4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testOfWithDuplicateKey() {
4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableMap.of("one", 1, "one", 1);
4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (IllegalArgumentException expected) {
4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals("duplicate key: one", expected.getMessage());
4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOfEmptyMap() {
4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableMap<String, Integer> copy
4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          = ImmutableMap.copyOf(Collections.<String, Integer>emptyMap());
4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Collections.<String, Integer>emptyMap(), copy);
4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertSame(copy, ImmutableMap.copyOf(copy));
4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOfSingletonMap() {
5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableMap<String, Integer> copy
5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          = ImmutableMap.copyOf(Collections.singletonMap("one", 1));
5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(copy, "one", 1);
5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertSame(copy, ImmutableMap.copyOf(copy));
5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOf() {
5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Map<String, Integer> original = new LinkedHashMap<String, Integer>();
5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      original.put("one", 1);
5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      original.put("two", 2);
5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      original.put("three", 3);
5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableMap<String, Integer> copy = ImmutableMap.copyOf(original);
5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertMapEquals(copy, "one", 1, "two", 2, "three", 3);
5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertSame(copy, ImmutableMap.copyOf(copy));
5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNullGet() {
5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableMap<String, Integer> map = ImmutableMap.of("one", 1);
5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(map.get(null));
5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("NullPointerTester")
5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNullPointers() throws Exception {
5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    NullPointerTester tester = new NullPointerTester();
5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicStaticMethods(ImmutableMap.class);
5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicInstanceMethods(
5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new ImmutableMap.Builder<Object, Object>());
5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicInstanceMethods(ImmutableMap.of());
5321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicInstanceMethods(ImmutableMap.of("one", 1));
5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicInstanceMethods(
5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableMap.of("one", 1, "two", 2, "three", 3));
5351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static <K, V> void assertMapEquals(Map<K, V> map,
5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Object... alternatingKeysAndValues) {
5391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(map.size(), alternatingKeysAndValues.length / 2);
5401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    int i = 0;
5411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (Entry<K, V> entry : map.entrySet()) {
5421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(alternatingKeysAndValues[i++], entry.getKey());
5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(alternatingKeysAndValues[i++], entry.getValue());
5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class IntHolder implements Serializable {
5481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public int value;
5491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public IntHolder(int value) {
5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      this.value = value;
5521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public boolean equals(Object o) {
5551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return (o instanceof IntHolder) && ((IntHolder) o).value == value;
5561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public int hashCode() {
5591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return value;
5601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private static final long serialVersionUID = 5;
5631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testMutableValues() {
5661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    IntHolder holderA = new IntHolder(1);
5671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    IntHolder holderB = new IntHolder(2);
5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, IntHolder> map = ImmutableMap.of("a", holderA, "b", holderB);
5691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    holderA.value = 3;
5701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(map.entrySet().contains(
5711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("a", new IntHolder(3))));
5721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, Integer> intMap = ImmutableMap.of("a", 3, "b", 2);
5731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(intMap.hashCode(), map.entrySet().hashCode());
5741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(intMap.hashCode(), map.hashCode());
5751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
5781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testViewSerialization() {
5791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, Integer> map = ImmutableMap.of("one", 1, "two", 2, "three", 3);
5801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    LenientSerializableTester.reserializeAndAssertLenient(map.entrySet());
5811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    LenientSerializableTester.reserializeAndAssertLenient(map.keySet());
5821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> reserializedValues = reserialize(map.values());
5841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Lists.newArrayList(map.values()),
5851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Lists.newArrayList(reserializedValues));
5861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(reserializedValues instanceof ImmutableCollection);
5871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
589