11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2009 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 com.google.common.collect.testing.features.CollectionFeature;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionSize;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.SetFeature;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.Test;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestSuite;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.lang.reflect.Method;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.AbstractSet;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Comparator;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.EnumSet;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.HashSet;
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator;
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.LinkedHashSet;
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set;
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.SortedSet;
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.TreeSet;
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.CopyOnWriteArraySet;
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Generates a test suite covering the {@link Set} implementations in the
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link java.util} package. Can be subclassed to specify tests that should
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * be suppressed.
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class TestsForSetsInJavaUtil {
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static Test suite() {
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new TestsForSetsInJavaUtil().allTests();
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public Test allTests() {
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TestSuite suite = new TestSuite("java.util Sets");
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(testsForEmptySet());
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(testsForSingletonSet());
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(testsForHashSet());
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(testsForLinkedHashSet());
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(testsForEnumSet());
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(testsForTreeSetNatural());
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(testsForTreeSetWithComparator());
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(testsForCopyOnWriteArraySet());
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(testsForUnmodifiableSet());
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(testsForCheckedSet());
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(testsForAbstractSet());
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(testsForBadlyCollidingHashSet());
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return suite;
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected Collection<Method> suppressForEmptySet() {
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Collections.emptySet();
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected Collection<Method> suppressForSingletonSet() {
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Collections.emptySet();
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected Collection<Method> suppressForHashSet() {
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Collections.emptySet();
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected Collection<Method> suppressForLinkedHashSet() {
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Collections.emptySet();
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected Collection<Method> suppressForEnumSet() {
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Collections.emptySet();
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected Collection<Method> suppressForTreeSetNatural() {
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Collections.emptySet();
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected Collection<Method> suppressForTreeSetWithComparator() {
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Collections.emptySet();
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected Collection<Method> suppressForCopyOnWriteArraySet() {
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Collections.emptySet();
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected Collection<Method> suppressForUnmodifiableSet() {
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Collections.emptySet();
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected Collection<Method> suppressForCheckedSet() {
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Collections.emptySet();
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected Collection<Method> suppressForAbstractSet() {
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Collections.emptySet();
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public Test testsForEmptySet() {
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return SetTestSuiteBuilder
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .using(new TestStringSetGenerator() {
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            @Override public Set<String> create(String[] elements) {
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              return Collections.emptySet();
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          })
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("emptySet")
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.NONE,
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionSize.ZERO)
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .suppressing(suppressForEmptySet())
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite();
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public Test testsForSingletonSet() {
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return SetTestSuiteBuilder
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .using(new TestStringSetGenerator() {
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            @Override public Set<String> create(String[] elements) {
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              return Collections.singleton(elements[0]);
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          })
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("singleton")
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.NONE,
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_VALUES,
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionSize.ONE)
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .suppressing(suppressForSingletonSet())
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite();
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public Test testsForHashSet() {
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return SetTestSuiteBuilder
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .using(new TestStringSetGenerator() {
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            @Override public Set<String> create(String[] elements) {
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              return new HashSet<String>(MinimalCollection.of(elements));
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          })
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("HashSet")
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            SetFeature.GENERAL_PURPOSE,
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_VALUES,
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionSize.ANY)
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .suppressing(suppressForHashSet())
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite();
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public Test testsForLinkedHashSet() {
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return SetTestSuiteBuilder
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .using(new TestStringSetGenerator() {
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            @Override public Set<String> create(String[] elements) {
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              return new LinkedHashSet<String>(MinimalCollection.of(elements));
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          })
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("LinkedHashSet")
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            SetFeature.GENERAL_PURPOSE,
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_VALUES,
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.KNOWN_ORDER,
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionSize.ANY)
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .suppressing(suppressForLinkedHashSet())
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite();
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public Test testsForEnumSet() {
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return SetTestSuiteBuilder
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .using(new TestEnumSetGenerator() {
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            @Override public Set<AnEnum> create(AnEnum[] elements) {
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              return (elements.length == 0)
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                  ? EnumSet.noneOf(AnEnum.class)
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                  : EnumSet.copyOf(MinimalCollection.of(elements));
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          })
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("EnumSet")
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            SetFeature.GENERAL_PURPOSE,
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.KNOWN_ORDER,
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.RESTRICTS_ELEMENTS,
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionSize.ANY)
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .suppressing(suppressForEnumSet())
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite();
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public Test testsForTreeSetNatural() {
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return SetTestSuiteBuilder
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .using(new TestStringSortedSetGenerator() {
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            @Override public SortedSet<String> create(String[] elements) {
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              return new TreeSet<String>(MinimalCollection.of(elements));
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          })
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("TreeSet, natural")
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            SetFeature.GENERAL_PURPOSE,
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.KNOWN_ORDER,
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionSize.ANY)
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .suppressing(suppressForTreeSetNatural())
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite();
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public Test testsForTreeSetWithComparator() {
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return SetTestSuiteBuilder
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .using(new TestStringSortedSetGenerator() {
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            @Override public SortedSet<String> create(String[] elements) {
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              SortedSet<String> set
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                  = new TreeSet<String>(arbitraryNullFriendlyComparator());
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              Collections.addAll(set, elements);
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              return set;
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          })
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("TreeSet, with comparator")
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            SetFeature.GENERAL_PURPOSE,
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_VALUES,
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.KNOWN_ORDER,
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionSize.ANY)
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .suppressing(suppressForTreeSetWithComparator())
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite();
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public Test testsForCopyOnWriteArraySet() {
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return SetTestSuiteBuilder
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .using(new TestStringSetGenerator() {
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            @Override public Set<String> create(String[] elements) {
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              return new CopyOnWriteArraySet<String>(
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                  MinimalCollection.of(elements));
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          })
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("CopyOnWriteArraySet")
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            SetFeature.GENERAL_PURPOSE,
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_VALUES,
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.KNOWN_ORDER,
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionSize.ANY)
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .suppressing(suppressForCopyOnWriteArraySet())
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite();
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public Test testsForUnmodifiableSet() {
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return SetTestSuiteBuilder
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .using(new TestStringSetGenerator() {
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            @Override public Set<String> create(String[] elements) {
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              Set<String> innerSet = new HashSet<String>();
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              Collections.addAll(innerSet, elements);
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              return Collections.unmodifiableSet(innerSet);
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          })
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("unmodifiableSet/HashSet")
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.NONE,
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_VALUES,
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionSize.ANY)
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .suppressing(suppressForUnmodifiableSet())
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite();
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public Test testsForCheckedSet() {
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return SetTestSuiteBuilder
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .using(new TestStringSetGenerator() {
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            @Override public Set<String> create(String[] elements) {
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              Set<String> innerSet = new HashSet<String>();
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              Collections.addAll(innerSet, elements);
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              return Collections.checkedSet(innerSet, String.class);
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          })
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("checkedSet/HashSet")
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            SetFeature.GENERAL_PURPOSE,
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_VALUES,
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.RESTRICTS_ELEMENTS,
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionSize.ANY)
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .suppressing(suppressForCheckedSet())
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite();
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public Test testsForAbstractSet() {
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return SetTestSuiteBuilder
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .using(new TestStringSetGenerator () {
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            @Override protected Set<String> create(String[] elements) {
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              final String[] deduped = dedupe(elements);
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              return new AbstractSet<String>() {
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                @Override public int size() {
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                  return deduped.length;
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                }
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                @Override public Iterator<String> iterator() {
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                  return MinimalCollection.of(deduped).iterator();
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                }
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              };
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          })
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("AbstractSet")
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.NONE,
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_VALUES,
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.KNOWN_ORDER, // in this case, anyway
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionSize.ANY)
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .suppressing(suppressForAbstractSet())
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite();
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public Test testsForBadlyCollidingHashSet() {
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return SetTestSuiteBuilder
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .using(new TestCollidingSetGenerator() {
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            @Override
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            public Set<Object> create(Object... elements) {
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              return new HashSet<Object>(MinimalCollection.of(elements));
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          })
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("badly colliding HashSet")
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            SetFeature.GENERAL_PURPOSE,
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_VALUES,
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionSize.SEVERAL)
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .suppressing(suppressForHashSet())
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite();
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static String[] dedupe(String[] elements) {
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<String> tmp = new LinkedHashSet<String>();
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collections.addAll(tmp, elements);
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return tmp.toArray(new String[0]);
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static <T> Comparator<T> arbitraryNullFriendlyComparator() {
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new Comparator<T>() {
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      public int compare(T left, T right) {
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return String.valueOf(left).compareTo(String.valueOf(right));
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
335