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