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 java.util.Arrays.asList;
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.io.Serializable;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map.Entry;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set;
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Common tests for any {@code BiMap}.
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic abstract class AbstractBiMapTest extends TestCase {
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected abstract BiMap<Integer, String> create();
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected BiMap<Integer, String> bimap;
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected Set<Entry<Integer, String>> entrySet;
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // public for GWT
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public void setUp() throws Exception {
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    super.setUp();
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap = create();
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    entrySet = bimap.entrySet();
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testClear() {
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.clear();
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(bimap.isEmpty());
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    putOneTwoThree();
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.clear();
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(bimap.isEmpty());
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testContainsKey() {
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(bimap.containsKey(null));
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(bimap.containsKey(1));
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(bimap.containsKey("one"));
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, "one");
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(bimap.containsKey(1));
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(null, null);
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(bimap.containsKey(null));
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testContainsValue() {
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(bimap.containsValue(null));
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(bimap.containsValue(1));
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(bimap.containsValue("one"));
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, "one");
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(bimap.containsValue("one"));
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(null, null);
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(bimap.containsValue(null));
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEquals() {
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    BiMap<Integer, String> biMap = create();
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(biMap, biMap);
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(create(), biMap);
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    biMap.put(1, null);
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(create().equals(biMap));
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet() {
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(bimap.get(1));
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(bimap.get(null));
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(bimap.get("bad"));
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, "one");
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(0, null);
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(null, "nothing");
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("one", bimap.get(1));
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(bimap.get(0));
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("nothing", bimap.get(null));
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(bimap.get("bad"));
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.forcePut(null, null);
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(bimap.get(null));
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.remove(null);
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(bimap.get(null));
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testInverseSimple() {
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    BiMap<String, Integer> inverse = bimap.inverse();
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, "one");
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(2, "two");
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of("one", 1, "two", 2), inverse);
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // see InverseBiMapTest
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(bimap, inverse.inverse());
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testInversePut() {
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    BiMap<String, Integer> inverse = bimap.inverse();
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, "one");
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.inverse().put("two", 2);
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of("one", 1, "two", 2), inverse);
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(1, "one", 2, "two"), bimap);
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsEmpty() {
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(bimap.isEmpty());
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, "one");
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(bimap.isEmpty());
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.remove(1);
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(bimap.isEmpty());
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPut() {
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, "one");
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(1, "one"), bimap);
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(2, "two");
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(1, "one", 2, "two"), bimap);
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(2, "two");
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(1, "one", 2, "two"), bimap);
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, "ONE");
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(1, "ONE", 2, "two"), bimap);
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      bimap.put(3, "two");
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException e) {
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(1, "ONE", 2, "two"), bimap);
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(-1, null);
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(null, "null");
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<Integer, String> expected = Maps.newHashMap();
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expected.put(1, "ONE");
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expected.put(2, "two");
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expected.put(-1, null);
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expected.put(null, "null");
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expected, bimap);
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.remove(-1);
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(null, null);
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expected.remove(-1);
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expected.put(null, null);
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expected, bimap);
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPutNull() {
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(-1, null);
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(bimap.containsValue(null));
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, "one");
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(bimap.containsValue(null));
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPutAll() {
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, "one");
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<Integer, String> newEntries = ImmutableMap.of(2, "two", 3, "three");
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.putAll(newEntries);
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(1, "one", 2, "two", 3, "three"), bimap);
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testForcePut() {
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(bimap.forcePut(1, "one"));
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(1, "one"), bimap);
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("one", bimap.forcePut(1, "one"));
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(1, "one"), bimap);
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("one", bimap.forcePut(1, "ONE"));
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(1, "ONE"), bimap);
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(bimap.forcePut(-1, "ONE")); // key 1 disappears without a trace
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(-1, "ONE"), bimap);
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(bimap.forcePut(2, "two"));
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(-1, "ONE", 2, "two"), bimap);
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("two", bimap.forcePut(2, "ONE"));
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of(2, "ONE"), bimap);
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemove() {
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<Integer, String> map = Maps.newHashMap();
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put(0, null);
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put(1, "one");
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put(null, "null");
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.putAll(map);
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(bimap.remove(0));
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.remove(0);
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(map, bimap);
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("null", bimap.remove(null));
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.singletonMap(1, "one"), bimap);
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(bimap.remove(15));
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("one", bimap.remove(1));
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(bimap.isEmpty());
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSize() {
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, bimap.size());
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, "one");
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, bimap.size());
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, "ONE");
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, bimap.size());
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(2, "two");
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, bimap.size());
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.forcePut(1, "two");
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, bimap.size());
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testToString() {
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, "one");
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(2, "two");
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String string = bimap.toString();
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String expected = string.startsWith("{1")
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ? "{1=one, 2=two}"
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        : "{2=two, 1=one}";
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expected, bimap.toString());
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Entry Set
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntrySetAdd() {
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      entrySet.add(Maps.immutableEntry(1, "one"));
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntrySetAddAll() {
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      entrySet.addAll(Collections.singleton(Maps.immutableEntry(1, "one")));
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntrySetClear() {
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    entrySet.clear();
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(entrySet.isEmpty());
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(bimap.isEmpty());
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    putOneTwoThree();
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    entrySet.clear();
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(entrySet.isEmpty());
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(bimap.isEmpty());
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntrySetContains() {
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entrySet.contains(Maps.immutableEntry(1, "one")));
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, "one");
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(entrySet.contains(Maps.immutableEntry(1, "one")));
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entrySet.contains(Maps.immutableEntry(1, "")));
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entrySet.contains(Maps.immutableEntry(0, "one")));
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entrySet.contains(Maps.immutableEntry(1, null)));
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entrySet.contains(Maps.immutableEntry(null, "one")));
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entrySet.contains(Maps.immutableEntry(null, null)));
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(null, null);
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(entrySet.contains(Maps.immutableEntry(1, "one")));
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(entrySet.contains(Maps.immutableEntry(null, null)));
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entrySet.contains(Maps.immutableEntry(1, "")));
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entrySet.contains(Maps.immutableEntry(0, "one")));
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entrySet.contains(Maps.immutableEntry(1, null)));
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entrySet.contains(Maps.immutableEntry(null, "one")));
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(null, "null");
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(0, null);
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(entrySet.contains(Maps.immutableEntry(1, "one")));
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(entrySet.contains(Maps.immutableEntry(null, "null")));
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(entrySet.contains(Maps.immutableEntry(0, null)));
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entrySet.contains(Maps.immutableEntry(1, "")));
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entrySet.contains(Maps.immutableEntry(0, "one")));
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entrySet.contains(Maps.immutableEntry(1, null)));
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entrySet.contains(Maps.immutableEntry(null, "one")));
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entrySet.contains(Maps.immutableEntry(null, null)));
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntrySetIsEmpty() {
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(entrySet.isEmpty());
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, "one");
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entrySet.isEmpty());
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.remove(1);
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(entrySet.isEmpty());
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntrySetRemove() {
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    putOneTwoThree();
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(bimap.containsKey(1));
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(bimap.containsValue("one"));
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(entrySet.remove(Maps.immutableEntry(1, "one")));
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(bimap.containsKey(1));
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(bimap.containsValue("one"));
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, bimap.size());
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, bimap.inverse().size());
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entrySet.remove(Maps.immutableEntry(2, "three")));
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entrySet.remove(3));
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, bimap.size());
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, bimap.inverse().size());
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntrySetRemoveAll() {
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    putOneTwoThree();
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(bimap.containsKey(1));
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(bimap.containsValue("one"));
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(entrySet.removeAll(
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Collections.singleton(Maps.immutableEntry(1, "one"))));
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(bimap.containsKey(1));
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(bimap.containsValue("one"));
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, bimap.size());
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, bimap.inverse().size());
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntrySetValue() {
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, "one");
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Entry<Integer, String> entry = bimap.entrySet().iterator().next();
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(2, "two");
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("one", entry.getValue());
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, "one");
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("one", entry.getValue());
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("one", bimap.get(1));
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Integer.valueOf(1), bimap.inverse().get("one"));
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, "uno");
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("uno", entry.getValue());
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("uno", bimap.get(1));
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Integer.valueOf(1), bimap.inverse().get("uno"));
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, bimap.size());
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, bimap.inverse().size());
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      entry.setValue("two");
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {}
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("uno", entry.getValue());
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("uno", bimap.get(1));
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Integer.valueOf(1), bimap.inverse().get("uno"));
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, bimap.size());
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, bimap.inverse().size());
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntrySetValueRemovedEntry() {
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, "a");
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Entry<Integer, String> entry = bimap.entrySet().iterator().next();
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.clear();
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      entry.setValue("b");
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalStateException expected) {}
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, bimap.size());
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, bimap.inverse().size());
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntrySetValueRemovedEntryNullOldValue() {
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, null);
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Entry<Integer, String> entry = bimap.entrySet().iterator().next();
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.clear();
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      entry.setValue("b");
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalStateException expected) {}
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, bimap.size());
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, bimap.inverse().size());
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntrySetValueRemovedEntryAddedEqualEntry() {
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, "a");
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Entry<Integer, String> entry = bimap.entrySet().iterator().next();
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.clear();
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, "a");
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      entry.setValue("b");
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalStateException expected) {}
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, bimap.size());
4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("a", bimap.get(1));
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, bimap.inverse().size());
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals((Integer) 1, bimap.inverse().get("a"));
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeySetIteratorRemove() {
4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    putOneTwoThree();
4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> iterator = bimap.keySet().iterator();
4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.next();
4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.remove();
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, bimap.size());
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, bimap.inverse().size());
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeySetRemoveAll() {
4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    putOneTwoThree();
4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Integer> keySet = bimap.keySet();
4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(keySet.removeAll(asList(1, 3)));
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, bimap.size());
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(keySet.contains(2));
4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeySetRetainAll() {
4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    putOneTwoThree();
4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Integer> keySet = bimap.keySet();
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(keySet.retainAll(Collections.singleton(2)));
4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, bimap.size());
4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(keySet.contains(2));
4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntriesIteratorRemove() {
4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    putOneTwoThree();
4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Entry<Integer, String>> iterator = bimap.entrySet().iterator();
4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.next();
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.remove();
4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, bimap.size());
4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, bimap.inverse().size());
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntriesRetainAll() {
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    putOneTwoThree();
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Map.Entry<Integer, String>> entries = bimap.entrySet();
4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map.Entry<Integer, String> entry = Maps.immutableEntry(2, "two");
4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(entries.retainAll(Collections.singleton(entry)));
4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, bimap.size());
4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(bimap.containsKey(2));
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testValuesIteratorRemove() {
4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    putOneTwoThree();
4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = bimap.values().iterator();
4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.next();
4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.remove();
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, bimap.size());
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, bimap.inverse().size());
4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testValuesToArray() {
4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, "one");
4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String[] array = new String[3];
4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    array[1] = "garbage";
4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(array, bimap.values().toArray(array));
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("one", array[0]);
4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(array[1]);
4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testValuesToString() {
4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, "one");
4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[one]", bimap.values().toString());
4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSerialization() {
4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, "one");
4781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(2, "two");
4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(3, "three");
4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(null, null);
4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    BiMap<Integer, String> copy =
4831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        SerializableTester.reserializeAndAssert(bimap);
4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(bimap.inverse(), copy.inverse());
4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  void putOneTwoThree() {
4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, "one");
4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(2, "two");
4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(3, "three");
4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("used only by @GwtIncompatible code")
4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class BiMapPair implements Serializable {
4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final BiMap<Integer, String> forward;
4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final BiMap<String, Integer> backward;
4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    BiMapPair(BiMap<Integer, String> original) {
4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      this.forward = original;
5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      this.backward = original.inverse();
5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private static final long serialVersionUID = 0;
5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSerializationWithInverseEqual() {
5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, "one");
5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(2, "two");
5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(3, "three");
5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(null, null);
5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    BiMapPair pair = new BiMapPair(bimap);
5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    BiMapPair copy = SerializableTester.reserialize(pair);
5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(pair.forward, copy.forward);
5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(pair.backward, copy.backward);
5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    copy.forward.put(4, "four");
5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    copy.backward.put("five", 5);
5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(copy.backward, copy.forward.inverse());
5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(copy.forward, copy.backward.inverse());
5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(copy.forward.containsKey(4));
5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(copy.forward.containsKey(5));
5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(copy.backward.containsValue(4));
5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(copy.backward.containsValue(5));
5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(copy.forward.containsValue("four"));
5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(copy.forward.containsValue("five"));
5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(copy.backward.containsKey("four"));
5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(copy.backward.containsKey("five"));
5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * The sameness checks ensure that a bimap and its inverse remain consistent,
5351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * even after the deserialized instances are updated. Also, the relationship
5361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@code a == b.inverse()} should continue to hold after both bimaps are
5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * serialized and deserialized together.
5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
5391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
5401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSerializationWithInverseSame() {
5411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(1, "one");
5421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(2, "two");
5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(3, "three");
5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    bimap.put(null, null);
5451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    BiMapPair pair = new BiMapPair(bimap);
5471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    BiMapPair copy = SerializableTester.reserialize(pair);
5481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(copy.backward, copy.forward.inverse());
5491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(copy.forward, copy.backward.inverse());
5501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
552