10888a09821a98ac0680fad765217302858e70fa4Paul Duffin/*
20888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Copyright (C) 2008 The Guava Authors
30888a09821a98ac0680fad765217302858e70fa4Paul Duffin *
40888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License");
50888a09821a98ac0680fad765217302858e70fa4Paul Duffin * you may not use this file except in compliance with the License.
60888a09821a98ac0680fad765217302858e70fa4Paul Duffin * You may obtain a copy of the License at
70888a09821a98ac0680fad765217302858e70fa4Paul Duffin *
80888a09821a98ac0680fad765217302858e70fa4Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0
90888a09821a98ac0680fad765217302858e70fa4Paul Duffin *
100888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Unless required by applicable law or agreed to in writing, software
110888a09821a98ac0680fad765217302858e70fa4Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS,
120888a09821a98ac0680fad765217302858e70fa4Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130888a09821a98ac0680fad765217302858e70fa4Paul Duffin * See the License for the specific language governing permissions and
140888a09821a98ac0680fad765217302858e70fa4Paul Duffin * limitations under the License.
150888a09821a98ac0680fad765217302858e70fa4Paul Duffin */
160888a09821a98ac0680fad765217302858e70fa4Paul Duffin
170888a09821a98ac0680fad765217302858e70fa4Paul Duffinpackage com.google.common.collect;
180888a09821a98ac0680fad765217302858e70fa4Paul Duffin
190888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.annotations.GwtCompatible;
200888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.base.Joiner;
210888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.collect.ImmutableMap.Builder;
220888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.collect.testing.AnEnum;
230888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.collect.testing.MapInterfaceTest;
240888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.collect.testing.MinimalSet;
250888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.collect.testing.SampleElements.Colliders;
260888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.testing.EqualsTester;
270888a09821a98ac0680fad765217302858e70fa4Paul Duffin
280888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestCase;
290888a09821a98ac0680fad765217302858e70fa4Paul Duffin
300888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.io.Serializable;
310888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Collections;
320888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.EnumMap;
330888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.LinkedHashMap;
340888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Map;
350888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Map.Entry;
360888a09821a98ac0680fad765217302858e70fa4Paul Duffin
370888a09821a98ac0680fad765217302858e70fa4Paul Duffin/**
380888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Tests for {@link ImmutableMap}.
390888a09821a98ac0680fad765217302858e70fa4Paul Duffin *
400888a09821a98ac0680fad765217302858e70fa4Paul Duffin * @author Kevin Bourrillion
410888a09821a98ac0680fad765217302858e70fa4Paul Duffin * @author Jesse Wilson
420888a09821a98ac0680fad765217302858e70fa4Paul Duffin */
430888a09821a98ac0680fad765217302858e70fa4Paul Duffin@GwtCompatible(emulated = true)
440888a09821a98ac0680fad765217302858e70fa4Paul Duffinpublic class ImmutableMapTest extends TestCase {
450888a09821a98ac0680fad765217302858e70fa4Paul Duffin
460888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public abstract static class AbstractMapTests<K, V>
470888a09821a98ac0680fad765217302858e70fa4Paul Duffin      extends MapInterfaceTest<K, V> {
480888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public AbstractMapTests() {
490888a09821a98ac0680fad765217302858e70fa4Paul Duffin      super(false, false, false, false, false);
500888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
510888a09821a98ac0680fad765217302858e70fa4Paul Duffin
520888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override protected Map<K, V> makeEmptyMap() {
530888a09821a98ac0680fad765217302858e70fa4Paul Duffin      throw new UnsupportedOperationException();
540888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
550888a09821a98ac0680fad765217302858e70fa4Paul Duffin
560888a09821a98ac0680fad765217302858e70fa4Paul Duffin    private static final Joiner joiner = Joiner.on(", ");
570888a09821a98ac0680fad765217302858e70fa4Paul Duffin
580888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override protected void assertMoreInvariants(Map<K, V> map) {
590888a09821a98ac0680fad765217302858e70fa4Paul Duffin      // TODO: can these be moved to MapInterfaceTest?
600888a09821a98ac0680fad765217302858e70fa4Paul Duffin      for (Entry<K, V> entry : map.entrySet()) {
610888a09821a98ac0680fad765217302858e70fa4Paul Duffin        assertEquals(entry.getKey() + "=" + entry.getValue(),
620888a09821a98ac0680fad765217302858e70fa4Paul Duffin            entry.toString());
630888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
640888a09821a98ac0680fad765217302858e70fa4Paul Duffin
650888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertEquals("{" + joiner.join(map.entrySet()) + "}",
660888a09821a98ac0680fad765217302858e70fa4Paul Duffin          map.toString());
670888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertEquals("[" + joiner.join(map.entrySet()) + "]",
680888a09821a98ac0680fad765217302858e70fa4Paul Duffin          map.entrySet().toString());
690888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertEquals("[" + joiner.join(map.keySet()) + "]",
700888a09821a98ac0680fad765217302858e70fa4Paul Duffin          map.keySet().toString());
710888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertEquals("[" + joiner.join(map.values()) + "]",
720888a09821a98ac0680fad765217302858e70fa4Paul Duffin          map.values().toString());
730888a09821a98ac0680fad765217302858e70fa4Paul Duffin
740888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertEquals(MinimalSet.from(map.entrySet()), map.entrySet());
750888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertEquals(Sets.newHashSet(map.keySet()), map.keySet());
760888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
770888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
780888a09821a98ac0680fad765217302858e70fa4Paul Duffin
790888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static class MapTests extends AbstractMapTests<String, Integer> {
800888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override protected Map<String, Integer> makeEmptyMap() {
810888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return ImmutableMap.of();
820888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
830888a09821a98ac0680fad765217302858e70fa4Paul Duffin
840888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override protected Map<String, Integer> makePopulatedMap() {
850888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return ImmutableMap.of("one", 1, "two", 2, "three", 3);
860888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
870888a09821a98ac0680fad765217302858e70fa4Paul Duffin
880888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override protected String getKeyNotInPopulatedMap() {
890888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return "minus one";
900888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
910888a09821a98ac0680fad765217302858e70fa4Paul Duffin
920888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override protected Integer getValueNotInPopulatedMap() {
930888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return -1;
940888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
950888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
960888a09821a98ac0680fad765217302858e70fa4Paul Duffin
970888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static class SingletonMapTests
980888a09821a98ac0680fad765217302858e70fa4Paul Duffin      extends AbstractMapTests<String, Integer> {
990888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override protected Map<String, Integer> makePopulatedMap() {
1000888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return ImmutableMap.of("one", 1);
1010888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1020888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1030888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override protected String getKeyNotInPopulatedMap() {
1040888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return "minus one";
1050888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1060888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1070888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override protected Integer getValueNotInPopulatedMap() {
1080888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return -1;
1090888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1100888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1110888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1120888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static class MapTestsWithBadHashes
1130888a09821a98ac0680fad765217302858e70fa4Paul Duffin      extends AbstractMapTests<Object, Integer> {
1140888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1150888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override protected Map<Object, Integer> makeEmptyMap() {
1160888a09821a98ac0680fad765217302858e70fa4Paul Duffin      throw new UnsupportedOperationException();
1170888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1180888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1190888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override protected Map<Object, Integer> makePopulatedMap() {
1200888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Colliders colliders = new Colliders();
1210888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return ImmutableMap.of(
1220888a09821a98ac0680fad765217302858e70fa4Paul Duffin          colliders.e0, 0,
1230888a09821a98ac0680fad765217302858e70fa4Paul Duffin          colliders.e1, 1,
1240888a09821a98ac0680fad765217302858e70fa4Paul Duffin          colliders.e2, 2,
1250888a09821a98ac0680fad765217302858e70fa4Paul Duffin          colliders.e3, 3);
1260888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1270888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1280888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override protected Object getKeyNotInPopulatedMap() {
1290888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return new Colliders().e4;
1300888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1310888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1320888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override protected Integer getValueNotInPopulatedMap() {
1330888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return 4;
1340888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1350888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1360888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1370888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public static class CreationTests extends TestCase {
1380888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void testEmptyBuilder() {
1390888a09821a98ac0680fad765217302858e70fa4Paul Duffin      ImmutableMap<String, Integer> map
1400888a09821a98ac0680fad765217302858e70fa4Paul Duffin          = new Builder<String, Integer>().build();
1410888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertEquals(Collections.<String, Integer>emptyMap(), map);
1420888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1430888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1440888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void testSingletonBuilder() {
1450888a09821a98ac0680fad765217302858e70fa4Paul Duffin      ImmutableMap<String, Integer> map = new Builder<String, Integer>()
1460888a09821a98ac0680fad765217302858e70fa4Paul Duffin          .put("one", 1)
1470888a09821a98ac0680fad765217302858e70fa4Paul Duffin          .build();
1480888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertMapEquals(map, "one", 1);
1490888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1500888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1510888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void testBuilder() {
1520888a09821a98ac0680fad765217302858e70fa4Paul Duffin      ImmutableMap<String, Integer> map = new Builder<String, Integer>()
1530888a09821a98ac0680fad765217302858e70fa4Paul Duffin          .put("one", 1)
1540888a09821a98ac0680fad765217302858e70fa4Paul Duffin          .put("two", 2)
1550888a09821a98ac0680fad765217302858e70fa4Paul Duffin          .put("three", 3)
1560888a09821a98ac0680fad765217302858e70fa4Paul Duffin          .put("four", 4)
1570888a09821a98ac0680fad765217302858e70fa4Paul Duffin          .put("five", 5)
1580888a09821a98ac0680fad765217302858e70fa4Paul Duffin          .build();
1590888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertMapEquals(map,
1600888a09821a98ac0680fad765217302858e70fa4Paul Duffin          "one", 1, "two", 2, "three", 3, "four", 4, "five", 5);
1610888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1620888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1630888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void testBuilder_withImmutableEntry() {
1640888a09821a98ac0680fad765217302858e70fa4Paul Duffin      ImmutableMap<String, Integer> map = new Builder<String, Integer>()
1650888a09821a98ac0680fad765217302858e70fa4Paul Duffin          .put(Maps.immutableEntry("one", 1))
1660888a09821a98ac0680fad765217302858e70fa4Paul Duffin          .build();
1670888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertMapEquals(map, "one", 1);
1680888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1690888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1700888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void testBuilder_withImmutableEntryAndNullContents() {
1710888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Builder<String, Integer> builder = new Builder<String, Integer>();
1720888a09821a98ac0680fad765217302858e70fa4Paul Duffin      try {
1730888a09821a98ac0680fad765217302858e70fa4Paul Duffin        builder.put(Maps.immutableEntry("one", (Integer) null));
1740888a09821a98ac0680fad765217302858e70fa4Paul Duffin        fail();
1750888a09821a98ac0680fad765217302858e70fa4Paul Duffin      } catch (NullPointerException expected) {
1760888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
1770888a09821a98ac0680fad765217302858e70fa4Paul Duffin      try {
1780888a09821a98ac0680fad765217302858e70fa4Paul Duffin        builder.put(Maps.immutableEntry((String) null, 1));
1790888a09821a98ac0680fad765217302858e70fa4Paul Duffin        fail();
1800888a09821a98ac0680fad765217302858e70fa4Paul Duffin      } catch (NullPointerException expected) {
1810888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
1820888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1830888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1840888a09821a98ac0680fad765217302858e70fa4Paul Duffin    private static class StringHolder {
1850888a09821a98ac0680fad765217302858e70fa4Paul Duffin      String string;
1860888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1870888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1880888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void testBuilder_withMutableEntry() {
1890888a09821a98ac0680fad765217302858e70fa4Paul Duffin      ImmutableMap.Builder<String, Integer> builder =
1900888a09821a98ac0680fad765217302858e70fa4Paul Duffin          new Builder<String, Integer>();
1910888a09821a98ac0680fad765217302858e70fa4Paul Duffin      final StringHolder holder = new StringHolder();
1920888a09821a98ac0680fad765217302858e70fa4Paul Duffin      holder.string = "one";
1930888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Entry<String, Integer> entry = new AbstractMapEntry<String, Integer>() {
1940888a09821a98ac0680fad765217302858e70fa4Paul Duffin        @Override public String getKey() {
1950888a09821a98ac0680fad765217302858e70fa4Paul Duffin          return holder.string;
1960888a09821a98ac0680fad765217302858e70fa4Paul Duffin        }
1970888a09821a98ac0680fad765217302858e70fa4Paul Duffin        @Override public Integer getValue() {
1980888a09821a98ac0680fad765217302858e70fa4Paul Duffin          return 1;
1990888a09821a98ac0680fad765217302858e70fa4Paul Duffin        }
2000888a09821a98ac0680fad765217302858e70fa4Paul Duffin      };
2010888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2020888a09821a98ac0680fad765217302858e70fa4Paul Duffin      builder.put(entry);
2030888a09821a98ac0680fad765217302858e70fa4Paul Duffin      holder.string = "two";
2040888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertMapEquals(builder.build(), "one", 1);
2050888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2060888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2070888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void testBuilderPutAllWithEmptyMap() {
2080888a09821a98ac0680fad765217302858e70fa4Paul Duffin      ImmutableMap<String, Integer> map = new Builder<String, Integer>()
2090888a09821a98ac0680fad765217302858e70fa4Paul Duffin          .putAll(Collections.<String, Integer>emptyMap())
2100888a09821a98ac0680fad765217302858e70fa4Paul Duffin          .build();
2110888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertEquals(Collections.<String, Integer>emptyMap(), map);
2120888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2130888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2140888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void testBuilderPutAll() {
2150888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Map<String, Integer> toPut = new LinkedHashMap<String, Integer>();
2160888a09821a98ac0680fad765217302858e70fa4Paul Duffin      toPut.put("one", 1);
2170888a09821a98ac0680fad765217302858e70fa4Paul Duffin      toPut.put("two", 2);
2180888a09821a98ac0680fad765217302858e70fa4Paul Duffin      toPut.put("three", 3);
2190888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Map<String, Integer> moreToPut = new LinkedHashMap<String, Integer>();
2200888a09821a98ac0680fad765217302858e70fa4Paul Duffin      moreToPut.put("four", 4);
2210888a09821a98ac0680fad765217302858e70fa4Paul Duffin      moreToPut.put("five", 5);
2220888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2230888a09821a98ac0680fad765217302858e70fa4Paul Duffin      ImmutableMap<String, Integer> map = new Builder<String, Integer>()
2240888a09821a98ac0680fad765217302858e70fa4Paul Duffin          .putAll(toPut)
2250888a09821a98ac0680fad765217302858e70fa4Paul Duffin          .putAll(moreToPut)
2260888a09821a98ac0680fad765217302858e70fa4Paul Duffin          .build();
2270888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertMapEquals(map,
2280888a09821a98ac0680fad765217302858e70fa4Paul Duffin          "one", 1, "two", 2, "three", 3, "four", 4, "five", 5);
2290888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2300888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2310888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void testBuilderReuse() {
2320888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Builder<String, Integer> builder = new Builder<String, Integer>();
2330888a09821a98ac0680fad765217302858e70fa4Paul Duffin      ImmutableMap<String, Integer> mapOne = builder
2340888a09821a98ac0680fad765217302858e70fa4Paul Duffin          .put("one", 1)
2350888a09821a98ac0680fad765217302858e70fa4Paul Duffin          .put("two", 2)
2360888a09821a98ac0680fad765217302858e70fa4Paul Duffin          .build();
2370888a09821a98ac0680fad765217302858e70fa4Paul Duffin      ImmutableMap<String, Integer> mapTwo = builder
2380888a09821a98ac0680fad765217302858e70fa4Paul Duffin          .put("three", 3)
2390888a09821a98ac0680fad765217302858e70fa4Paul Duffin          .put("four", 4)
2400888a09821a98ac0680fad765217302858e70fa4Paul Duffin          .build();
2410888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2420888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertMapEquals(mapOne, "one", 1, "two", 2);
2430888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertMapEquals(mapTwo, "one", 1, "two", 2, "three", 3, "four", 4);
2440888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2450888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2460888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void testBuilderPutNullKeyFailsAtomically() {
2470888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Builder<String, Integer> builder = new Builder<String, Integer>();
2480888a09821a98ac0680fad765217302858e70fa4Paul Duffin      try {
2490888a09821a98ac0680fad765217302858e70fa4Paul Duffin        builder.put(null, 1);
2500888a09821a98ac0680fad765217302858e70fa4Paul Duffin        fail();
2510888a09821a98ac0680fad765217302858e70fa4Paul Duffin      } catch (NullPointerException expected) {}
2520888a09821a98ac0680fad765217302858e70fa4Paul Duffin      builder.put("foo", 2);
2530888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertMapEquals(builder.build(), "foo", 2);
2540888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2550888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2560888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void testBuilderPutImmutableEntryWithNullKeyFailsAtomically() {
2570888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Builder<String, Integer> builder = new Builder<String, Integer>();
2580888a09821a98ac0680fad765217302858e70fa4Paul Duffin      try {
2590888a09821a98ac0680fad765217302858e70fa4Paul Duffin        builder.put(Maps.immutableEntry((String) null, 1));
2600888a09821a98ac0680fad765217302858e70fa4Paul Duffin        fail();
2610888a09821a98ac0680fad765217302858e70fa4Paul Duffin      } catch (NullPointerException expected) {}
2620888a09821a98ac0680fad765217302858e70fa4Paul Duffin      builder.put("foo", 2);
2630888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertMapEquals(builder.build(), "foo", 2);
2640888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2650888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2660888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // for GWT compatibility
2670888a09821a98ac0680fad765217302858e70fa4Paul Duffin    static class SimpleEntry<K, V> extends AbstractMapEntry<K, V> {
2680888a09821a98ac0680fad765217302858e70fa4Paul Duffin      public K key;
2690888a09821a98ac0680fad765217302858e70fa4Paul Duffin      public V value;
2700888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2710888a09821a98ac0680fad765217302858e70fa4Paul Duffin      SimpleEntry(K key, V value) {
2720888a09821a98ac0680fad765217302858e70fa4Paul Duffin        this.key = key;
2730888a09821a98ac0680fad765217302858e70fa4Paul Duffin        this.value = value;
2740888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
2750888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2760888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override
2770888a09821a98ac0680fad765217302858e70fa4Paul Duffin      public K getKey() {
2780888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return key;
2790888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
2800888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2810888a09821a98ac0680fad765217302858e70fa4Paul Duffin      @Override
2820888a09821a98ac0680fad765217302858e70fa4Paul Duffin      public V getValue() {
2830888a09821a98ac0680fad765217302858e70fa4Paul Duffin        return value;
2840888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
2850888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2860888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2870888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void testBuilderPutMutableEntryWithNullKeyFailsAtomically() {
2880888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Builder<String, Integer> builder = new Builder<String, Integer>();
2890888a09821a98ac0680fad765217302858e70fa4Paul Duffin      try {
2900888a09821a98ac0680fad765217302858e70fa4Paul Duffin        builder.put(new SimpleEntry<String, Integer>(null, 1));
2910888a09821a98ac0680fad765217302858e70fa4Paul Duffin        fail();
2920888a09821a98ac0680fad765217302858e70fa4Paul Duffin      } catch (NullPointerException expected) {}
2930888a09821a98ac0680fad765217302858e70fa4Paul Duffin      builder.put("foo", 2);
2940888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertMapEquals(builder.build(), "foo", 2);
2950888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2960888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2970888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void testBuilderPutNullKey() {
2980888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Builder<String, Integer> builder = new Builder<String, Integer>();
2990888a09821a98ac0680fad765217302858e70fa4Paul Duffin      try {
3000888a09821a98ac0680fad765217302858e70fa4Paul Duffin        builder.put(null, 1);
3010888a09821a98ac0680fad765217302858e70fa4Paul Duffin        fail();
3020888a09821a98ac0680fad765217302858e70fa4Paul Duffin      } catch (NullPointerException expected) {
3030888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
3040888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
3050888a09821a98ac0680fad765217302858e70fa4Paul Duffin
3060888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void testBuilderPutNullValue() {
3070888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Builder<String, Integer> builder = new Builder<String, Integer>();
3080888a09821a98ac0680fad765217302858e70fa4Paul Duffin      try {
3090888a09821a98ac0680fad765217302858e70fa4Paul Duffin        builder.put("one", null);
3100888a09821a98ac0680fad765217302858e70fa4Paul Duffin        fail();
3110888a09821a98ac0680fad765217302858e70fa4Paul Duffin      } catch (NullPointerException expected) {
3120888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
3130888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
3140888a09821a98ac0680fad765217302858e70fa4Paul Duffin
3150888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void testBuilderPutNullKeyViaPutAll() {
3160888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Builder<String, Integer> builder = new Builder<String, Integer>();
3170888a09821a98ac0680fad765217302858e70fa4Paul Duffin      try {
3180888a09821a98ac0680fad765217302858e70fa4Paul Duffin        builder.putAll(Collections.<String, Integer>singletonMap(null, 1));
3190888a09821a98ac0680fad765217302858e70fa4Paul Duffin        fail();
3200888a09821a98ac0680fad765217302858e70fa4Paul Duffin      } catch (NullPointerException expected) {
3210888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
3220888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
3230888a09821a98ac0680fad765217302858e70fa4Paul Duffin
3240888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void testBuilderPutNullValueViaPutAll() {
3250888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Builder<String, Integer> builder = new Builder<String, Integer>();
3260888a09821a98ac0680fad765217302858e70fa4Paul Duffin      try {
3270888a09821a98ac0680fad765217302858e70fa4Paul Duffin        builder.putAll(Collections.<String, Integer>singletonMap("one", null));
3280888a09821a98ac0680fad765217302858e70fa4Paul Duffin        fail();
3290888a09821a98ac0680fad765217302858e70fa4Paul Duffin      } catch (NullPointerException expected) {
3300888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
3310888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
3320888a09821a98ac0680fad765217302858e70fa4Paul Duffin
3330888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void testPuttingTheSameKeyTwiceThrowsOnBuild() {
3340888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Builder<String, Integer> builder = new Builder<String, Integer>()
3350888a09821a98ac0680fad765217302858e70fa4Paul Duffin          .put("one", 1)
3360888a09821a98ac0680fad765217302858e70fa4Paul Duffin          .put("one", 1); // throwing on this line would be even better
3370888a09821a98ac0680fad765217302858e70fa4Paul Duffin
3380888a09821a98ac0680fad765217302858e70fa4Paul Duffin      try {
3390888a09821a98ac0680fad765217302858e70fa4Paul Duffin        builder.build();
3400888a09821a98ac0680fad765217302858e70fa4Paul Duffin        fail();
3410888a09821a98ac0680fad765217302858e70fa4Paul Duffin      } catch (IllegalArgumentException expected) {
3420888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
3430888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
3440888a09821a98ac0680fad765217302858e70fa4Paul Duffin
3450888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void testOf() {
3460888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertMapEquals(
3470888a09821a98ac0680fad765217302858e70fa4Paul Duffin          ImmutableMap.of("one", 1),
3480888a09821a98ac0680fad765217302858e70fa4Paul Duffin          "one", 1);
3490888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertMapEquals(
3500888a09821a98ac0680fad765217302858e70fa4Paul Duffin          ImmutableMap.of("one", 1, "two", 2),
3510888a09821a98ac0680fad765217302858e70fa4Paul Duffin          "one", 1, "two", 2);
3520888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertMapEquals(
3530888a09821a98ac0680fad765217302858e70fa4Paul Duffin          ImmutableMap.of("one", 1, "two", 2, "three", 3),
3540888a09821a98ac0680fad765217302858e70fa4Paul Duffin          "one", 1, "two", 2, "three", 3);
3550888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertMapEquals(
3560888a09821a98ac0680fad765217302858e70fa4Paul Duffin          ImmutableMap.of("one", 1, "two", 2, "three", 3, "four", 4),
3570888a09821a98ac0680fad765217302858e70fa4Paul Duffin          "one", 1, "two", 2, "three", 3, "four", 4);
3580888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertMapEquals(
3590888a09821a98ac0680fad765217302858e70fa4Paul Duffin          ImmutableMap.of("one", 1, "two", 2, "three", 3, "four", 4, "five", 5),
3600888a09821a98ac0680fad765217302858e70fa4Paul Duffin          "one", 1, "two", 2, "three", 3, "four", 4, "five", 5);
3610888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
3620888a09821a98ac0680fad765217302858e70fa4Paul Duffin
3630888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void testOfNullKey() {
3640888a09821a98ac0680fad765217302858e70fa4Paul Duffin      try {
3650888a09821a98ac0680fad765217302858e70fa4Paul Duffin        ImmutableMap.of(null, 1);
3660888a09821a98ac0680fad765217302858e70fa4Paul Duffin        fail();
3670888a09821a98ac0680fad765217302858e70fa4Paul Duffin      } catch (NullPointerException expected) {
3680888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
3690888a09821a98ac0680fad765217302858e70fa4Paul Duffin
3700888a09821a98ac0680fad765217302858e70fa4Paul Duffin      try {
3710888a09821a98ac0680fad765217302858e70fa4Paul Duffin        ImmutableMap.of("one", 1, null, 2);
3720888a09821a98ac0680fad765217302858e70fa4Paul Duffin        fail();
3730888a09821a98ac0680fad765217302858e70fa4Paul Duffin      } catch (NullPointerException expected) {
3740888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
3750888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
3760888a09821a98ac0680fad765217302858e70fa4Paul Duffin
3770888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void testOfNullValue() {
3780888a09821a98ac0680fad765217302858e70fa4Paul Duffin      try {
3790888a09821a98ac0680fad765217302858e70fa4Paul Duffin        ImmutableMap.of("one", null);
3800888a09821a98ac0680fad765217302858e70fa4Paul Duffin        fail();
3810888a09821a98ac0680fad765217302858e70fa4Paul Duffin      } catch (NullPointerException expected) {
3820888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
3830888a09821a98ac0680fad765217302858e70fa4Paul Duffin
3840888a09821a98ac0680fad765217302858e70fa4Paul Duffin      try {
3850888a09821a98ac0680fad765217302858e70fa4Paul Duffin        ImmutableMap.of("one", 1, "two", null);
3860888a09821a98ac0680fad765217302858e70fa4Paul Duffin        fail();
3870888a09821a98ac0680fad765217302858e70fa4Paul Duffin      } catch (NullPointerException expected) {
3880888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
3890888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
3900888a09821a98ac0680fad765217302858e70fa4Paul Duffin
3910888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void testOfWithDuplicateKey() {
3920888a09821a98ac0680fad765217302858e70fa4Paul Duffin      try {
3930888a09821a98ac0680fad765217302858e70fa4Paul Duffin        ImmutableMap.of("one", 1, "one", 1);
3940888a09821a98ac0680fad765217302858e70fa4Paul Duffin        fail();
3950888a09821a98ac0680fad765217302858e70fa4Paul Duffin      } catch (IllegalArgumentException expected) {
3960888a09821a98ac0680fad765217302858e70fa4Paul Duffin      }
3970888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
3980888a09821a98ac0680fad765217302858e70fa4Paul Duffin
3990888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void testCopyOfEmptyMap() {
4000888a09821a98ac0680fad765217302858e70fa4Paul Duffin      ImmutableMap<String, Integer> copy
4010888a09821a98ac0680fad765217302858e70fa4Paul Duffin          = ImmutableMap.copyOf(Collections.<String, Integer>emptyMap());
4020888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertEquals(Collections.<String, Integer>emptyMap(), copy);
4030888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertSame(copy, ImmutableMap.copyOf(copy));
4040888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4050888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4060888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void testCopyOfSingletonMap() {
4070888a09821a98ac0680fad765217302858e70fa4Paul Duffin      ImmutableMap<String, Integer> copy
4080888a09821a98ac0680fad765217302858e70fa4Paul Duffin          = ImmutableMap.copyOf(Collections.singletonMap("one", 1));
4090888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertMapEquals(copy, "one", 1);
4100888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertSame(copy, ImmutableMap.copyOf(copy));
4110888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4120888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4130888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void testCopyOf() {
4140888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Map<String, Integer> original = new LinkedHashMap<String, Integer>();
4150888a09821a98ac0680fad765217302858e70fa4Paul Duffin      original.put("one", 1);
4160888a09821a98ac0680fad765217302858e70fa4Paul Duffin      original.put("two", 2);
4170888a09821a98ac0680fad765217302858e70fa4Paul Duffin      original.put("three", 3);
4180888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4190888a09821a98ac0680fad765217302858e70fa4Paul Duffin      ImmutableMap<String, Integer> copy = ImmutableMap.copyOf(original);
4200888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertMapEquals(copy, "one", 1, "two", 2, "three", 3);
4210888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertSame(copy, ImmutableMap.copyOf(copy));
4220888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4230888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
4240888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4250888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testNullGet() {
4260888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ImmutableMap<String, Integer> map = ImmutableMap.of("one", 1);
4270888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertNull(map.get(null));
4280888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
4290888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4300888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testAsMultimap() {
4310888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ImmutableMap<String, Integer> map = ImmutableMap.of(
4320888a09821a98ac0680fad765217302858e70fa4Paul Duffin        "one", 1, "won", 1, "two", 2, "too", 2, "three", 3);
4330888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ImmutableSetMultimap<String, Integer> expected = ImmutableSetMultimap.of(
4340888a09821a98ac0680fad765217302858e70fa4Paul Duffin        "one", 1, "won", 1, "two", 2, "too", 2, "three", 3);
4350888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(expected, map.asMultimap());
4360888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
4370888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4380888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testAsMultimapWhenEmpty() {
4390888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ImmutableMap<String, Integer> map = ImmutableMap.of();
4400888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ImmutableSetMultimap<String, Integer> expected = ImmutableSetMultimap.of();
4410888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(expected, map.asMultimap());
4420888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
4430888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4440888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testAsMultimapCaches() {
4450888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ImmutableMap<String, Integer> map = ImmutableMap.of("one", 1);
4460888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ImmutableSetMultimap<String, Integer> multimap1 = map.asMultimap();
4470888a09821a98ac0680fad765217302858e70fa4Paul Duffin    ImmutableSetMultimap<String, Integer> multimap2 = map.asMultimap();
4480888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(1, multimap1.asMap().size());
4490888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertSame(multimap1, multimap2);
4500888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
4510888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4520888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static <K, V> void assertMapEquals(Map<K, V> map,
4530888a09821a98ac0680fad765217302858e70fa4Paul Duffin      Object... alternatingKeysAndValues) {
4540888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(map.size(), alternatingKeysAndValues.length / 2);
4550888a09821a98ac0680fad765217302858e70fa4Paul Duffin    int i = 0;
4560888a09821a98ac0680fad765217302858e70fa4Paul Duffin    for (Entry<K, V> entry : map.entrySet()) {
4570888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertEquals(alternatingKeysAndValues[i++], entry.getKey());
4580888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertEquals(alternatingKeysAndValues[i++], entry.getValue());
4590888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4600888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
4610888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4620888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static class IntHolder implements Serializable {
4630888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public int value;
4640888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4650888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public IntHolder(int value) {
4660888a09821a98ac0680fad765217302858e70fa4Paul Duffin      this.value = value;
4670888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4680888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4690888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public boolean equals(Object o) {
4700888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return (o instanceof IntHolder) && ((IntHolder) o).value == value;
4710888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4720888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4730888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public int hashCode() {
4740888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return value;
4750888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
4760888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4770888a09821a98ac0680fad765217302858e70fa4Paul Duffin    private static final long serialVersionUID = 5;
4780888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
4790888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4800888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testMutableValues() {
4810888a09821a98ac0680fad765217302858e70fa4Paul Duffin    IntHolder holderA = new IntHolder(1);
4820888a09821a98ac0680fad765217302858e70fa4Paul Duffin    IntHolder holderB = new IntHolder(2);
4830888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Map<String, IntHolder> map = ImmutableMap.of("a", holderA, "b", holderB);
4840888a09821a98ac0680fad765217302858e70fa4Paul Duffin    holderA.value = 3;
4850888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertTrue(map.entrySet().contains(
4860888a09821a98ac0680fad765217302858e70fa4Paul Duffin        Maps.immutableEntry("a", new IntHolder(3))));
4870888a09821a98ac0680fad765217302858e70fa4Paul Duffin    Map<String, Integer> intMap = ImmutableMap.of("a", 3, "b", 2);
4880888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(intMap.hashCode(), map.entrySet().hashCode());
4890888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertEquals(intMap.hashCode(), map.hashCode());
4900888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
4910888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4920888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testCopyOfEnumMap() {
4930888a09821a98ac0680fad765217302858e70fa4Paul Duffin    EnumMap<AnEnum, String> map = new EnumMap<AnEnum, String>(AnEnum.class);
4940888a09821a98ac0680fad765217302858e70fa4Paul Duffin    map.put(AnEnum.B, "foo");
4950888a09821a98ac0680fad765217302858e70fa4Paul Duffin    map.put(AnEnum.C, "bar");
4960888a09821a98ac0680fad765217302858e70fa4Paul Duffin    assertTrue(ImmutableMap.copyOf(map) instanceof ImmutableEnumMap);
4970888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
4980888a09821a98ac0680fad765217302858e70fa4Paul Duffin
4990888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testEquals() {
5000888a09821a98ac0680fad765217302858e70fa4Paul Duffin    new EqualsTester()
5010888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .addEqualityGroup(ImmutableList.of(), ImmutableList.of())
5020888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .addEqualityGroup(ImmutableList.of(1), ImmutableList.of(1))
5030888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .addEqualityGroup(ImmutableList.of(1, 2), ImmutableList.of(1, 2))
5040888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .addEqualityGroup(ImmutableList.of(1, 2, 3))
5050888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .addEqualityGroup(ImmutableList.of(1, 2, 3, 4))
5060888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5))
5070888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6))
5080888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7))
5090888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 8))
5100888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 8, 9))
5110888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
5120888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11))
5130888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12))
5140888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .addEqualityGroup(ImmutableList.of(100, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12))
5150888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .addEqualityGroup(ImmutableList.of(1, 200, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12))
5160888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .addEqualityGroup(ImmutableList.of(1, 2, 300, 4, 5, 6, 7, 8, 9, 10, 11, 12))
5170888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .addEqualityGroup(ImmutableList.of(1, 2, 3, 400, 5, 6, 7, 8, 9, 10, 11, 12))
5180888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 500, 6, 7, 8, 9, 10, 11, 12))
5190888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 600, 7, 8, 9, 10, 11, 12))
5200888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 700, 8, 9, 10, 11, 12))
5210888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 800, 9, 10, 11, 12))
5220888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 8, 900, 10, 11, 12))
5230888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 1000, 11, 12))
5240888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1100, 12))
5250888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .addEqualityGroup(ImmutableList.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1200))
5260888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .testEquals();
5270888a09821a98ac0680fad765217302858e70fa4Paul Duffin
5280888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
5290888a09821a98ac0680fad765217302858e70fa4Paul Duffin}
5300888a09821a98ac0680fad765217302858e70fa4Paul Duffin
531