10888a09821a98ac0680fad765217302858e70fa4Paul Duffin/* 20888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Copyright (C) 2007 The Guava Authors 30888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 40888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License"); 50888a09821a98ac0680fad765217302858e70fa4Paul Duffin * you may not use this file except in compliance with the License. 60888a09821a98ac0680fad765217302858e70fa4Paul Duffin * You may obtain a copy of the License at 70888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 80888a09821a98ac0680fad765217302858e70fa4Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0 90888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 100888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Unless required by applicable law or agreed to in writing, software 110888a09821a98ac0680fad765217302858e70fa4Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS, 120888a09821a98ac0680fad765217302858e70fa4Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130888a09821a98ac0680fad765217302858e70fa4Paul Duffin * See the License for the specific language governing permissions and 140888a09821a98ac0680fad765217302858e70fa4Paul Duffin * limitations under the License. 150888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 160888a09821a98ac0680fad765217302858e70fa4Paul Duffin 170888a09821a98ac0680fad765217302858e70fa4Paul Duffinpackage com.google.common.collect; 180888a09821a98ac0680fad765217302858e70fa4Paul Duffin 193ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffinimport static com.google.common.truth.Truth.assertThat; 200888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static java.util.Arrays.asList; 210888a09821a98ac0680fad765217302858e70fa4Paul Duffin 220888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.annotations.GwtCompatible; 230888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.testing.EqualsTester; 240888a09821a98ac0680fad765217302858e70fa4Paul Duffin 250888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestCase; 260888a09821a98ac0680fad765217302858e70fa4Paul Duffin 270888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Arrays; 280888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Collection; 290888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Iterator; 300888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Map; 310888a09821a98ac0680fad765217302858e70fa4Paul Duffin 320888a09821a98ac0680fad765217302858e70fa4Paul Duffin/** 330888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Unit tests for {@code LinkedHashMultimap}. 340888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 350888a09821a98ac0680fad765217302858e70fa4Paul Duffin * @author Jared Levy 360888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 370888a09821a98ac0680fad765217302858e70fa4Paul Duffin@GwtCompatible(emulated = true) 380888a09821a98ac0680fad765217302858e70fa4Paul Duffinpublic class LinkedHashMultimapTest extends TestCase { 390888a09821a98ac0680fad765217302858e70fa4Paul Duffin 400888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testValueSetHashTableExpansion() { 410888a09821a98ac0680fad765217302858e70fa4Paul Duffin LinkedHashMultimap<String, Integer> multimap = LinkedHashMultimap.create(); 420888a09821a98ac0680fad765217302858e70fa4Paul Duffin for (int z = 1; z <= 100; z++) { 430888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("a", z); 440888a09821a98ac0680fad765217302858e70fa4Paul Duffin // The Eclipse compiler (and hence GWT) rejects a parameterized cast. 450888a09821a98ac0680fad765217302858e70fa4Paul Duffin @SuppressWarnings("unchecked") 460888a09821a98ac0680fad765217302858e70fa4Paul Duffin LinkedHashMultimap<String, Integer>.ValueSet valueSet = 470888a09821a98ac0680fad765217302858e70fa4Paul Duffin (LinkedHashMultimap.ValueSet) multimap.backingMap().get("a"); 480888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(z, valueSet.size()); 490888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertFalse(Hashing.needsResizing(valueSet.size(), valueSet.hashTable.length, 500888a09821a98ac0680fad765217302858e70fa4Paul Duffin LinkedHashMultimap.VALUE_SET_LOAD_FACTOR)); 510888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 520888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 530888a09821a98ac0680fad765217302858e70fa4Paul Duffin 540888a09821a98ac0680fad765217302858e70fa4Paul Duffin private Multimap<String, Integer> initializeMultimap5() { 550888a09821a98ac0680fad765217302858e70fa4Paul Duffin Multimap<String, Integer> multimap = LinkedHashMultimap.create(); 560888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("foo", 5); 570888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("bar", 4); 580888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("foo", 3); 590888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("cow", 2); 600888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("bar", 1); 610888a09821a98ac0680fad765217302858e70fa4Paul Duffin return multimap; 620888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 630888a09821a98ac0680fad765217302858e70fa4Paul Duffin 640888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testToString() { 650888a09821a98ac0680fad765217302858e70fa4Paul Duffin Multimap<String, Integer> multimap = LinkedHashMultimap.create(); 660888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("foo", 3); 670888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("bar", 1); 680888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.putAll("foo", Arrays.asList(-1, 2, 4)); 690888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.putAll("bar", Arrays.asList(2, 3)); 700888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("foo", 1); 710888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals("{foo=[3, -1, 2, 4, 1], bar=[1, 2, 3]}", 720888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.toString()); 730888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 740888a09821a98ac0680fad765217302858e70fa4Paul Duffin 750888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testOrderingReadOnly() { 760888a09821a98ac0680fad765217302858e70fa4Paul Duffin Multimap<String, Integer> multimap = initializeMultimap5(); 770888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertOrderingReadOnly(multimap); 780888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 790888a09821a98ac0680fad765217302858e70fa4Paul Duffin 800888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testOrderingUnmodifiable() { 810888a09821a98ac0680fad765217302858e70fa4Paul Duffin Multimap<String, Integer> multimap = initializeMultimap5(); 820888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertOrderingReadOnly(Multimaps.unmodifiableMultimap(multimap)); 830888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 840888a09821a98ac0680fad765217302858e70fa4Paul Duffin 850888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testOrderingSynchronized() { 860888a09821a98ac0680fad765217302858e70fa4Paul Duffin Multimap<String, Integer> multimap = initializeMultimap5(); 870888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertOrderingReadOnly(Multimaps.synchronizedMultimap(multimap)); 880888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 890888a09821a98ac0680fad765217302858e70fa4Paul Duffin 900888a09821a98ac0680fad765217302858e70fa4Paul Duffin private void assertOrderingReadOnly(Multimap<String, Integer> multimap) { 913ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin assertThat(multimap.get("foo")).has().exactly(5, 3).inOrder(); 923ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin assertThat(multimap.get("bar")).has().exactly(4, 1).inOrder(); 933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin assertThat(multimap.get("cow")).has().item(2); 940888a09821a98ac0680fad765217302858e70fa4Paul Duffin 953ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin assertThat(multimap.keySet()).has().exactly("foo", "bar", "cow").inOrder(); 963ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin assertThat(multimap.values()).has().exactly(5, 4, 3, 2, 1).inOrder(); 970888a09821a98ac0680fad765217302858e70fa4Paul Duffin 980888a09821a98ac0680fad765217302858e70fa4Paul Duffin Iterator<Map.Entry<String, Integer>> entryIterator = 990888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.entries().iterator(); 1000888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(Maps.immutableEntry("foo", 5), entryIterator.next()); 1010888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(Maps.immutableEntry("bar", 4), entryIterator.next()); 1020888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(Maps.immutableEntry("foo", 3), entryIterator.next()); 1030888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(Maps.immutableEntry("cow", 2), entryIterator.next()); 1040888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(Maps.immutableEntry("bar", 1), entryIterator.next()); 1050888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1060888a09821a98ac0680fad765217302858e70fa4Paul Duffin Iterator<Map.Entry<String, Collection<Integer>>> collectionIterator = 1070888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.asMap().entrySet().iterator(); 1080888a09821a98ac0680fad765217302858e70fa4Paul Duffin Map.Entry<String, Collection<Integer>> entry = collectionIterator.next(); 1090888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals("foo", entry.getKey()); 1103ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin assertThat(entry.getValue()).has().exactly(5, 3).inOrder(); 1110888a09821a98ac0680fad765217302858e70fa4Paul Duffin entry = collectionIterator.next(); 1120888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals("bar", entry.getKey()); 1133ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin assertThat(entry.getValue()).has().exactly(4, 1).inOrder(); 1140888a09821a98ac0680fad765217302858e70fa4Paul Duffin entry = collectionIterator.next(); 1150888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals("cow", entry.getKey()); 1163ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin assertThat(entry.getValue()).has().item(2); 1170888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1180888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1190888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testOrderingUpdates() { 1200888a09821a98ac0680fad765217302858e70fa4Paul Duffin Multimap<String, Integer> multimap = initializeMultimap5(); 1210888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1223ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin assertThat(multimap.replaceValues("foo", asList(6, 7))).has().exactly(5, 3).inOrder(); 1233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin assertThat(multimap.keySet()).has().exactly("foo", "bar", "cow").inOrder(); 1243ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin assertThat(multimap.removeAll("foo")).has().exactly(6, 7).inOrder(); 1253ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin assertThat(multimap.keySet()).has().exactly("bar", "cow").inOrder(); 1260888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertTrue(multimap.remove("bar", 4)); 1273ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin assertThat(multimap.keySet()).has().exactly("bar", "cow").inOrder(); 1280888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertTrue(multimap.remove("bar", 1)); 1293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin assertThat(multimap.keySet()).has().item("cow"); 1300888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("bar", 9); 1313ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin assertThat(multimap.keySet()).has().exactly("cow", "bar").inOrder(); 1320888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1330888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1340888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testToStringNullExact() { 1350888a09821a98ac0680fad765217302858e70fa4Paul Duffin Multimap<String, Integer> multimap = LinkedHashMultimap.create(); 1360888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1370888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("foo", 3); 1380888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("foo", -1); 1390888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put(null, null); 1400888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("bar", 1); 1410888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("foo", 2); 1420888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put(null, 0); 1430888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("bar", 2); 1440888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("bar", null); 1450888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("foo", null); 1460888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("foo", 4); 1470888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put(null, -1); 1480888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("bar", 3); 1490888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("bar", 1); 1500888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("foo", 1); 1510888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1520888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals( 1530888a09821a98ac0680fad765217302858e70fa4Paul Duffin "{foo=[3, -1, 2, null, 4, 1], null=[null, 0, -1], bar=[1, 2, null, 3]}", 1540888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.toString()); 1550888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1560888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1570888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testPutMultimapOrdered() { 1580888a09821a98ac0680fad765217302858e70fa4Paul Duffin Multimap<String, Integer> multimap = LinkedHashMultimap.create(); 1590888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.putAll(initializeMultimap5()); 1600888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertOrderingReadOnly(multimap); 1610888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1620888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1630888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testKeysToString_ordering() { 1640888a09821a98ac0680fad765217302858e70fa4Paul Duffin Multimap<String, Integer> multimap = initializeMultimap5(); 1650888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals("[foo x 2, bar x 2, cow]", multimap.keys().toString()); 1660888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1670888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1680888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testCreate() { 1690888a09821a98ac0680fad765217302858e70fa4Paul Duffin LinkedHashMultimap<String, Integer> multimap = LinkedHashMultimap.create(); 1700888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("foo", 1); 1710888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("bar", 2); 1720888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("foo", 3); 1730888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(ImmutableSet.of(1, 3), multimap.get("foo")); 1740888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1750888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1760888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testCreateFromMultimap() { 1770888a09821a98ac0680fad765217302858e70fa4Paul Duffin Multimap<String, Integer> multimap = LinkedHashMultimap.create(); 1780888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("a", 1); 1790888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("b", 2); 1800888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("a", 3); 1810888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("c", 4); 1820888a09821a98ac0680fad765217302858e70fa4Paul Duffin LinkedHashMultimap<String, Integer> copy = 1830888a09821a98ac0680fad765217302858e70fa4Paul Duffin LinkedHashMultimap.create(multimap); 1840888a09821a98ac0680fad765217302858e70fa4Paul Duffin new EqualsTester() 1850888a09821a98ac0680fad765217302858e70fa4Paul Duffin .addEqualityGroup(multimap, copy) 1860888a09821a98ac0680fad765217302858e70fa4Paul Duffin .testEquals(); 1870888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1880888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1890888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testCreateFromSizes() { 1900888a09821a98ac0680fad765217302858e70fa4Paul Duffin LinkedHashMultimap<String, Integer> multimap 1910888a09821a98ac0680fad765217302858e70fa4Paul Duffin = LinkedHashMultimap.create(20, 15); 1920888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("foo", 1); 1930888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("bar", 2); 1940888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap.put("foo", 3); 1950888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(ImmutableSet.of(1, 3), multimap.get("foo")); 1960888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1970888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1980888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testCreateFromIllegalSizes() { 1990888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 2000888a09821a98ac0680fad765217302858e70fa4Paul Duffin LinkedHashMultimap.create(-20, 15); 2010888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail(); 2020888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IllegalArgumentException expected) {} 2030888a09821a98ac0680fad765217302858e70fa4Paul Duffin 2040888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 2050888a09821a98ac0680fad765217302858e70fa4Paul Duffin LinkedHashMultimap.create(20, -15); 2060888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail(); 2070888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (IllegalArgumentException expected) {} 2080888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 2090888a09821a98ac0680fad765217302858e70fa4Paul Duffin} 2100888a09821a98ac0680fad765217302858e70fa4Paul Duffin 211