14c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath/* 24c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Copyright (C) 2016 The Android Open Source Project 34c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 44c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Licensed under the Apache License, Version 2.0 (the "License"); 54c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * you may not use this file except in compliance with the License. 64c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * You may obtain a copy of the License at 74c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 84c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * http://www.apache.org/licenses/LICENSE-2.0 94c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * 104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Unless required by applicable law or agreed to in writing, software 114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * distributed under the License is distributed on an "AS IS" BASIS, 124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * See the License for the specific language governing permissions and 144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * limitations under the License 154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamathpackage libcore.java.util; 184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamathimport java.util.ArrayList; 214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamathimport java.util.Collections; 224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamathimport java.util.Comparator; 234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamathimport java.util.HashSet; 244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamathimport java.util.Spliterator; 254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamathimport java.util.function.Consumer; 264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamathimport static junit.framework.Assert.assertEquals; 284c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamathimport static junit.framework.Assert.assertFalse; 294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamathimport static junit.framework.Assert.assertNull; 304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamathimport static junit.framework.Assert.assertTrue; 314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamathimport static junit.framework.Assert.fail; 324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamathpublic class SpliteratorTester { 344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static <T> void runBasicIterationTests(Spliterator<T> spliterator, 354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath ArrayList<T> expectedElements) { 364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath ArrayList<T> recorder = new ArrayList<T>(expectedElements.size()); 374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Consumer<T> consumer = (T value) -> recorder.add(value); 384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath // tryAdvance. 404c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath assertTrue(spliterator.tryAdvance(consumer)); 414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath assertEquals(expectedElements.get(0), recorder.get(0)); 424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath // forEachRemaining. 444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath spliterator.forEachRemaining(consumer); 454c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath assertEquals(expectedElements, recorder); 464c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 474c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath // There should be no more elements remaining in this spliterator. 484c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath assertFalse(spliterator.tryAdvance(consumer)); 494c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath spliterator.forEachRemaining((T) -> fail()); 504c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 514c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 524c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static <T> void runBasicIterationTests_unordered(Spliterator<T> spliterator, 534c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath ArrayList<T> expectedElements, Comparator<T> comparator) { 544c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath ArrayList<T> recorder = new ArrayList<T>(expectedElements.size()); 554c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Consumer<T> consumer = (T value) -> recorder.add(value); 564c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 574c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath // tryAdvance. 584c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath assertTrue(spliterator.tryAdvance(consumer)); 594c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath assertTrue(expectedElements.contains(recorder.get(0))); 604c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 614c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath // forEachRemaining. 624c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath spliterator.forEachRemaining(consumer); 634c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Collections.sort(expectedElements, comparator); 644c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Collections.sort(recorder, comparator); 654c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath assertEquals(expectedElements, recorder); 664c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 674c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath // There should be no more elements remaining in this spliterator. 684c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath assertFalse(spliterator.tryAdvance(consumer)); 694c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath spliterator.forEachRemaining((T) -> fail()); 704c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 714c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 724c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath private static <T> void recordAndAssertBasicIteration( 734c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Spliterator<T> spliterator, ArrayList<T> recorder) { 744c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath spliterator.tryAdvance(value -> recorder.add(value)); 754c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath spliterator.forEachRemaining(value -> recorder.add(value)); 764c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 774c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath // There shouldn't be any elements left in the spliterator. 784c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath assertFalse(spliterator.tryAdvance(value -> recorder.add(value))); 794c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath spliterator.tryAdvance(value -> fail()); 804c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 814c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath // And all subsequent splits should fail. 824c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath assertNull(spliterator.trySplit()); 834c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 844c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 854c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static void testSpliteratorNPE(Spliterator<?> spliterator) { 864c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath try { 874c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath spliterator.tryAdvance(null); 884c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath fail(); 894c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } catch (NullPointerException expected) { 904c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 914c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 924c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath try { 934c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath spliterator.forEachRemaining(null); 944c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath fail(); 954c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } catch (NullPointerException expected) { 964c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 974c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 984c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 994c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static <T extends Comparable<T>> void runBasicSplitTests( 1004c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Iterable<T> spliterable, ArrayList<T> expectedElements) { 1014c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath runBasicSplitTests(spliterable, expectedElements, T::compareTo); 1024c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 1034c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 1044c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static <T> void runBasicSplitTests(Spliterator<T> spliterator, 1054c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath ArrayList<T> expectedElements, Comparator<T> comparator) { 1064c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath ArrayList<T> recorder = new ArrayList<>(); 1074c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 1084c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath // Advance the original spliterator by one element. 1094c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath assertTrue(spliterator.tryAdvance(value -> recorder.add(value))); 1104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 1114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath // Try splitting it. 1124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Spliterator<T> split1 = spliterator.trySplit(); 1134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (split1 != null) { 1144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath // Try to split the resulting split. 1154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Spliterator<T> split1_1 = split1.trySplit(); 1164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Spliterator<T> split1_2 = split1.trySplit(); 1174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (split1_1 != null) { 1184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath recordAndAssertBasicIteration(split1_1, recorder); 1194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 1204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (split1_2 != null) { 1214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath recordAndAssertBasicIteration(split1_2, recorder); 1224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 1234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 1244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath // Iterate over the remainder of split1. 1254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath recordAndAssertBasicIteration(split1, recorder); 1264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 1274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 1284c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath // Try to split the original iterator again. 1294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Spliterator<T> split2 = spliterator.trySplit(); 1304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath if (split2 != null) { 1314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath recordAndAssertBasicIteration(split2, recorder); 1324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 1334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 1344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath // Record all remaining elements of the original spliterator. 1354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath recordAndAssertBasicIteration(spliterator, recorder); 1364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 1374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Collections.sort(expectedElements, comparator); 1384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Collections.sort(recorder, comparator); 1394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath assertEquals(expectedElements, recorder); 1404c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 1414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 1424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath /** 1434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * Note that the contract of trySplit() is generally quite weak (as it must be). There 1444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * are no demands about when the spliterator can or cannot split itself. In general, this 1454c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * test is quite loose. All it does is exercise the basic methods on the splits (if any) 1464c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * and confirms that the union of all elements in the split is the collection that was 1474c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath * iterated over. 1484c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath */ 1494c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static <T> void runBasicSplitTests(Iterable<T> spliterable, 1504c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath ArrayList<T> expectedElements, Comparator<T> comparator) { 1514c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath runBasicSplitTests(spliterable.spliterator(), expectedElements, comparator); 1524c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 1534c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 1544c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static <T> void runOrderedTests(Iterable<T> spliterable) { 1554c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath ArrayList<T> iteration1 = new ArrayList<>(); 1564c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath ArrayList<T> iteration2 = new ArrayList<>(); 1574c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 1584c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath spliterable.spliterator().forEachRemaining(value -> iteration1.add(value)); 1594c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath spliterable.spliterator().forEachRemaining(value -> iteration2.add(value)); 1604c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 1614c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath assertEquals(iteration1, iteration2); 1624c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 1634c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath iteration1.clear(); 1644c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath iteration2.clear(); 1654c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 1664c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath spliterable.spliterator().trySplit().forEachRemaining(value -> iteration1.add(value)); 1674c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath spliterable.spliterator().trySplit().forEachRemaining(value -> iteration2.add(value)); 1684c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath assertEquals(iteration1, iteration2); 1694c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 1704c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 1714c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static <T> void runSizedTests(Spliterator<T> spliterator, int expectedSize) { 1724c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath assertEquals(expectedSize, spliterator.estimateSize()); 1734c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath assertEquals(expectedSize, spliterator.getExactSizeIfKnown()); 1744c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 1754c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 1764c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static <T> void runSizedTests(Iterable<T> spliterable, int expectedSize) { 1774c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath runSizedTests(spliterable.spliterator(), expectedSize); 1784c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 1794c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 1804c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static <T> void runSubSizedTests(Spliterator<T> spliterator, int expectedSize) { 1814c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath assertEquals(expectedSize, spliterator.estimateSize()); 1824c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath assertEquals(expectedSize, spliterator.getExactSizeIfKnown()); 1834c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 1844c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 1854c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Spliterator<T> split1 = spliterator.trySplit(); 1864c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath assertEquals(expectedSize, spliterator.estimateSize() + split1.estimateSize()); 1874c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath assertEquals(expectedSize, spliterator.getExactSizeIfKnown() + split1.getExactSizeIfKnown()); 1884c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 1894c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 1904c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static <T> void runSubSizedTests(Iterable<T> spliterable, int expectedSize) { 1914c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath runSubSizedTests(spliterable.spliterator(), expectedSize); 1924c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 1934c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 1944c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static <T> void runDistinctTests(Iterable<T> spliterable) { 1954c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath HashSet<T> distinct = new HashSet<>(); 1964c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath ArrayList<T> allElements = new ArrayList<>(); 1974c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 1984c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Spliterator<T> spliterator = spliterable.spliterator(); 1994c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Spliterator<T> split1 = spliterator.trySplit(); 2004c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 2014c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath // First test that iterating via the spliterator using forEachRemaining 2024c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath // yields distinct elements. 2034c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath spliterator.forEachRemaining(value -> { distinct.add(value); allElements.add(value); }); 2044c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath split1.forEachRemaining(value -> { distinct.add(value); allElements.add(value); }); 2054c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath assertEquals(distinct.size(), allElements.size()); 2064c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 2074c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath distinct.clear(); 2084c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath allElements.clear(); 2094c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath spliterator = spliterable.spliterator(); 2104c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath split1 = spliterator.trySplit(); 2114c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 2124c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath // Then test whether using tryAdvance yields the same results. 2134c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath while (spliterator.tryAdvance(value -> { distinct.add(value); allElements.add(value); })) { 2144c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 2154c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 2164c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath while (split1.tryAdvance(value -> { distinct.add(value); allElements.add(value); })) { 2174c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 2184c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 2194c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath assertEquals(distinct.size(), allElements.size()); 2204c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 2214c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 2224c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static <T> void runSortedTests(Iterable<T> spliterable, Comparator<T> comparator) { 2234c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Spliterator<T> spliterator = spliterable.spliterator(); 2244c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Spliterator<T> split1 = spliterator.trySplit(); 2254c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 2264c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath ArrayList<T> elements = new ArrayList<>(); 2274c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath spliterator.forEachRemaining(value -> elements.add(value)); 2284c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 2294c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath ArrayList<T> sortedElements = new ArrayList<>(elements); 2304c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Collections.sort(sortedElements, comparator); 2314c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath assertEquals(elements, sortedElements); 2324c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 2334c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath elements.clear(); 2344c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 2354c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath split1.forEachRemaining(value -> elements.add(value)); 2364c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath sortedElements = new ArrayList<>(elements); 2374c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath Collections.sort(sortedElements, comparator); 2384c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath assertEquals(elements, sortedElements); 2394c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 2404c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath 2414c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath public static <T extends Comparable<T>> void runSortedTests(Iterable<T> spliterable) { 2424c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath runSortedTests(spliterable, T::compareTo); 2434c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath } 2444c89023ef86f29fa9add7db2574f2169fe842577Narayan Kamath} 245