11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 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; 181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.Iterables.unmodifiableIterable; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.Sets.newEnumSet; 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.Sets.newHashSet; 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.Sets.powerSet; 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.IteratorFeature.UNMODIFIABLE; 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.testers.CollectionIteratorTester.getIteratorKnownOrderRemoveSupportedMethod; 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.io.ObjectStreamConstants.TC_REFERENCE; 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.io.ObjectStreamConstants.baseWireHandle; 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.util.Collections.emptySet; 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.util.Collections.singleton; 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static org.junit.contrib.truth.Truth.ASSERT; 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible; 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible; 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Predicate; 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Predicates; 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.AnEnum; 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.IteratorTester; 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.MinimalIterable; 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.SetTestSuiteBuilder; 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.TestEnumSetGenerator; 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.TestStringSetGenerator; 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionFeature; 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionSize; 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.SetFeature; 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.EqualsTester; 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.NullPointerTester; 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.SerializableTester; 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.Test; 491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase; 501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestSuite; 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.ByteArrayInputStream; 531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.ByteArrayOutputStream; 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.IOException; 551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.ObjectInputStream; 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.ObjectOutputStream; 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.Serializable; 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.nio.ByteBuffer; 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.ArrayList; 601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Arrays; 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection; 621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections; 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Comparator; 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.EnumSet; 651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.HashMap; 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.HashSet; 671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator; 681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.LinkedHashMap; 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.LinkedHashSet; 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List; 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Map; 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.NoSuchElementException; 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set; 741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.SortedSet; 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.TreeSet; 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport javax.annotation.Nullable; 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unit test for {@code Sets}. 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Jared Levy 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true) 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class SetsTest extends TestCase { 871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final IteratorTester.KnownOrder KNOWN_ORDER = 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert IteratorTester.KnownOrder.KNOWN_ORDER; 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final Collection<Integer> EMPTY_COLLECTION 921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert = Arrays.<Integer>asList(); 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final Collection<Integer> SOME_COLLECTION 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert = Arrays.asList(0, 1, 1); 961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final Iterable<Integer> SOME_ITERABLE 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert = new Iterable<Integer>() { 991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Iterator<Integer> iterator() { 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return SOME_COLLECTION.iterator(); 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final List<Integer> LONGER_LIST 1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert = Arrays.asList(8, 6, 7, 5, 3, 0, 9); 1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final Comparator<Integer> SOME_COMPARATOR 1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert = Collections.reverseOrder(); 1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible("suite") 1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static Test suite() { 1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert TestSuite suite = new TestSuite(); 1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert suite.addTestSuite(SetsTest.class); 1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() { 1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Set<String> create(String[] elements) { 1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int size = elements.length; 1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Remove last element, if size > 1 1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<String> set1 = (size > 1) 1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ? Sets.newHashSet( 1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Arrays.asList(elements).subList(0, size - 1)) 1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert : Sets.newHashSet(elements); 1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Remove first element, if size > 0 1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<String> set2 = (size > 0) 1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ? Sets.newHashSet( 1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Arrays.asList(elements).subList(1, size)) 1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert : Sets.<String>newHashSet(); 1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Sets.union(set1, set2); 1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }) 1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .named("Sets.union") 1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .withFeatures(CollectionSize.ANY, CollectionFeature.ALLOWS_NULL_VALUES) 1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .createTestSuite()); 1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() { 1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Set<String> create(String[] elements) { 1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<String> set1 = Sets.newHashSet(elements); 1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert set1.add(samples().e3); 1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<String> set2 = Sets.newHashSet(elements); 1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert set2.add(samples().e4); 1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Sets.intersection(set1, set2); 1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }) 1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .named("Sets.intersection") 1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .withFeatures(CollectionSize.ANY, CollectionFeature.ALLOWS_NULL_VALUES) 1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .createTestSuite()); 1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert suite.addTest(SetTestSuiteBuilder.using(new TestStringSetGenerator() { 1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Set<String> create(String[] elements) { 1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<String> set1 = Sets.newHashSet(elements); 1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert set1.add(samples().e3); 1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<String> set2 = Sets.newHashSet(samples().e3); 1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Sets.difference(set1, set2); 1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }) 1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .named("Sets.difference") 1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .withFeatures(CollectionSize.ANY, CollectionFeature.ALLOWS_NULL_VALUES) 1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .createTestSuite()); 1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert suite.addTest(SetTestSuiteBuilder.using(new TestEnumSetGenerator() { 1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Set<AnEnum> create(AnEnum[] elements) { 1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert AnEnum[] otherElements = new AnEnum[elements.length - 1]; 1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert System.arraycopy( 1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert elements, 1, otherElements, 0, otherElements.length); 1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Sets.immutableEnumSet(elements[0], otherElements); 1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }) 1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .named("Sets.immutableEnumSet") 1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .withFeatures(CollectionSize.ONE, CollectionSize.SEVERAL, 1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert CollectionFeature.ALLOWS_NULL_QUERIES) 1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .createTestSuite()); 1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert suite.addTest(testsForFilter()); 1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert suite.addTest(testsForFilterNoNulls()); 1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert suite.addTest(testsForFilterFiltered()); 1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return suite; 1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible("suite") 1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static Test testsForFilter() { 1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return SetTestSuiteBuilder.using(new TestStringSetGenerator() { 1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Set<String> create(String[] elements) { 1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<String> unfiltered = Sets.newLinkedHashSet(); 1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unfiltered.add("yyy"); 1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unfiltered.addAll(Arrays.asList(elements)); 1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unfiltered.add("zzz"); 1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Sets.filter(unfiltered, Collections2Test.NOT_YYY_ZZZ); 1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }) 1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .named("Sets.filter") 1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .withFeatures( 1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert SetFeature.GENERAL_PURPOSE, 1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert CollectionFeature.ALLOWS_NULL_VALUES, 1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert CollectionFeature.KNOWN_ORDER, 1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert CollectionSize.ANY) 1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .suppressing(getIteratorKnownOrderRemoveSupportedMethod()) 1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .createTestSuite(); 2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible("suite") 2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static Test testsForFilterNoNulls() { 2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return SetTestSuiteBuilder.using(new TestStringSetGenerator() { 2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Set<String> create(String[] elements) { 2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<String> unfiltered = Sets.newLinkedHashSet(); 2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unfiltered.add("yyy"); 2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unfiltered.addAll(ImmutableList.copyOf(elements)); 2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unfiltered.add("zzz"); 2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Sets.filter(unfiltered, Collections2Test.LENGTH_1); 2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }) 2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .named("Sets.filter, no nulls") 2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .withFeatures( 2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert SetFeature.GENERAL_PURPOSE, 2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert CollectionFeature.KNOWN_ORDER, 2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert CollectionSize.ANY, 2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert CollectionFeature.ALLOWS_NULL_QUERIES) 2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .suppressing(getIteratorKnownOrderRemoveSupportedMethod()) 2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .createTestSuite(); 2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible("suite") 2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static Test testsForFilterFiltered() { 2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return SetTestSuiteBuilder.using(new TestStringSetGenerator() { 2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Set<String> create(String[] elements) { 2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<String> unfiltered = Sets.newLinkedHashSet(); 2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unfiltered.add("yyy"); 2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unfiltered.addAll(ImmutableList.copyOf(elements)); 2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unfiltered.add("zzz"); 2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unfiltered.add("abc"); 2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Sets.filter( 2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Sets.filter(unfiltered, Collections2Test.LENGTH_1), 2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Collections2Test.NOT_YYY_ZZZ); 2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }) 2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .named("Sets.filter, filtered input") 2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .withFeatures( 2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert SetFeature.GENERAL_PURPOSE, 2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert CollectionFeature.KNOWN_ORDER, 2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert CollectionSize.ANY, 2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert CollectionFeature.ALLOWS_NULL_QUERIES) 2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .suppressing(getIteratorKnownOrderRemoveSupportedMethod()) 2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .createTestSuite(); 2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private enum SomeEnum { A, B, C, D } 2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testImmutableEnumSet() { 2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<SomeEnum> units = Sets.immutableEnumSet(SomeEnum.D, SomeEnum.B); 2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ASSERT.that(units).hasContentsInOrder(SomeEnum.B, SomeEnum.D); 2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert units.remove(SomeEnum.B); 2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("ImmutableEnumSet should throw an exception on remove()"); 2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException expected) {} 2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert units.add(SomeEnum.C); 2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("ImmutableEnumSet should throw an exception on add()"); 2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException expected) {} 2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible("SerializableTester") 2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testImmutableEnumSet_serialized() { 2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<SomeEnum> units = Sets.immutableEnumSet(SomeEnum.D, SomeEnum.B); 2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ASSERT.that(units).hasContentsInOrder(SomeEnum.B, SomeEnum.D); 2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<SomeEnum> copy = SerializableTester.reserializeAndAssert(units); 2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(copy instanceof ImmutableEnumSet); 2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testImmutableEnumSet_fromIterable() { 2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableSet<SomeEnum> none 2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert = Sets.immutableEnumSet(MinimalIterable.<SomeEnum>of()); 2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ASSERT.that(none).hasContentsInOrder(); 2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableSet<SomeEnum> one 2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert = Sets.immutableEnumSet(MinimalIterable.of(SomeEnum.B)); 2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ASSERT.that(one).hasContentsInOrder(SomeEnum.B); 2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableSet<SomeEnum> two 2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert = Sets.immutableEnumSet(MinimalIterable.of(SomeEnum.D, SomeEnum.B)); 2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ASSERT.that(two).hasContentsInOrder(SomeEnum.B, SomeEnum.D); 2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible("java serialization not supported in GWT.") 2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testImmutableEnumSet_deserializationMakesDefensiveCopy() 2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throws Exception { 2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableSet<SomeEnum> original = 2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Sets.immutableEnumSet(SomeEnum.A, SomeEnum.B); 2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int handleOffset = 6; 2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert byte[] serializedForm = serializeWithBackReference(original, handleOffset); 2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ObjectInputStream in = 2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert new ObjectInputStream(new ByteArrayInputStream(serializedForm)); 2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableSet<?> deserialized = (ImmutableSet<?>) in.readObject(); 2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert EnumSet<?> delegate = (EnumSet<?>) in.readObject(); 2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(original, deserialized); 3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(delegate.remove(SomeEnum.A)); 3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(deserialized.contains(SomeEnum.A)); 3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible("java serialization not supported in GWT.") 3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static byte[] serializeWithBackReference( 3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Object original, int handleOffset) throws IOException { 3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ByteArrayOutputStream bos = new ByteArrayOutputStream(); 3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ObjectOutputStream out = new ObjectOutputStream(bos); 3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert out.writeObject(original); 3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert byte[] handle = toByteArray(baseWireHandle + handleOffset); 3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert byte[] ref = prepended(TC_REFERENCE, handle); 3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert bos.write(ref); 3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return bos.toByteArray(); 3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static byte[] prepended(byte b, byte[] array) { 3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert byte[] out = new byte[array.length + 1]; 3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert out[0] = b; 3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert System.arraycopy(array, 0, out, 1, array.length); 3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return out; 3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible("java.nio.ByteBuffer") 3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static byte[] toByteArray(int h) { 3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return ByteBuffer.allocate(4).putInt(h).array(); 3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewEnumSet_empty() { 3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert EnumSet<SomeEnum> copy = 3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert newEnumSet(Collections.<SomeEnum>emptySet(), SomeEnum.class); 3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(EnumSet.noneOf(SomeEnum.class), copy); 3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewEnumSet_enumSet() { 3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert EnumSet<SomeEnum> set = EnumSet.of(SomeEnum.A, SomeEnum.D); 3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(set, newEnumSet(set, SomeEnum.class)); 3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewEnumSet_collection() { 3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<SomeEnum> set = ImmutableSet.of(SomeEnum.B, SomeEnum.C); 3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(set, newEnumSet(set, SomeEnum.class)); 3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewEnumSet_iterable() { 3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<SomeEnum> set = ImmutableSet.of(SomeEnum.A, SomeEnum.B, SomeEnum.C); 3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(set, newEnumSet(unmodifiableIterable(set), SomeEnum.class)); 3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewHashSetEmpty() { 3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert HashSet<Integer> set = Sets.newHashSet(); 3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verifySetContents(set, EMPTY_COLLECTION); 3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewHashSetVarArgs() { 3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert HashSet<Integer> set = Sets.newHashSet(0, 1, 1); 3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verifySetContents(set, Arrays.asList(0, 1)); 3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewHashSetFromCollection() { 3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert HashSet<Integer> set = Sets.newHashSet(SOME_COLLECTION); 3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verifySetContents(set, SOME_COLLECTION); 3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewHashSetFromIterable() { 3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert HashSet<Integer> set = Sets.newHashSet(SOME_ITERABLE); 3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verifySetContents(set, SOME_ITERABLE); 3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewHashSetWithExpectedSizeSmall() { 3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert HashSet<Integer> set = Sets.newHashSetWithExpectedSize(0); 3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verifySetContents(set, EMPTY_COLLECTION); 3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewHashSetWithExpectedSizeLarge() { 3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert HashSet<Integer> set = Sets.newHashSetWithExpectedSize(1000); 3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verifySetContents(set, EMPTY_COLLECTION); 3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewHashSetFromIterator() { 3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert HashSet<Integer> set = Sets.newHashSet(SOME_COLLECTION.iterator()); 3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verifySetContents(set, SOME_COLLECTION); 3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewLinkedHashSetEmpty() { 3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LinkedHashSet<Integer> set = Sets.newLinkedHashSet(); 3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verifyLinkedHashSetContents(set, EMPTY_COLLECTION); 3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewLinkedHashSetFromCollection() { 3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LinkedHashSet<Integer> set = Sets.newLinkedHashSet(LONGER_LIST); 3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verifyLinkedHashSetContents(set, LONGER_LIST); 3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewLinkedHashSetFromIterable() { 3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LinkedHashSet<Integer> set = Sets.newLinkedHashSet(new Iterable<Integer>() 4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert { 4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Iterator<Integer> iterator() { 4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return LONGER_LIST.iterator(); 4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }); 4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verifyLinkedHashSetContents(set, LONGER_LIST); 4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewLinkedHashSetWithExpectedSizeSmall() { 4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LinkedHashSet<Integer> set = Sets.newLinkedHashSetWithExpectedSize(0); 4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verifySetContents(set, EMPTY_COLLECTION); 4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewLinkedHashSetWithExpectedSizeLarge() { 4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LinkedHashSet<Integer> set = Sets.newLinkedHashSetWithExpectedSize(1000); 4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verifySetContents(set, EMPTY_COLLECTION); 4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewTreeSetEmpty() { 4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert TreeSet<Integer> set = Sets.newTreeSet(); 4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verifySortedSetContents(set, EMPTY_COLLECTION, null); 4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewTreeSetEmptyDerived() { 4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert TreeSet<Derived> set = Sets.newTreeSet(); 4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(set.isEmpty()); 4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert set.add(new Derived("foo")); 4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert set.add(new Derived("bar")); 4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ASSERT.that(set).hasContentsInOrder(new Derived("bar"), new Derived("foo")); 4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewTreeSetEmptyNonGeneric() { 4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert TreeSet<LegacyComparable> set = Sets.newTreeSet(); 4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(set.isEmpty()); 4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert set.add(new LegacyComparable("foo")); 4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert set.add(new LegacyComparable("bar")); 4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ASSERT.that(set).hasContentsInOrder(new LegacyComparable("bar"), new LegacyComparable("foo")); 4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewTreeSetFromCollection() { 4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert TreeSet<Integer> set = Sets.newTreeSet(SOME_COLLECTION); 4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verifySortedSetContents(set, SOME_COLLECTION, null); 4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewTreeSetFromIterable() { 4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert TreeSet<Integer> set = Sets.newTreeSet(SOME_ITERABLE); 4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verifySortedSetContents(set, SOME_ITERABLE, null); 4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewTreeSetFromIterableDerived() { 4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Iterable<Derived> iterable = 4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Arrays.asList(new Derived("foo"), new Derived("bar")); 4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert TreeSet<Derived> set = Sets.newTreeSet(iterable); 4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ASSERT.that(set).hasContentsInOrder( 4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert new Derived("bar"), new Derived("foo")); 4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewTreeSetFromIterableNonGeneric() { 4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Iterable<LegacyComparable> iterable = 4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Arrays.asList(new LegacyComparable("foo"), new LegacyComparable("bar")); 4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert TreeSet<LegacyComparable> set = Sets.newTreeSet(iterable); 4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ASSERT.that(set).hasContentsInOrder( 4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert new LegacyComparable("bar"), new LegacyComparable("foo")); 4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewTreeSetEmptyWithComparator() { 4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert TreeSet<Integer> set = Sets.newTreeSet(SOME_COMPARATOR); 4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verifySortedSetContents(set, EMPTY_COLLECTION, SOME_COMPARATOR); 4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewIdentityHashSet() { 4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Integer> set = Sets.newIdentityHashSet(); 4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Integer value1 = new Integer(12357); 4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Integer value2 = new Integer(12357); 4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(set.add(value1)); 4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(set.contains(value2)); 4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(set.contains(value1)); 4781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(set.add(value2)); 4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(2, set.size()); 4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testComplementOfEnumSet() { 4831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<SomeEnum> units = EnumSet.of(SomeEnum.B, SomeEnum.D); 4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert EnumSet<SomeEnum> otherUnits = Sets.complementOf(units); 4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verifySetContents(otherUnits, EnumSet.of(SomeEnum.A, SomeEnum.C)); 4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testComplementOfEnumSetWithType() { 4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<SomeEnum> units = EnumSet.of(SomeEnum.B, SomeEnum.D); 4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert EnumSet<SomeEnum> otherUnits = Sets.complementOf(units, SomeEnum.class); 4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verifySetContents(otherUnits, EnumSet.of(SomeEnum.A, SomeEnum.C)); 4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testComplementOfRegularSet() { 4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<SomeEnum> units = Sets.newHashSet(SomeEnum.B, SomeEnum.D); 4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert EnumSet<SomeEnum> otherUnits = Sets.complementOf(units); 4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verifySetContents(otherUnits, EnumSet.of(SomeEnum.A, SomeEnum.C)); 4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testComplementOfRegularSetWithType() { 5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<SomeEnum> units = Sets.newHashSet(SomeEnum.B, SomeEnum.D); 5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert EnumSet<SomeEnum> otherUnits = Sets.complementOf(units, SomeEnum.class); 5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verifySetContents(otherUnits, EnumSet.of(SomeEnum.A, SomeEnum.C)); 5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testComplementOfEmptySet() { 5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<SomeEnum> noUnits = Collections.emptySet(); 5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert EnumSet<SomeEnum> allUnits = Sets.complementOf(noUnits, SomeEnum.class); 5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verifySetContents(EnumSet.allOf(SomeEnum.class), allUnits); 5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testComplementOfFullSet() { 5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<SomeEnum> allUnits = Sets.newHashSet(SomeEnum.values()); 5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert EnumSet<SomeEnum> noUnits = Sets.complementOf(allUnits, SomeEnum.class); 5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verifySetContents(noUnits, EnumSet.noneOf(SomeEnum.class)); 5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testComplementOfEmptyEnumSetWithoutType() { 5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<SomeEnum> noUnits = EnumSet.noneOf(SomeEnum.class); 5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert EnumSet<SomeEnum> allUnits = Sets.complementOf(noUnits); 5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verifySetContents(allUnits, EnumSet.allOf(SomeEnum.class)); 5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testComplementOfEmptySetWithoutTypeDoesntWork() { 5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<SomeEnum> set = Collections.emptySet(); 5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Sets.complementOf(set); 5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IllegalArgumentException expected) {} 5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible("NullPointerTester") 5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNullPointerExceptions() throws Exception { 5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert NullPointerTester tester = new NullPointerTester(); 5351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert tester.setDefault(Enum.class, SomeEnum.A); 5361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // TODO: make NPT create empty arrays for defaults automatically 5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert tester.setDefault(Collection[].class, new Collection[0]); 5391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert tester.setDefault(Enum[].class, new Enum[0]); 5401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert tester.setDefault(Set[].class, new Set[0]); 5411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert tester.testAllPublicStaticMethods(Sets.class); 5421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewSetFromMap() { 5451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Integer> set = Sets.newSetFromMap(new HashMap<Integer, Boolean>()); 5461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert set.addAll(SOME_COLLECTION); 5471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verifySetContents(set, SOME_COLLECTION); 5481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible("SerializableTester") 5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewSetFromMapSerialization() { 5521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Integer> set = 5531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Sets.newSetFromMap(new LinkedHashMap<Integer, Boolean>()); 5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert set.addAll(SOME_COLLECTION); 5551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Integer> copy = SerializableTester.reserializeAndAssert(set); 5561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ASSERT.that(copy).hasContentsInOrder(0, 1); 5571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testNewSetFromMapIllegal() { 5601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Map<Integer, Boolean> map = new LinkedHashMap<Integer, Boolean>(); 5611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert map.put(2, true); 5621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 5631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Sets.newSetFromMap(map); 5641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 5651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IllegalArgumentException expected) {} 5661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // TODO: the overwhelming number of suppressions below suggests that maybe 5691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // it's not worth having a varargs form of this method at all... 5701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 5721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * The 0-ary cartesian product is a single empty list. 5731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 5741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") // varargs! 5751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testCartesianProduct_zeroary() { 5761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ASSERT.that(Sets.cartesianProduct()).hasContentsAnyOrder(list()); 5771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 5801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A unary cartesian product is one list of size 1 for each element in the 5811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * input set. 5821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 5831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") // varargs! 5841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testCartesianProduct_unary() { 5851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ASSERT.that(Sets.cartesianProduct(set(1, 2))).hasContentsAnyOrder(list(1), list(2)); 5861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") // varargs! 5891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testCartesianProduct_binary0x0() { 5901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Integer> mt = emptySet(); 5911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEmpty(Sets.cartesianProduct(mt, mt)); 5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") // varargs! 5951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testCartesianProduct_binary0x1() { 5961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Integer> mt = emptySet(); 5971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEmpty(Sets.cartesianProduct(mt, set(1))); 5981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") // varargs! 6011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testCartesianProduct_binary1x0() { 6021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Integer> mt = emptySet(); 6031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEmpty(Sets.cartesianProduct(set(1), mt)); 6041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static void assertEmpty(Set<? extends List<?>> set) { 6071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(set.isEmpty()); 6081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(0, set.size()); 6091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(set.iterator().hasNext()); 6101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") // varargs! 6131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testCartesianProduct_binary1x1() { 6141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ASSERT.that(Sets.cartesianProduct(set(1), set(2))).hasContentsAnyOrder(list(1, 2)); 6151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") // varargs! 6181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testCartesianProduct_binary1x2() { 6191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ASSERT.that(Sets.cartesianProduct(set(1), set(2, 3))).hasContentsAnyOrder( 6201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert list(1, 2), list(1, 3)); 6211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") // varargs! 6241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testCartesianProduct_binary2x2() { 6251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ASSERT.that(Sets.cartesianProduct(set(1, 2), set(3, 4))).hasContentsAnyOrder( 6261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert list(1, 3), list(1, 4), list(2, 3), list(2, 4)); 6271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") // varargs! 6301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testCartesianProduct_2x2x2() { 6311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ASSERT.that(Sets.cartesianProduct(set(0, 1), set(0, 1), set(0, 1))).hasContentsAnyOrder( 6321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert list(0, 0, 0), list(0, 0, 1), list(0, 1, 0), list(0, 1, 1), 6331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert list(1, 0, 0), list(1, 0, 1), list(1, 1, 0), list(1, 1, 1)); 6341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") // varargs! 6371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testCartesianProduct_contains() { 6381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<List<Integer>> actual = Sets.cartesianProduct(set(1, 2), set(3, 4)); 6391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(actual.contains(list(1, 3))); 6401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(actual.contains(list(1, 4))); 6411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(actual.contains(list(2, 3))); 6421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(actual.contains(list(2, 4))); 6431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(actual.contains(list(3, 1))); 6441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") // varargs! 6471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testCartesianProduct_unrelatedTypes() { 6481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Integer> x = set(1, 2); 6491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<String> y = set("3", "4"); 6501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert List<Object> exp1 = list((Object) 1, "3"); 6521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert List<Object> exp2 = list((Object) 1, "4"); 6531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert List<Object> exp3 = list((Object) 2, "3"); 6541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert List<Object> exp4 = list((Object) 2, "4"); 6551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ASSERT.that(Sets.<Object>cartesianProduct(x, y)).hasContentsAnyOrder(exp1, exp2, exp3, exp4); 6571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") // varargs! 6601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testCartesianProductTooBig() { 6611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Integer> set = Ranges.closed(0, 10000).asSet(DiscreteDomains.integers()); 6621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 6631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<List<Integer>> productSet = Sets.cartesianProduct(set, set, set, set, set); 6641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("Expected IAE"); 6651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IllegalArgumentException expected) {} 6661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") // varargs! 6691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testCartesianProduct_hashCode() { 6701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Run through the same cartesian products we tested above 6711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<List<Integer>> degenerate = Sets.cartesianProduct(); 6731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkHashCode(degenerate); 6741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkHashCode(Sets.cartesianProduct(set(1, 2))); 6761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int num = Integer.MAX_VALUE / 3 * 2; // tickle overflow-related problems 6781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkHashCode(Sets.cartesianProduct(set(1, 2, num))); 6791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Integer> mt = emptySet(); 6811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkHashCode(Sets.cartesianProduct(mt, mt)); 6821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkHashCode(Sets.cartesianProduct(mt, set(num))); 6831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkHashCode(Sets.cartesianProduct(set(num), mt)); 6841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkHashCode(Sets.cartesianProduct(set(num), set(1))); 6851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkHashCode(Sets.cartesianProduct(set(1), set(2, num))); 6861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkHashCode(Sets.cartesianProduct(set(1, num), set(2, num - 1))); 6871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkHashCode(Sets.cartesianProduct( 6881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert set(1, num), set(2, num - 1), set(3, num + 1))); 6891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // a bigger one 6911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkHashCode(Sets.cartesianProduct( 6921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert set(1, num, num + 1), set(2), set(3, num + 2), set(4, 5, 6, 7, 8))); 6931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 6941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testPowerSetEmpty() { 6961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableSet<Integer> elements = ImmutableSet.of(); 6971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Set<Integer>> powerSet = powerSet(elements); 6981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(1, powerSet.size()); 6991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(ImmutableSet.of(ImmutableSet.of()), powerSet); 7001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(0, powerSet.hashCode()); 7011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testPowerSetContents() { 7041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableSet<Integer> elements = ImmutableSet.of(1, 2, 3); 7051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Set<Integer>> powerSet = powerSet(elements); 7061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(8, powerSet.size()); 7071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(4 * 1 + 4 * 2 + 4 * 3, powerSet.hashCode()); 7081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Set<Integer>> expected = newHashSet(); 7101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expected.add(ImmutableSet.<Integer>of()); 7111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expected.add(ImmutableSet.of(1)); 7121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expected.add(ImmutableSet.of(2)); 7131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expected.add(ImmutableSet.of(3)); 7141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expected.add(ImmutableSet.of(1, 2)); 7151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expected.add(ImmutableSet.of(1, 3)); 7161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expected.add(ImmutableSet.of(2, 3)); 7171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expected.add(ImmutableSet.of(1, 2, 3)); 7181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Set<Integer>> almostPowerSet = newHashSet(expected); 7201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert almostPowerSet.remove(ImmutableSet.of(1, 2, 3)); 7211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert almostPowerSet.add(ImmutableSet.of(1, 2, 4)); 7221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert new EqualsTester() 7241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .addEqualityGroup(expected, powerSet) 7251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .addEqualityGroup(ImmutableSet.of(1, 2, 3)) 7261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .addEqualityGroup(almostPowerSet) 7271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .testEquals(); 7281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (Set<Integer> subset : expected) { 7301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(powerSet.contains(subset)); 7311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(powerSet.contains(ImmutableSet.of(1, 2, 4))); 7331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(powerSet.contains(singleton(null))); 7341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(powerSet.contains(null)); 7351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(powerSet.contains("notASet")); 7361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testPowerSetIteration_manual() { 7391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableSet<Integer> elements = ImmutableSet.of(1, 2, 3); 7401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Set<Integer>> powerSet = powerSet(elements); 7411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // The API doesn't promise this iteration order, but it's convenient here. 7421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Iterator<Set<Integer>> i = powerSet.iterator(); 7431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(ImmutableSet.of(), i.next()); 7441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(ImmutableSet.of(1), i.next()); 7451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(ImmutableSet.of(2), i.next()); 7461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(ImmutableSet.of(2, 1), i.next()); 7471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(ImmutableSet.of(3), i.next()); 7481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(ImmutableSet.of(3, 1), i.next()); 7491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(ImmutableSet.of(3, 2), i.next()); 7501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(ImmutableSet.of(3, 2, 1), i.next()); 7511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(i.hasNext()); 7521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 7531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert i.next(); 7541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 7551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NoSuchElementException expected) { 7561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible("too slow for GWT") 7601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testPowerSetIteration_iteratorTester() { 7611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableSet<Integer> elements = ImmutableSet.of(1, 2); 7621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Set<Integer>> expected = newHashSet(); 7641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expected.add(ImmutableSet.<Integer>of()); 7651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expected.add(ImmutableSet.of(1)); 7661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expected.add(ImmutableSet.of(2)); 7671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expected.add(ImmutableSet.of(1, 2)); 7681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Set<Set<Integer>> powerSet = powerSet(elements); 7701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert new IteratorTester<Set<Integer>>(6, UNMODIFIABLE, expected, KNOWN_ORDER) { 7711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Iterator<Set<Integer>> newTargetIterator() { 7721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return powerSet.iterator(); 7731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }.test(); 7751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testPowerSetIteration_iteratorTester_fast() { 7781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableSet<Integer> elements = ImmutableSet.of(1, 2); 7791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Set<Integer>> expected = newHashSet(); 7811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expected.add(ImmutableSet.<Integer>of()); 7821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expected.add(ImmutableSet.of(1)); 7831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expected.add(ImmutableSet.of(2)); 7841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expected.add(ImmutableSet.of(1, 2)); 7851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Set<Set<Integer>> powerSet = powerSet(elements); 7871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert new IteratorTester<Set<Integer>>(4, UNMODIFIABLE, expected, KNOWN_ORDER) { 7881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override protected Iterator<Set<Integer>> newTargetIterator() { 7891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return powerSet.iterator(); 7901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }.test(); 7921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 7931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 7941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testPowerSetSize() { 7951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertPowerSetSize(1); 7961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertPowerSetSize(2, 'a'); 7971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertPowerSetSize(4, 'a', 'b'); 7981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertPowerSetSize(8, 'a', 'b', 'c'); 7991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertPowerSetSize(16, 'a', 'b', 'd', 'e'); 8001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertPowerSetSize(1 << 30, 8011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 8021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', 8031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert '3', '4'); 8041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testPowerSetCreationErrors() { 8071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 8081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert powerSet(newHashSet('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 8091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 8101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 'y', 'z', '1', '2', '3', '4', '5')); 8111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 8121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IllegalArgumentException expected) { 8131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 8161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert powerSet(singleton(null)); 8171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 8181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException expected) { 8191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testPowerSetEqualsAndHashCode_verifyAgainstHashSet() { 8231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableList<Integer> allElements = ImmutableList.of(4233352, 3284593, 8241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 3794208, 3849533, 4013967, 2902658, 1886275, 2131109, 985872, 1843868); 8251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int i = 0; i < allElements.size(); i++) { 8261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Integer> elements = newHashSet(allElements.subList(0, i)); 8271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Set<Integer>> powerSet1 = powerSet(elements); 8281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Set<Integer>> powerSet2 = powerSet(elements); 8291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert new EqualsTester() 8301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .addEqualityGroup(powerSet1, powerSet2, toHashSets(powerSet1)) 8311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .addEqualityGroup(ImmutableSet.of()) 8321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .addEqualityGroup(ImmutableSet.of(9999999)) 8331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .addEqualityGroup("notASet") 8341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .testEquals(); 8351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(toHashSets(powerSet1).hashCode(), powerSet1.hashCode()); 8361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 8401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Test that a hash code miscomputed by "input.hashCode() * tooFarValue / 2" 8411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * is correct under our {@code hashCode} implementation. 8421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 8431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testPowerSetHashCode_inputHashCodeTimesTooFarValueIsZero() { 8441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Object> sumToEighthMaxIntElements = 8451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert newHashSet(objectWithHashCode(1 << 29), objectWithHashCode(0)); 8461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertPowerSetHashCode(1 << 30, sumToEighthMaxIntElements); 8471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Object> sumToQuarterMaxIntElements = 8491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert newHashSet(objectWithHashCode(1 << 30), objectWithHashCode(0)); 8501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertPowerSetHashCode(1 << 31, sumToQuarterMaxIntElements); 8511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testPowerSetShowOff() { 8541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Object> zero = ImmutableSet.of(); 8551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Set<Object>> one = powerSet(zero); 8561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Set<Set<Object>>> two = powerSet(one); 8571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Set<Set<Set<Object>>>> four = powerSet(two); 8581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Set<Set<Set<Set<Object>>>>> sixteen = powerSet(four); 8591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Set<Set<Set<Set<Set<Object>>>>>> sixtyFiveThousandish = 8601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert powerSet(sixteen); 8611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(1 << 16, sixtyFiveThousandish.size()); 8621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(powerSet(makeSetOfZeroToTwentyNine()) 8641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .contains(makeSetOfZeroToTwentyNine())); 8651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertFalse(powerSet(makeSetOfZeroToTwentyNine()) 8661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .contains(ImmutableSet.of(30))); 8671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static Set<Integer> makeSetOfZeroToTwentyNine() { 8701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // TODO: use Range once it's publicly available 8711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Integer> zeroToTwentyNine = newHashSet(); 8721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int i = 0; i < 30; i++) { 8731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert zeroToTwentyNine.add(i); 8741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return zeroToTwentyNine; 8761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static <E> Set<Set<E>> toHashSets(Set<Set<E>> powerSet) { 8791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Set<E>> result = newHashSet(); 8801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (Set<E> subset : powerSet) { 8811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert result.add(new HashSet<E>(subset)); 8821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return result; 8841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static Object objectWithHashCode(final int hashCode) { 8871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new Object() { 8881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int hashCode() { 8891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return hashCode; 8901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 8921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static void assertPowerSetHashCode(int expected, Set<?> elements) { 8951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expected, powerSet(elements).hashCode()); 8961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 8971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 8981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static void assertPowerSetSize(int i, Object... elements) { 8991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(i, powerSet(newHashSet(elements)).size()); 9001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static void checkHashCode(Set<?> set) { 9031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(Sets.newHashSet(set).hashCode(), set.hashCode()); 9041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static <E> Set<E> set(E... elements) { 9071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return ImmutableSet.copyOf(elements); 9081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static <E> List<E> list(E... elements) { 9111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return ImmutableList.copyOf(elements); 9121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 9151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Utility method to verify that the given LinkedHashSet is equal to and 9161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * hashes identically to a set constructed with the elements in the given 9171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * collection. Also verifies that the ordering in the set is the same 9181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * as the ordering of the given contents. 9191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 9201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static <E> void verifyLinkedHashSetContents( 9211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert LinkedHashSet<E> set, Collection<E> contents) { 9221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("LinkedHashSet should have preserved order for iteration", 9231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert new ArrayList<E>(set), new ArrayList<E>(contents)); 9241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verifySetContents(set, contents); 9251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 9281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Utility method to verify that the given SortedSet is equal to and 9291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * hashes identically to a set constructed with the elements in the 9301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * given iterable. Also verifies that the comparator is the same as the 9311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * given comparator. 9321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 9331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static <E> void verifySortedSetContents( 9341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert SortedSet<E> set, Iterable<E> iterable, 9351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Nullable Comparator<E> comparator) { 9361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertSame(comparator, set.comparator()); 9371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert verifySetContents(set, iterable); 9381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 9411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Utility method that verifies that the given set is equal to and hashes 9421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * identically to a set constructed with the elements in the given iterable. 9431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 9441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static <E> void verifySetContents(Set<E> set, Iterable<E> contents) { 9451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<E> expected = null; 9461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (contents instanceof Set) { 9471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expected = (Set<E>) contents; 9481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 9491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expected = new HashSet<E>(); 9501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (E element : contents) { 9511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expected.add(element); 9521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(expected, set); 9551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 9581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Simple base class to verify that we handle generics correctly. 9591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 9601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static class Base implements Comparable<Base>, Serializable { 9611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private final String s; 9621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Base(String s) { 9641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.s = s; 9651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int hashCode() { // delegate to 's' 9681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return s.hashCode(); 9691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean equals(Object other) { 9721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (other == null) { 9731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 9741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else if (other instanceof Base) { 9751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return s.equals(((Base) other).s); 9761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } else { 9771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 9781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 9821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public int compareTo(Base o) { 9831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return s.compareTo(o.s); 9841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final long serialVersionUID = 0; 9871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 9901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Simple derived class to verify that we handle generics correctly. 9911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 9921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static class Derived extends Base { 9931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Derived(String s) { 9941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert super(s); 9951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 9971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final long serialVersionUID = 0; 9981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 9991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 10001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testFilterFiltered() { 10011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<String> unfiltered = Sets.newHashSet(); 10021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<String> filtered = Sets.filter( 10031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Sets.filter(unfiltered, Collections2Test.LENGTH_1), 10041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Collections2Test.STARTS_WITH_VOWEL); 10051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unfiltered.add("a"); 10061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unfiltered.add("b"); 10071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unfiltered.add("apple"); 10081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unfiltered.add("banana"); 10091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert unfiltered.add("e"); 10101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(ImmutableSet.of("a", "e"), filtered); 10111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(ImmutableSet.of("a", "b", "apple", "banana", "e"), unfiltered); 10121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 10131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 10141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert filtered.add("d"); 10151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 10161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IllegalArgumentException expected) {} 10171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 10181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert filtered.add("egg"); 10191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 10201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IllegalArgumentException expected) {} 10211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(ImmutableSet.of("a", "e"), filtered); 10221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(ImmutableSet.of("a", "b", "apple", "banana", "e"), unfiltered); 10231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 10241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert filtered.clear(); 10251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertTrue(filtered.isEmpty()); 10261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(ImmutableSet.of("b", "apple", "banana"), unfiltered); 10271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 10291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testFilterSorted() { 10301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert SortedSet<Long> sorted = Sets.newTreeSet(); 10311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long i = 1; i < 11; i++) { 10321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert sorted.add(i); 10331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert SortedSet<Long> filteredEven = Sets.filter(sorted, new Predicate<Long>() { 10351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 10361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public boolean apply(Long input) { 10371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return input % 2 == 0; 10381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }); 10401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 10411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("filteredSortedSet", ImmutableSet.of(2L, 4L, 6L, 8L, 10L), filteredEven); 10421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("First", 2L, filteredEven.first().longValue()); 10431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("Last", 10L, filteredEven.last().longValue()); 10441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("subSet", ImmutableSet.of(4L, 6L), filteredEven.subSet(4L, 8L)); 10451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("headSet", ImmutableSet.of(2L, 4L), filteredEven.headSet(5L)); 10461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("tailSet", ImmutableSet.of(8L, 10L), filteredEven.tailSet(7L)); 10471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("comparator", sorted.comparator(), filteredEven.comparator()); 10481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 10491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert sorted.add(12L); 10501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert sorted.add(0L); 10511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("addingElementsToSet", ImmutableSet.of(0L, 2L, 4L, 6L, 8L, 10L, 12L), 10521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert filteredEven); 10531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("FirstOnModifiedSortedSet", 0L, filteredEven.first().longValue()); 10541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("LastOnModifiedSortedSet", 12L, filteredEven.last().longValue()); 10551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 10571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static SortedSet<Long> filteredEmpty = Sets.filter(new TreeSet<Long>(), Predicates.alwaysTrue()); 10581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testFilteredSortedEmpty_size() { 10591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("filterEmptySize", 0, filteredEmpty.size()); 10601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 10621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testFilteredSortedEmpty_first() { 10631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 10641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert filteredEmpty.first(); 10651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("CallFirstOnEmptySetThrowsException"); 10661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NoSuchElementException expected) {} 10671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 10691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testFilteredSortedEmpty_last() { 10701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 10711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert filteredEmpty.last(); 10721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("CallLastOnEmptySetThrowsException"); 10731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NoSuchElementException expected) {} 10741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 10761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static SortedSet<Long> sorted = Sets.newTreeSet(); 10771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static { 10781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (long i = 1; i < 11; i++) { 10791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert sorted.add(i); 10801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static SortedSet<Long> filterAllElements = Sets.filter(sorted, Predicates.alwaysFalse()); 10831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 10841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testFilteredSortedAllFiltered_size() { 10851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("filterAllElementsSize", 0, filterAllElements.size()); 10861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 10881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testFilteredSortedAllFiltered_first() { 10891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 10901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert filterAllElements.first(); 10911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("CallFirstOnSetWithAllElementsFilteredThrowsException"); 10921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NoSuchElementException expected) {} 10931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 10941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 10951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testFilteredSortedAllFiltered_last() { 10961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 10971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert filterAllElements.last(); 10981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("CallLastOnSetWithAllElementsFilteredThrowsException"); 10991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NoSuchElementException expected) {} 11001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 11011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 1102