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.testing.IteratorFeature.MODIFIABLE;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.util.Arrays.asList;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static org.junit.contrib.truth.Truth.ASSERT;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.DerivedComparable;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.IteratorTester;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.SerializableTester;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Comparator;
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator;
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map;
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map.Entry;
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.NoSuchElementException;
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set;
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.SortedMap;
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.SortedSet;
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unit tests for {@code TreeMultimap} with natural ordering.
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Jared Levy
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class TreeMultimapNaturalTest<E> extends AbstractSetMultimapTest {
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected Multimap<String, Integer> create() {
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return TreeMultimap.create();
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /* Null keys and values aren't supported. */
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected String nullKey() {
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return "null";
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override protected Integer nullValue() {
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return 42;
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Create and populate a {@code TreeMultimap} with the natural ordering of
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * keys and values.
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private TreeMultimap<String, Integer> createPopulate() {
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultimap<String, Integer> multimap = TreeMultimap.create();
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("google", 2);
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("google", 6);
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 3);
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 1);
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 7);
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("tree", 4);
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("tree", 0);
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return multimap;
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testToString() {
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("{bar=[1, 2, 3], foo=[-1, 1, 2, 3, 4]}",
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        createSample().toString());
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOrderedGet() {
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultimap<String, Integer> multimap = createPopulate();
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(multimap.get("foo")).hasContentsInOrder(1, 3, 7);
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(multimap.get("google")).hasContentsInOrder(2, 6);
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(multimap.get("tree")).hasContentsInOrder(0, 4);
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOrderedKeySet() {
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultimap<String, Integer> multimap = createPopulate();
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(multimap.keySet()).hasContentsInOrder("foo", "google", "tree");
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOrderedAsMapEntries() {
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultimap<String, Integer> multimap = createPopulate();
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Map.Entry<String, Collection<Integer>>> iterator =
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.asMap().entrySet().iterator();
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Map.Entry<String, Collection<Integer>> entry = iterator.next();
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("foo", entry.getKey());
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(entry.getValue()).hasContentsAnyOrder(1, 3, 7);
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    entry = iterator.next();
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("google", entry.getKey());
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(entry.getValue()).hasContentsAnyOrder(2, 6);
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    entry = iterator.next();
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("tree", entry.getKey());
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(entry.getValue()).hasContentsAnyOrder(0, 4);
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOrderedEntries() {
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultimap<String, Integer> multimap = createPopulate();
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(multimap.entries()).hasContentsInOrder(
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("foo", 1),
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("foo", 3),
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("foo", 7),
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("google", 2),
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("google", 6),
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("tree", 0),
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("tree", 4));
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testOrderedValues() {
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultimap<String, Integer> multimap = createPopulate();
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(multimap.values()).hasContentsInOrder(
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        1, 3, 7, 2, 6, 0, 4);
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFirst() {
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultimap<String, Integer> multimap = createPopulate();
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Integer.valueOf(1), multimap.get("foo").first());
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      multimap.get("missing").first();
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("Expected NoSuchElementException");
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NoSuchElementException expected) {}
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLast() {
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultimap<String, Integer> multimap = createPopulate();
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Integer.valueOf(7), multimap.get("foo").last());
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      multimap.get("missing").last();
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("Expected NoSuchElementException");
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NoSuchElementException expected) {}
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testComparatorFromGet() {
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultimap<String, Integer> multimap = createPopulate();
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(Ordering.natural(), multimap.get("foo").comparator());
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(Ordering.natural(), multimap.get("missing").comparator());
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testHeadSet() {
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultimap<String, Integer> multimap = createPopulate();
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Integer> fooSet = multimap.get("foo").headSet(4);
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Sets.newHashSet(1, 3), fooSet);
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Integer> missingSet = multimap.get("missing").headSet(4);
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Sets.newHashSet(), missingSet);
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 0);
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Sets.newHashSet(0, 1, 3), fooSet);
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    missingSet.add(2);
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Sets.newHashSet(2), multimap.get("missing"));
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTailSet() {
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultimap<String, Integer> multimap = createPopulate();
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Integer> fooSet = multimap.get("foo").tailSet(2);
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Sets.newHashSet(3, 7), fooSet);
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Integer> missingSet = multimap.get("missing").tailSet(4);
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Sets.newHashSet(), missingSet);
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 6);
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Sets.newHashSet(3, 6, 7), fooSet);
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    missingSet.add(9);
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Sets.newHashSet(9), multimap.get("missing"));
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSubSet() {
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultimap<String, Integer> multimap = createPopulate();
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Integer> fooSet = multimap.get("foo").subSet(2, 6);
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Sets.newHashSet(3), fooSet);
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("foo", 5);
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Sets.newHashSet(3, 5), fooSet);
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    fooSet.add(4);
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Sets.newHashSet(1, 3, 4, 5, 7), multimap.get("foo"));
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testMultimapConstructor() {
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<String, Integer> multimap = createSample();
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultimap<String, Integer> copy = TreeMultimap.create(multimap);
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multimap, copy);
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final Comparator<Double> KEY_COMPARATOR =
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Ordering.natural();
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final Comparator<Double> VALUE_COMPARATOR =
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Ordering.natural().reverse().nullsFirst();
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Test that creating one TreeMultimap from another does not copy the
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * comparators from the source TreeMultimap.
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreateFromTreeMultimap() {
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<Double, Double> tree = TreeMultimap.create(KEY_COMPARATOR, VALUE_COMPARATOR);
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tree.put(1.0, 2.0);
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tree.put(2.0, 3.0);
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tree.put(3.0, 4.0);
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tree.put(4.0, 5.0);
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultimap<Double, Double> copyFromTree = TreeMultimap.create(tree);
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(tree, copyFromTree);
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(Ordering.natural(), copyFromTree.keyComparator());
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(Ordering.natural(), copyFromTree.valueComparator());
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(Ordering.natural(), copyFromTree.get(1.0).comparator());
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Test that creating one TreeMultimap from a non-TreeMultimap
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * results in natural ordering.
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreateFromHashMultimap() {
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multimap<Double, Double> hash = HashMultimap.create();
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    hash.put(1.0, 2.0);
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    hash.put(2.0, 3.0);
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    hash.put(3.0, 4.0);
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    hash.put(4.0, 5.0);
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultimap<Double, Double> copyFromHash = TreeMultimap.create(hash);
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(hash, copyFromHash);
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ordering.natural(), copyFromHash.keyComparator());
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ordering.natural(), copyFromHash.valueComparator());
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Test that creating one TreeMultimap from a SortedSetMultimap uses natural
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * ordering.
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCreateFromSortedSetMultimap() {
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SortedSetMultimap<Double, Double> tree = TreeMultimap.create(KEY_COMPARATOR, VALUE_COMPARATOR);
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tree.put(1.0, 2.0);
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tree.put(2.0, 3.0);
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tree.put(3.0, 4.0);
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tree.put(4.0, 5.0);
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SortedSetMultimap<Double, Double> sorted = Multimaps.unmodifiableSortedSetMultimap(tree);
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultimap<Double, Double> copyFromSorted = TreeMultimap.create(sorted);
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(tree, copyFromSorted);
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(Ordering.natural(), copyFromSorted.keyComparator());
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(Ordering.natural(), copyFromSorted.valueComparator());
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(Ordering.natural(), copyFromSorted.get(1.0).comparator());
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testComparators() {
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultimap<String, Integer> multimap = TreeMultimap.create();
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ordering.natural(), multimap.keyComparator());
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ordering.natural(), multimap.valueComparator());
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSortedKeySet() {
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultimap<String, Integer> multimap = createPopulate();
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SortedSet<String> keySet = multimap.keySet();
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("foo", keySet.first());
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("tree", keySet.last());
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ordering.natural(), keySet.comparator());
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableSet.of("foo", "google"), keySet.headSet("hi"));
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableSet.of("tree"), keySet.tailSet("hi"));
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableSet.of("google"), keySet.subSet("gap", "hi"));
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeySetSubSet() {
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultimap<String, Integer> multimap = createPopulate();
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SortedSet<String> keySet = multimap.keySet();
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SortedSet<String> subSet = keySet.subSet("gap", "hi");
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, subSet.size());
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(subSet.contains("google"));
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(subSet.contains("foo"));
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(subSet.containsAll(Collections.singleton("google")));
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(subSet.containsAll(Collections.singleton("foo")));
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = subSet.iterator();
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.hasNext());
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("google", iterator.next());
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(subSet.remove("foo"));
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(multimap.containsKey("foo"));
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(7, multimap.size());
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(subSet.remove("google"));
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(multimap.containsKey("google"));
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(5, multimap.size());
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("unreasonable slow")
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetIteration() {
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new IteratorTester<Integer>(6, MODIFIABLE,
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Sets.newTreeSet(asList(2, 3, 4, 7, 8)),
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IteratorTester.KnownOrder.KNOWN_ORDER) {
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      private Multimap<String, Integer> multimap;
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<Integer> newTargetIterator() {
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap = create();
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("foo", asList(3, 8, 4));
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("bar", asList(5, 6));
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("foo", asList(7, 2));
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return multimap.get("foo").iterator();
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected void verify(List<Integer> elements) {
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(newHashSet(elements), multimap.get("foo"));
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("unreasonable slow")
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEntriesIteration() {
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Entry<String, Integer>> set = Sets.newLinkedHashSet(asList(
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("bar", 4),
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("bar", 5),
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("foo", 2),
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("foo", 3),
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("foo", 6)));
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new IteratorTester<Entry<String, Integer>>(6, MODIFIABLE, set,
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IteratorTester.KnownOrder.KNOWN_ORDER) {
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      private Multimap<String, Integer> multimap;
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<Entry<String, Integer>> newTargetIterator() {
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap = create();
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("foo", asList(6, 3));
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("bar", asList(4, 5));
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("foo", asList(2));
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return multimap.entries().iterator();
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected void verify(List<Entry<String, Integer>> elements) {
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(newHashSet(elements), multimap.entries());
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("unreasonable slow")
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeysIteration() {
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new IteratorTester<String>(6, MODIFIABLE, Lists.newArrayList("bar", "bar",
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "foo", "foo", "foo"), IteratorTester.KnownOrder.KNOWN_ORDER) {
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      private Multimap<String, Integer> multimap;
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<String> newTargetIterator() {
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap = create();
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("foo", asList(2, 3));
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("bar", asList(4, 5));
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("foo", asList(6));
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return multimap.keys().iterator();
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected void verify(List<String> elements) {
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(elements, Lists.newArrayList(multimap.keys()));
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("unreasonable slow")
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testValuesIteration() {
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new IteratorTester<Integer>(6, MODIFIABLE, newArrayList(4, 5, 2, 3, 6),
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IteratorTester.KnownOrder.KNOWN_ORDER) {
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      private Multimap<String, Integer> multimap;
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<Integer> newTargetIterator() {
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap = create();
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("foo", asList(2, 3));
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("bar", asList(4, 5));
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("foo", asList(6));
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return multimap.values().iterator();
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected void verify(List<Integer> elements) {
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(elements, Lists.newArrayList(multimap.values()));
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("unreasonable slow")
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testKeySetIteration() {
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new IteratorTester<String>(6, MODIFIABLE,
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Sets.newTreeSet(asList("bar", "baz", "cat", "dog", "foo")),
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IteratorTester.KnownOrder.KNOWN_ORDER) {
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      private Multimap<String, Integer> multimap;
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<String> newTargetIterator() {
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap = create();
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("foo", asList(2, 3));
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("bar", asList(4, 5));
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("foo", asList(6));
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("baz", asList(7, 8));
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("dog", asList(9));
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("bar", asList(10, 11));
4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("cat", asList(12, 13, 14));
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return multimap.keySet().iterator();
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected void verify(List<String> elements) {
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(newHashSet(elements), multimap.keySet());
4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("unreasonable slow")
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAsSetIteration() {
4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Entry<String, Collection<Integer>>> set = Sets.newTreeSet(
4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new Comparator<Entry<String, ?>>() {
4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public int compare(Entry<String, ?> o1, Entry<String, ?> o2) {
4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return o1.getKey().compareTo(o2.getKey());
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        });
4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collections.addAll(set,
4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("bar",
4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            (Collection<Integer>) Sets.newHashSet(4, 5, 10, 11)),
4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("baz",
4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            (Collection<Integer>) Sets.newHashSet(7, 8)),
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("cat",
4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            (Collection<Integer>) Sets.newHashSet(12, 13, 14)),
4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("dog",
4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            (Collection<Integer>) Sets.newHashSet(9)),
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Maps.immutableEntry("foo",
4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            (Collection<Integer>) Sets.newHashSet(2, 3, 6))
4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    );
4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new IteratorTester<Entry<String, Collection<Integer>>>(6, MODIFIABLE, set,
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IteratorTester.KnownOrder.KNOWN_ORDER) {
4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      private Multimap<String, Integer> multimap;
4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<Entry<String, Collection<Integer>>>
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          newTargetIterator() {
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap = create();
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("foo", asList(2, 3));
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("bar", asList(4, 5));
4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("foo", asList(6));
4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("baz", asList(7, 8));
4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("dog", asList(9));
4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("bar", asList(10, 11));
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multimap.putAll("cat", asList(12, 13, 14));
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return multimap.asMap().entrySet().iterator();
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected void verify(
4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          List<Entry<String, Collection<Integer>>> elements) {
4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        assertEquals(newHashSet(elements), multimap.asMap().entrySet());
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testExplicitComparatorSerialization() {
4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultimap<String, Integer> multimap = createPopulate();
4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultimap<String, Integer> copy
4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = SerializableTester.reserializeAndAssert(multimap);
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(copy.values()).hasContentsInOrder(1, 3, 7, 2, 6, 0, 4);
4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(copy.keySet()).hasContentsInOrder("foo", "google", "tree");
4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multimap.keyComparator(), copy.keyComparator());
4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(multimap.valueComparator(), copy.valueComparator());
4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTreeMultimapDerived() {
4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultimap<DerivedComparable, DerivedComparable> multimap = TreeMultimap.create();
4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMultimap.of(), multimap);
4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(new DerivedComparable("foo"), new DerivedComparable("f"));
4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(new DerivedComparable("foo"), new DerivedComparable("o"));
4781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(new DerivedComparable("foo"), new DerivedComparable("o"));
4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(new DerivedComparable("bar"), new DerivedComparable("b"));
4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(new DerivedComparable("bar"), new DerivedComparable("a"));
4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(new DerivedComparable("bar"), new DerivedComparable("r"));
4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(multimap.keySet()).hasContentsInOrder(
4831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new DerivedComparable("bar"), new DerivedComparable("foo"));
4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(multimap.values()).hasContentsInOrder(
4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new DerivedComparable("a"), new DerivedComparable("b"), new DerivedComparable("r"),
4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new DerivedComparable("f"), new DerivedComparable("o"));
4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ordering.natural(), multimap.keyComparator());
4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ordering.natural(), multimap.valueComparator());
4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SerializableTester.reserializeAndAssert(multimap);
4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTreeMultimapNonGeneric() {
4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultimap<LegacyComparable, LegacyComparable> multimap
4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = TreeMultimap.create();
4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMultimap.of(), multimap);
4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(new LegacyComparable("foo"), new LegacyComparable("f"));
4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(new LegacyComparable("foo"), new LegacyComparable("o"));
4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(new LegacyComparable("foo"), new LegacyComparable("o"));
5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(new LegacyComparable("bar"), new LegacyComparable("b"));
5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(new LegacyComparable("bar"), new LegacyComparable("a"));
5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put(new LegacyComparable("bar"), new LegacyComparable("r"));
5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(multimap.keySet()).hasContentsInOrder(
5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new LegacyComparable("bar"), new LegacyComparable("foo"));
5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(multimap.values()).hasContentsInOrder(
5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new LegacyComparable("a"),
5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new LegacyComparable("b"),
5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new LegacyComparable("r"),
5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new LegacyComparable("f"),
5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new LegacyComparable("o"));
5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ordering.natural(), multimap.keyComparator());
5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ordering.natural(), multimap.valueComparator());
5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SerializableTester.reserializeAndAssert(multimap);
5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTreeMultimapAsMapSorted() {
5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultimap<String, Integer> multimap = createPopulate();
5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SortedMap<String, Collection<Integer>> asMap = multimap.asMap();
5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Ordering.natural(), asMap.comparator());
5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("foo", asMap.firstKey());
5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("tree", asMap.lastKey());
5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Integer> fooValues = ImmutableSet.of(1, 3, 7);
5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Integer> googleValues = ImmutableSet.of(2, 6);
5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<Integer> treeValues = ImmutableSet.of(4, 0);
5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of("google", googleValues, "tree", treeValues),
5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        asMap.tailMap("g"));
5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of("google", googleValues, "foo", fooValues),
5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        asMap.headMap("h"));
5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableMap.of("google", googleValues),
5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        asMap.subMap("g", "h"));
5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTailSetClear() {
5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TreeMultimap<String, Integer> multimap = TreeMultimap.create();
5351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("a", 1);
5361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("a", 11);
5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("b", 2);
5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("c", 3);
5391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("d", 4);
5401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("e", 5);
5411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.put("e", 55);
5421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    multimap.keySet().tailSet("d").clear();
5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableSet.of("a", "b", "c"), multimap.keySet());
5451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(4, multimap.size());
5461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(4, multimap.values().size());
5471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(4, multimap.keys().size());
5481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
550