11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2008 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.testing; 181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.util.Collections.singleton; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase; 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Arrays; 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection; 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections; 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.HashSet; 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator; 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map; 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map.Entry; 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set; 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests representing the contract of {@link Map}. Concrete subclasses of this 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * base class test conformance of concrete {@link Map} subclasses to that 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * contract. 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * TODO: Descriptive assertion messages, with hints as to probable 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * fixes. 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * TODO: Add another constructor parameter indicating whether the 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * class under test is ordered, and check the order if so. 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * TODO: Refactor to share code with SetTestBuilder &c. 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>This class is GWT compatible. 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param <K> the type of keys used by the maps under test 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param <V> the type of mapped values used the maps under test 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author George van den Driessche 491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic abstract class MapInterfaceTest<K, V> extends TestCase { 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** A key type that is not assignable to any classes but Object. */ 531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final class IncompatibleKeyType { 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public String toString() { 551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return "IncompatibleKeyType"; 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected final boolean supportsPut; 601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected final boolean supportsRemove; 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected final boolean supportsClear; 621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected final boolean allowsNullKeys; 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected final boolean allowsNullValues; 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected final boolean supportsIteratorRemove; 651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates a new, empty instance of the class under test. 681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a new, empty map instance. 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws UnsupportedOperationException if it's not possible to make an 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * empty instance of the class under test. 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected abstract Map<K, V> makeEmptyMap() 741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throws UnsupportedOperationException; 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates a new, non-empty instance of the class under test. 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a new, non-empty map instance. 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws UnsupportedOperationException if it's not possible to make a 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * non-empty instance of the class under test. 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected abstract Map<K, V> makePopulatedMap() 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throws UnsupportedOperationException; 851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates a new key that is not expected to be found 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * in {@link #makePopulatedMap()}. 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a key. 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws UnsupportedOperationException if it's not possible to make a key 921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * that will not be found in the map. 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected abstract K getKeyNotInPopulatedMap() 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throws UnsupportedOperationException; 961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates a new value that is not expected to be found 991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * in {@link #makePopulatedMap()}. 1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a value. 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws UnsupportedOperationException if it's not possible to make a value 1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * that will not be found in the map. 1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected abstract V getValueNotInPopulatedMap() 1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throws UnsupportedOperationException; 1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Constructor that assigns {@code supportsIteratorRemove} the same value as 1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code supportsRemove}. 1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected MapInterfaceTest( 1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean allowsNullKeys, 1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean allowsNullValues, 1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean supportsPut, 1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean supportsRemove, 1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean supportsClear) { 1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this(allowsNullKeys, allowsNullValues, supportsPut, supportsRemove, 1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert supportsClear, supportsRemove); 1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Constructor with an explicit {@code supportsIteratorRemove} parameter. 1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected MapInterfaceTest( 1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean allowsNullKeys, 1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean allowsNullValues, 1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean supportsPut, 1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean supportsRemove, 1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean supportsClear, 1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean supportsIteratorRemove) { 1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.supportsPut = supportsPut; 1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.supportsRemove = supportsRemove; 1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.supportsClear = supportsClear; 1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.allowsNullKeys = allowsNullKeys; 1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.allowsNullValues = allowsNullValues; 1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.supportsIteratorRemove = supportsIteratorRemove; 1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Used by tests that require a map, but don't care whether it's 1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * populated or not. 1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a new map instance. 1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected Map<K, V> makeEitherMap() { 1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return makePopulatedMap(); 1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return makeEmptyMap(); 1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected final boolean supportsValuesHashCode(Map<K, V> map) { 1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // get the first non-null value 1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Collection<V> values = map.values(); 1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (V value : values) { 1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (value != null) { 1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert value.hashCode(); 1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (Exception e) { 1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return true; 1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return true; 1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Checks all the properties that should always hold of a map. Also calls 1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link #assertMoreInvariants} to check invariants that are peculiar to 1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * specific implementations. 1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @see #assertMoreInvariants 1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param map the map to check. 1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected final void assertInvariants(Map<K, V> map) { 1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<K> keySet = map.keySet(); 1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Collection<V> valueCollection = map.values(); 1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Entry<K, V>> entrySet = map.entrySet(); 1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(map.size() == 0, map.isEmpty()); 1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(map.size(), keySet.size()); 1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(keySet.size() == 0, keySet.isEmpty()); 1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(!keySet.isEmpty(), keySet.iterator().hasNext()); 1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int expectedKeySetHash = 0; 1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (K key : keySet) { 1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert V value = map.get(key); 1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expectedKeySetHash += key != null ? key.hashCode() : 0; 1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsKey(key)); 1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsValue(value)); 1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(valueCollection.contains(value)); 1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(valueCollection.containsAll(Collections.singleton(value))); 1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(entrySet.contains(mapEntry(key, value))); 1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(allowsNullKeys || (key != null)); 1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expectedKeySetHash, keySet.hashCode()); 2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(map.size(), valueCollection.size()); 2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(valueCollection.size() == 0, valueCollection.isEmpty()); 2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals( 2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert !valueCollection.isEmpty(), valueCollection.iterator().hasNext()); 2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (V value : valueCollection) { 2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsValue(value)); 2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(allowsNullValues || (value != null)); 2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(map.size(), entrySet.size()); 2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(entrySet.size() == 0, entrySet.isEmpty()); 2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(!entrySet.isEmpty(), entrySet.iterator().hasNext()); 2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(entrySet.contains("foo")); 2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean supportsValuesHashCode = supportsValuesHashCode(map); 2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsValuesHashCode) { 2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int expectedEntrySetHash = 0; 2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (Entry<K, V> entry : entrySet) { 2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsKey(entry.getKey())); 2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsValue(entry.getValue())); 2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int expectedHash = 2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert (entry.getKey() == null ? 0 : entry.getKey().hashCode()) ^ 2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert (entry.getValue() == null ? 0 : entry.getValue().hashCode()); 2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expectedHash, entry.hashCode()); 2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expectedEntrySetHash += expectedHash; 2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expectedEntrySetHash, entrySet.hashCode()); 2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(entrySet.containsAll(new HashSet<Entry<K, V>>(entrySet))); 2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(entrySet.equals(new HashSet<Entry<K, V>>(entrySet))); 2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Object[] entrySetToArray1 = entrySet.toArray(); 2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(map.size(), entrySetToArray1.length); 2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(Arrays.asList(entrySetToArray1).containsAll(entrySet)); 2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Entry<?, ?>[] entrySetToArray2 = new Entry<?, ?>[map.size() + 2]; 2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert entrySetToArray2[map.size()] = mapEntry("foo", 1); 2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertSame(entrySetToArray2, entrySet.toArray(entrySetToArray2)); 2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertNull(entrySetToArray2[map.size()]); 2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(Arrays.asList(entrySetToArray2).containsAll(entrySet)); 2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Object[] valuesToArray1 = valueCollection.toArray(); 2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(map.size(), valuesToArray1.length); 2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(Arrays.asList(valuesToArray1).containsAll(valueCollection)); 2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Object[] valuesToArray2 = new Object[map.size() + 2]; 2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valuesToArray2[map.size()] = "foo"; 2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertSame(valuesToArray2, valueCollection.toArray(valuesToArray2)); 2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertNull(valuesToArray2[map.size()]); 2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(Arrays.asList(valuesToArray2).containsAll(valueCollection)); 2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsValuesHashCode) { 2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int expectedHash = 0; 2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (Entry<K, V> entry : entrySet) { 2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expectedHash += entry.hashCode(); 2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expectedHash, map.hashCode()); 2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertMoreInvariants(map); 2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Override this to check invariants which should hold true for a particular 2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * implementation, but which are not generally applicable to every instance 2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * of Map. 2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @param map the map whose additional invariants to check. 2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected void assertMoreInvariants(Map<K, V> map) { 2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testClear() { 2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsClear) { 2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.clear(); 2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.isEmpty()); 2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.clear(); 2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testContainsKey() { 2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K unmappedKey; 2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unmappedKey = getKeyNotInPopulatedMap(); 3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.containsKey(unmappedKey)); 3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.containsKey(new IncompatibleKeyType())); 3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ClassCastException tolerated) {} 3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsKey(map.keySet().iterator().next())); 3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (allowsNullKeys) { 3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.containsKey(null); 3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.containsKey(null); 3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException optional) { 3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testContainsValue() { 3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V unmappedValue; 3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unmappedValue = getValueNotInPopulatedMap(); 3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.containsValue(unmappedValue)); 3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsValue(map.values().iterator().next())); 3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (allowsNullValues) { 3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.containsValue(null); 3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.containsKey(null); 3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException optional) { 3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEntrySet() { 3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Set<Entry<K, V>> entrySet; 3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert entrySet = map.entrySet(); 3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K unmappedKey; 3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V unmappedValue; 3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unmappedKey = getKeyNotInPopulatedMap(); 3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unmappedValue = getValueNotInPopulatedMap(); 3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (Entry<K, V> entry : entrySet) { 3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(unmappedKey.equals(entry.getKey())); 3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(unmappedValue.equals(entry.getValue())); 3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEntrySetForEmptyMap() { 3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEmptyMap(); 3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEntrySetContainsEntryIncompatibleKey() { 3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Set<Entry<K, V>> entrySet; 3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEitherMap(); 3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert entrySet = map.entrySet(); 3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V unmappedValue; 3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unmappedValue = getValueNotInPopulatedMap(); 3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Entry<IncompatibleKeyType, V> entry 3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert = mapEntry(new IncompatibleKeyType(), unmappedValue); 3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(entrySet.contains(entry)); 3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (ClassCastException tolerated) {} 3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEntrySetContainsEntryNullKeyPresent() { 4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (!allowsNullKeys || !supportsPut) { 4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Set<Entry<K, V>> entrySet; 4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEitherMap(); 4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert entrySet = map.entrySet(); 4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V unmappedValue; 4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unmappedValue = getValueNotInPopulatedMap(); 4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.put(null, unmappedValue); 4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Entry<K, V> entry = mapEntry(null, unmappedValue); 4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(entrySet.contains(entry)); 4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(entrySet.contains(mapEntry(null, null))); 4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEntrySetContainsEntryNullKeyMissing() { 4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Set<Entry<K, V>> entrySet; 4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEitherMap(); 4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert entrySet = map.entrySet(); 4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V unmappedValue; 4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unmappedValue = getValueNotInPopulatedMap(); 4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Entry<K, V> entry = mapEntry(null, unmappedValue); 4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(entrySet.contains(entry)); 4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(allowsNullKeys); 4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(entrySet.contains(mapEntry(null, null))); 4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(allowsNullKeys && allowsNullValues); 4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEntrySetIteratorRemove() { 4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Entry<K, V>> entrySet = map.entrySet(); 4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Iterator<Entry<K, V>> iterator = entrySet.iterator(); 4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsIteratorRemove) { 4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Entry<K, V> entry = iterator.next(); 4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Entry<K, V> entryCopy = Helpers.mapEntry( 4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert entry.getKey(), entry.getValue()); 4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert iterator.remove(); 4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize - 1, map.size()); 4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Use "entryCopy" instead of "entry" because "entry" might be invalidated after 4781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // iterator.remove(). 4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(entrySet.contains(entryCopy)); 4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert iterator.remove(); 4831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected IllegalStateException."); 4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IllegalStateException e) { 4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert iterator.next(); 4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert iterator.remove(); 4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEntrySetRemove() { 5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Entry<K, V>> entrySet = map.entrySet(); 5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsRemove) { 5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean didRemove = entrySet.remove(entrySet.iterator().next()); 5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(didRemove); 5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize - 1, map.size()); 5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert entrySet.remove(entrySet.iterator().next()); 5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEntrySetRemoveMissingKey() { 5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K key; 5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEitherMap(); 5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert key = getKeyNotInPopulatedMap(); 5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 5321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Entry<K, V>> entrySet = map.entrySet(); 5351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Entry<K, V> entry 5361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert = mapEntry(key, getValueNotInPopulatedMap()); 5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsRemove) { 5391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean didRemove = entrySet.remove(entry); 5401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(didRemove); 5411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 5421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean didRemove = entrySet.remove(entry); 5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(didRemove); 5451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException optional) {} 5461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 5481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.containsKey(key)); 5491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 5501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEntrySetRemoveDifferentValue() { 5531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 5561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 5571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 5581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Entry<K, V>> entrySet = map.entrySet(); 5611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert K key = map.keySet().iterator().next(); 5621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Entry<K, V> entry 5631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert = mapEntry(key, getValueNotInPopulatedMap()); 5641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 5651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsRemove) { 5661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean didRemove = entrySet.remove(entry); 5671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(didRemove); 5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 5691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean didRemove = entrySet.remove(entry); 5711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(didRemove); 5721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException optional) {} 5731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 5751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsKey(key)); 5761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 5771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEntrySetRemoveNullKeyPresent() { 5801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (!allowsNullKeys || !supportsPut || !supportsRemove) { 5811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 5821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 5841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Set<Entry<K, V>> entrySet; 5851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEitherMap(); 5871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 5881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 5891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 5911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert entrySet = map.entrySet(); 5931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V unmappedValue; 5941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unmappedValue = getValueNotInPopulatedMap(); 5961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 5971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 5981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.put(null, unmappedValue); 6011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(unmappedValue, map.get(null)); 6021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsKey(null)); 6031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Entry<K, V> entry = mapEntry(null, unmappedValue); 6041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(entrySet.remove(entry)); 6051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertNull(map.get(null)); 6061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.containsKey(null)); 6071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEntrySetRemoveNullKeyMissing() { 6101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 6111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 6121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEitherMap(); 6131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 6141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 6151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Entry<K, V>> entrySet = map.entrySet(); 6181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Entry<K, V> entry 6191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert = mapEntry(null, getValueNotInPopulatedMap()); 6201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 6211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsRemove) { 6221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 6231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean didRemove = entrySet.remove(entry); 6241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(didRemove); 6251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 6261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(allowsNullKeys); 6271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 6291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 6301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean didRemove = entrySet.remove(entry); 6311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(didRemove); 6321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException optional) {} 6331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 6351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 6361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEntrySetRemoveAll() { 6391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 6401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 6411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 6421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 6431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 6441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Entry<K, V>> entrySet = map.entrySet(); 6471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Entry<K, V> entryToRemove = entrySet.iterator().next(); 6491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Entry<K, V>> entriesToRemove = singleton(entryToRemove); 6501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsRemove) { 6511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // We use a copy of "entryToRemove" in the assertion because "entryToRemove" might be 6521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // invalidated and have undefined behavior after entrySet.removeAll(entriesToRemove), 6531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // for example entryToRemove.getValue() might be null. 6541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Entry<K, V> entryToRemoveCopy = Helpers.mapEntry( 6551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert entryToRemove.getKey(), entryToRemove.getValue()); 6561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 6581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean didRemove = entrySet.removeAll(entriesToRemove); 6591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(didRemove); 6601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize - entriesToRemove.size(), map.size()); 6611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Use "entryToRemoveCopy" instead of "entryToRemove" because it might be invalidated and 6631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // have undefined behavior after entrySet.removeAll(entriesToRemove), 6641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(entrySet.contains(entryToRemoveCopy)); 6651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 6661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 6671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert entrySet.removeAll(entriesToRemove); 6681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 6691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 6701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 6711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 6741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEntrySetRemoveAllNullFromEmpty() { 6771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 6781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 6791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEmptyMap(); 6801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 6811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 6821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Entry<K, V>> entrySet = map.entrySet(); 6851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsRemove) { 6861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 6871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert entrySet.removeAll(null); 6881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected NullPointerException."); 6891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 6901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 6911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 6931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 6941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert entrySet.removeAll(null); 6951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException or NullPointerException."); 6961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 6971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 6981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 6991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 7001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 7031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEntrySetRetainAll() { 7061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 7071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 7081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 7091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 7101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 7111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Entry<K, V>> entrySet = map.entrySet(); 7141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Entry<K, V>> entriesToRetain = 7151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert singleton(entrySet.iterator().next()); 7161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsRemove) { 7171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean shouldRemove = (entrySet.size() > entriesToRetain.size()); 7181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean didRemove = entrySet.retainAll(entriesToRetain); 7191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(shouldRemove, didRemove); 7201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(entriesToRetain.size(), map.size()); 7211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (Entry<K, V> entry : entriesToRetain) { 7221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(entrySet.contains(entry)); 7231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 7251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 7261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert entrySet.retainAll(entriesToRetain); 7271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 7281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 7291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 7301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 7331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEntrySetRetainAllNullFromEmpty() { 7361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 7371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 7381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEmptyMap(); 7391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 7401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 7411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Entry<K, V>> entrySet = map.entrySet(); 7441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsRemove) { 7451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 7461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert entrySet.retainAll(null); 7471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Returning successfully is not ideal, but tolerated. 7481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 7491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 7501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 7521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 7531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert entrySet.retainAll(null); 7541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // We have to tolerate a successful return (Sun bug 4802647) 7551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 7561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 7571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 7581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 7591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 7621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEntrySetClear() { 7651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 7661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 7671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 7681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 7691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 7701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Entry<K, V>> entrySet = map.entrySet(); 7731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsClear) { 7741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert entrySet.clear(); 7751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(entrySet.isEmpty()); 7761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 7771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 7781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert entrySet.clear(); 7791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 7801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 7811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 7821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 7851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEntrySetAddAndAddAll() { 7881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map = makeEitherMap(); 7891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Entry<K, V>> entrySet = map.entrySet(); 7911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Entry<K, V> entryToAdd = mapEntry(null, null); 7921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 7931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert entrySet.add(entryToAdd); 7941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException or NullPointerException."); 7951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 7961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 7971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 7981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 7991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 8011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 8031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert entrySet.addAll(singleton(entryToAdd)); 8041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException or NullPointerException."); 8051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 8061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 8071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 8081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 8091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 8111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEntrySetSetValue() { 8141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // TODO: Investigate the extent to which, in practice, maps that support 8151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // put() also support Entry.setValue(). 8161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (!supportsPut) { 8171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 8181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 8211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V valueToSet; 8221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 8231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 8241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valueToSet = getValueNotInPopulatedMap(); 8251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 8261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 8271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Entry<K, V>> entrySet = map.entrySet(); 8301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Entry<K, V> entry = entrySet.iterator().next(); 8311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V oldValue = entry.getValue(); 8321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V returnedValue = entry.setValue(valueToSet); 8331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(oldValue, returnedValue); 8341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(entrySet.contains( 8351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert mapEntry(entry.getKey(), valueToSet))); 8361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(valueToSet, map.get(entry.getKey())); 8371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 8381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEntrySetSetValueSameValue() { 8411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // TODO: Investigate the extent to which, in practice, maps that support 8421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // put() also support Entry.setValue(). 8431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (!supportsPut) { 8441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 8451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 8481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 8491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 8501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 8511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 8521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Entry<K, V>> entrySet = map.entrySet(); 8551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Entry<K, V> entry = entrySet.iterator().next(); 8561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V oldValue = entry.getValue(); 8571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V returnedValue = entry.setValue(oldValue); 8581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(oldValue, returnedValue); 8591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(entrySet.contains( 8601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert mapEntry(entry.getKey(), oldValue))); 8611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(oldValue, map.get(entry.getKey())); 8621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 8631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEqualsForEqualMap() { 8661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 8671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 8681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 8691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 8701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 8711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(map, map); 8741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(makePopulatedMap(), map); 8751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.equals(Collections.emptyMap())); 8761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert //no-inspection ObjectEqualsNull 8771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.equals(null)); 8781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEqualsForLargerMap() { 8811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (!supportsPut) { 8821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 8831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 8861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> largerMap; 8871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 8881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 8891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert largerMap = makePopulatedMap(); 8901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert largerMap.put(getKeyNotInPopulatedMap(), getValueNotInPopulatedMap()); 8911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 8921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 8931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.equals(largerMap)); 8961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEqualsForSmallerMap() { 8991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (!supportsRemove) { 9001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 9011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 9041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> smallerMap; 9051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 9061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 9071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert smallerMap = makePopulatedMap(); 9081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert smallerMap.remove(smallerMap.keySet().iterator().next()); 9091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 9101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 9111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.equals(smallerMap)); 9141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEqualsForEmptyMap() { 9171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 9181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 9191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEmptyMap(); 9201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 9211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 9221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(map, map); 9251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(makeEmptyMap(), map); 9261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(Collections.emptyMap(), map); 9271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.equals(Collections.emptySet())); 9281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert //noinspection ObjectEqualsNull 9291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.equals(null)); 9301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testGet() { 9331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 9341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 9351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 9361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 9371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 9381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (Entry<K, V> entry : map.entrySet()) { 9411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(entry.getValue(), map.get(entry.getKey())); 9421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert K unmappedKey = null; 9451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 9461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unmappedKey = getKeyNotInPopulatedMap(); 9471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 9481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 9491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertNull(map.get(unmappedKey)); 9511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testGetForEmptyMap() { 9541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 9551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert K unmappedKey = null; 9561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 9571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEmptyMap(); 9581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unmappedKey = getKeyNotInPopulatedMap(); 9591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 9601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 9611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertNull(map.get(unmappedKey)); 9631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testGetNull() { 9661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Map<K, V> map = makeEitherMap(); 9671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (allowsNullKeys) { 9681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (allowsNullValues) { 9691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // TODO: decide what to test here. 9701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 9711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(map.containsKey(null), map.get(null) != null); 9721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 9741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 9751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.get(null); 9761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException optional) { 9771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 9801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testHashCode() { 9831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 9841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 9851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 9861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 9871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 9881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 9901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testHashCodeForEmptyMap() { 9931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 9941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 9951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEmptyMap(); 9961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 9971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 9981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 10001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 10021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testPutNewKey() { 10031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map = makeEitherMap(); 10041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToPut; 10051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V valueToPut; 10061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 10071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToPut = getKeyNotInPopulatedMap(); 10081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valueToPut = getValueNotInPopulatedMap(); 10091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 10101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 10111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsPut) { 10131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 10141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert V oldValue = map.put(keyToPut, valueToPut); 10151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(valueToPut, map.get(keyToPut)); 10161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsKey(keyToPut)); 10171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsValue(valueToPut)); 10181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize + 1, map.size()); 10191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertNull(oldValue); 10201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 10211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 10221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.put(keyToPut, valueToPut); 10231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 10241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 10251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 10261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 10291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 10311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testPutExistingKey() { 10321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 10331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToPut; 10341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V valueToPut; 10351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 10361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 10371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valueToPut = getValueNotInPopulatedMap(); 10381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 10391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 10401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToPut = map.keySet().iterator().next(); 10421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsPut) { 10431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 10441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.put(keyToPut, valueToPut); 10451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(valueToPut, map.get(keyToPut)); 10461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsKey(keyToPut)); 10471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsValue(valueToPut)); 10481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 10491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 10501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 10511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.put(keyToPut, valueToPut); 10521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 10531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 10541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 10551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 10581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 10601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testPutNullKey() { 10611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (!supportsPut) { 10621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 10631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map = makeEitherMap(); 10651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V valueToPut; 10661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 10671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valueToPut = getValueNotInPopulatedMap(); 10681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 10691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 10701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (allowsNullKeys) { 10721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V oldValue = map.get(null); 10731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V returnedValue = map.put(null, valueToPut); 10741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(oldValue, returnedValue); 10751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(valueToPut, map.get(null)); 10761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsKey(null)); 10771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsValue(valueToPut)); 10781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 10791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 10801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.put(null, valueToPut); 10811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected RuntimeException"); 10821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (RuntimeException e) { 10831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 10841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 10871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 10891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testPutNullValue() { 10901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (!supportsPut) { 10911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 10921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map = makeEitherMap(); 10941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToPut; 10951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 10961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToPut = getKeyNotInPopulatedMap(); 10971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 10981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 10991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 11001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (allowsNullValues) { 11011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 11021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V oldValue = map.get(keyToPut); 11031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V returnedValue = map.put(keyToPut, null); 11041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(oldValue, returnedValue); 11051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertNull(map.get(keyToPut)); 11061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsKey(keyToPut)); 11071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsValue(null)); 11081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize + 1, map.size()); 11091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 11101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 11111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.put(keyToPut, null); 11121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected RuntimeException"); 11131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (RuntimeException e) { 11141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 11151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 11161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 11171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 11181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 11191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 11201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testPutNullValueForExistingKey() { 11211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (!supportsPut) { 11221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 11231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 11241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 11251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToPut; 11261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 11271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 11281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToPut = map.keySet().iterator().next(); 11291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 11301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 11311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 11321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (allowsNullValues) { 11331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 11341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V oldValue = map.get(keyToPut); 11351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V returnedValue = map.put(keyToPut, null); 11361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(oldValue, returnedValue); 11371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertNull(map.get(keyToPut)); 11381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsKey(keyToPut)); 11391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsValue(null)); 11401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 11411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 11421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 11431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.put(keyToPut, null); 11441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected RuntimeException"); 11451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (RuntimeException e) { 11461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 11471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 11481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 11491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 11501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 11511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 11521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testPutAllNewKey() { 11531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map = makeEitherMap(); 11541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToPut; 11551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V valueToPut; 11561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 11571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToPut = getKeyNotInPopulatedMap(); 11581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valueToPut = getValueNotInPopulatedMap(); 11591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 11601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 11611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 11621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> mapToPut = Collections.singletonMap(keyToPut, valueToPut); 11631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsPut) { 11641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 11651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.putAll(mapToPut); 11661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(valueToPut, map.get(keyToPut)); 11671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsKey(keyToPut)); 11681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsValue(valueToPut)); 11691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize + 1, map.size()); 11701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 11711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 11721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.putAll(mapToPut); 11731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 11741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 11751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 11761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 11771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 11781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 11791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 11801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 11811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testPutAllExistingKey() { 11821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 11831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToPut; 11841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V valueToPut; 11851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 11861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 11871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valueToPut = getValueNotInPopulatedMap(); 11881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 11891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 11901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 11911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToPut = map.keySet().iterator().next(); 11921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> mapToPut = Collections.singletonMap(keyToPut, valueToPut); 11931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 11941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsPut) { 11951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.putAll(mapToPut); 11961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(valueToPut, map.get(keyToPut)); 11971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsKey(keyToPut)); 11981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsValue(valueToPut)); 11991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 12001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 12011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.putAll(mapToPut); 12021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 12031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 12041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 12051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 12061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 12071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 12081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 12091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 12101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 12111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRemove() { 12121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 12131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToRemove; 12141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 12151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 12161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 12171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 12181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 12191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToRemove = map.keySet().iterator().next(); 12201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsRemove) { 12211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 12221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert V expectedValue = map.get(keyToRemove); 12231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert V oldValue = map.remove(keyToRemove); 12241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expectedValue, oldValue); 12251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.containsKey(keyToRemove)); 12261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize - 1, map.size()); 12271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 12281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 12291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.remove(keyToRemove); 12301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 12311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 12321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 12331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 12341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 12351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 12361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 12371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 12381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRemoveMissingKey() { 12391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 12401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToRemove; 12411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 12421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 12431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToRemove = getKeyNotInPopulatedMap(); 12441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 12451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 12461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 12471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsRemove) { 12481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 12491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertNull(map.remove(keyToRemove)); 12501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 12511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 12521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 12531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.remove(keyToRemove); 12541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 12551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 12561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 12571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 12581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 12591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 12601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 12611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 12621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testSize() { 12631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(makeEitherMap()); 12641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 12651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 12661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testKeySetRemove() { 12671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 12681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 12691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 12701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 12711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 12721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 12731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 12741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<K> keys = map.keySet(); 12751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert K key = keys.iterator().next(); 12761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsRemove) { 12771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 12781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keys.remove(key); 12791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize - 1, map.size()); 12801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.containsKey(key)); 12811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 12821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 12831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keys.remove(key); 12841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 12851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 12861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 12871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 12881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 12891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 12901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 12911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 12921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testKeySetRemoveAll() { 12931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 12941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 12951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 12961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 12971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 12981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 12991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 13001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<K> keys = map.keySet(); 13011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert K key = keys.iterator().next(); 13021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsRemove) { 13031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 13041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(keys.removeAll(Collections.singleton(key))); 13051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize - 1, map.size()); 13061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.containsKey(key)); 13071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 13081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 13091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keys.removeAll(Collections.singleton(key)); 13101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 13111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 13121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 13131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 13141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 13151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 13161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 13171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 13181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testKeySetRetainAll() { 13191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 13201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 13211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 13221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 13231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 13241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 13251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 13261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<K> keys = map.keySet(); 13271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert K key = keys.iterator().next(); 13281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsRemove) { 13291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keys.retainAll(Collections.singleton(key)); 13301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(1, map.size()); 13311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsKey(key)); 13321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 13331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 13341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keys.retainAll(Collections.singleton(key)); 13351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 13361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 13371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 13381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 13391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 13401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 13411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 13421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 13431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testKeySetClear() { 13441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 13451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 13461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEitherMap(); 13471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 13481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 13491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 13501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 13511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<K> keySet = map.keySet(); 13521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsClear) { 13531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keySet.clear(); 13541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(keySet.isEmpty()); 13551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 13561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 13571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keySet.clear(); 13581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 13591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 13601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 13611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 13621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 13631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 13641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 13651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 13661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testKeySetRemoveAllNullFromEmpty() { 13671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 13681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 13691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEmptyMap(); 13701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 13711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 13721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 13731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 13741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<K> keySet = map.keySet(); 13751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsRemove) { 13761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 13771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keySet.removeAll(null); 13781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected NullPointerException."); 13791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 13801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 13811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 13821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 13831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 13841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keySet.removeAll(null); 13851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException or NullPointerException."); 13861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 13871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 13881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 13891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 13901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 13911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 13921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 13931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 13941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 13951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testKeySetRetainAllNullFromEmpty() { 13961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 13971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 13981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEmptyMap(); 13991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 14001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 14011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 14021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 14031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<K> keySet = map.keySet(); 14041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsRemove) { 14051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 14061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keySet.retainAll(null); 14071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Returning successfully is not ideal, but tolerated. 14081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 14091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 14101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 14111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 14121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 14131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keySet.retainAll(null); 14141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // We have to tolerate a successful return (Sun bug 4802647) 14151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 14161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 14171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 14181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 14191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 14201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 14211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 14221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 14231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 14241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testValues() { 14251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 14261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Collection<V> valueCollection; 14271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 14281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 14291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 14301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 14311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 14321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 14331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 14341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valueCollection = map.values(); 14351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V unmappedValue; 14361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 14371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unmappedValue = getValueNotInPopulatedMap(); 14381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 14391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 14401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 14411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (V value : valueCollection) { 14421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(unmappedValue.equals(value)); 14431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 14441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 14451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 14461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testValuesIteratorRemove() { 14471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 14481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 14491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 14501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 14511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 14521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 14531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 14541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Collection<V> valueCollection = map.values(); 14551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Iterator<V> iterator = valueCollection.iterator(); 14561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsIteratorRemove) { 14571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 14581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert iterator.next(); 14591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert iterator.remove(); 14601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize - 1, map.size()); 14611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // (We can't assert that the values collection no longer contains the 14621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // removed value, because the underlying map can have multiple mappings 14631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // to the same value.) 14641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 14651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 14661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert iterator.remove(); 14671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected IllegalStateException."); 14681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IllegalStateException e) { 14691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 14701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 14711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 14721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 14731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert iterator.next(); 14741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert iterator.remove(); 14751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 14761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 14771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 14781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 14791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 14801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 14811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 14821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 14831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testValuesRemove() { 14841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 14851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 14861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 14871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 14881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 14891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 14901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 14911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Collection<V> valueCollection = map.values(); 14921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsRemove) { 14931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 14941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valueCollection.remove(valueCollection.iterator().next()); 14951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize - 1, map.size()); 14961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // (We can't assert that the values collection no longer contains the 14971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // removed value, because the underlying map can have multiple mappings 14981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // to the same value.) 14991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 15001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 15011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valueCollection.remove(valueCollection.iterator().next()); 15021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 15031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 15041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 15051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 15061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 15071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 15081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 15091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 15101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testValuesRemoveMissing() { 15111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 15121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V valueToRemove; 15131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 15141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEitherMap(); 15151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valueToRemove = getValueNotInPopulatedMap(); 15161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 15171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 15181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 15191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 15201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Collection<V> valueCollection = map.values(); 15211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 15221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsRemove) { 15231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(valueCollection.remove(valueToRemove)); 15241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 15251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 15261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(valueCollection.remove(valueToRemove)); 15271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 15281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Tolerated. 15291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 15301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 15311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 15321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 15331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 15341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 15351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testValuesRemoveAll() { 15361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 15371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 15381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 15391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 15401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 15411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 15421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 15431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Collection<V> valueCollection = map.values(); 15441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<V> valuesToRemove = singleton(valueCollection.iterator().next()); 15451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsRemove) { 15461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valueCollection.removeAll(valuesToRemove); 15471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (V value : valuesToRemove) { 15481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(valueCollection.contains(value)); 15491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 15501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (V value : valueCollection) { 15511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(valuesToRemove.contains(value)); 15521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 15531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 15541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 15551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valueCollection.removeAll(valuesToRemove); 15561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 15571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 15581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 15591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 15601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 15611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 15621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 15631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 15641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testValuesRemoveAllNullFromEmpty() { 15651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 15661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 15671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEmptyMap(); 15681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 15691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 15701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 15711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 15721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Collection<V> values = map.values(); 15731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsRemove) { 15741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 15751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert values.removeAll(null); 15761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Returning successfully is not ideal, but tolerated. 15771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 15781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 15791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 15801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 15811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 15821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert values.removeAll(null); 15831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // We have to tolerate a successful return (Sun bug 4802647) 15841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 15851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 15861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 15871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 15881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 15891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 15901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 15911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 15921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 15931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testValuesRetainAll() { 15941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 15951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 15961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 15971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 15981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 15991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 16001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 16011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Collection<V> valueCollection = map.values(); 16021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<V> valuesToRetain = singleton(valueCollection.iterator().next()); 16031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsRemove) { 16041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valueCollection.retainAll(valuesToRetain); 16051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (V value : valuesToRetain) { 16061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(valueCollection.contains(value)); 16071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 16081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (V value : valueCollection) { 16091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(valuesToRetain.contains(value)); 16101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 16111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 16121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 16131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valueCollection.retainAll(valuesToRetain); 16141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 16151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 16161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 16171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 16181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 16191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 16201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 16211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 16221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testValuesRetainAllNullFromEmpty() { 16231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 16241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 16251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEmptyMap(); 16261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 16271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 16281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 16291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 16301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Collection<V> values = map.values(); 16311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsRemove) { 16321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 16331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert values.retainAll(null); 16341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Returning successfully is not ideal, but tolerated. 16351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 16361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 16371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 16381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 16391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 16401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert values.retainAll(null); 16411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // We have to tolerate a successful return (Sun bug 4802647) 16421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 16431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 16441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 16451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 16461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 16471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 16481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 16491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 16501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 16511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testValuesClear() { 16521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Map<K, V> map; 16531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 16541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 16551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 16561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 16571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 16581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 16591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Collection<V> valueCollection = map.values(); 16601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsClear) { 16611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valueCollection.clear(); 16621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(valueCollection.isEmpty()); 16631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 16641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 16651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valueCollection.clear(); 16661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 16671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 16681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 16691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 16701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 16711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 16721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 16731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 16741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static <K, V> Entry<K, V> mapEntry(K key, V value) { 16751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Collections.singletonMap(key, value).entrySet().iterator().next(); 16761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 16771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 1678