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