17dd252788645e940eada959bdde927426e2531c9Paul Duffin/*
27dd252788645e940eada959bdde927426e2531c9Paul Duffin * Copyright (C) 2008 The Guava Authors
37dd252788645e940eada959bdde927426e2531c9Paul Duffin *
47dd252788645e940eada959bdde927426e2531c9Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License");
57dd252788645e940eada959bdde927426e2531c9Paul Duffin * you may not use this file except in compliance with the License.
67dd252788645e940eada959bdde927426e2531c9Paul Duffin * You may obtain a copy of the License at
77dd252788645e940eada959bdde927426e2531c9Paul Duffin *
87dd252788645e940eada959bdde927426e2531c9Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0
97dd252788645e940eada959bdde927426e2531c9Paul Duffin *
107dd252788645e940eada959bdde927426e2531c9Paul Duffin * Unless required by applicable law or agreed to in writing, software
117dd252788645e940eada959bdde927426e2531c9Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS,
127dd252788645e940eada959bdde927426e2531c9Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137dd252788645e940eada959bdde927426e2531c9Paul Duffin * See the License for the specific language governing permissions and
147dd252788645e940eada959bdde927426e2531c9Paul Duffin * limitations under the License.
157dd252788645e940eada959bdde927426e2531c9Paul Duffin */
167dd252788645e940eada959bdde927426e2531c9Paul Duffin
177dd252788645e940eada959bdde927426e2531c9Paul Duffinpackage com.google.common.collect.testing.google;
187dd252788645e940eada959bdde927426e2531c9Paul Duffin
197dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.base.Preconditions.checkNotNull;
207dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.collect.Lists.newArrayList;
217dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.collect.Sets.newTreeSet;
227dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.collect.testing.SampleElements.Strings.AFTER_LAST;
237dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.collect.testing.SampleElements.Strings.AFTER_LAST_2;
247dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.collect.testing.SampleElements.Strings.BEFORE_FIRST;
257dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.collect.testing.SampleElements.Strings.BEFORE_FIRST_2;
267dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static junit.framework.Assert.assertEquals;
277dd252788645e940eada959bdde927426e2531c9Paul Duffin
287dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.annotations.GwtCompatible;
297dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.ContiguousSet;
307dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.DiscreteDomain;
317dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.ImmutableSet;
327dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.ImmutableSortedSet;
337dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.Lists;
347dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.Ordering;
357dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.Range;
367dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.Sets;
377dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.TestCollectionGenerator;
387dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.TestCollidingSetGenerator;
397dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.TestIntegerSortedSetGenerator;
407dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.TestSetGenerator;
417dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.TestStringListGenerator;
427dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.TestStringSetGenerator;
437dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.TestStringSortedSetGenerator;
447dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.TestUnhashableCollectionGenerator;
457dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.UnhashableObject;
467dd252788645e940eada959bdde927426e2531c9Paul Duffin
477dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.Arrays;
487dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.Collections;
497dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.Comparator;
507dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.List;
517dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.Set;
527dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.SortedSet;
537dd252788645e940eada959bdde927426e2531c9Paul Duffin
547dd252788645e940eada959bdde927426e2531c9Paul Duffin/**
557dd252788645e940eada959bdde927426e2531c9Paul Duffin * Generators of different types of sets and derived collections from sets.
567dd252788645e940eada959bdde927426e2531c9Paul Duffin *
577dd252788645e940eada959bdde927426e2531c9Paul Duffin * @author Kevin Bourrillion
587dd252788645e940eada959bdde927426e2531c9Paul Duffin * @author Jared Levy
597dd252788645e940eada959bdde927426e2531c9Paul Duffin * @author Hayward Chan
607dd252788645e940eada959bdde927426e2531c9Paul Duffin */
617dd252788645e940eada959bdde927426e2531c9Paul Duffin@GwtCompatible(emulated = true)
627dd252788645e940eada959bdde927426e2531c9Paul Duffinpublic class SetGenerators {
637dd252788645e940eada959bdde927426e2531c9Paul Duffin
647dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static class ImmutableSetCopyOfGenerator extends TestStringSetGenerator {
657dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override protected Set<String> create(String[] elements) {
667dd252788645e940eada959bdde927426e2531c9Paul Duffin      return ImmutableSet.copyOf(elements);
677dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
687dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
697dd252788645e940eada959bdde927426e2531c9Paul Duffin
707dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static class ImmutableSetWithBadHashesGenerator
717dd252788645e940eada959bdde927426e2531c9Paul Duffin      extends TestCollidingSetGenerator
727dd252788645e940eada959bdde927426e2531c9Paul Duffin      // Work around a GWT compiler bug.  Not explicitly listing this will
737dd252788645e940eada959bdde927426e2531c9Paul Duffin      // cause the createArray() method missing in the generated javascript.
747dd252788645e940eada959bdde927426e2531c9Paul Duffin      // TODO: Remove this once the GWT bug is fixed.
757dd252788645e940eada959bdde927426e2531c9Paul Duffin      implements TestCollectionGenerator<Object> {
767dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
777dd252788645e940eada959bdde927426e2531c9Paul Duffin    public Set<Object> create(Object... elements) {
787dd252788645e940eada959bdde927426e2531c9Paul Duffin      return ImmutableSet.copyOf(elements);
797dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
807dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
817dd252788645e940eada959bdde927426e2531c9Paul Duffin
827dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static class DegeneratedImmutableSetGenerator
837dd252788645e940eada959bdde927426e2531c9Paul Duffin      extends TestStringSetGenerator {
847dd252788645e940eada959bdde927426e2531c9Paul Duffin    // Make sure we get what we think we're getting, or else this test
857dd252788645e940eada959bdde927426e2531c9Paul Duffin    // is pointless
867dd252788645e940eada959bdde927426e2531c9Paul Duffin    @SuppressWarnings("cast")
877dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override protected Set<String> create(String[] elements) {
887dd252788645e940eada959bdde927426e2531c9Paul Duffin      return (ImmutableSet<String>)
897dd252788645e940eada959bdde927426e2531c9Paul Duffin          ImmutableSet.of(elements[0], elements[0]);
907dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
917dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
927dd252788645e940eada959bdde927426e2531c9Paul Duffin
937dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static class ImmutableSortedSetCopyOfGenerator
947dd252788645e940eada959bdde927426e2531c9Paul Duffin      extends TestStringSortedSetGenerator {
957dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override protected SortedSet<String> create(String[] elements) {
967dd252788645e940eada959bdde927426e2531c9Paul Duffin      return ImmutableSortedSet.copyOf(elements);
977dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
987dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
997dd252788645e940eada959bdde927426e2531c9Paul Duffin
1007dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static class ImmutableSortedSetHeadsetGenerator
1017dd252788645e940eada959bdde927426e2531c9Paul Duffin      extends TestStringSortedSetGenerator {
1027dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override protected SortedSet<String> create(String[] elements) {
1037dd252788645e940eada959bdde927426e2531c9Paul Duffin      List<String> list = Lists.newArrayList(elements);
1047dd252788645e940eada959bdde927426e2531c9Paul Duffin      list.add("zzz");
1057dd252788645e940eada959bdde927426e2531c9Paul Duffin      return ImmutableSortedSet.copyOf(list)
1067dd252788645e940eada959bdde927426e2531c9Paul Duffin          .headSet("zzy");
1077dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1087dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1097dd252788645e940eada959bdde927426e2531c9Paul Duffin
1107dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static class ImmutableSortedSetTailsetGenerator
1117dd252788645e940eada959bdde927426e2531c9Paul Duffin      extends TestStringSortedSetGenerator {
1127dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override protected SortedSet<String> create(String[] elements) {
1137dd252788645e940eada959bdde927426e2531c9Paul Duffin      List<String> list = Lists.newArrayList(elements);
1147dd252788645e940eada959bdde927426e2531c9Paul Duffin      list.add("\0");
1157dd252788645e940eada959bdde927426e2531c9Paul Duffin      return ImmutableSortedSet.copyOf(list)
1167dd252788645e940eada959bdde927426e2531c9Paul Duffin          .tailSet("\0\0");
1177dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1187dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1197dd252788645e940eada959bdde927426e2531c9Paul Duffin
1207dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static class ImmutableSortedSetSubsetGenerator
1217dd252788645e940eada959bdde927426e2531c9Paul Duffin      extends TestStringSortedSetGenerator {
1227dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override protected SortedSet<String> create(String[] elements) {
1237dd252788645e940eada959bdde927426e2531c9Paul Duffin      List<String> list = Lists.newArrayList(elements);
1247dd252788645e940eada959bdde927426e2531c9Paul Duffin      list.add("\0");
1257dd252788645e940eada959bdde927426e2531c9Paul Duffin      list.add("zzz");
1267dd252788645e940eada959bdde927426e2531c9Paul Duffin      return ImmutableSortedSet.copyOf(list)
1277dd252788645e940eada959bdde927426e2531c9Paul Duffin          .subSet("\0\0", "zzy");
1287dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1297dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1307dd252788645e940eada959bdde927426e2531c9Paul Duffin
1317dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static class ImmutableSortedSetExplicitComparator
1327dd252788645e940eada959bdde927426e2531c9Paul Duffin      extends TestStringSetGenerator {
1337dd252788645e940eada959bdde927426e2531c9Paul Duffin
1347dd252788645e940eada959bdde927426e2531c9Paul Duffin    private static final Comparator<String> STRING_REVERSED
1357dd252788645e940eada959bdde927426e2531c9Paul Duffin        = Collections.reverseOrder();
1367dd252788645e940eada959bdde927426e2531c9Paul Duffin
1377dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override protected SortedSet<String> create(String[] elements) {
1387dd252788645e940eada959bdde927426e2531c9Paul Duffin      return ImmutableSortedSet.orderedBy(STRING_REVERSED)
1397dd252788645e940eada959bdde927426e2531c9Paul Duffin          .add(elements)
1407dd252788645e940eada959bdde927426e2531c9Paul Duffin          .build();
1417dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1427dd252788645e940eada959bdde927426e2531c9Paul Duffin
1437dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override public List<String> order(List<String> insertionOrder) {
1447dd252788645e940eada959bdde927426e2531c9Paul Duffin      Collections.sort(insertionOrder, Collections.reverseOrder());
1457dd252788645e940eada959bdde927426e2531c9Paul Duffin      return insertionOrder;
1467dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1477dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1487dd252788645e940eada959bdde927426e2531c9Paul Duffin
1497dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static class ImmutableSortedSetExplicitSuperclassComparatorGenerator
1507dd252788645e940eada959bdde927426e2531c9Paul Duffin      extends TestStringSetGenerator {
1517dd252788645e940eada959bdde927426e2531c9Paul Duffin
1527dd252788645e940eada959bdde927426e2531c9Paul Duffin    private static final Comparator<Comparable<?>> COMPARABLE_REVERSED
1537dd252788645e940eada959bdde927426e2531c9Paul Duffin        = Collections.reverseOrder();
1547dd252788645e940eada959bdde927426e2531c9Paul Duffin
1557dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override protected SortedSet<String> create(String[] elements) {
1567dd252788645e940eada959bdde927426e2531c9Paul Duffin      return new ImmutableSortedSet.Builder<String>(COMPARABLE_REVERSED)
1577dd252788645e940eada959bdde927426e2531c9Paul Duffin          .add(elements)
1587dd252788645e940eada959bdde927426e2531c9Paul Duffin          .build();
1597dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1607dd252788645e940eada959bdde927426e2531c9Paul Duffin
1617dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override public List<String> order(List<String> insertionOrder) {
1627dd252788645e940eada959bdde927426e2531c9Paul Duffin      Collections.sort(insertionOrder, Collections.reverseOrder());
1637dd252788645e940eada959bdde927426e2531c9Paul Duffin      return insertionOrder;
1647dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1657dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1667dd252788645e940eada959bdde927426e2531c9Paul Duffin
1677dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static class ImmutableSortedSetReversedOrderGenerator
1687dd252788645e940eada959bdde927426e2531c9Paul Duffin      extends TestStringSetGenerator {
1697dd252788645e940eada959bdde927426e2531c9Paul Duffin
1707dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override protected SortedSet<String> create(String[] elements) {
1717dd252788645e940eada959bdde927426e2531c9Paul Duffin      return ImmutableSortedSet.<String>reverseOrder()
1727dd252788645e940eada959bdde927426e2531c9Paul Duffin          .addAll(Arrays.asList(elements).iterator())
1737dd252788645e940eada959bdde927426e2531c9Paul Duffin          .build();
1747dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1757dd252788645e940eada959bdde927426e2531c9Paul Duffin
1767dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override public List<String> order(List<String> insertionOrder) {
1777dd252788645e940eada959bdde927426e2531c9Paul Duffin      Collections.sort(insertionOrder, Collections.reverseOrder());
1787dd252788645e940eada959bdde927426e2531c9Paul Duffin      return insertionOrder;
1797dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1807dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1817dd252788645e940eada959bdde927426e2531c9Paul Duffin
1827dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static class ImmutableSortedSetUnhashableGenerator
1837dd252788645e940eada959bdde927426e2531c9Paul Duffin      extends TestUnhashableSetGenerator {
1847dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override public Set<UnhashableObject> create(
1857dd252788645e940eada959bdde927426e2531c9Paul Duffin        UnhashableObject[] elements) {
1867dd252788645e940eada959bdde927426e2531c9Paul Duffin      return ImmutableSortedSet.copyOf(elements);
1877dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1887dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1897dd252788645e940eada959bdde927426e2531c9Paul Duffin
1907dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static class ImmutableSetAsListGenerator
1917dd252788645e940eada959bdde927426e2531c9Paul Duffin      extends TestStringListGenerator {
1927dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override protected List<String> create(String[] elements) {
1937dd252788645e940eada959bdde927426e2531c9Paul Duffin      return ImmutableSet.copyOf(elements).asList();
1947dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1957dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1967dd252788645e940eada959bdde927426e2531c9Paul Duffin
1977dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static class ImmutableSortedSetAsListGenerator
1987dd252788645e940eada959bdde927426e2531c9Paul Duffin      extends TestStringListGenerator {
1997dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override protected List<String> create(String[] elements) {
2007dd252788645e940eada959bdde927426e2531c9Paul Duffin      Comparator<String> comparator = createExplicitComparator(elements);
2017dd252788645e940eada959bdde927426e2531c9Paul Duffin      ImmutableSet<String> set = ImmutableSortedSet.copyOf(
2027dd252788645e940eada959bdde927426e2531c9Paul Duffin          comparator, Arrays.asList(elements));
2037dd252788645e940eada959bdde927426e2531c9Paul Duffin      return set.asList();
2047dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2057dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
2067dd252788645e940eada959bdde927426e2531c9Paul Duffin
2077dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static class ImmutableSortedSetSubsetAsListGenerator
2087dd252788645e940eada959bdde927426e2531c9Paul Duffin      extends TestStringListGenerator {
2097dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override protected List<String> create(String[] elements) {
2107dd252788645e940eada959bdde927426e2531c9Paul Duffin      Comparator<String> comparator = createExplicitComparator(elements);
2117dd252788645e940eada959bdde927426e2531c9Paul Duffin      ImmutableSortedSet.Builder<String> builder
2127dd252788645e940eada959bdde927426e2531c9Paul Duffin          = ImmutableSortedSet.orderedBy(comparator);
2137dd252788645e940eada959bdde927426e2531c9Paul Duffin      builder.add(BEFORE_FIRST);
2147dd252788645e940eada959bdde927426e2531c9Paul Duffin      builder.add(elements);
2157dd252788645e940eada959bdde927426e2531c9Paul Duffin      builder.add(AFTER_LAST);
2167dd252788645e940eada959bdde927426e2531c9Paul Duffin      return builder.build().subSet(BEFORE_FIRST_2,
2177dd252788645e940eada959bdde927426e2531c9Paul Duffin          AFTER_LAST).asList();
2187dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2197dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
2207dd252788645e940eada959bdde927426e2531c9Paul Duffin
2217dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static class ImmutableSortedSetAsListSubListGenerator
2227dd252788645e940eada959bdde927426e2531c9Paul Duffin      extends TestStringListGenerator {
2237dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override protected List<String> create(String[] elements) {
2247dd252788645e940eada959bdde927426e2531c9Paul Duffin      Comparator<String> comparator = createExplicitComparator(elements);
2257dd252788645e940eada959bdde927426e2531c9Paul Duffin      ImmutableSortedSet.Builder<String> builder
2267dd252788645e940eada959bdde927426e2531c9Paul Duffin          = ImmutableSortedSet.orderedBy(comparator);
2277dd252788645e940eada959bdde927426e2531c9Paul Duffin      builder.add(BEFORE_FIRST);
2287dd252788645e940eada959bdde927426e2531c9Paul Duffin      builder.add(elements);
2297dd252788645e940eada959bdde927426e2531c9Paul Duffin      builder.add(AFTER_LAST);
2307dd252788645e940eada959bdde927426e2531c9Paul Duffin      return builder.build().asList().subList(1, elements.length + 1);
2317dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2327dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
2337dd252788645e940eada959bdde927426e2531c9Paul Duffin
2347dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static class ImmutableSortedSetSubsetAsListSubListGenerator
2357dd252788645e940eada959bdde927426e2531c9Paul Duffin      extends TestStringListGenerator {
2367dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override protected List<String> create(String[] elements) {
2377dd252788645e940eada959bdde927426e2531c9Paul Duffin      Comparator<String> comparator = createExplicitComparator(elements);
2387dd252788645e940eada959bdde927426e2531c9Paul Duffin      ImmutableSortedSet.Builder<String> builder
2397dd252788645e940eada959bdde927426e2531c9Paul Duffin          = ImmutableSortedSet.orderedBy(comparator);
2407dd252788645e940eada959bdde927426e2531c9Paul Duffin      builder.add(BEFORE_FIRST);
2417dd252788645e940eada959bdde927426e2531c9Paul Duffin      builder.add(BEFORE_FIRST_2);
2427dd252788645e940eada959bdde927426e2531c9Paul Duffin      builder.add(elements);
2437dd252788645e940eada959bdde927426e2531c9Paul Duffin      builder.add(AFTER_LAST);
2447dd252788645e940eada959bdde927426e2531c9Paul Duffin      builder.add(AFTER_LAST_2);
2457dd252788645e940eada959bdde927426e2531c9Paul Duffin      return builder.build().subSet(BEFORE_FIRST_2,
2467dd252788645e940eada959bdde927426e2531c9Paul Duffin          AFTER_LAST_2)
2477dd252788645e940eada959bdde927426e2531c9Paul Duffin              .asList().subList(1, elements.length + 1);
2487dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2497dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
2507dd252788645e940eada959bdde927426e2531c9Paul Duffin
2517dd252788645e940eada959bdde927426e2531c9Paul Duffin  public abstract static class TestUnhashableSetGenerator
2527dd252788645e940eada959bdde927426e2531c9Paul Duffin      extends TestUnhashableCollectionGenerator<Set<UnhashableObject>>
2537dd252788645e940eada959bdde927426e2531c9Paul Duffin      implements TestSetGenerator<UnhashableObject> {
2547dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
2557dd252788645e940eada959bdde927426e2531c9Paul Duffin
2567dd252788645e940eada959bdde927426e2531c9Paul Duffin  private static Ordering<String> createExplicitComparator(
2577dd252788645e940eada959bdde927426e2531c9Paul Duffin      String[] elements) {
2587dd252788645e940eada959bdde927426e2531c9Paul Duffin    // Collapse equal elements, which Ordering.explicit() doesn't support, while
2597dd252788645e940eada959bdde927426e2531c9Paul Duffin    // maintaining the ordering by first occurrence.
2607dd252788645e940eada959bdde927426e2531c9Paul Duffin    Set<String> elementsPlus = Sets.newLinkedHashSet();
2617dd252788645e940eada959bdde927426e2531c9Paul Duffin    elementsPlus.add(BEFORE_FIRST);
2627dd252788645e940eada959bdde927426e2531c9Paul Duffin    elementsPlus.add(BEFORE_FIRST_2);
2637dd252788645e940eada959bdde927426e2531c9Paul Duffin    elementsPlus.addAll(Arrays.asList(elements));
2647dd252788645e940eada959bdde927426e2531c9Paul Duffin    elementsPlus.add(AFTER_LAST);
2657dd252788645e940eada959bdde927426e2531c9Paul Duffin    elementsPlus.add(AFTER_LAST_2);
2667dd252788645e940eada959bdde927426e2531c9Paul Duffin    return Ordering.explicit(Lists.newArrayList(elementsPlus));
2677dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
2687dd252788645e940eada959bdde927426e2531c9Paul Duffin
2697dd252788645e940eada959bdde927426e2531c9Paul Duffin  /*
2707dd252788645e940eada959bdde927426e2531c9Paul Duffin   * All the ContiguousSet generators below manually reject nulls here. In principle, we'd like to
2717dd252788645e940eada959bdde927426e2531c9Paul Duffin   * defer that to Range, since it's ContiguousSet.create() that's used to create the sets. However,
2727dd252788645e940eada959bdde927426e2531c9Paul Duffin   * that gets messy here, and we already have null tests for Range.
2737dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
2747dd252788645e940eada959bdde927426e2531c9Paul Duffin
2757dd252788645e940eada959bdde927426e2531c9Paul Duffin  /*
2767dd252788645e940eada959bdde927426e2531c9Paul Duffin   * These generators also rely on consecutive integer inputs (not necessarily in order, but no
2777dd252788645e940eada959bdde927426e2531c9Paul Duffin   * holes).
2787dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
2797dd252788645e940eada959bdde927426e2531c9Paul Duffin
2807dd252788645e940eada959bdde927426e2531c9Paul Duffin  // SetCreationTester has some tests that pass in duplicates. Dedup them.
2817dd252788645e940eada959bdde927426e2531c9Paul Duffin  private static <E extends Comparable<? super E>> SortedSet<E> nullCheckedTreeSet(E[] elements) {
2827dd252788645e940eada959bdde927426e2531c9Paul Duffin    SortedSet<E> set = newTreeSet();
2837dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (E element : elements) {
2847dd252788645e940eada959bdde927426e2531c9Paul Duffin      // Explicit null check because TreeSet wrongly accepts add(null) when empty.
2857dd252788645e940eada959bdde927426e2531c9Paul Duffin      set.add(checkNotNull(element));
2867dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2877dd252788645e940eada959bdde927426e2531c9Paul Duffin    return set;
2887dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
2897dd252788645e940eada959bdde927426e2531c9Paul Duffin
2907dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static class ContiguousSetGenerator extends AbstractContiguousSetGenerator {
2917dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override protected SortedSet<Integer> create(Integer[] elements) {
2927dd252788645e940eada959bdde927426e2531c9Paul Duffin      return checkedCreate(nullCheckedTreeSet(elements));
2937dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2947dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
2957dd252788645e940eada959bdde927426e2531c9Paul Duffin
2967dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static class ContiguousSetHeadsetGenerator extends AbstractContiguousSetGenerator {
2977dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override protected SortedSet<Integer> create(Integer[] elements) {
2987dd252788645e940eada959bdde927426e2531c9Paul Duffin      SortedSet<Integer> set = nullCheckedTreeSet(elements);
2997dd252788645e940eada959bdde927426e2531c9Paul Duffin      int tooHigh = (set.isEmpty()) ? 0 : set.last() + 1;
3007dd252788645e940eada959bdde927426e2531c9Paul Duffin      set.add(tooHigh);
3017dd252788645e940eada959bdde927426e2531c9Paul Duffin      return checkedCreate(set).headSet(tooHigh);
3027dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
3037dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
3047dd252788645e940eada959bdde927426e2531c9Paul Duffin
3057dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static class ContiguousSetTailsetGenerator extends AbstractContiguousSetGenerator {
3067dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override protected SortedSet<Integer> create(Integer[] elements) {
3077dd252788645e940eada959bdde927426e2531c9Paul Duffin      SortedSet<Integer> set = nullCheckedTreeSet(elements);
3087dd252788645e940eada959bdde927426e2531c9Paul Duffin      int tooLow = (set.isEmpty()) ? 0 : set.first() - 1;
3097dd252788645e940eada959bdde927426e2531c9Paul Duffin      set.add(tooLow);
3107dd252788645e940eada959bdde927426e2531c9Paul Duffin      return checkedCreate(set).tailSet(tooLow + 1);
3117dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
3127dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
3137dd252788645e940eada959bdde927426e2531c9Paul Duffin
3147dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static class ContiguousSetSubsetGenerator extends AbstractContiguousSetGenerator {
3157dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override protected SortedSet<Integer> create(Integer[] elements) {
3167dd252788645e940eada959bdde927426e2531c9Paul Duffin      SortedSet<Integer> set = nullCheckedTreeSet(elements);
3177dd252788645e940eada959bdde927426e2531c9Paul Duffin      if (set.isEmpty()) {
3187dd252788645e940eada959bdde927426e2531c9Paul Duffin        /*
3197dd252788645e940eada959bdde927426e2531c9Paul Duffin         * The (tooLow + 1, tooHigh) arguments below would be invalid because tooLow would be
3207dd252788645e940eada959bdde927426e2531c9Paul Duffin         * greater than tooHigh.
3217dd252788645e940eada959bdde927426e2531c9Paul Duffin         */
3227dd252788645e940eada959bdde927426e2531c9Paul Duffin        return ContiguousSet.create(Range.openClosed(0, 1), DiscreteDomain.integers()).subSet(0, 1);
3237dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
3247dd252788645e940eada959bdde927426e2531c9Paul Duffin      int tooHigh = set.last() + 1;
3257dd252788645e940eada959bdde927426e2531c9Paul Duffin      int tooLow = set.first() - 1;
3267dd252788645e940eada959bdde927426e2531c9Paul Duffin      set.add(tooHigh);
3277dd252788645e940eada959bdde927426e2531c9Paul Duffin      set.add(tooLow);
3287dd252788645e940eada959bdde927426e2531c9Paul Duffin      return checkedCreate(set).subSet(tooLow + 1, tooHigh);
3297dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
3307dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
3317dd252788645e940eada959bdde927426e2531c9Paul Duffin
3327dd252788645e940eada959bdde927426e2531c9Paul Duffin  private abstract static class AbstractContiguousSetGenerator
3337dd252788645e940eada959bdde927426e2531c9Paul Duffin      extends TestIntegerSortedSetGenerator {
3347dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected final ContiguousSet<Integer> checkedCreate(SortedSet<Integer> elementsSet) {
3357dd252788645e940eada959bdde927426e2531c9Paul Duffin      List<Integer> elements = newArrayList(elementsSet);
3367dd252788645e940eada959bdde927426e2531c9Paul Duffin      /*
3377dd252788645e940eada959bdde927426e2531c9Paul Duffin       * A ContiguousSet can't have holes. If a test demands a hole, it should be changed so that it
3387dd252788645e940eada959bdde927426e2531c9Paul Duffin       * doesn't need one, or it should be suppressed for ContiguousSet.
3397dd252788645e940eada959bdde927426e2531c9Paul Duffin       */
3407dd252788645e940eada959bdde927426e2531c9Paul Duffin      for (int i = 0; i < elements.size() - 1; i++) {
3417dd252788645e940eada959bdde927426e2531c9Paul Duffin        assertEquals(elements.get(i) + 1, (int) elements.get(i + 1));
3427dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
3437dd252788645e940eada959bdde927426e2531c9Paul Duffin      Range<Integer> range =
3447dd252788645e940eada959bdde927426e2531c9Paul Duffin          (elements.isEmpty()) ? Range.closedOpen(0, 0) : Range.encloseAll(elements);
3457dd252788645e940eada959bdde927426e2531c9Paul Duffin      return ContiguousSet.create(range, DiscreteDomain.integers());
3467dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
3477dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
3487dd252788645e940eada959bdde927426e2531c9Paul Duffin}
3497dd252788645e940eada959bdde927426e2531c9Paul Duffin
350