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
197dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.collect.testing.Helpers.orderEntriesByKey;
203ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffinimport static com.google.common.truth.Truth.assertThat;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
247dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.Helpers;
257dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.SampleElements;
267dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.features.CollectionFeature;
277dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.features.CollectionSize;
287dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.features.MapFeature;
297dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.google.BiMapTestSuiteBuilder;
307dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.google.TestBiMapGenerator;
317dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.testing.EqualsTester;
327dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.testing.NullPointerTester;
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.SerializableTester;
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
350888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.Test;
360888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestCase;
370888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestSuite;
380888a09821a98ac0680fad765217302858e70fa4Paul Duffin
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
407dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.Iterator;
417dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.List;
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map;
437dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.Map.Entry;
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set;
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests for {@code EnumBiMap}.
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Mike Bostock
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Jared Levy
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class EnumBiMapTest extends TestCase {
547dd252788645e940eada959bdde927426e2531c9Paul Duffin  private enum Currency { DOLLAR, FRANC, PESO, POUND, YEN }
557dd252788645e940eada959bdde927426e2531c9Paul Duffin  private enum Country { CANADA, CHILE, JAPAN, SWITZERLAND, UK }
567dd252788645e940eada959bdde927426e2531c9Paul Duffin
577dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static final class EnumBiMapGenerator implements TestBiMapGenerator<Country, Currency> {
587dd252788645e940eada959bdde927426e2531c9Paul Duffin    @SuppressWarnings("unchecked")
597dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
607dd252788645e940eada959bdde927426e2531c9Paul Duffin    public BiMap<Country, Currency> create(Object... entries) {
617dd252788645e940eada959bdde927426e2531c9Paul Duffin      BiMap<Country, Currency> result = EnumBiMap.create(Country.class, Currency.class);
627dd252788645e940eada959bdde927426e2531c9Paul Duffin      for (Object object : entries) {
637dd252788645e940eada959bdde927426e2531c9Paul Duffin        Entry<Country, Currency> entry = (Entry<Country, Currency>) object;
647dd252788645e940eada959bdde927426e2531c9Paul Duffin        result.put(entry.getKey(), entry.getValue());
657dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
667dd252788645e940eada959bdde927426e2531c9Paul Duffin      return result;
677dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
687dd252788645e940eada959bdde927426e2531c9Paul Duffin
697dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
707dd252788645e940eada959bdde927426e2531c9Paul Duffin    public SampleElements<Entry<Country, Currency>> samples() {
717dd252788645e940eada959bdde927426e2531c9Paul Duffin      return new SampleElements<Entry<Country, Currency>>(
727dd252788645e940eada959bdde927426e2531c9Paul Duffin          Helpers.mapEntry(Country.CANADA, Currency.DOLLAR),
737dd252788645e940eada959bdde927426e2531c9Paul Duffin          Helpers.mapEntry(Country.CHILE, Currency.PESO),
747dd252788645e940eada959bdde927426e2531c9Paul Duffin          Helpers.mapEntry(Country.UK, Currency.POUND),
757dd252788645e940eada959bdde927426e2531c9Paul Duffin          Helpers.mapEntry(Country.JAPAN, Currency.YEN),
767dd252788645e940eada959bdde927426e2531c9Paul Duffin          Helpers.mapEntry(Country.SWITZERLAND, Currency.FRANC));
777dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
787dd252788645e940eada959bdde927426e2531c9Paul Duffin
797dd252788645e940eada959bdde927426e2531c9Paul Duffin    @SuppressWarnings("unchecked")
807dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
817dd252788645e940eada959bdde927426e2531c9Paul Duffin    public Entry<Country, Currency>[] createArray(int length) {
827dd252788645e940eada959bdde927426e2531c9Paul Duffin      return new Entry[length];
837dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
847dd252788645e940eada959bdde927426e2531c9Paul Duffin
857dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
867dd252788645e940eada959bdde927426e2531c9Paul Duffin    public Iterable<Entry<Country, Currency>> order(List<Entry<Country, Currency>> insertionOrder) {
877dd252788645e940eada959bdde927426e2531c9Paul Duffin      return orderEntriesByKey(insertionOrder);
887dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
897dd252788645e940eada959bdde927426e2531c9Paul Duffin
907dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
917dd252788645e940eada959bdde927426e2531c9Paul Duffin    public Country[] createKeyArray(int length) {
927dd252788645e940eada959bdde927426e2531c9Paul Duffin      return new Country[length];
937dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
947dd252788645e940eada959bdde927426e2531c9Paul Duffin
957dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
967dd252788645e940eada959bdde927426e2531c9Paul Duffin    public Currency[] createValueArray(int length) {
977dd252788645e940eada959bdde927426e2531c9Paul Duffin      return new Currency[length];
987dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
997dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1007dd252788645e940eada959bdde927426e2531c9Paul Duffin
1017dd252788645e940eada959bdde927426e2531c9Paul Duffin  @GwtIncompatible("suite")
1027dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static Test suite() {
1037dd252788645e940eada959bdde927426e2531c9Paul Duffin    TestSuite suite = new TestSuite();
1047dd252788645e940eada959bdde927426e2531c9Paul Duffin    suite.addTest(BiMapTestSuiteBuilder.using(new EnumBiMapGenerator())
1057dd252788645e940eada959bdde927426e2531c9Paul Duffin        .named("EnumBiMap")
1067dd252788645e940eada959bdde927426e2531c9Paul Duffin        .withFeatures(CollectionSize.ANY,
1077dd252788645e940eada959bdde927426e2531c9Paul Duffin            CollectionFeature.SERIALIZABLE,
1080888a09821a98ac0680fad765217302858e70fa4Paul Duffin            CollectionFeature.SUPPORTS_ITERATOR_REMOVE,
1097dd252788645e940eada959bdde927426e2531c9Paul Duffin            MapFeature.GENERAL_PURPOSE,
1107dd252788645e940eada959bdde927426e2531c9Paul Duffin            CollectionFeature.KNOWN_ORDER)
1117dd252788645e940eada959bdde927426e2531c9Paul Duffin        .createTestSuite());
1127dd252788645e940eada959bdde927426e2531c9Paul Duffin    suite.addTestSuite(EnumBiMapTest.class);
1137dd252788645e940eada959bdde927426e2531c9Paul Duffin    return suite;
1147dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreate() {
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    EnumBiMap<Currency, Country> bimap =
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        EnumBiMap.create(Currency.class, Country.class);
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(bimap.isEmpty());
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{}", bimap.toString());
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(HashBiMap.create(), bimap);
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(Currency.DOLLAR, Country.CANADA);
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Country.CANADA, bimap.get(Currency.DOLLAR));
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Currency.DOLLAR, bimap.inverse().get(Country.CANADA));
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreateFromMap() {
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /* Test with non-empty Map. */
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<Currency, Country> map = ImmutableMap.of(
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Currency.DOLLAR, Country.CANADA,
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Currency.PESO, Country.CHILE,
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Currency.FRANC, Country.SWITZERLAND);
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    EnumBiMap<Currency, Country> bimap = EnumBiMap.create(map);
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Country.CANADA, bimap.get(Currency.DOLLAR));
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Currency.DOLLAR, bimap.inverse().get(Country.CANADA));
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /* Map must have at least one entry if not an EnumBiMap. */
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      EnumBiMap.create(Collections.<Currency, Country>emptyMap());
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("IllegalArgumentException expected");
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {}
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      EnumBiMap.create(
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          EnumHashBiMap.<Currency, Country>create(Currency.class));
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("IllegalArgumentException expected");
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {}
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /* Map can be empty if it's an EnumBiMap. */
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<Currency, Country> emptyBimap =
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        EnumBiMap.create(Currency.class, Country.class);
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap = EnumBiMap.create(emptyBimap);
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(bimap.isEmpty());
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEnumBiMapConstructor() {
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /* Test that it copies existing entries. */
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    EnumBiMap<Currency, Country> bimap1 =
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        EnumBiMap.create(Currency.class, Country.class);
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap1.put(Currency.DOLLAR, Country.CANADA);
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    EnumBiMap<Currency, Country> bimap2 =
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        EnumBiMap.create(bimap1);
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Country.CANADA, bimap2.get(Currency.DOLLAR));
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(bimap1, bimap2);
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap2.inverse().put(Country.SWITZERLAND, Currency.FRANC);
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Country.SWITZERLAND, bimap2.get(Currency.FRANC));
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(bimap1.get(Currency.FRANC));
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(bimap2.equals(bimap1));
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /* Test that it can be empty. */
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    EnumBiMap<Currency, Country> emptyBimap =
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        EnumBiMap.create(Currency.class, Country.class);
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    EnumBiMap<Currency, Country> bimap3 =
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        EnumBiMap.create(emptyBimap);
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(bimap3, emptyBimap);
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeyType() {
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    EnumBiMap<Currency, Country> bimap =
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        EnumBiMap.create(Currency.class, Country.class);
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Currency.class, bimap.keyType());
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testValueType() {
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    EnumBiMap<Currency, Country> bimap =
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        EnumBiMap.create(Currency.class, Country.class);
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Country.class, bimap.valueType());
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1897dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testIterationOrder() {
1907dd252788645e940eada959bdde927426e2531c9Paul Duffin    // The enum orderings are alphabetical, leading to the bimap and its inverse
1917dd252788645e940eada959bdde927426e2531c9Paul Duffin    // having inconsistent iteration orderings.
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<Currency, Country> map = ImmutableMap.of(
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Currency.DOLLAR, Country.CANADA,
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Currency.PESO, Country.CHILE,
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Currency.FRANC, Country.SWITZERLAND);
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    EnumBiMap<Currency, Country> bimap = EnumBiMap.create(map);
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1987dd252788645e940eada959bdde927426e2531c9Paul Duffin    // forward map ordered by currency
1993ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(bimap.keySet())
2000888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .has().exactly(Currency.DOLLAR, Currency.FRANC, Currency.PESO).inOrder();
2017dd252788645e940eada959bdde927426e2531c9Paul Duffin    // forward map ordered by currency (even for country values)
2023ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(bimap.values())
2030888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .has().exactly(Country.CANADA, Country.SWITZERLAND, Country.CHILE).inOrder();
2047dd252788645e940eada959bdde927426e2531c9Paul Duffin    // backward map ordered by country
2053ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(bimap.inverse().keySet())
2060888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .has().exactly(Country.CANADA, Country.CHILE, Country.SWITZERLAND).inOrder();
2077dd252788645e940eada959bdde927426e2531c9Paul Duffin    // backward map ordered by country (even for currency values)
2083ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(bimap.inverse().values())
2090888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .has().exactly(Currency.DOLLAR, Currency.PESO, Currency.FRANC).inOrder();
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2127dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testKeySetIteratorRemove() {
2137dd252788645e940eada959bdde927426e2531c9Paul Duffin    // The enum orderings are alphabetical, leading to the bimap and its inverse
2147dd252788645e940eada959bdde927426e2531c9Paul Duffin    // having inconsistent iteration orderings.
2157dd252788645e940eada959bdde927426e2531c9Paul Duffin    Map<Currency, Country> map = ImmutableMap.of(
2167dd252788645e940eada959bdde927426e2531c9Paul Duffin        Currency.DOLLAR, Country.CANADA,
2177dd252788645e940eada959bdde927426e2531c9Paul Duffin        Currency.PESO, Country.CHILE,
2187dd252788645e940eada959bdde927426e2531c9Paul Duffin        Currency.FRANC, Country.SWITZERLAND);
2197dd252788645e940eada959bdde927426e2531c9Paul Duffin    EnumBiMap<Currency, Country> bimap = EnumBiMap.create(map);
2207dd252788645e940eada959bdde927426e2531c9Paul Duffin
2217dd252788645e940eada959bdde927426e2531c9Paul Duffin    Iterator<Currency> iter = bimap.keySet().iterator();
2227dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertEquals(Currency.DOLLAR, iter.next());
2237dd252788645e940eada959bdde927426e2531c9Paul Duffin    iter.remove();
2247dd252788645e940eada959bdde927426e2531c9Paul Duffin
2257dd252788645e940eada959bdde927426e2531c9Paul Duffin    // forward map ordered by currency
2263ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(bimap.keySet())
2270888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .has().exactly(Currency.FRANC, Currency.PESO).inOrder();
2287dd252788645e940eada959bdde927426e2531c9Paul Duffin    // forward map ordered by currency (even for country values)
2293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(bimap.values())
2300888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .has().exactly(Country.SWITZERLAND, Country.CHILE).inOrder();
2317dd252788645e940eada959bdde927426e2531c9Paul Duffin    // backward map ordered by country
2323ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(bimap.inverse().keySet())
2330888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .has().exactly(Country.CHILE, Country.SWITZERLAND).inOrder();
2347dd252788645e940eada959bdde927426e2531c9Paul Duffin    // backward map ordered by country (even for currency values)
2353ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(bimap.inverse().values())
2360888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .has().exactly(Currency.PESO, Currency.FRANC).inOrder();
2377dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
2387dd252788645e940eada959bdde927426e2531c9Paul Duffin
2397dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testValuesIteratorRemove() {
2403c77433663281544363151bf284b0240dfd22a42Paul Duffin    // The enum orderings are alphabetical, leading to the bimap and its inverse
2413c77433663281544363151bf284b0240dfd22a42Paul Duffin    // having inconsistent iteration orderings.
2423c77433663281544363151bf284b0240dfd22a42Paul Duffin    Map<Currency, Country> map = ImmutableMap.of(
2433c77433663281544363151bf284b0240dfd22a42Paul Duffin        Currency.DOLLAR, Country.CANADA,
2443c77433663281544363151bf284b0240dfd22a42Paul Duffin        Currency.PESO, Country.CHILE,
2453c77433663281544363151bf284b0240dfd22a42Paul Duffin        Currency.FRANC, Country.SWITZERLAND);
2463c77433663281544363151bf284b0240dfd22a42Paul Duffin    EnumBiMap<Currency, Country> bimap = EnumBiMap.create(map);
2473c77433663281544363151bf284b0240dfd22a42Paul Duffin
2487dd252788645e940eada959bdde927426e2531c9Paul Duffin    Iterator<Currency> iter = bimap.keySet().iterator();
2497dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertEquals(Currency.DOLLAR, iter.next());
2507dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertEquals(Currency.FRANC, iter.next());
2517dd252788645e940eada959bdde927426e2531c9Paul Duffin    iter.remove();
2527dd252788645e940eada959bdde927426e2531c9Paul Duffin
2533c77433663281544363151bf284b0240dfd22a42Paul Duffin    // forward map ordered by currency
2543ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(bimap.keySet())
2550888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .has().exactly(Currency.DOLLAR, Currency.PESO).inOrder();
2563c77433663281544363151bf284b0240dfd22a42Paul Duffin    // forward map ordered by currency (even for country values)
2573ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(bimap.values())
2580888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .has().exactly(Country.CANADA, Country.CHILE).inOrder();
2593c77433663281544363151bf284b0240dfd22a42Paul Duffin    // backward map ordered by country
2603ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(bimap.inverse().keySet())
2610888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .has().exactly(Country.CANADA, Country.CHILE).inOrder();
2623c77433663281544363151bf284b0240dfd22a42Paul Duffin    // backward map ordered by country (even for currency values)
2633ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    assertThat(bimap.inverse().values())
2640888a09821a98ac0680fad765217302858e70fa4Paul Duffin        .has().exactly(Currency.DOLLAR, Currency.PESO).inOrder();
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntrySet() {
2687dd252788645e940eada959bdde927426e2531c9Paul Duffin    // Bug 3168290
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<Currency, Country> map = ImmutableMap.of(
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Currency.DOLLAR, Country.CANADA,
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Currency.PESO, Country.CHILE,
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Currency.FRANC, Country.SWITZERLAND);
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    EnumBiMap<Currency, Country> bimap = EnumBiMap.create(map);
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Object> uniqueEntries = Sets.newIdentityHashSet();
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    uniqueEntries.addAll(bimap.entrySet());
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, uniqueEntries.size());
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2797dd252788645e940eada959bdde927426e2531c9Paul Duffin  @GwtIncompatible("serialization")
2807dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testSerializable() {
2817dd252788645e940eada959bdde927426e2531c9Paul Duffin    SerializableTester.reserializeAndAssert(
2827dd252788645e940eada959bdde927426e2531c9Paul Duffin        EnumBiMap.create(ImmutableMap.of(Currency.DOLLAR, Country.CANADA)));
2837dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
2847dd252788645e940eada959bdde927426e2531c9Paul Duffin
2857dd252788645e940eada959bdde927426e2531c9Paul Duffin  @GwtIncompatible("reflection")
2867dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testNulls() {
2877dd252788645e940eada959bdde927426e2531c9Paul Duffin    new NullPointerTester().testAllPublicStaticMethods(EnumBiMap.class);
2887dd252788645e940eada959bdde927426e2531c9Paul Duffin    new NullPointerTester()
2897dd252788645e940eada959bdde927426e2531c9Paul Duffin        .testAllPublicInstanceMethods(
2907dd252788645e940eada959bdde927426e2531c9Paul Duffin            EnumBiMap.create(ImmutableMap.of(Currency.DOLLAR, Country.CHILE)));
2917dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
2927dd252788645e940eada959bdde927426e2531c9Paul Duffin
2937dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testEquals() {
2947dd252788645e940eada959bdde927426e2531c9Paul Duffin    new EqualsTester()
2957dd252788645e940eada959bdde927426e2531c9Paul Duffin        .addEqualityGroup(
2967dd252788645e940eada959bdde927426e2531c9Paul Duffin            EnumBiMap.create(ImmutableMap.of(Currency.DOLLAR, Country.CANADA)),
2977dd252788645e940eada959bdde927426e2531c9Paul Duffin            EnumBiMap.create(ImmutableMap.of(Currency.DOLLAR, Country.CANADA)))
2987dd252788645e940eada959bdde927426e2531c9Paul Duffin        .addEqualityGroup(EnumBiMap.create(ImmutableMap.of(Currency.DOLLAR, Country.CHILE)))
2997dd252788645e940eada959bdde927426e2531c9Paul Duffin        .addEqualityGroup(EnumBiMap.create(ImmutableMap.of(Currency.FRANC, Country.CANADA)))
3007dd252788645e940eada959bdde927426e2531c9Paul Duffin        .testEquals();
3017dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
3027dd252788645e940eada959bdde927426e2531c9Paul Duffin
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /* Remaining behavior tested by AbstractBiMapTest. */
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
305