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 com.google.common.collect.Lists.newArrayList;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.Sets.newHashSet;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.Sets.newLinkedHashSet;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.IteratorFeature.MODIFIABLE;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.IteratorFeature.SUPPORTS_REMOVE;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.IteratorFeature.SUPPORTS_SET;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.util.Arrays.asList;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static org.junit.contrib.truth.Truth.ASSERT;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.IteratorTester;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.ListIteratorTester;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Arrays;
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator;
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.ListIterator;
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map;
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map.Entry;
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.RandomAccess;
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set;
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests for {@code LinkedListMultimap}.
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Mike Bostock
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class LinkedListMultimapTest extends AbstractListMultimapTest {
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected LinkedListMultimap<String, Integer> create() {
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return LinkedListMultimap.create();
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Confirm that get() returns a List that doesn't implement RandomAccess.
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetRandomAccess() {
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = create();
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 3);
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.get("foo") instanceof RandomAccess);
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.get("bar") instanceof RandomAccess);
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Confirm that removeAll() returns a List that implements RandomAccess, even
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * though get() doesn't.
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveAllRandomAccess() {
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = create();
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 3);
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.removeAll("foo") instanceof RandomAccess);
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.removeAll("bar") instanceof RandomAccess);
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Confirm that replaceValues() returns a List that implements RandomAccess,
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * even though get() doesn't.
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testReplaceValuesRandomAccess() {
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = create();
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 3);
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.replaceValues("foo", Arrays.asList(2, 4))
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        instanceof RandomAccess);
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.replaceValues("bar", Arrays.asList(2, 4))
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        instanceof RandomAccess);
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreateFromMultimap() {
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = createSample();
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    LinkedListMultimap<String, Integer> copy =
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        LinkedListMultimap.create(multimap);
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multimap, copy);
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreateFromSize() {
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    LinkedListMultimap<String, Integer> multimap
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = LinkedListMultimap.create(20);
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 2);
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 3);
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableList.of(1, 3), multimap.get("foo"));
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreateFromIllegalSize() {
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      LinkedListMultimap.create(-20);
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {}
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /* "Linked" prefix avoids collision with AbstractMultimapTest. */
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLinkedToString() {
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{foo=[3, -1, 2, 4, 1], bar=[1, 2, 3, 1]}",
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        createSample().toString());
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLinkedGetAdd() {
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    LinkedListMultimap<String, Integer> map = create();
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("bar", 1);
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> foos = map.get("foo");
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    foos.add(2);
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    foos.add(3);
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("bar", 4);
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("foo", 5);
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{bar=[1, 4], foo=[2, 3, 5]}", map.toString());
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[bar=1, foo=2, foo=3, bar=4, foo=5]",
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        map.entries().toString());
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLinkedGetInsert() {
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ListMultimap<String, Integer> map = create();
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("bar", 1);
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> foos = map.get("foo");
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    foos.add(2);
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    foos.add(0, 3);
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("bar", 4);
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("foo", 5);
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{bar=[1, 4], foo=[3, 2, 5]}", map.toString());
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[bar=1, foo=3, foo=2, bar=4, foo=5]",
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        map.entries().toString());
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLinkedPutInOrder() {
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> map = create();
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("foo", 1);
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("bar", 2);
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("bar", 3);
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{foo=[1], bar=[2, 3]}", map.toString());
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[foo=1, bar=2, bar=3]", map.entries().toString());
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLinkedPutOutOfOrder() {
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> map = create();
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("bar", 1);
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("foo", 2);
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("bar", 3);
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{bar=[1, 3], foo=[2]}", map.toString());
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[bar=1, foo=2, bar=3]", map.entries().toString());
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLinkedPutAllMultimap() {
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> src = create();
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    src.put("bar", 1);
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    src.put("foo", 2);
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    src.put("bar", 3);
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> dst = create();
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    dst.putAll(src);
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{bar=[1, 3], foo=[2]}", dst.toString());
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[bar=1, foo=2, bar=3]", src.entries().toString());
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLinkedReplaceValues() {
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> map = create();
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("bar", 1);
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("foo", 2);
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("bar", 3);
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("bar", 4);
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{bar=[1, 3, 4], foo=[2]}", map.toString());
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.replaceValues("bar", asList(1, 2));
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[bar=1, foo=2, bar=2]", map.entries().toString());
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{bar=[1, 2], foo=[2]}", map.toString());
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLinkedClear() {
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ListMultimap<String, Integer> map = create();
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("foo", 1);
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("foo", 2);
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("bar", 3);
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> foos = map.get("foo");
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Integer> values = map.values();
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList(1, 2), foos);
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(values).hasContentsInOrder(1, 2, 3);
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.clear();
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.emptyList(), foos);
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(values).hasContentsInOrder();
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[]", map.entries().toString());
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{}", map.toString());
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLinkedKeySet() {
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> map = create();
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("bar", 1);
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("foo", 2);
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("bar", 3);
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("bar", 4);
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[bar, foo]", map.keySet().toString());
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.keySet().remove("bar");
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{foo=[2]}", map.toString());
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLinkedKeys() {
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> map = create();
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("bar", 1);
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("foo", 2);
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("bar", 3);
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("bar", 4);
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[bar=1, foo=2, bar=3, bar=4]",
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        map.entries().toString());
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(map.keys()).hasContentsInOrder("bar", "foo", "bar", "bar");
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.keys().remove("bar"); // bar is no longer the first key!
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{foo=[2], bar=[3, 4]}", map.toString());
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLinkedValues() {
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> map = create();
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("bar", 1);
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("foo", 2);
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("bar", 3);
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("bar", 4);
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[1, 2, 3, 4]", map.values().toString());
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.values().remove(2);
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{bar=[1, 3, 4]}", map.toString());
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLinkedEntries() {
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> map = create();
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("bar", 1);
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("foo", 2);
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("bar", 3);
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Map.Entry<String, Integer>> entries = map.entries().iterator();
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map.Entry<String, Integer> entry = entries.next();
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("bar", entry.getKey());
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, (int) entry.getValue());
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    entry = entries.next();
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("foo", entry.getKey());
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, (int) entry.getValue());
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    entry.setValue(4);
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    entry = entries.next();
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("bar", entry.getKey());
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, (int) entry.getValue());
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entries.hasNext());
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    entries.remove();
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{bar=[1], foo=[4]}", map.toString());
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLinkedAsMapEntries() {
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> map = create();
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("bar", 1);
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("foo", 2);
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    map.put("bar", 3);
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Map.Entry<String, Collection<Integer>>> entries
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = map.asMap().entrySet().iterator();
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map.Entry<String, Collection<Integer>> entry = entries.next();
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("bar", entry.getKey());
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(entry.getValue()).hasContentsInOrder(1, 3);
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      entry.setValue(Arrays.<Integer>asList());
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("UnsupportedOperationException expected");
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {}
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    entries.remove(); // clear
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    entry = entries.next();
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("foo", entry.getKey());
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(entry.getValue()).hasContentsInOrder(2);
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(entries.hasNext());
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{foo=[2]}", map.toString());
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Test calling setValue() on an entry returned by multimap.entries().
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public void testEntrySetValue() {
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ListMultimap<String, Integer> multimap = create();
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 3);
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Map.Entry<String, Integer>> entries = multimap.entries();
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Map.Entry<String, Integer>> iterator = entries.iterator();
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map.Entry<String, Integer> entrya = iterator.next();
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map.Entry<String, Integer> entryb = iterator.next();
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    int oldValue = entrya.setValue(2);
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, oldValue);
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsEntry("foo", 1));
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", 2));
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("bar", 3));
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, (int) entrya.getValue());
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, (int) entryb.getValue());
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntriesAfterMultimapUpdate() {
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ListMultimap<String, Integer> multimap = create();
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 2);
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("bar", 3);
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<Map.Entry<String, Integer>> entries = multimap.entries();
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Map.Entry<String, Integer>> iterator = entries.iterator();
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map.Entry<String, Integer> entrya = iterator.next();
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map.Entry<String, Integer> entryb = iterator.next();
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, (int) multimap.get("foo").set(0, 4));
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsEntry("foo", 2));
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", 4));
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("bar", 3));
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(4, (int) entrya.getValue());
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, (int) entryb.getValue());
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.put("foo", 5));
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", 5));
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("foo", 4));
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsEntry("bar", 3));
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(4, (int) entrya.getValue());
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, (int) entryb.getValue());
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("unreasonable slow")
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntriesIteration() {
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Entry<String, Integer>> addItems = ImmutableList.of(
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("foo", 99),
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("foo", 88),
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("bar", 77));
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (final int startIndex : new int[] {0, 3, 5}) {
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<Entry<String, Integer>> list = Lists.newArrayList(
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Maps.immutableEntry("foo", 2),
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Maps.immutableEntry("foo", 3),
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Maps.immutableEntry("bar", 4),
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Maps.immutableEntry("bar", 5),
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Maps.immutableEntry("foo", 6));
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      new ListIteratorTester<Entry<String, Integer>>(3, addItems,
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ImmutableList.of(SUPPORTS_REMOVE), list, startIndex) {
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        private LinkedListMultimap<String, Integer> multimap;
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        @Override protected ListIterator<Entry<String, Integer>> newTargetIterator() {
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          multimap = create();
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          multimap.putAll("foo", asList(2, 3));
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          multimap.putAll("bar", asList(4, 5));
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          multimap.put("foo", 6);
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          return multimap.entries().listIterator(startIndex);
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        @Override protected void verify(List<Entry<String, Integer>> elements) {
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertEquals(elements, multimap.entries());
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }.test();
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("unreasonable slow")
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeysIteration() {
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new IteratorTester<String>(6, MODIFIABLE, newArrayList("foo", "foo", "bar",
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "bar", "foo"), IteratorTester.KnownOrder.KNOWN_ORDER) {
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      private Multimap<String, Integer> multimap;
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<String> newTargetIterator() {
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap = create();
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("foo", asList(2, 3));
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("bar", asList(4, 5));
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("foo", asList(6));
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return multimap.keys().iterator();
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected void verify(List<String> elements) {
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(elements, Lists.newArrayList(multimap.keys()));
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("unreasonable slow")
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testValuesIteration() {
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> addItems = ImmutableList.of(99, 88, 77);
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (final int startIndex : new int[] {0, 3, 5}) {
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      new ListIteratorTester<Integer>(3, addItems,
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ImmutableList.of(SUPPORTS_REMOVE, SUPPORTS_SET),
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Lists.newArrayList(2, 3, 4, 5, 6), startIndex) {
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        private LinkedListMultimap<String, Integer> multimap;
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        @Override protected ListIterator<Integer> newTargetIterator() {
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          multimap = create();
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          multimap.put("bar", 2);
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          multimap.putAll("foo", Arrays.asList(3, 4));
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          multimap.put("bar", 5);
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          multimap.put("foo", 6);
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          return multimap.values().listIterator(startIndex);
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        @Override protected void verify(List<Integer> elements) {
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertEquals(elements, multimap.values());
4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }.test();
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("unreasonable slow")
4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeySetIteration() {
4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new IteratorTester<String>(6, MODIFIABLE, newLinkedHashSet(asList(
4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "foo", "bar", "baz", "dog", "cat")),
4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IteratorTester.KnownOrder.KNOWN_ORDER) {
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      private Multimap<String, Integer> multimap;
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<String> newTargetIterator() {
4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap = create();
4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("foo", asList(2, 3));
4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("bar", asList(4, 5));
4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("foo", asList(6));
4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("baz", asList(7, 8));
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("dog", asList(9));
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("bar", asList(10, 11));
4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("cat", asList(12, 13, 14));
4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return multimap.keySet().iterator();
4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected void verify(List<String> elements) {
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(newHashSet(elements), multimap.keySet());
4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("unreasonable slow")
4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAsSetIteration() {
4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Entry<String, Collection<Integer>>> set = Sets.newLinkedHashSet(asList(
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("foo",
4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            (Collection<Integer>) asList(2, 3, 6)),
4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("bar",
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            (Collection<Integer>) asList(4, 5, 10, 11)),
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("baz",
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            (Collection<Integer>) asList(7, 8)),
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("dog",
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            (Collection<Integer>) asList(9)),
4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("cat",
4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            (Collection<Integer>) asList(12, 13, 14))
4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ));
4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new IteratorTester<Entry<String, Collection<Integer>>>(6, MODIFIABLE, set,
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IteratorTester.KnownOrder.KNOWN_ORDER) {
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      private Multimap<String, Integer> multimap;
4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<Entry<String, Collection<Integer>>>
4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          newTargetIterator() {
4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap = create();
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("foo", asList(2, 3));
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("bar", asList(4, 5));
4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("foo", asList(6));
4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("baz", asList(7, 8));
4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("dog", asList(9));
4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("bar", asList(10, 11));
4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("cat", asList(12, 13, 14));
4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return multimap.asMap().entrySet().iterator();
4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected void verify(
4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          List<Entry<String, Collection<Integer>>> elements) {
4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(newHashSet(elements), multimap.asMap().entrySet());
4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
474