/* * Copyright (C) 2007 The Guava Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.common.collect; import static org.junit.contrib.truth.Truth.ASSERT; import com.google.common.annotations.GwtCompatible; import com.google.common.annotations.GwtIncompatible; import com.google.common.testing.SerializableTester; import java.util.Collection; import java.util.Comparator; import java.util.Iterator; import java.util.Map; import java.util.SortedSet; /** * Unit tests for {@code TreeMultimap} with explicit comparators. * * @author Jared Levy */ @GwtCompatible(emulated = true) public class TreeMultimapExplicitTest extends AbstractSetMultimapTest { /** * Compare strings lengths, and if the lengths are equal compare the strings. * A {@code null} is less than any non-null value. */ private enum StringLength implements Comparator { COMPARATOR; @Override public int compare(String first, String second) { if (first == second) { return 0; } else if (first == null) { return -1; } else if (second == null) { return 1; } else if (first.length() != second.length()) { return first.length() - second.length(); } else { return first.compareTo(second); } } } /** * Decreasing integer values. A {@code null} comes before any non-null value. */ private static final Comparator DECREASING_INT_COMPARATOR = Ordering.natural().reverse().nullsFirst(); @Override protected Multimap create() { return TreeMultimap.create( StringLength.COMPARATOR, DECREASING_INT_COMPARATOR); } /** * Create and populate a {@code TreeMultimap} with explicit comparators. */ private TreeMultimap createPopulate() { TreeMultimap multimap = TreeMultimap.create( StringLength.COMPARATOR, DECREASING_INT_COMPARATOR); multimap.put("google", 2); multimap.put("google", 6); multimap.put(null, 3); multimap.put(null, 1); multimap.put(null, 7); multimap.put("tree", 0); multimap.put("tree", null); return multimap; } /** * Test that a TreeMultimap created from another uses the natural ordering. */ public void testMultimapCreateFromTreeMultimap() { TreeMultimap tree = TreeMultimap.create( StringLength.COMPARATOR, DECREASING_INT_COMPARATOR); tree.put("google", 2); tree.put("google", 6); tree.put("tree", 0); tree.put("tree", 3); ASSERT.that(tree.keySet()).hasContentsInOrder("tree", "google"); ASSERT.that(tree.get("google")).hasContentsInOrder(6, 2); TreeMultimap copy = TreeMultimap.create(tree); assertEquals(tree, copy); ASSERT.that(copy.keySet()).hasContentsInOrder("google", "tree"); ASSERT.that(copy.get("google")).hasContentsInOrder(2, 6); assertEquals(Ordering.natural(), copy.keyComparator()); assertEquals(Ordering.natural(), copy.valueComparator()); assertEquals(Ordering.natural(), copy.get("google").comparator()); } public void testToString() { assertEquals("{bar=[3, 2, 1], foo=[4, 3, 2, 1, -1]}", createSample().toString()); } public void testGetComparator() { TreeMultimap multimap = createPopulate(); assertEquals(StringLength.COMPARATOR, multimap.keyComparator()); assertEquals(DECREASING_INT_COMPARATOR, multimap.valueComparator()); } public void testOrderedGet() { TreeMultimap multimap = createPopulate(); ASSERT.that(multimap.get(null)).hasContentsInOrder(7, 3, 1); ASSERT.that(multimap.get("google")).hasContentsInOrder(6, 2); ASSERT.that(multimap.get("tree")).hasContentsInOrder(null, 0); } public void testOrderedKeySet() { TreeMultimap multimap = createPopulate(); ASSERT.that(multimap.keySet()).hasContentsInOrder(null, "tree", "google"); } public void testOrderedAsMapEntries() { TreeMultimap multimap = createPopulate(); Iterator>> iterator = multimap.asMap().entrySet().iterator(); Map.Entry> entry = iterator.next(); assertEquals(null, entry.getKey()); ASSERT.that(entry.getValue()).hasContentsAnyOrder(7, 3, 1); entry = iterator.next(); assertEquals("tree", entry.getKey()); ASSERT.that(entry.getValue()).hasContentsAnyOrder(null, 0); entry = iterator.next(); assertEquals("google", entry.getKey()); ASSERT.that(entry.getValue()).hasContentsAnyOrder(6, 2); } public void testOrderedEntries() { TreeMultimap multimap = createPopulate(); ASSERT.that(multimap.entries()).hasContentsInOrder( Maps.immutableEntry((String) null, 7), Maps.immutableEntry((String) null, 3), Maps.immutableEntry((String) null, 1), Maps.immutableEntry("tree", (Integer) null), Maps.immutableEntry("tree", 0), Maps.immutableEntry("google", 6), Maps.immutableEntry("google", 2)); } public void testOrderedValues() { TreeMultimap multimap = createPopulate(); ASSERT.that(multimap.values()).hasContentsInOrder(7, 3, 1, null, 0, 6, 2); } public void testComparator() { TreeMultimap multimap = createPopulate(); assertEquals(DECREASING_INT_COMPARATOR, multimap.get("foo").comparator()); assertEquals(DECREASING_INT_COMPARATOR, multimap.get("missing").comparator()); } public void testMultimapComparators() { Multimap multimap = createSample(); TreeMultimap copy = TreeMultimap.create(StringLength.COMPARATOR, DECREASING_INT_COMPARATOR); copy.putAll(multimap); assertEquals(multimap, copy); assertEquals(StringLength.COMPARATOR, copy.keyComparator()); assertEquals(DECREASING_INT_COMPARATOR, copy.valueComparator()); } public void testSortedKeySet() { TreeMultimap multimap = createPopulate(); SortedSet keySet = multimap.keySet(); assertEquals(null, keySet.first()); assertEquals("google", keySet.last()); assertEquals(StringLength.COMPARATOR, keySet.comparator()); assertEquals(Sets.newHashSet(null, "tree"), keySet.headSet("yahoo")); assertEquals(Sets.newHashSet("google"), keySet.tailSet("yahoo")); assertEquals(Sets.newHashSet("tree"), keySet.subSet("ask", "yahoo")); } @GwtIncompatible("SerializableTester") public void testExplicitComparatorSerialization() { TreeMultimap multimap = createPopulate(); TreeMultimap copy = SerializableTester.reserializeAndAssert(multimap); ASSERT.that(copy.values()).hasContentsInOrder(7, 3, 1, null, 0, 6, 2); ASSERT.that(copy.keySet()).hasContentsInOrder(null, "tree", "google"); assertEquals(multimap.keyComparator(), copy.keyComparator()); assertEquals(multimap.valueComparator(), copy.valueComparator()); } }