10888a09821a98ac0680fad765217302858e70fa4Paul Duffin/* 20888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Copyright (C) 2013 The Guava Authors 30888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 40888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 50888a09821a98ac0680fad765217302858e70fa4Paul Duffin * in compliance with the License. You may obtain a copy of the License at 60888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 70888a09821a98ac0680fad765217302858e70fa4Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0 80888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 90888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Unless required by applicable law or agreed to in writing, software distributed under the License 100888a09821a98ac0680fad765217302858e70fa4Paul Duffin * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 110888a09821a98ac0680fad765217302858e70fa4Paul Duffin * or implied. See the License for the specific language governing permissions and limitations under 120888a09821a98ac0680fad765217302858e70fa4Paul Duffin * the License. 130888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 140888a09821a98ac0680fad765217302858e70fa4Paul Duffin 150888a09821a98ac0680fad765217302858e70fa4Paul Duffinpackage com.google.common.collect.testing.google; 160888a09821a98ac0680fad765217302858e70fa4Paul Duffin 170888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.collect.testing.features.CollectionFeature.SUPPORTS_ITERATOR_REMOVE; 180888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.collect.testing.features.CollectionSize.SEVERAL; 190888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.collect.testing.features.CollectionSize.ZERO; 200888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.collect.testing.features.MapFeature.ALLOWS_NULL_KEYS; 210888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.collect.testing.features.MapFeature.ALLOWS_NULL_KEY_QUERIES; 220888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.collect.testing.features.MapFeature.SUPPORTS_PUT; 230888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.collect.testing.features.MapFeature.SUPPORTS_REMOVE; 240888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static org.truth0.Truth.ASSERT; 250888a09821a98ac0680fad765217302858e70fa4Paul Duffin 260888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.annotations.GwtCompatible; 270888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.collect.Iterables; 280888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.collect.Multimap; 290888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.collect.testing.Helpers; 300888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.collect.testing.features.CollectionFeature; 310888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.collect.testing.features.CollectionSize; 320888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.collect.testing.features.MapFeature; 330888a09821a98ac0680fad765217302858e70fa4Paul Duffin 340888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.ArrayList; 350888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Collection; 360888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Iterator; 370888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.List; 380888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Map.Entry; 390888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Set; 400888a09821a98ac0680fad765217302858e70fa4Paul Duffin 410888a09821a98ac0680fad765217302858e70fa4Paul Duffin/** 420888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Tests for {@link Multimap#asMap}. 430888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 440888a09821a98ac0680fad765217302858e70fa4Paul Duffin * @author Louis Wasserman 450888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 460888a09821a98ac0680fad765217302858e70fa4Paul Duffin@GwtCompatible 470888a09821a98ac0680fad765217302858e70fa4Paul Duffinpublic class MultimapAsMapTester<K, V> extends AbstractMultimapTester<K, V, Multimap<K, V>> { 480888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testAsMapGet() { 490888a09821a98ac0680fad765217302858e70fa4Paul Duffin for (K key : sampleKeys()) { 500888a09821a98ac0680fad765217302858e70fa4Paul Duffin List<V> expectedValues = new ArrayList<V>(); 510888a09821a98ac0680fad765217302858e70fa4Paul Duffin for (Entry<K, V> entry : getSampleElements()) { 520888a09821a98ac0680fad765217302858e70fa4Paul Duffin if (entry.getKey().equals(key)) { 530888a09821a98ac0680fad765217302858e70fa4Paul Duffin expectedValues.add(entry.getValue()); 540888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 550888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 560888a09821a98ac0680fad765217302858e70fa4Paul Duffin 570888a09821a98ac0680fad765217302858e70fa4Paul Duffin Collection<V> collection = multimap().asMap().get(key); 580888a09821a98ac0680fad765217302858e70fa4Paul Duffin if (expectedValues.isEmpty()) { 590888a09821a98ac0680fad765217302858e70fa4Paul Duffin ASSERT.that(collection).isNull(); 600888a09821a98ac0680fad765217302858e70fa4Paul Duffin } else { 610888a09821a98ac0680fad765217302858e70fa4Paul Duffin ASSERT.that(collection).has().exactlyAs(expectedValues); 620888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 630888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 640888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 650888a09821a98ac0680fad765217302858e70fa4Paul Duffin 660888a09821a98ac0680fad765217302858e70fa4Paul Duffin @CollectionSize.Require(absent = ZERO) 670888a09821a98ac0680fad765217302858e70fa4Paul Duffin @MapFeature.Require(ALLOWS_NULL_KEYS) 680888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testAsMapGetNullKeyPresent() { 690888a09821a98ac0680fad765217302858e70fa4Paul Duffin initMultimapWithNullKey(); 700888a09821a98ac0680fad765217302858e70fa4Paul Duffin ASSERT.that(multimap().asMap().get(null)).has().exactly(getValueForNullKey()); 710888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 720888a09821a98ac0680fad765217302858e70fa4Paul Duffin 730888a09821a98ac0680fad765217302858e70fa4Paul Duffin @MapFeature.Require(ALLOWS_NULL_KEY_QUERIES) 740888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testAsMapGetNullKeyAbsent() { 750888a09821a98ac0680fad765217302858e70fa4Paul Duffin ASSERT.that(multimap().asMap().get(null)).isNull(); 760888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 770888a09821a98ac0680fad765217302858e70fa4Paul Duffin 780888a09821a98ac0680fad765217302858e70fa4Paul Duffin @MapFeature.Require(absent = ALLOWS_NULL_KEY_QUERIES) 790888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testAsMapGetNullKeyUnsupported() { 800888a09821a98ac0680fad765217302858e70fa4Paul Duffin try { 810888a09821a98ac0680fad765217302858e70fa4Paul Duffin multimap().asMap().get(null); 820888a09821a98ac0680fad765217302858e70fa4Paul Duffin fail("Expected NullPointerException"); 830888a09821a98ac0680fad765217302858e70fa4Paul Duffin } catch (NullPointerException expected) {} 840888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 850888a09821a98ac0680fad765217302858e70fa4Paul Duffin 860888a09821a98ac0680fad765217302858e70fa4Paul Duffin @CollectionSize.Require(absent = ZERO) 870888a09821a98ac0680fad765217302858e70fa4Paul Duffin @MapFeature.Require(SUPPORTS_REMOVE) 880888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testAsMapRemove() { 890888a09821a98ac0680fad765217302858e70fa4Paul Duffin ASSERT.that(multimap().asMap().remove(sampleKeys().e0)).iteratesAs(sampleValues().e0); 900888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertGet(sampleKeys().e0); 910888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(getNumElements() - 1, multimap().size()); 920888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 930888a09821a98ac0680fad765217302858e70fa4Paul Duffin 940888a09821a98ac0680fad765217302858e70fa4Paul Duffin @CollectionSize.Require(SEVERAL) 950888a09821a98ac0680fad765217302858e70fa4Paul Duffin @MapFeature.Require(SUPPORTS_PUT) 960888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testAsMapEntrySetReflectsPutSameKey() { 970888a09821a98ac0680fad765217302858e70fa4Paul Duffin resetContainer( 980888a09821a98ac0680fad765217302858e70fa4Paul Duffin Helpers.mapEntry(sampleKeys().e0, sampleValues().e0), 990888a09821a98ac0680fad765217302858e70fa4Paul Duffin Helpers.mapEntry(sampleKeys().e0, sampleValues().e3)); 1000888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1010888a09821a98ac0680fad765217302858e70fa4Paul Duffin Set<Entry<K, Collection<V>>> asMapEntrySet = multimap().asMap().entrySet(); 1020888a09821a98ac0680fad765217302858e70fa4Paul Duffin Collection<V> valueCollection = Iterables.getOnlyElement(asMapEntrySet).getValue(); 1030888a09821a98ac0680fad765217302858e70fa4Paul Duffin ASSERT.that(valueCollection) 1040888a09821a98ac0680fad765217302858e70fa4Paul Duffin .has().exactly(sampleValues().e0, sampleValues().e3); 1050888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertTrue(multimap().put(sampleKeys().e0, sampleValues().e4)); 1060888a09821a98ac0680fad765217302858e70fa4Paul Duffin ASSERT.that(valueCollection) 1070888a09821a98ac0680fad765217302858e70fa4Paul Duffin .has().exactly(sampleValues().e0, sampleValues().e3, sampleValues().e4); 1080888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1090888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1100888a09821a98ac0680fad765217302858e70fa4Paul Duffin @CollectionSize.Require(SEVERAL) 1110888a09821a98ac0680fad765217302858e70fa4Paul Duffin @MapFeature.Require(SUPPORTS_PUT) 1120888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testAsMapEntrySetReflectsPutDifferentKey() { 1130888a09821a98ac0680fad765217302858e70fa4Paul Duffin resetContainer( 1140888a09821a98ac0680fad765217302858e70fa4Paul Duffin Helpers.mapEntry(sampleKeys().e0, sampleValues().e0), 1150888a09821a98ac0680fad765217302858e70fa4Paul Duffin Helpers.mapEntry(sampleKeys().e0, sampleValues().e3)); 1160888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1170888a09821a98ac0680fad765217302858e70fa4Paul Duffin Set<Entry<K, Collection<V>>> asMapEntrySet = multimap().asMap().entrySet(); 1180888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertTrue(multimap().put(sampleKeys().e1, sampleValues().e4)); 1190888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(2, asMapEntrySet.size()); 1200888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1210888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1220888a09821a98ac0680fad765217302858e70fa4Paul Duffin @CollectionSize.Require(SEVERAL) 1230888a09821a98ac0680fad765217302858e70fa4Paul Duffin @MapFeature.Require({SUPPORTS_PUT, SUPPORTS_REMOVE}) 1240888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testAsMapEntrySetRemovePropagatesToMultimap() { 1250888a09821a98ac0680fad765217302858e70fa4Paul Duffin resetContainer( 1260888a09821a98ac0680fad765217302858e70fa4Paul Duffin Helpers.mapEntry(sampleKeys().e0, sampleValues().e0), 1270888a09821a98ac0680fad765217302858e70fa4Paul Duffin Helpers.mapEntry(sampleKeys().e0, sampleValues().e3)); 1280888a09821a98ac0680fad765217302858e70fa4Paul Duffin Set<Entry<K, Collection<V>>> asMapEntrySet = multimap().asMap().entrySet(); 1290888a09821a98ac0680fad765217302858e70fa4Paul Duffin Entry<K, Collection<V>> asMapEntry0 = Iterables.getOnlyElement(asMapEntrySet); 1300888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertTrue(multimap().put(sampleKeys().e1, sampleValues().e4)); 1310888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertTrue(asMapEntrySet.remove(asMapEntry0)); 1320888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertEquals(1, multimap().size()); 1330888a09821a98ac0680fad765217302858e70fa4Paul Duffin ASSERT.that(multimap().keySet()).iteratesAs(sampleKeys().e1); 1340888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1350888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1360888a09821a98ac0680fad765217302858e70fa4Paul Duffin @CollectionSize.Require(SEVERAL) 1370888a09821a98ac0680fad765217302858e70fa4Paul Duffin @CollectionFeature.Require(SUPPORTS_ITERATOR_REMOVE) 1380888a09821a98ac0680fad765217302858e70fa4Paul Duffin public void testAsMapEntrySetIteratorRemovePropagatesToMultimap() { 1390888a09821a98ac0680fad765217302858e70fa4Paul Duffin resetContainer( 1400888a09821a98ac0680fad765217302858e70fa4Paul Duffin Helpers.mapEntry(sampleKeys().e0, sampleValues().e0), 1410888a09821a98ac0680fad765217302858e70fa4Paul Duffin Helpers.mapEntry(sampleKeys().e0, sampleValues().e3)); 1420888a09821a98ac0680fad765217302858e70fa4Paul Duffin Set<Entry<K, Collection<V>>> asMapEntrySet = multimap().asMap().entrySet(); 1430888a09821a98ac0680fad765217302858e70fa4Paul Duffin Iterator<Entry<K, Collection<V>>> asMapEntryItr = asMapEntrySet.iterator(); 1440888a09821a98ac0680fad765217302858e70fa4Paul Duffin asMapEntryItr.next(); 1450888a09821a98ac0680fad765217302858e70fa4Paul Duffin asMapEntryItr.remove(); 1460888a09821a98ac0680fad765217302858e70fa4Paul Duffin assertTrue(multimap().isEmpty()); 1470888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1480888a09821a98ac0680fad765217302858e70fa4Paul Duffin} 149