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 Bringertimport static org.junit.contrib.truth.Truth.ASSERT;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.SerializableTester;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.ArrayList;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Arrays;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.ConcurrentModificationException;
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator;
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map;
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map.Entry;
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.NoSuchElementException;
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set;
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests for {@code Multimap} implementations. Caution: when subclassing avoid
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * accidental naming collisions with tests in this class!
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Jared Levy
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic abstract class AbstractMultimapTest extends TestCase {
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private Multimap<String, Integer> multimap;
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected abstract Multimap<String, Integer> create();
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected Multimap<String, Integer> createSample() {
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> sample = create();
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sample.putAll("foo", asList(3, -1, 2, 4, 1));
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sample.putAll("bar", asList(1, 2, 3, 1));
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return sample;
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // public for GWT
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public void setUp() throws Exception {
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    super.setUp();
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap = create();
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected Multimap<String, Integer> getMultimap() {
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return multimap;
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the key to use as a null placeholder in tests. The default
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * implementation returns {@code null}, but tests for multimaps that don't
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * support null keys should override it.
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected String nullKey() {
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return null;
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the value to use as a null placeholder in tests. The default
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * implementation returns {@code null}, but tests for multimaps that don't
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * support null values should override it.
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected Integer nullValue() {
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return null;
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Validate multimap size by calling {@code size()} and also by iterating
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * through the entries. This tests cases where the {@code entries()} list is
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * stored separately, such as the {@link LinkedHashMultimap}. It also
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * verifies that the multimap contains every multimap entry.
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected void assertSize(int expectedSize) {
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expectedSize, multimap.size());
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    int size = 0;
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (Entry<String, Integer> entry : multimap.entries()) {
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(multimap.containsEntry(entry.getKey(), entry.getValue()));
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      size++;
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expectedSize, size);
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    int size2 = 0;
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (Entry<String, Collection<Integer>> entry2 :
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.asMap().entrySet()) {
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      size2 += entry2.getValue().size();
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expectedSize, size2);
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected boolean removedCollectionsAreModifiable() {
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return false;
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSize0() {
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(0);
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSize1() {
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(1);
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSize2Keys() {
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 5);
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(2);
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSize2Values() {
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 7);
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(2);
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSizeNull() {
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 5);
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), nullValue());
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", nullValue());
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), 5);
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(5);
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsEmptyYes() {
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.isEmpty());
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsEmptyNo() {
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.isEmpty());
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsEmptyNull() {
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), nullValue());
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.isEmpty());
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsEmptyRemoved() {
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.remove("foo", 1);
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.isEmpty());
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testContainsKeyTrue() {
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsKey("foo"));
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testContainsKeyFalse() {
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsKey("bar"));
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsKey(nullKey()));
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testContainsKeyNull() {
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), 1);
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsKey(nullKey()));
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testContainsValueTrue() {
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsValue(1));
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testContainsValueFalse() {
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsValue(2));
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsValue(nullValue()));
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testContainsValueNull() {
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", nullValue());
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsValue(nullValue()));
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testContainsKeyValueTrue() {
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", 1));
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testContainsKeyValueRemoved() {
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.remove("foo", 1);
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsEntry("foo", 1));
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet0() {
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> values = multimap.get("bar");
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, values.size());
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet1() {
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 3);
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> values = multimap.get("bar");
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, values.size());
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(values.contains(3));
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(values.contains(5));
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet2() {
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 3);
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> values = multimap.get("foo");
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, values.size());
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(values.contains(1));
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(values.contains(3));
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetNull() {
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), nullValue());
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), 3);
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> values = multimap.get(nullKey());
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, values.size());
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(values.contains(nullValue()));
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(values.contains(3));
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPutAllIterable() {
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<Integer> iterable = new Iterable<Integer>() {
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      public Iterator<Integer> iterator() {
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Lists.newArrayList(1, 3).iterator();
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.putAll("foo", iterable);
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", 1));
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", 3));
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(2);
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<Integer> emptyIterable = new Iterable<Integer>() {
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      public Iterator<Integer> iterator() {
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Iterators.emptyIterator();
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.putAll("bar", emptyIterable);
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(2);
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.singleton("foo"), multimap.keySet());
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPutAllCollection() {
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> collection = Lists.newArrayList(1, 3);
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.putAll("foo", collection);
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", 1));
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", 3));
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(2);
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> emptyCollection = Lists.newArrayList();
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.putAll("bar", emptyCollection);
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(2);
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.singleton("foo"), multimap.keySet());
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPutAllCollectionNull() {
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> collection = Lists.newArrayList(1, nullValue());
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.putAll(nullKey(), collection);
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry(nullKey(), 1));
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry(nullKey(), nullValue()));
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(2);
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPutAllEmptyCollection() {
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> collection = Lists.newArrayList();
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.putAll("foo", collection);
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(0);
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.isEmpty());
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPutAllMultimap() {
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 2);
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("cow", 5);
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), 2);
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap2 = create();
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap2.put("foo", 1);
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap2.put("bar", 3);
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap2.put(nullKey(), nullValue());
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.putAll(multimap2);
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", 2));
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("cow", 5));
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", 1));
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("bar", 3));
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry(nullKey(), nullValue()));
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry(nullKey(), 2));
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(6);
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPutAllReturn_emptyCollection() {
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.putAll("foo", new ArrayList<Integer>()));
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.putAll(create()));
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPutAllReturn_nonEmptyCollection() {
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.putAll("foo", asList(1, 2, 3)));
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.putAll("foo", asList(4, 5, 6)));
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.putAll(create()));
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> other = create();
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    other.putAll("bar", asList(7, 8, 9));
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.putAll(other));
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void checkRemovedCollection(Collection<Integer> collection) {
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (removedCollectionsAreModifiable()) {
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      collection.add(9876);
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      collection.remove(9876);
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(collection.contains(9876));
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } else {
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        collection.add(9876);
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (UnsupportedOperationException expected) {
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testReplaceValues() {
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 3);
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> values = asList(2, nullValue());
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> oldValues = multimap.replaceValues("foo", values);
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", 2));
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", nullValue()));
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("bar", 3));
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(3);
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(oldValues.contains(1));
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, oldValues.size());
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkRemovedCollection(oldValues);
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testReplaceValuesEmpty() {
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 3);
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> values = asList();
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> oldValues = multimap.replaceValues("foo", values);
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsKey("foo"));
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("bar", 3));
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(1);
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(oldValues.contains(1));
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, oldValues.size());
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkRemovedCollection(oldValues);
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testReplaceValuesNull() {
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), 1);
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 3);
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> values = asList(2, nullValue());
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> oldValues = multimap.replaceValues(nullKey(), values);
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry(nullKey(), 2));
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry(nullKey(), nullValue()));
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("bar", 3));
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(3);
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(oldValues.contains(1));
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, oldValues.size());
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkRemovedCollection(oldValues);
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testReplaceValuesNotPresent() {
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 3);
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> values = asList(2, 4);
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> oldValues = multimap.replaceValues("foo", values);
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", 2));
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", 4));
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("bar", 3));
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(3);
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNotNull(oldValues);
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(oldValues.isEmpty());
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkRemovedCollection(oldValues);
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testReplaceValuesDuplicates() {
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> values = Lists.newArrayList(1, 2, 3, 2, 1);
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 3);
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> oldValues = multimap.replaceValues("bar", values);
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> replacedValues = multimap.get("bar");
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(multimap.size());
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(replacedValues.size(), multimap.size());
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, oldValues.size());
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(oldValues.contains(3));
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkRemovedCollection(oldValues);
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemove() {
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 3);
4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.remove("foo", 1));
4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsEntry("foo", 1));
4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", 3));
4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(1);
4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.remove("bar", 3));
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", 3));
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(1);
4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.remove("foo", 2));
4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", 3));
4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(1);
4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.remove("foo", 3));
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsKey("foo"));
4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(0);
4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveNull() {
4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), 1);
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), 3);
4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), nullValue());
4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.remove(nullKey(), 1));
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsEntry(nullKey(), 1));
4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry(nullKey(), 3));
4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry(nullKey(), nullValue()));
4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(2);
4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.remove(nullKey(), nullValue()));
4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsEntry(nullKey(), 1));
4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry(nullKey(), 3));
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsEntry(nullKey(), nullValue()));
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(1);
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveAll() {
4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 3);
4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> removed = multimap.removeAll("foo");
4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsKey("foo"));
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(0);
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(removed.contains(1));
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(removed.contains(3));
4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, removed.size());
4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkRemovedCollection(removed);
4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveAllNull() {
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), 1);
4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), nullValue());
4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> removed = multimap.removeAll(nullKey());
4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsKey(nullKey()));
4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(0);
4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(removed.contains(1));
4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(removed.contains(nullValue()));
4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, removed.size());
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkRemovedCollection(removed);
4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveAllNotPresent() {
4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 3);
4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> removed = multimap.removeAll("bar");
4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(2);
4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNotNull(removed);
4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(removed.isEmpty());
4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkRemovedCollection(removed);
4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testClear() {
4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 3);
4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.clear();
4831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, multimap.keySet().size());
4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(0);
4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeySet() {
4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", nullValue());
4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), 3);
4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<String> keys = multimap.keySet();
4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, keys.size());
4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(keys.contains("foo"));
4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(keys.contains(nullKey()));
4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(keys.containsAll(Lists.newArrayList("foo", nullKey())));
4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(keys.containsAll(Lists.newArrayList("foo", "bar")));
4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testValues() {
5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", nullValue());
5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), 3);
5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> values = multimap.values();
5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, values.size());
5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(values.contains(1));
5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(values.contains(3));
5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(values.contains(nullValue()));
5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(values.contains(5));
5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testValuesClear() {
5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", nullValue());
5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), 3);
5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> values = multimap.values();
5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    values.clear();
5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.isEmpty());
5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(values.isEmpty());
5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsEntry("foo", 1));
5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testValuesRemoveAllNullFromEmpty() {
5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      multimap.values().removeAll(null);
5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // Returning successfully is not ideal, but tolerated.
5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testValuesRetainAllNullFromEmpty() {
5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      multimap.values().retainAll(null);
5321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // Returning successfully is not ideal, but tolerated.
5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // the entries collection is more thoroughly tested in MultimapCollectionTest
5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked") // varargs
5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntries() {
5391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
5401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", nullValue());
5411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), 3);
5421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Entry<String, Integer>> entries = multimap.entries();
5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(entries).hasContentsAnyOrder(
5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("foo", 1),
5451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("foo", nullValue()),
5461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry(nullKey(), 3));
5471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNoSuchElementException() {
5501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Entry<String, Integer>> entries =
5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.entries().iterator();
5521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
5531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      entries.next();
5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
5551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NoSuchElementException expected) {}
5561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAsMap() {
5591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
5601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", nullValue());
5611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), 3);
5621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map<String, Collection<Integer>> map = multimap.asMap();
5631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, map.size());
5651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(map.get("foo")).hasContentsAnyOrder(1, nullValue());
5661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(map.get(nullKey())).hasContentsAnyOrder(3);
5671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(map.get("bar"));
5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(map.containsKey("foo"));
5691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(map.containsKey(nullKey()));
5701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsKey("bar"));
5711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(map.remove("foo")).hasContentsAnyOrder(1, nullValue());
5731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsKey("foo"));
5741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, multimap.size());
5751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(map.remove("bar"));
5761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.get(nullKey()).add(5);
5771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry(nullKey(), 5));
5781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, multimap.size());
5791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.get(nullKey()).clear();
5801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.isEmpty());
5811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, multimap.size());
5821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
5841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      map.put("bar", asList(4, 8));
5851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("Expected UnsupportedOperationException");
5861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {}
5871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 5);
5891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(1);
5901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.clear();
5911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(0);
5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAsMapEntries() {
5951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
5961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", nullValue());
5971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), 3);
5981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Entry<String, Collection<Integer>>> entries =
5991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.asMap().entrySet();
6001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, entries.size());
6011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(entries.contains(
6031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("foo", multimap.get("foo"))));
6041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entries.contains(
6051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("bar", multimap.get("foo"))));
6061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entries.contains(
6071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("bar", null)));
6081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entries.contains(
6091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("foo", null)));
6101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entries.contains(
6111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("foo", asList(1, 4))));
6121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entries.contains("foo"));
6131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Entry<String, Collection<Integer>>> iterator =
6151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        entries.iterator();
6161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = 0; i < 2; i++) {
6171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(iterator.hasNext());
6181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Entry<String, Collection<Integer>> entry = iterator.next();
6191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if ("foo".equals(entry.getKey())) {
6201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(2, entry.getValue().size());
6211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertTrue(entry.getValue().contains(1));
6221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertTrue(entry.getValue().contains(nullValue()));
6231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } else {
6241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(nullKey(), entry.getKey());
6251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(1, entry.getValue().size());
6261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertTrue(entry.getValue().contains(3));
6271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
6281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
6301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAsMapToString() {
6331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
6341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{foo=[1]}", multimap.asMap().toString());
6351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeys() {
6381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
6391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 5);
6401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", nullValue());
6411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), 3);
6421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = multimap.keys();
6431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, multiset.count("foo"));
6441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, multiset.count(nullKey()));
6451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(multiset.elementSet()).hasContentsAnyOrder("foo", nullKey());
6461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, multiset.entrySet().size());
6471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(4, multiset.size());
6481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Multiset.Entry<String>> entries = multimap.keys().entrySet();
6501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(entries.contains(Multisets.immutableEntry("foo", 3)));
6511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entries.contains(Multisets.immutableEntry("foo", 2)));
6521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entries.contains(Maps.immutableEntry("foo", 3)));
6531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> foo3null1 =
6551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        HashMultiset.create(asList("foo", "foo", nullKey(), "foo"));
6561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(foo3null1, multiset);
6571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multiset, foo3null1);
6581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multiset.equals(
6591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        HashMultiset.create(asList("foo", "foo", nullKey(), nullKey()))));
6601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(foo3null1.hashCode(), multiset.hashCode());
6611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(foo3null1.entrySet(), multiset.entrySet());
6621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multiset.entrySet(), foo3null1.entrySet());
6631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(foo3null1.entrySet().hashCode(),
6641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multiset.entrySet().hashCode());
6651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, multiset.remove("bar", 1));
6671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, multiset.remove(nullKey(), 4));
6681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsKey(nullKey()));
6691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(3);
6701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("foo", entries.iterator().next().getElement());
6711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, multiset.remove("foo", 1));
6731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsKey("foo"));
6741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(2);
6751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, multiset.setCount("foo", 0));
6761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, multiset.setCount("bar", 0));
6771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeysAdd() {
6801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
6811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = multimap.keys();
6821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
6841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      multiset.add("bar");
6851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
6861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {}
6871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
6891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      multiset.add("bar", 2);
6901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
6911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {}
6921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeysContainsAll() {
6951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
6961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 5);
6971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", nullValue());
6981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), 3);
6991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = multimap.keys();
7001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multiset.containsAll(asList("foo", nullKey())));
7021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multiset.containsAll(asList("foo", "bar")));
7031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeysClear() {
7061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
7071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 5);
7081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", nullValue());
7091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), 3);
7101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset = multimap.keys();
7111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multiset.clear();
7131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multiset.isEmpty());
7141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.isEmpty());
7151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(0);
7161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsKey("foo"));
7171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsKey(nullKey()));
7181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeysToString() {
7211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 7);
7221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 8);
7231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[foo x 2]", multimap.keys().toString());
7241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeysEntrySetIterator() {
7271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 7);
7281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 8);
7291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Multiset.Entry<String>> iterator
7301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = multimap.keys().entrySet().iterator();
7311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.hasNext());
7321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Multisets.immutableEntry("foo", 2), iterator.next());
7331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.remove();
7341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
7351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(0);
7361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeysEntrySetToString() {
7391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 7);
7401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 8);
7411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[foo x 2]", multimap.keys().entrySet().toString());
7421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeysEntrySetRemove() {
7451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.putAll("foo", asList(1, 2, 3));
7461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.putAll("bar", asList(4, 5));
7471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Multiset.Entry<String>> entries = multimap.keys().entrySet();
7481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(entries.remove(Multisets.immutableEntry("bar", 2)));
7491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[foo x 3]", multimap.keys().entrySet().toString());
7501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // doesn't exist in entries, should have no effect
7521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entries.remove(Multisets.immutableEntry("foo", 2)));
7531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[foo x 3]", multimap.keys().entrySet().toString());
7541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("Multimap size after keys().entrySet().remove(entry)",
7551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        3, multimap.size());
7561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEqualsTrue() {
7591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
7601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", nullValue());
7611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), 3);
7621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multimap, multimap);
7631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap2 = create();
7651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap2.put(nullKey(), 3);
7661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap2.put("foo", 1);
7671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap2.put("foo", nullValue());
7681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multimap, multimap2);
7701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multimap.hashCode(), multimap2.hashCode());
7711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEqualsFalse() {
7741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
7751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 3);
7761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 3);
7771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap2 = create();
7791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap2.put("bar", 3);
7801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap2.put("bar", 1);
7811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.equals(multimap2));
7821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap2.put("foo", 3);
7841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.equals(multimap2));
7851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.equals(nullValue()));
7871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.equals("foo"));
7881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testValuesIterator() {
7911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
7921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 2);
7931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), 4);
7941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    int sum = 0;
7951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i : multimap.values()) {
7961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      sum += i;
7971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(7, sum);
7991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testValuesIteratorEmpty() {
8021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    int sum = 0;
8031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i : multimap.values()) {
8041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      sum += i;
8051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, sum);
8071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetAddQuery() {
8101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
8111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 3);
8121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 4);
8131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> values = multimap.get("foo");
8141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 5);
8151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 6);
8161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /* Verify that values includes effect of put. */
8181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, values.size());
8191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(values.contains(1));
8201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(values.contains(5));
8211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(values.contains(6));
8221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(values).hasContentsAnyOrder(1, 3, 5);
8231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(values.containsAll(asList(3, 5)));
8241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(values.isEmpty());
8251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multimap.get("foo"), values);
8261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multimap.get("foo").hashCode(), values.hashCode());
8271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multimap.get("foo").toString(), values.toString());
8281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetAddAll() {
8311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
8321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 3);
8331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.get("foo").addAll(asList(5, 7));
8341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.get("bar").addAll(asList(6, 8));
8351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.get("cow").addAll(Arrays.<Integer>asList());
8361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(6);
8371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(multimap.get("foo")).hasContentsAnyOrder(1, 3, 5, 7);
8381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(multimap.get("bar")).hasContentsAnyOrder(6, 8);
8391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(multimap.get("cow")).isEmpty();
8401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetRemoveAddQuery() {
8431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
8441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 3);
8451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 4);
8461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> values = multimap.get("foo");
8471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> iterator = values.iterator();
8481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.remove("foo", 1);
8491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.remove("foo", 3);
8501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /* Verify that values includes effect of remove */
8521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, values.size());
8531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(values.contains(1));
8541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(values.contains(6));
8551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(values.isEmpty());
8561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multimap.get("foo"), values);
8571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multimap.get("foo").hashCode(), values.hashCode());
8581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multimap.get("foo").toString(), values.toString());
8591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 5);
8611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /* Verify that values includes effect of put. */
8631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, values.size());
8641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(values.contains(1));
8651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(values.contains(5));
8661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(values.contains(6));
8671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(5, values.iterator().next().intValue());
8681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(values.isEmpty());
8691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multimap.get("foo"), values);
8701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multimap.get("foo").hashCode(), values.hashCode());
8711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multimap.get("foo").toString(), values.toString());
8721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
8741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      iterator.hasNext();
8751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (ConcurrentModificationException expected) {}
8761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testModifyCollectionFromGet() {
8791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
8801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 3);
8811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 4);
8821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> values = multimap.get("foo");
8831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(values.add(5));
8851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(4);
8861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, multimap.get("foo").size());
8871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", 5));
8881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    values.clear();
8901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(1);
8911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsKey("foo"));
8921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(values.addAll(asList(7, 9)));
8941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(3);
8951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, multimap.get("foo").size());
8961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", 7));
8971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", 9));
8981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(values.addAll(Collections.<Integer>emptyList()));
8991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(3);
9001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(values.remove(7));
9021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(2);
9031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, multimap.get("foo").size());
9041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsEntry("foo", 7));
9051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", 9));
9061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(values.remove(77));
9071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(2);
9081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(values.add(11));
9101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(values.add(13));
9111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(values.add(15));
9121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(values.add(17));
9131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(values.removeAll(asList(11, 15)));
9151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(4);
9161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(multimap.get("foo")).hasContentsAnyOrder(9, 13, 17);
9171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(values.removeAll(asList(21, 25)));
9181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(4);
9191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(values.retainAll(asList(13, 17, 19)));
9211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(3);
9221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(multimap.get("foo")).hasContentsAnyOrder(13, 17);
9231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(values.retainAll(asList(13, 17, 19)));
9241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(3);
9251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    values.remove(13);
9271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    values.remove(17);
9281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.get("foo").isEmpty());
9291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(1);
9301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsKey("foo"));
9311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetIterator() {
9341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
9351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 3);
9361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 5);
9371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 4);
9381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> values = multimap.get("foo");
9391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> iterator = values.iterator();
9411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.hasNext());
9421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Integer v1 = iterator.next();
9431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.hasNext());
9441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Integer v2 = iterator.next();
9451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.remove();
9461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.hasNext());
9471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Integer v3 = iterator.next();
9481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
9491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(asList(v1, v2, v3)).hasContentsAnyOrder(1, 3, 5);
9511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(3);
9521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", v1));
9531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsEntry("foo", v2));
9541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", v3));
9551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator = values.iterator();
9571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.hasNext());
9581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Integer n1 = iterator.next();
9591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.remove();
9601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.hasNext());
9611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Integer n3 = iterator.next();
9621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.remove();
9631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
9641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(asList(n1, n3)).hasContentsAnyOrder(v1, v3);
9661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(1);
9671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsKey("foo"));
9681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetClear() {
9711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
9721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 3);
9731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> values = multimap.get("foo");
9741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.clear();
9751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(values.isEmpty());
9761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetPutAllCollection() {
9791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> values = multimap.get("foo");
9801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> collection = Lists.newArrayList(1, 3);
9811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.putAll("foo", collection);
9821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(values).hasContentsAnyOrder(1, 3);
9831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetPutAllMultimap() {
9861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 2);
9871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("cow", 5);
9881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), 2);
9891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> valuesFoo = multimap.get("foo");
9901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> valuesBar = multimap.get("bar");
9911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> valuesCow = multimap.get("cow");
9921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> valuesNull = multimap.get(nullKey());
9931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap2 = create();
9941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap2.put("foo", 1);
9951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap2.put("bar", 3);
9961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap2.put(nullKey(), nullValue());
9971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.putAll(multimap2);
9981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(valuesFoo).hasContentsAnyOrder(1, 2);
10001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(valuesBar).hasContentsAnyOrder(3);
10011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(valuesCow).hasContentsAnyOrder(5);
10021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(valuesNull).hasContentsAnyOrder(nullValue(), 2);
10031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetRemove() {
10061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
10071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 3);
10081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> values = multimap.get("foo");
10091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.remove("foo", 1);
10101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(values).hasContentsAnyOrder(3);
10111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetRemoveAll() {
10141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
10151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 3);
10161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> values = multimap.get("foo");
10171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.removeAll("foo");
10181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(values.isEmpty());
10191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetReplaceValues() {
10221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
10231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 3);
10241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> values = multimap.get("foo");
10251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.replaceValues("foo", asList(1, 5));
10261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(values).hasContentsAnyOrder(1, 5);
10271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.replaceValues("foo", new ArrayList<Integer>());
10291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.isEmpty());
10301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(0);
10311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(values.isEmpty());
10321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntriesUpdate() {
10351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
10361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Entry<String, Integer>> entries = multimap.entries();
10371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Entry<String, Integer>> iterator = entries.iterator();
10381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.hasNext());
10401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Entry<String, Integer> entry = iterator.next();
10411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("foo", entry.getKey());
10421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, entry.getValue().intValue());
10431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.remove();
10441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
10451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.isEmpty());
10461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(0);
10471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
10491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      entries.add(Maps.immutableEntry("bar", 2));
10501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("UnsupportedOperationException expected");
10511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {}
10521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(0);
10531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsEntry("bar", 2));
10541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 2);
10561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(1);
10571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(entries.contains(Maps.immutableEntry("bar", 2)));
10581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    entries.clear();
10601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.isEmpty());
10611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(0);
10621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntriesRemove() {
10651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
10661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", nullValue());
10671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), 3);
10681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Entry<String, Integer>> entries = multimap.entries();
10691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(entries.remove(Maps.immutableEntry("foo", nullValue())));
10711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(2);
10721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsEntry("foo", nullValue()));
10731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entries.remove(Maps.immutableEntry("foo", 3)));
10751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entries.remove(3.5));
10761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(2);
10771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
10801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntriesRemoveAll() {
10811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
10821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 2);
10831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 3);
10841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.entries().removeAll(
10861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Collections.singleton(Maps.immutableEntry("foo", 3))));
10871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(3);
10881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.entries().removeAll(asList(
10901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("foo", 3), Maps.immutableEntry("bar", 3))));
10911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(2);
10921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsKey("bar"));
10931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntriesRemoveAllNullFromEmpty() {
10961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
10971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      multimap.entries().removeAll(null);
10981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // Returning successfully is not ideal, but tolerated.
10991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
11001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
11031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntriesRetainAll() {
11041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
11051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 2);
11061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 3);
11071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.entries().retainAll(asList(
11091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("foo", 1), Maps.immutableEntry("foo", 2),
11101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("foo", 3), Maps.immutableEntry("bar", 3))));
11111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(3);
11121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.entries().retainAll(asList(
11141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("foo", 3), Maps.immutableEntry("bar", 3))));
11151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(1);
11161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("bar", 3));
11171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntriesRetainAllNullFromEmpty() {
11201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
11211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      multimap.entries().retainAll(null);
11221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // Returning successfully is not ideal, but tolerated.
11231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
11241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntriesIterator() {
11271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 3);
11281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Entry<String, Integer>> iterator
11291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = multimap.entries().iterator();
11301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.hasNext());
11311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Maps.immutableEntry("foo", 3), iterator.next());
11321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.remove();
11331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
11341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(0);
11351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntriesToString() {
11381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 3);
11391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Entry<String, Integer>> entries = multimap.entries();
11401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[foo=3]", entries.toString());
11411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntriesToArray() {
11441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 3);
11451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Entry<String, Integer>> entries = multimap.entries();
11461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Entry<?, ?>[] array = new Entry<?, ?>[3];
11471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(array, entries.toArray(array));
11481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Maps.immutableEntry("foo", 3), array[0]);
11491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(array[1]);
11501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
11531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Test calling setValue() on an entry returned by multimap.entries().
11541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
11551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntrySetValue() {
11561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
11571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 1);
11581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Entry<String, Integer>> entries = multimap.entries();
11591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Entry<String, Integer>> iterator = entries.iterator();
11601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Entry<String, Integer> entrya = iterator.next();
11611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Entry<String, Integer> entryb = iterator.next();
11621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
11631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      entrya.setValue(3);
11641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
11651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {}
11661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", 1));
11671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("bar", 1));
11681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsEntry("foo", 2));
11691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsEntry("bar", 2));
11701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, (int) entrya.getValue());
11711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, (int) entryb.getValue());
11721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /** Verify that the entries remain valid after iterating past them. */
11751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntriesCopy() {
11761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
11771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 2);
11781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 3);
11791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Entry<String, Integer>> copy = Sets.newHashSet(multimap.entries());
11811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, copy.size());
11821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(copy.contains(Maps.immutableEntry("foo", 1)));
11831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(copy.contains(Maps.immutableEntry("foo", 2)));
11841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(copy.contains(Maps.immutableEntry("bar", 3)));
11851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(copy.contains(Maps.immutableEntry("bar", 1)));
11861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.removeAll("foo");
11881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, copy.size());
11891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(copy.contains(Maps.immutableEntry("foo", 1)));
11901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(copy.contains(Maps.immutableEntry("foo", 2)));
11911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(copy.contains(Maps.immutableEntry("bar", 3)));
11921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(copy.contains(Maps.immutableEntry("bar", 1)));
11931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeySetRemove() {
11961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
11971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", nullValue());
11981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), 3);
11991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<String> keys = multimap.keySet();
12001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(keys.remove("foo"));
12011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(keys.remove("bar"));
12021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(1);
12031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsKey("foo"));
12041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry(nullKey(), 3));
12051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeySetRemoveAllNullFromEmpty() {
12081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
12091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      multimap.keySet().removeAll(null);
12101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
12111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
12121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeySetRetainAllNullFromEmpty() {
12151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
12161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      multimap.keySet().retainAll(null);
12171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // Returning successfully is not ideal, but tolerated.
12181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
12191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeySetIterator() {
12221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
12231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", nullValue());
12241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), 3);
12251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = multimap.keySet().iterator();
12271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    while (iterator.hasNext()) {
12281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      String key = iterator.next();
12291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if ("foo".equals(key)) {
12301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        iterator.remove();
12311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
12321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(1);
12341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsKey("foo"));
12351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry(nullKey(), 3));
12361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator = multimap.keySet().iterator();
12381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(nullKey(), iterator.next());
12391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.remove();
12401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.isEmpty());
12411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(0);
12421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeySetClear() {
12451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
12461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", nullValue());
12471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), 3);
12481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.keySet().clear();
12501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.isEmpty());
12511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(0);
12521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testValuesIteratorRemove() {
12551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
12561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 2);
12571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), 4);
12581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> iterator = multimap.values().iterator();
12601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    while (iterator.hasNext()) {
12611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      int value = iterator.next();
12621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if ((value % 2) == 0) {
12631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        iterator.remove();
12641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
12651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(1);
12681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", 1));
12691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAsMapEntriesUpdate() {
12721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
12731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 3);
12741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Entry<String, Collection<Integer>>> entries =
12751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.asMap().entrySet();
12761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Entry<String, Collection<Integer>> entry = entries.iterator().next();
12771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> values = entry.getValue();
12781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 5);
12801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, values.size());
12811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(values.contains(5));
12821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    values.add(7);
12841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(4);
12851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsValue(7));
12861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 4);
12881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, entries.size());
12891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(5);
12901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(entries.remove(entry));
12921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(1);
12931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsKey("foo"));
12941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsKey("bar"));
12951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entries.remove("foo"));
12961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entries.remove(
12971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("foo", Collections.singleton(2))));
12981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(1);
12991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Entry<String, Collection<Integer>>> iterator =
13011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        entries.iterator();
13021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.hasNext());
13031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.next();
13041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.remove();
13051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
13061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(0);
13071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.isEmpty());
13081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 8);
13101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(1);
13111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    entries.clear();
13121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSize(0);
13131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testToStringNull() {
13161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 3);
13171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", -1);
13181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), nullValue());
13191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 1);
13201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 2);
13211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), 0);
13221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 2);
13231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", nullValue());
13241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", nullValue());
13251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 4);
13261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(nullKey(), -1);
13271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 3);
13281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 1);
13291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
13301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // This test is brittle. The original test was meant to validate the
13321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // contents of the string itself, but key and value ordering tend
13331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // to change under unpredictable circumstances. Instead, we're just ensuring
13341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // that the string not return null and, implicitly, not throw an exception.
13351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNotNull(multimap.toString());
13361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
13391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSerializable() {
13401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap = createSample();
13411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multimap, SerializableTester.reserialize(multimap));
13421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEmptyToString() {
13451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> map = create();
13461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{}", map.toString());
13471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[]", map.entries().toString());
13481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEmptyGetToString() {
13511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> map = create();
13521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.get("foo"); // shouldn't have any side-effect
13531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{}", map.toString());
13541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[]", map.entries().toString());
13551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetRemoveToString() {
13581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> map = create();
13591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("bar", 1);
13601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("foo", 2);
13611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("bar", 3);
13621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.get("foo").remove(2);
13631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.get("bar").remove(1);
13641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{bar=[3]}", map.toString());
13651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[bar=3]", map.entries().toString());
13661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveToString() {
13691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> map = create();
13701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("foo", 1);
13711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("foo", 2);
13721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.remove("foo", 1);
13731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[foo=2]", map.entries().toString());
13741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
1376