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.testers;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.CollectionFeature.ALLOWS_NULL_VALUES;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.CollectionFeature.SUPPORTS_RETAIN_ALL;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.CollectionSize.ONE;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.CollectionSize.ZERO;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.AbstractCollectionTester;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.MinimalCollection;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionFeature;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionSize;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Arrays;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A generic JUnit test which tests {@code retainAll} operations on a
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * collection. Can't be invoked directly; please see
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link com.google.common.collect.testing.CollectionTestSuiteBuilder}.
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>This class is GWT compatible.
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Chris Povirk
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@SuppressWarnings("unchecked") // too many "unchecked generic array creations"
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class CollectionRetainAllTester<E> extends AbstractCollectionTester<E> {
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * A collection of elements to retain, along with a description for use in
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * failure messages.
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private class Target {
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private final Collection<E> toRetain;
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private final String description;
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private Target(Collection<E> toRetain, String description) {
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      this.toRetain = toRetain;
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      this.description = description;
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public String toString() {
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return description;
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private Target empty;
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private Target disjoint;
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private Target superset;
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private Target nonEmptyProperSubset;
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private Target sameElements;
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private Target partialOverlap;
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private Target containsDuplicates;
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private Target nullSingleton;
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public void setUp() throws Exception {
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    super.setUp();
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    empty = new Target(emptyCollection(), "empty");
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /*
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * We test that nullSingleton.retainAll(disjointList) does NOT throw a
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * NullPointerException when disjointList does not, so we can't use
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * MinimalCollection, which throws NullPointerException on calls to
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * contains(null).
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     */
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<E> disjointList = Arrays.asList(samples.e3, samples.e4);
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    disjoint
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = new Target(disjointList, "disjoint");
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    superset
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = new Target(MinimalCollection.of(
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            samples.e0, samples.e1, samples.e2, samples.e3, samples.e4),
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            "superset");
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    nonEmptyProperSubset
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = new Target(MinimalCollection.of(samples.e1), "subset");
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sameElements
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = new Target(Arrays.asList(createSamplesArray()), "sameElements");
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    containsDuplicates = new Target(
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        MinimalCollection.of(samples.e0, samples.e0, samples.e3, samples.e3),
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "containsDuplicates");
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    partialOverlap
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = new Target(MinimalCollection.of(samples.e2, samples.e3),
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            "partialOverlap");
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    nullSingleton
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = new Target(Collections.<E>singleton(null), "nullSingleton");
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // retainAll(empty)
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_RETAIN_ALL)
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(ZERO)
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll_emptyPreviouslyEmpty() {
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectReturnsFalse(empty);
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectUnchanged();
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(absent = SUPPORTS_RETAIN_ALL)
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(ZERO)
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll_emptyPreviouslyEmptyUnsupported() {
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectReturnsFalseOrThrows(empty);
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectUnchanged();
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_RETAIN_ALL)
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = ZERO)
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll_emptyPreviouslyNonEmpty() {
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectReturnsTrue(empty);
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectContents();
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectMissing(samples.e0, samples.e1, samples.e2);
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(absent = SUPPORTS_RETAIN_ALL)
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = ZERO)
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll_emptyPreviouslyNonEmptyUnsupported() {
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectThrows(empty);
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectUnchanged();
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // retainAll(disjoint)
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_RETAIN_ALL)
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(ZERO)
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll_disjointPreviouslyEmpty() {
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectReturnsFalse(disjoint);
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectUnchanged();
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(absent = SUPPORTS_RETAIN_ALL)
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(ZERO)
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll_disjointPreviouslyEmptyUnsupported() {
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectReturnsFalseOrThrows(disjoint);
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectUnchanged();
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_RETAIN_ALL)
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = ZERO)
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll_disjointPreviouslyNonEmpty() {
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectReturnsTrue(disjoint);
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectContents();
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectMissing(samples.e0, samples.e1, samples.e2);
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(absent = SUPPORTS_RETAIN_ALL)
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = ZERO)
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll_disjointPreviouslyNonEmptyUnsupported() {
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectThrows(disjoint);
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectUnchanged();
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // retainAll(superset)
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_RETAIN_ALL)
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll_superset() {
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectReturnsFalse(superset);
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectUnchanged();
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(absent = SUPPORTS_RETAIN_ALL)
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll_supersetUnsupported() {
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectReturnsFalseOrThrows(superset);
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectUnchanged();
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // retainAll(subset)
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_RETAIN_ALL)
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = {ZERO, ONE})
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll_subset() {
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectReturnsTrue(nonEmptyProperSubset);
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectContents(nonEmptyProperSubset.toRetain);
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(absent = SUPPORTS_RETAIN_ALL)
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = {ZERO, ONE})
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll_subsetUnsupported() {
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectThrows(nonEmptyProperSubset);
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectUnchanged();
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // retainAll(sameElements)
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_RETAIN_ALL)
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll_sameElements() {
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectReturnsFalse(sameElements);
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectUnchanged();
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(absent = SUPPORTS_RETAIN_ALL)
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll_sameElementsUnsupported() {
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectReturnsFalseOrThrows(sameElements);
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectUnchanged();
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // retainAll(partialOverlap)
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_RETAIN_ALL)
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = {ZERO, ONE})
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll_partialOverlap() {
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectReturnsTrue(partialOverlap);
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectContents(samples.e2);
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(absent = SUPPORTS_RETAIN_ALL)
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = {ZERO, ONE})
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll_partialOverlapUnsupported() {
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectThrows(partialOverlap);
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectUnchanged();
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // retainAll(containsDuplicates)
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_RETAIN_ALL)
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(ONE)
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll_containsDuplicatesSizeOne() {
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectReturnsFalse(containsDuplicates);
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectContents(samples.e0);
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_RETAIN_ALL)
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = {ZERO, ONE})
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll_containsDuplicatesSizeSeveral() {
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectReturnsTrue(containsDuplicates);
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectContents(samples.e0);
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // retainAll(nullSingleton)
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_RETAIN_ALL)
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(ZERO)
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll_nullSingletonPreviouslyEmpty() {
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectReturnsFalse(nullSingleton);
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectUnchanged();
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_RETAIN_ALL)
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = ZERO)
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll_nullSingletonPreviouslyNonEmpty() {
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectReturnsTrue(nullSingleton);
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectContents();
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require({SUPPORTS_RETAIN_ALL, ALLOWS_NULL_VALUES})
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(ONE)
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll_nullSingletonPreviouslySingletonWithNull() {
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    initCollectionWithNullElement();
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectReturnsFalse(nullSingleton);
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectContents(createArrayWithNullElement());
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require({SUPPORTS_RETAIN_ALL, ALLOWS_NULL_VALUES})
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = {ZERO, ONE})
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll_nullSingletonPreviouslySeveralWithNull() {
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    initCollectionWithNullElement();
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectReturnsTrue(nullSingleton);
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectContents(nullSingleton.toRetain);
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // nullSingleton.retainAll()
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require({SUPPORTS_RETAIN_ALL, ALLOWS_NULL_VALUES})
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = ZERO)
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll_containsNonNullWithNull() {
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    initCollectionWithNullElement();
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectReturnsTrue(disjoint);
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectContents();
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // retainAll(null)
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /*
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * AbstractCollection fails the retainAll(null) test when the subject
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * collection is empty, but we'd still like to test retainAll(null) when we
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * can. We split the test into empty and non-empty cases. This allows us to
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * suppress only the former.
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_RETAIN_ALL)
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(ZERO)
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll_nullCollectionReferenceEmptySubject() {
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      collection.retainAll(null);
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // Returning successfully is not ideal, but tolerated.
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_RETAIN_ALL)
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = ZERO)
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll_nullCollectionReferenceNonEmptySubject() {
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      collection.retainAll(null);
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("retainAll(null) should throw NullPointerException");
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void expectReturnsTrue(Target target) {
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String message
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = Platform.format("retainAll(%s) should return true", target);
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(message, collection.retainAll(target.toRetain));
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void expectReturnsFalse(Target target) {
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String message
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = Platform.format("retainAll(%s) should return false", target);
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(message, collection.retainAll(target.toRetain));
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void expectThrows(Target target) {
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      collection.retainAll(target.toRetain);
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      String message = Platform.format("retainAll(%s) should throw", target);
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail(message);
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void expectReturnsFalseOrThrows(Target target) {
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String message
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = Platform.format("retainAll(%s) should return false or throw", target);
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(message, collection.retainAll(target.toRetain));
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException tolerated) {
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
343