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