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