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 java.util.concurrent.ConcurrentMap; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests representing the contract of {@link ConcurrentMap}. Concrete 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * subclasses of this base class test conformance of concrete 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link ConcurrentMap} subclasses to that contract. 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>This class is GWT compatible. 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>The tests in this class for null keys and values only check maps for 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * which null keys and values are not allowed. There are currently no 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link ConcurrentMap} implementations that support nulls. 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Jared Levy 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic abstract class ConcurrentMapInterfaceTest<K, V> 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert extends MapInterfaceTest<K, V> { 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected ConcurrentMapInterfaceTest(boolean allowsNullKeys, 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean allowsNullValues, boolean supportsPut, boolean supportsRemove, 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert boolean supportsClear) { 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert super(allowsNullKeys, allowsNullValues, supportsPut, supportsRemove, 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert supportsClear); 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Creates a new value that is not expected to be found in 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link #makePopulatedMap()} and differs from the value returned by 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link #getValueNotInPopulatedMap()}. 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @return a value 501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws UnsupportedOperationException if it's not possible to make a value 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * that will not be found in the map 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected abstract V getSecondValueNotInPopulatedMap() 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throws UnsupportedOperationException; 551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected abstract ConcurrentMap<K, V> makeEmptyMap() 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throws UnsupportedOperationException; 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected abstract ConcurrentMap<K, V> makePopulatedMap() 601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throws UnsupportedOperationException; 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected ConcurrentMap<K, V> makeEitherMap() { 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return makePopulatedMap(); 651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return makeEmptyMap(); 671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testPutIfAbsentNewKey() { 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final ConcurrentMap<K, V> map; 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToPut; 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V valueToPut; 741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEitherMap(); 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToPut = getKeyNotInPopulatedMap(); 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valueToPut = getValueNotInPopulatedMap(); 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsPut) { 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert V oldValue = map.putIfAbsent(keyToPut, valueToPut); 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(valueToPut, map.get(keyToPut)); 851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsKey(keyToPut)); 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsValue(valueToPut)); 871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize + 1, map.size()); 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertNull(oldValue); 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.putIfAbsent(keyToPut, valueToPut); 921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testPutIfAbsentExistingKey() { 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final ConcurrentMap<K, V> map; 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToPut; 1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V valueToPut; 1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valueToPut = getValueNotInPopulatedMap(); 1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToPut = map.keySet().iterator().next(); 1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsPut) { 1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert V oldValue = map.get(keyToPut); 1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(oldValue, map.putIfAbsent(keyToPut, valueToPut)); 1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(oldValue, map.get(keyToPut)); 1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsKey(keyToPut)); 1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsValue(oldValue)); 1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.containsValue(valueToPut)); 1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.putIfAbsent(keyToPut, valueToPut); 1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testPutIfAbsentNullKey() { 1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (allowsNullKeys) { 1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; // Not yet implemented 1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final ConcurrentMap<K, V> map; 1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V valueToPut; 1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEitherMap(); 1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valueToPut = getValueNotInPopulatedMap(); 1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsPut) { 1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.putIfAbsent(null, valueToPut); 1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected NullPointerException"); 1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.putIfAbsent(null, valueToPut); 1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException or NullPointerException"); 1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testPutIfAbsentNewKeyNullValue() { 1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (allowsNullValues) { 1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; // Not yet implemented 1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final ConcurrentMap<K, V> map; 1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToPut; 1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEitherMap(); 1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToPut = getKeyNotInPopulatedMap(); 1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsPut) { 1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.putIfAbsent(keyToPut, null); 1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected NullPointerException"); 1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.putIfAbsent(keyToPut, null); 1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException or NullPointerException"); 1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testPutIfAbsentExistingKeyNullValue() { 2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (allowsNullValues) { 2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; // Not yet implemented 2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final ConcurrentMap<K, V> map; 2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToPut; 2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToPut = map.keySet().iterator().next(); 2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsPut) { 2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertNull(map.putIfAbsent(keyToPut, null)); 2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.putIfAbsent(keyToPut, null); 2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException or NullPointerException"); 2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRemoveKeyValueExisting() { 2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final ConcurrentMap<K, V> map; 2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToRemove; 2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToRemove = map.keySet().iterator().next(); 2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert V oldValue = map.get(keyToRemove); 2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsRemove) { 2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.remove(keyToRemove, oldValue)); 2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.containsKey(keyToRemove)); 2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize - 1, map.size()); 2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.remove(keyToRemove, oldValue); 2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRemoveKeyValueMissingKey() { 2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final ConcurrentMap<K, V> map; 2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToRemove; 2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V valueToRemove; 2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToRemove = getKeyNotInPopulatedMap(); 2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valueToRemove = getValueNotInPopulatedMap(); 2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsRemove) { 2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.remove(keyToRemove, valueToRemove)); 2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.remove(keyToRemove, valueToRemove); 2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRemoveKeyValueDifferentValue() { 2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final ConcurrentMap<K, V> map; 2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToRemove; 2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V valueToRemove; 2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valueToRemove = getValueNotInPopulatedMap(); 2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToRemove = map.keySet().iterator().next(); 2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsRemove) { 2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert V oldValue = map.get(keyToRemove); 2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.remove(keyToRemove, valueToRemove)); 2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(oldValue, map.get(keyToRemove)); 3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsKey(keyToRemove)); 3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.remove(keyToRemove, valueToRemove); 3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRemoveKeyValueNullKey() { 3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (allowsNullKeys) { 3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; // Not yet implemented 3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final ConcurrentMap<K, V> map; 3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V valueToRemove; 3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEitherMap(); 3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valueToRemove = getValueNotInPopulatedMap(); 3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsRemove) { 3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.remove(null, valueToRemove)); 3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.remove(null, valueToRemove)); 3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRemoveKeyValueExistingKeyNullValue() { 3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (allowsNullValues) { 3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; // Not yet implemented 3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final ConcurrentMap<K, V> map; 3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToRemove; 3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToRemove = map.keySet().iterator().next(); 3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsRemove) { 3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.remove(keyToRemove, null)); 3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.remove(keyToRemove, null)); 3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRemoveKeyValueMissingKeyNullValue() { 3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (allowsNullValues) { 3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; // Not yet implemented 3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final ConcurrentMap<K, V> map; 3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToRemove; 3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEitherMap(); 3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToRemove = getKeyNotInPopulatedMap(); 3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsRemove) { 3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.remove(keyToRemove, null)); 3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.remove(keyToRemove, null)); 3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /* Replace2 tests call 2-parameter replace(key, value) */ 4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testReplace2ExistingKey() { 4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final ConcurrentMap<K, V> map; 4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToReplace; 4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V newValue; 4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert newValue = getValueNotInPopulatedMap(); 4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToReplace = map.keySet().iterator().next(); 4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsPut) { 4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert V oldValue = map.get(keyToReplace); 4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(oldValue, map.replace(keyToReplace, newValue)); 4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(newValue, map.get(keyToReplace)); 4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsKey(keyToReplace)); 4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsValue(newValue)); 4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.replace(keyToReplace, newValue); 4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testReplace2MissingKey() { 4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final ConcurrentMap<K, V> map; 4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToReplace; 4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V newValue; 4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEitherMap(); 4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToReplace = getKeyNotInPopulatedMap(); 4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert newValue = getValueNotInPopulatedMap(); 4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsPut) { 4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertNull(map.replace(keyToReplace, newValue)); 4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertNull(map.get(keyToReplace)); 4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.containsKey(keyToReplace)); 4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.containsValue(newValue)); 4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.replace(keyToReplace, newValue); 4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testReplace2NullKey() { 4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (allowsNullKeys) { 4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; // Not yet implemented 4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final ConcurrentMap<K, V> map; 4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V valueToReplace; 4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEitherMap(); 4781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert valueToReplace = getValueNotInPopulatedMap(); 4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 4831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsPut) { 4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertNull(map.replace(null, valueToReplace)); 4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertNull(map.replace(null, valueToReplace)); 4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testReplace2ExistingKeyNullValue() { 5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (allowsNullValues) { 5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; // Not yet implemented 5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final ConcurrentMap<K, V> map; 5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToReplace; 5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToReplace = map.keySet().iterator().next(); 5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsPut) { 5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.replace(keyToReplace, null); 5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected NullPointerException"); 5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.replace(keyToReplace, null); 5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException or NullPointerException"); 5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testReplace2MissingKeyNullValue() { 5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (allowsNullValues) { 5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; // Not yet implemented 5391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final ConcurrentMap<K, V> map; 5411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToReplace; 5421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEitherMap(); 5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToReplace = getKeyNotInPopulatedMap(); 5451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 5461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 5471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 5491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsPut) { 5501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertNull(map.replace(keyToReplace, null)); 5521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 5531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 5561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertNull(map.replace(keyToReplace, null)); 5581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 5591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 5601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 5611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 5621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 5651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 5661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /* 5691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Replace3 tests call 3-parameter replace(key, oldValue, newValue) 5701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 5711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testReplace3ExistingKeyValue() { 5731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final ConcurrentMap<K, V> map; 5741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToReplace; 5751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V oldValue; 5761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V newValue; 5771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 5791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert newValue = getValueNotInPopulatedMap(); 5801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 5811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 5821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToReplace = map.keySet().iterator().next(); 5841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert oldValue = map.get(keyToReplace); 5851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsPut) { 5861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 5871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.replace(keyToReplace, oldValue, newValue)); 5881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(newValue, map.get(keyToReplace)); 5891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsKey(keyToReplace)); 5901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsValue(newValue)); 5911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.containsValue(oldValue)); 5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 5931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 5941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.replace(keyToReplace, oldValue, newValue); 5961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 5971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 5981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 5991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 6021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testReplace3ExistingKeyDifferentValue() { 6051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final ConcurrentMap<K, V> map; 6061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToReplace; 6071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V oldValue; 6081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V newValue; 6091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 6101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 6111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert oldValue = getValueNotInPopulatedMap(); 6121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert newValue = getSecondValueNotInPopulatedMap(); 6131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 6141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 6151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToReplace = map.keySet().iterator().next(); 6171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V originalValue = map.get(keyToReplace); 6181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 6191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsPut) { 6201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.replace(keyToReplace, oldValue, newValue)); 6211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 6221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 6231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.replace(keyToReplace, oldValue, newValue); 6241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 6251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 6261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 6271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(map.containsKey(keyToReplace)); 6301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.containsValue(newValue)); 6311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.containsValue(oldValue)); 6321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(originalValue, map.get(keyToReplace)); 6331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 6341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 6351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testReplace3MissingKey() { 6381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final ConcurrentMap<K, V> map; 6391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToReplace; 6401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V oldValue; 6411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V newValue; 6421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 6431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEitherMap(); 6441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToReplace = getKeyNotInPopulatedMap(); 6451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert oldValue = getValueNotInPopulatedMap(); 6461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert newValue = getSecondValueNotInPopulatedMap(); 6471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 6481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 6491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 6511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsPut) { 6521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.replace(keyToReplace, oldValue, newValue)); 6531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 6541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 6551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.replace(keyToReplace, oldValue, newValue); 6561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException."); 6571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 6581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 6591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.containsKey(keyToReplace)); 6621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.containsValue(newValue)); 6631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.containsValue(oldValue)); 6641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 6651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 6661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testReplace3NullKey() { 6691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (allowsNullKeys) { 6701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; // Not yet implemented 6711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final ConcurrentMap<K, V> map; 6731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V oldValue; 6741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V newValue; 6751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 6761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEitherMap(); 6771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert oldValue = getValueNotInPopulatedMap(); 6781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert newValue = getSecondValueNotInPopulatedMap(); 6791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 6801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 6811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 6831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsPut) { 6841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 6851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.replace(null, oldValue, newValue)); 6861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 6871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 6881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 6901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 6911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.replace(null, oldValue, newValue)); 6921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 6931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 6941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 6951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 6961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 6991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 7001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testReplace3ExistingKeyNullOldValue() { 7031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (allowsNullValues) { 7041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; // Not yet implemented 7051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final ConcurrentMap<K, V> map; 7071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToReplace; 7081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V newValue; 7091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 7101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 7111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert newValue = getValueNotInPopulatedMap(); 7121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 7131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 7141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToReplace = map.keySet().iterator().next(); 7161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V originalValue = map.get(keyToReplace); 7171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 7181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsPut) { 7191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 7201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.replace(keyToReplace, null, newValue)); 7211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 7221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 7231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 7251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 7261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.replace(keyToReplace, null, newValue)); 7271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 7281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 7291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 7301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 7311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 7341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(originalValue, map.get(keyToReplace)); 7351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 7361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testReplace3MissingKeyNullOldValue() { 7391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (allowsNullValues) { 7401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; // Not yet implemented 7411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final ConcurrentMap<K, V> map; 7431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToReplace; 7441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V newValue; 7451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 7461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEitherMap(); 7471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToReplace = getKeyNotInPopulatedMap(); 7481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert newValue = getValueNotInPopulatedMap(); 7491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 7501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 7511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 7531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsPut) { 7541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 7551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.replace(keyToReplace, null, newValue)); 7561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 7571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 7581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 7601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 7611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(map.replace(keyToReplace, null, newValue)); 7621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 7631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 7641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 7651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 7661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 7691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 7701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testReplace3MissingKeyNullNewValue() { 7731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (allowsNullValues) { 7741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; // Not yet implemented 7751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final ConcurrentMap<K, V> map; 7771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToReplace; 7781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V oldValue; 7791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 7801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makeEitherMap(); 7811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToReplace = getKeyNotInPopulatedMap(); 7821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert oldValue = getValueNotInPopulatedMap(); 7831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 7841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 7851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 7871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsPut) { 7881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 7891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.replace(keyToReplace, oldValue, null); 7901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 7911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 7921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 7941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 7951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.replace(keyToReplace, oldValue, null); 7961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 7971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 7981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 7991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Optional. 8001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 8031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 8041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testReplace3ExistingKeyValueNullNewValue() { 8071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (allowsNullValues) { 8081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; // Not yet implemented 8091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final ConcurrentMap<K, V> map; 8111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final K keyToReplace; 8121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final V oldValue; 8131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 8141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map = makePopulatedMap(); 8151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 8161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return; 8171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert keyToReplace = map.keySet().iterator().next(); 8191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert oldValue = map.get(keyToReplace); 8201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int initialSize = map.size(); 8211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (supportsPut) { 8221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 8231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.replace(keyToReplace, oldValue, null); 8241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected NullPointerException"); 8251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 8261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 8271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 8291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 8301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.replace(keyToReplace, oldValue, null); 8311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected UnsupportedOperationException or NullPointerException"); 8321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException e) { 8331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 8341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException e) { 8351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Expected. 8361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(initialSize, map.size()); 8391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(oldValue, map.get(keyToReplace)); 8401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertInvariants(map); 8411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 843