11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 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.testing.SerializableTester;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests for {@code EnumBiMap}.
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Mike Bostock
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Jared Levy
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class EnumBiMapTest extends TestCase {
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private enum Currency { DOLLAR, FRANC, PESO }
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private enum Country { CANADA, CHILE, SWITZERLAND }
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreate() {
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    EnumBiMap<Currency, Country> bimap =
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        EnumBiMap.create(Currency.class, Country.class);
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(bimap.isEmpty());
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{}", bimap.toString());
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashBiMap.create(), bimap);
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(Currency.DOLLAR, Country.CANADA);
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Country.CANADA, bimap.get(Currency.DOLLAR));
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Currency.DOLLAR, bimap.inverse().get(Country.CANADA));
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreateFromMap() {
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /* Test with non-empty Map. */
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<Currency, Country> map = ImmutableMap.of(
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Currency.DOLLAR, Country.CANADA,
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Currency.PESO, Country.CHILE,
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Currency.FRANC, Country.SWITZERLAND);
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    EnumBiMap<Currency, Country> bimap = EnumBiMap.create(map);
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Country.CANADA, bimap.get(Currency.DOLLAR));
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Currency.DOLLAR, bimap.inverse().get(Country.CANADA));
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /* Map must have at least one entry if not an EnumBiMap. */
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      EnumBiMap.create(Collections.<Currency, Country>emptyMap());
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("IllegalArgumentException expected");
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {}
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      EnumBiMap.create(
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          EnumHashBiMap.<Currency, Country>create(Currency.class));
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("IllegalArgumentException expected");
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {}
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /* Map can be empty if it's an EnumBiMap. */
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<Currency, Country> emptyBimap =
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        EnumBiMap.create(Currency.class, Country.class);
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap = EnumBiMap.create(emptyBimap);
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(bimap.isEmpty());
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEnumBiMapConstructor() {
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /* Test that it copies existing entries. */
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    EnumBiMap<Currency, Country> bimap1 =
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        EnumBiMap.create(Currency.class, Country.class);
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap1.put(Currency.DOLLAR, Country.CANADA);
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    EnumBiMap<Currency, Country> bimap2 =
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        EnumBiMap.create(bimap1);
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Country.CANADA, bimap2.get(Currency.DOLLAR));
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(bimap1, bimap2);
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap2.inverse().put(Country.SWITZERLAND, Currency.FRANC);
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Country.SWITZERLAND, bimap2.get(Currency.FRANC));
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(bimap1.get(Currency.FRANC));
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(bimap2.equals(bimap1));
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /* Test that it can be empty. */
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    EnumBiMap<Currency, Country> emptyBimap =
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        EnumBiMap.create(Currency.class, Country.class);
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    EnumBiMap<Currency, Country> bimap3 =
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        EnumBiMap.create(emptyBimap);
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(bimap3, emptyBimap);
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeyType() {
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    EnumBiMap<Currency, Country> bimap =
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        EnumBiMap.create(Currency.class, Country.class);
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Currency.class, bimap.keyType());
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testValueType() {
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    EnumBiMap<Currency, Country> bimap =
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        EnumBiMap.create(Currency.class, Country.class);
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Country.class, bimap.valueType());
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializationTester")
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSerialization() {
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<Currency, Country> map = ImmutableMap.of(
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Currency.DOLLAR, Country.CANADA,
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Currency.PESO, Country.CHILE,
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Currency.FRANC, Country.SWITZERLAND);
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    EnumBiMap<Currency, Country> bimap = EnumBiMap.create(map);
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    BiMap<Currency, Country> copy =
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        SerializableTester.reserializeAndAssert(bimap);
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(bimap.inverse(), copy.inverse());
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIterationOrder() {
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // The enum orderings are alphabetical, leading to the bimap and its inverse
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // having inconsistent iteration orderings.
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<Currency, Country> map = ImmutableMap.of(
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Currency.DOLLAR, Country.CANADA,
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Currency.PESO, Country.CHILE,
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Currency.FRANC, Country.SWITZERLAND);
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    EnumBiMap<Currency, Country> bimap = EnumBiMap.create(map);
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // forward map ordered by currency
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(bimap.keySet())
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .hasContentsInOrder(Currency.DOLLAR, Currency.FRANC, Currency.PESO);
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // forward map ordered by currency (even for country values)
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(bimap.values())
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .hasContentsInOrder(Country.CANADA, Country.SWITZERLAND, Country.CHILE);
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // backward map ordered by country
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(bimap.inverse().keySet())
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .hasContentsInOrder(Country.CANADA, Country.CHILE, Country.SWITZERLAND);
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // backward map ordered by country (even for currency values)
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(bimap.inverse().values())
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .hasContentsInOrder(Currency.DOLLAR, Currency.PESO, Currency.FRANC);
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntrySet() {
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<Currency, Country> map = ImmutableMap.of(
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Currency.DOLLAR, Country.CANADA,
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Currency.PESO, Country.CHILE,
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Currency.FRANC, Country.SWITZERLAND);
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    EnumBiMap<Currency, Country> bimap = EnumBiMap.create(map);
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Object> uniqueEntries = Sets.newIdentityHashSet();
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    uniqueEntries.addAll(bimap.entrySet());
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, uniqueEntries.size());
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /* Remaining behavior tested by AbstractBiMapTest. */
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
164