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