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