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