1 /*
2  * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 /**
25  * @test
26  * @summary Spliterator traversing and splitting tests
27  * @library /lib/testlibrary/bootlib
28  * @build java.base/java.util.SpliteratorOfIntDataBuilder
29  *        java.base/java.util.SpliteratorTestHelper
30  * @run testng SpliteratorTraversingAndSplittingTest
31  * @bug 8020016 8071477 8072784 8169838
32  */
33 
34 import org.testng.annotations.DataProvider;
35 import org.testng.annotations.Test;
36 
37 import java.nio.CharBuffer;
38 import java.util.AbstractCollection;
39 import java.util.AbstractList;
40 import java.util.AbstractSet;
41 import java.util.ArrayDeque;
42 import java.util.ArrayList;
43 import java.util.Arrays;
44 import java.util.Collection;
45 import java.util.Collections;
46 import java.util.Comparator;
47 import java.util.HashMap;
48 import java.util.HashSet;
49 import java.util.IdentityHashMap;
50 import java.util.Iterator;
51 import java.util.LinkedHashMap;
52 import java.util.LinkedHashSet;
53 import java.util.LinkedList;
54 import java.util.List;
55 import java.util.ListIterator;
56 import java.util.Map;
57 import java.util.PriorityQueue;
58 import java.util.RandomAccess;
59 import java.util.Set;
60 import java.util.SortedSet;
61 import java.util.Spliterator;
62 import java.util.SpliteratorOfIntDataBuilder;
63 import java.util.SpliteratorTestHelper;
64 import java.util.Spliterators;
65 import java.util.Stack;
66 import java.util.TreeMap;
67 import java.util.TreeSet;
68 import java.util.Vector;
69 import java.util.WeakHashMap;
70 import java.util.concurrent.ArrayBlockingQueue;
71 import java.util.concurrent.ConcurrentHashMap;
72 import java.util.concurrent.ConcurrentLinkedQueue;
73 import java.util.concurrent.ConcurrentSkipListMap;
74 import java.util.concurrent.ConcurrentSkipListSet;
75 import java.util.concurrent.CopyOnWriteArrayList;
76 import java.util.concurrent.CopyOnWriteArraySet;
77 import java.util.concurrent.LinkedBlockingDeque;
78 import java.util.concurrent.LinkedBlockingQueue;
79 import java.util.concurrent.LinkedTransferQueue;
80 import java.util.concurrent.PriorityBlockingQueue;
81 import java.util.function.Consumer;
82 import java.util.function.DoubleConsumer;
83 import java.util.function.Function;
84 import java.util.function.IntConsumer;
85 import java.util.function.LongConsumer;
86 import java.util.function.Supplier;
87 import java.util.function.UnaryOperator;
88 
89 public class SpliteratorTraversingAndSplittingTest extends SpliteratorTestHelper {
90 
91     private static final List<Integer> SIZES = Arrays.asList(0, 1, 10, 42);
92 
93     private static final String LOW = new String(new char[] {Character.MIN_LOW_SURROGATE});
94     private static final String HIGH = new String(new char[] {Character.MIN_HIGH_SURROGATE});
95     private static final String HIGH_LOW = HIGH + LOW;
96     private static final String CHAR_HIGH_LOW = "A" + HIGH_LOW;
97     private static final String HIGH_LOW_CHAR = HIGH_LOW + "A";
98     private static final String CHAR_HIGH_LOW_CHAR = "A" + HIGH_LOW + "A";
99 
100     private static final List<String> STRINGS = generateTestStrings();
101 
generateTestStrings()102     private static List<String> generateTestStrings() {
103         List<String> strings = new ArrayList<>();
104         for (int n : Arrays.asList(1, 2, 3, 16, 17)) {
105             strings.add(generate("A", n));
106             strings.add(generate(LOW, n));
107             strings.add(generate(HIGH, n));
108             strings.add(generate(HIGH_LOW, n));
109             strings.add(generate(CHAR_HIGH_LOW, n));
110             strings.add(generate(HIGH_LOW_CHAR, n));
111             strings.add(generate(CHAR_HIGH_LOW_CHAR, n));
112         }
113         return strings;
114     }
115 
generate(String s, int n)116     private static String generate(String s, int n) {
117         StringBuilder sb = new StringBuilder();
118         for (int i = 0; i < n; i++) {
119             sb.append(s);
120         }
121         return sb.toString();
122     }
123 
124     private static class SpliteratorDataBuilder<T> {
125         List<Object[]> data;
126 
127         List<T> exp;
128 
129         Map<T, T> mExp;
130 
SpliteratorDataBuilder(List<Object[]> data, List<T> exp)131         SpliteratorDataBuilder(List<Object[]> data, List<T> exp) {
132             this.data = data;
133             this.exp = exp;
134             this.mExp = createMap(exp);
135         }
136 
createMap(List<T> l)137         Map<T, T> createMap(List<T> l) {
138             Map<T, T> m = new LinkedHashMap<>();
139             for (T t : l) {
140                 m.put(t, t);
141             }
142             return m;
143         }
144 
add(String description, Collection<?> expected, Supplier<Spliterator<?>> s)145         void add(String description, Collection<?> expected, Supplier<Spliterator<?>> s) {
146             description = joiner(description).toString();
147             data.add(new Object[]{description, expected, s});
148         }
149 
add(String description, Supplier<Spliterator<?>> s)150         void add(String description, Supplier<Spliterator<?>> s) {
151             add(description, exp, s);
152         }
153 
addCollection(Function<Collection<T>, ? extends Collection<T>> c)154         void addCollection(Function<Collection<T>, ? extends Collection<T>> c) {
155             add("new " + c.apply(Collections.<T>emptyList()).getClass().getName() + ".spliterator()",
156                 () -> c.apply(exp).spliterator());
157         }
158 
addList(Function<Collection<T>, ? extends List<T>> l)159         void addList(Function<Collection<T>, ? extends List<T>> l) {
160             addCollection(l);
161             addCollection(l.andThen(list -> list.subList(0, list.size())));
162         }
163 
addMap(Function<Map<T, T>, ? extends Map<T, T>> m)164         void addMap(Function<Map<T, T>, ? extends Map<T, T>> m) {
165             String description = "new " + m.apply(Collections.<T, T>emptyMap()).getClass().getName();
166             addMap(m, description);
167         }
168 
addMap(Function<Map<T, T>, ? extends Map<T, T>> m, String description)169         void addMap(Function<Map<T, T>, ? extends Map<T, T>> m, String description) {
170             add(description + ".keySet().spliterator()", () -> m.apply(mExp).keySet().spliterator());
171             add(description + ".values().spliterator()", () -> m.apply(mExp).values().spliterator());
172             add(description + ".entrySet().spliterator()", mExp.entrySet(), () -> m.apply(mExp).entrySet().spliterator());
173         }
174 
joiner(String description)175         StringBuilder joiner(String description) {
176             return new StringBuilder(description).
177                     append(" {").
178                     append("size=").append(exp.size()).
179                     append("}");
180         }
181     }
182 
183     static Object[][] spliteratorDataProvider;
184 
185     @DataProvider(name = "Spliterator<Integer>")
spliteratorDataProvider()186     public static Object[][] spliteratorDataProvider() {
187         if (spliteratorDataProvider != null) {
188             return spliteratorDataProvider;
189         }
190 
191         List<Object[]> data = new ArrayList<>();
192         for (int size : SIZES) {
193             List<Integer> exp = listIntRange(size);
194             SpliteratorDataBuilder<Integer> db = new SpliteratorDataBuilder<>(data, exp);
195 
196             // Direct spliterator methods
197 
198             db.add("Spliterators.spliterator(Collection, ...)",
199                    () -> Spliterators.spliterator(exp, 0));
200 
201             db.add("Spliterators.spliterator(Iterator, ...)",
202                    () -> Spliterators.spliterator(exp.iterator(), exp.size(), 0));
203 
204             db.add("Spliterators.spliteratorUnknownSize(Iterator, ...)",
205                    () -> Spliterators.spliteratorUnknownSize(exp.iterator(), 0));
206 
207             db.add("Spliterators.spliterator(Spliterators.iteratorFromSpliterator(Spliterator ), ...)",
208                    () -> Spliterators.spliterator(Spliterators.iterator(exp.spliterator()), exp.size(), 0));
209 
210             db.add("Spliterators.spliterator(T[], ...)",
211                    () -> Spliterators.spliterator(exp.toArray(new Integer[0]), 0));
212 
213             db.add("Arrays.spliterator(T[], ...)",
214                    () -> Arrays.spliterator(exp.toArray(new Integer[0])));
215 
216             class SpliteratorFromIterator extends Spliterators.AbstractSpliterator<Integer> {
217                 Iterator<Integer> it;
218 
219                 SpliteratorFromIterator(Iterator<Integer> it, long est) {
220                     super(est, Spliterator.SIZED);
221                     this.it = it;
222                 }
223 
224                 @Override
225                 public boolean tryAdvance(Consumer<? super Integer> action) {
226                     if (action == null)
227                         throw new NullPointerException();
228                     if (it.hasNext()) {
229                         action.accept(it.next());
230                         return true;
231                     }
232                     else {
233                         return false;
234                     }
235                 }
236             }
237             db.add("new Spliterators.AbstractSpliterator()",
238                    () -> new SpliteratorFromIterator(exp.iterator(), exp.size()));
239 
240             // Collections
241 
242             // default method implementations
243 
244             class AbstractCollectionImpl extends AbstractCollection<Integer> {
245                 Collection<Integer> c;
246 
247                 AbstractCollectionImpl(Collection<Integer> c) {
248                     this.c = c;
249                 }
250 
251                 @Override
252                 public Iterator<Integer> iterator() {
253                     return c.iterator();
254                 }
255 
256                 @Override
257                 public int size() {
258                     return c.size();
259                 }
260             }
261             db.addCollection(
262                     c -> new AbstractCollectionImpl(c));
263 
264             class AbstractListImpl extends AbstractList<Integer> {
265                 List<Integer> l;
266 
267                 AbstractListImpl(Collection<Integer> c) {
268                     this.l = new ArrayList<>(c);
269                 }
270 
271                 @Override
272                 public Integer get(int index) {
273                     return l.get(index);
274                 }
275 
276                 @Override
277                 public int size() {
278                     return l.size();
279                 }
280             }
281             db.addCollection(
282                     c -> new AbstractListImpl(c));
283 
284             class AbstractSetImpl extends AbstractSet<Integer> {
285                 Set<Integer> s;
286 
287                 AbstractSetImpl(Collection<Integer> c) {
288                     this.s = new HashSet<>(c);
289                 }
290 
291                 @Override
292                 public Iterator<Integer> iterator() {
293                     return s.iterator();
294                 }
295 
296                 @Override
297                 public int size() {
298                     return s.size();
299                 }
300             }
301             db.addCollection(
302                     c -> new AbstractSetImpl(c));
303 
304             class AbstractSortedSetImpl extends AbstractSet<Integer> implements SortedSet<Integer> {
305                 SortedSet<Integer> s;
306 
307                 AbstractSortedSetImpl(Collection<Integer> c) {
308                     this.s = new TreeSet<>(c);
309                 }
310 
311                 @Override
312                 public Iterator<Integer> iterator() {
313                     return s.iterator();
314                 }
315 
316                 @Override
317                 public int size() {
318                     return s.size();
319                 }
320 
321                 @Override
322                 public Comparator<? super Integer> comparator() {
323                     return s.comparator();
324                 }
325 
326                 @Override
327                 public SortedSet<Integer> subSet(Integer fromElement, Integer toElement) {
328                     return s.subSet(fromElement, toElement);
329                 }
330 
331                 @Override
332                 public SortedSet<Integer> headSet(Integer toElement) {
333                     return s.headSet(toElement);
334                 }
335 
336                 @Override
337                 public SortedSet<Integer> tailSet(Integer fromElement) {
338                     return s.tailSet(fromElement);
339                 }
340 
341                 @Override
342                 public Integer first() {
343                     return s.first();
344                 }
345 
346                 @Override
347                 public Integer last() {
348                     return s.last();
349                 }
350 
351                 @Override
352                 public Spliterator<Integer> spliterator() {
353                     return SortedSet.super.spliterator();
354                 }
355             }
356             db.addCollection(
357                     c -> new AbstractSortedSetImpl(c));
358 
359             class IterableWrapper implements Iterable<Integer> {
360                 final Iterable<Integer> it;
361 
362                 IterableWrapper(Iterable<Integer> it) {
363                     this.it = it;
364                 }
365 
366                 @Override
367                 public Iterator<Integer> iterator() {
368                     return it.iterator();
369                 }
370             }
371             db.add("new Iterable.spliterator()",
372                    () -> new IterableWrapper(exp).spliterator());
373 
374             //
375 
376             db.add("Arrays.asList().spliterator()",
377                    () -> Spliterators.spliterator(Arrays.asList(exp.toArray(new Integer[0])), 0));
378 
379             db.addList(ArrayList::new);
380 
381             db.addList(LinkedList::new);
382 
383             db.addList(Vector::new);
384 
385             class AbstractRandomAccessListImpl extends AbstractList<Integer> implements RandomAccess {
386                 Integer[] ia;
387 
388                 AbstractRandomAccessListImpl(Collection<Integer> c) {
389                     this.ia = c.toArray(new Integer[c.size()]);
390                 }
391 
392                 @Override
393                 public Integer get(int index) {
394                     return ia[index];
395                 }
396 
397                 @Override
398                 public int size() {
399                     return ia.length;
400                 }
401             }
402             db.addList(AbstractRandomAccessListImpl::new);
403 
404             class RandomAccessListImpl implements List<Integer>, RandomAccess {
405                 Integer[] ia;
406                 List<Integer> l;
407 
408                 RandomAccessListImpl(Collection<Integer> c) {
409                     this.ia = c.toArray(new Integer[c.size()]);
410                     this.l = Arrays.asList(ia);
411                 }
412 
413                 @Override
414                 public Integer get(int index) {
415                     return ia[index];
416                 }
417 
418                 @Override
419                 public Integer set(int index, Integer element) {
420                     throw new UnsupportedOperationException();
421                 }
422 
423                 @Override
424                 public void add(int index, Integer element) {
425                     throw new UnsupportedOperationException();
426                 }
427 
428                 @Override
429                 public Integer remove(int index) {
430                     throw new UnsupportedOperationException();
431                 }
432 
433                 @Override
434                 public int indexOf(Object o) {
435                     return l.indexOf(o);
436                 }
437 
438                 @Override
439                 public int lastIndexOf(Object o) {
440                     return Arrays.asList(ia).lastIndexOf(o);
441                 }
442 
443                 @Override
444                 public ListIterator<Integer> listIterator() {
445                     return l.listIterator();
446                 }
447 
448                 @Override
449                 public ListIterator<Integer> listIterator(int index) {
450                     return l.listIterator(index);
451                 }
452 
453                 @Override
454                 public List<Integer> subList(int fromIndex, int toIndex) {
455                     return l.subList(fromIndex, toIndex);
456                 }
457 
458                 @Override
459                 public int size() {
460                     return ia.length;
461                 }
462 
463                 @Override
464                 public boolean isEmpty() {
465                     return size() != 0;
466                 }
467 
468                 @Override
469                 public boolean contains(Object o) {
470                     return l.contains(o);
471                 }
472 
473                 @Override
474                 public Iterator<Integer> iterator() {
475                     return l.iterator();
476                 }
477 
478                 @Override
479                 public Object[] toArray() {
480                     return l.toArray();
481                 }
482 
483                 @Override
484                 public <T> T[] toArray(T[] a) {
485                     return l.toArray(a);
486                 }
487 
488                 @Override
489                 public boolean add(Integer integer) {
490                     throw new UnsupportedOperationException();
491                 }
492 
493                 @Override
494                 public boolean remove(Object o) {
495                     throw new UnsupportedOperationException();
496                 }
497 
498                 @Override
499                 public boolean containsAll(Collection<?> c) {
500                     return l.containsAll(c);
501                 }
502 
503                 @Override
504                 public boolean addAll(Collection<? extends Integer> c) {
505                     throw new UnsupportedOperationException();
506                 }
507 
508                 @Override
509                 public boolean addAll(int index, Collection<? extends Integer> c) {
510                     throw new UnsupportedOperationException();
511                 }
512 
513                 @Override
514                 public boolean removeAll(Collection<?> c) {
515                     throw new UnsupportedOperationException();
516                 }
517 
518                 @Override
519                 public boolean retainAll(Collection<?> c) {
520                     throw new UnsupportedOperationException();
521                 }
522 
523                 @Override
524                 public void clear() {
525                     throw new UnsupportedOperationException();
526                 }
527             }
528             db.addList(RandomAccessListImpl::new);
529 
530             db.addCollection(HashSet::new);
531 
532             db.addCollection(LinkedHashSet::new);
533 
534             db.addCollection(TreeSet::new);
535 
536 
537             db.addCollection(c -> { Stack<Integer> s = new Stack<>(); s.addAll(c); return s;});
538 
539             db.addCollection(PriorityQueue::new);
540 
541             db.addCollection(ArrayDeque::new);
542 
543 
544             db.addCollection(ConcurrentSkipListSet::new);
545 
546             if (size > 0) {
547                 db.addCollection(c -> {
548                     ArrayBlockingQueue<Integer> abq = new ArrayBlockingQueue<>(size);
549                     abq.addAll(c);
550                     return abq;
551                 });
552             }
553 
554             db.addCollection(PriorityBlockingQueue::new);
555 
556             db.addCollection(LinkedBlockingQueue::new);
557 
558             db.addCollection(LinkedTransferQueue::new);
559 
560             db.addCollection(ConcurrentLinkedQueue::new);
561 
562             db.addCollection(LinkedBlockingDeque::new);
563 
564             db.addCollection(CopyOnWriteArrayList::new);
565 
566             db.addCollection(CopyOnWriteArraySet::new);
567 
568             if (size == 0) {
569                 db.addCollection(c -> Collections.<Integer>emptySet());
570                 db.addList(c -> Collections.<Integer>emptyList());
571             }
572             else if (size == 1) {
573                 db.addCollection(c -> Collections.singleton(exp.get(0)));
574                 db.addCollection(c -> Collections.singletonList(exp.get(0)));
575             }
576 
577             {
578                 Integer[] ai = new Integer[size];
579                 Arrays.fill(ai, 1);
580                 db.add(String.format("Collections.nCopies(%d, 1)", exp.size()),
581                        Arrays.asList(ai),
582                        () -> Collections.nCopies(exp.size(), 1).spliterator());
583             }
584 
585             // Collections.synchronized/unmodifiable/checked wrappers
586             db.addCollection(Collections::unmodifiableCollection);
587             db.addCollection(c -> Collections.unmodifiableSet(new HashSet<>(c)));
588             db.addCollection(c -> Collections.unmodifiableSortedSet(new TreeSet<>(c)));
589             db.addList(c -> Collections.unmodifiableList(new ArrayList<>(c)));
590             db.addMap(Collections::unmodifiableMap);
591             db.addMap(m -> Collections.unmodifiableSortedMap(new TreeMap<>(m)));
592 
593             db.addCollection(Collections::synchronizedCollection);
594             db.addCollection(c -> Collections.synchronizedSet(new HashSet<>(c)));
595             db.addCollection(c -> Collections.synchronizedSortedSet(new TreeSet<>(c)));
596             db.addList(c -> Collections.synchronizedList(new ArrayList<>(c)));
597             db.addMap(Collections::synchronizedMap);
598             db.addMap(m -> Collections.synchronizedSortedMap(new TreeMap<>(m)));
599 
600             db.addCollection(c -> Collections.checkedCollection(c, Integer.class));
601             db.addCollection(c -> Collections.checkedQueue(new ArrayDeque<>(c), Integer.class));
602             db.addCollection(c -> Collections.checkedSet(new HashSet<>(c), Integer.class));
603             db.addCollection(c -> Collections.checkedSortedSet(new TreeSet<>(c), Integer.class));
604             db.addList(c -> Collections.checkedList(new ArrayList<>(c), Integer.class));
605             db.addMap(c -> Collections.checkedMap(c, Integer.class, Integer.class));
606             db.addMap(m -> Collections.checkedSortedMap(new TreeMap<>(m), Integer.class, Integer.class));
607 
608             // Maps
609 
610             db.addMap(HashMap::new);
611 
612             db.addMap(m -> {
613                 // Create a Map ensuring that for large sizes
614                 // buckets will contain 2 or more entries
615                 HashMap<Integer, Integer> cm = new HashMap<>(1, m.size() + 1);
616                 // Don't use putAll which inflates the table by
617                 // m.size() * loadFactor, thus creating a very sparse
618                 // map for 1000 entries defeating the purpose of this test,
619                 // in addition it will cause the split until null test to fail
620                 // because the number of valid splits is larger than the
621                 // threshold
622                 for (Map.Entry<Integer, Integer> e : m.entrySet())
623                     cm.put(e.getKey(), e.getValue());
624                 return cm;
625             }, "new java.util.HashMap(1, size + 1)");
626 
627             db.addMap(LinkedHashMap::new);
628 
629             db.addMap(IdentityHashMap::new);
630 
631             db.addMap(WeakHashMap::new);
632 
633             db.addMap(m -> {
634                 // Create a Map ensuring that for large sizes
635                 // buckets will be consist of 2 or more entries
636                 WeakHashMap<Integer, Integer> cm = new WeakHashMap<>(1, m.size() + 1);
637                 for (Map.Entry<Integer, Integer> e : m.entrySet())
638                     cm.put(e.getKey(), e.getValue());
639                 return cm;
640             }, "new java.util.WeakHashMap(1, size + 1)");
641 
642             // @@@  Descending maps etc
643             db.addMap(TreeMap::new);
644 
645             db.addMap(ConcurrentHashMap::new);
646 
647             db.addMap(ConcurrentSkipListMap::new);
648 
649             if (size == 0) {
650                 db.addMap(m -> Collections.<Integer, Integer>emptyMap());
651             }
652             else if (size == 1) {
653                 db.addMap(m -> Collections.singletonMap(exp.get(0), exp.get(0)));
654             }
655         }
656 
657         return spliteratorDataProvider = data.toArray(new Object[0][]);
658     }
659 
listIntRange(int upTo)660     private static List<Integer> listIntRange(int upTo) {
661         List<Integer> exp = new ArrayList<>();
662         for (int i = 0; i < upTo; i++)
663             exp.add(i);
664         return Collections.unmodifiableList(exp);
665     }
666 
667     @Test(dataProvider = "Spliterator<Integer>")
testNullPointerException(String description, Collection<Integer> exp, Supplier<Spliterator<Integer>> s)668     public void testNullPointerException(String description, Collection<Integer> exp, Supplier<Spliterator<Integer>> s) {
669         assertThrowsNPE(() -> s.get().forEachRemaining(null));
670         assertThrowsNPE(() -> s.get().tryAdvance(null));
671     }
672 
673     @Test(dataProvider = "Spliterator<Integer>")
testForEach(String description, Collection<Integer> exp, Supplier<Spliterator<Integer>> s)674     public void testForEach(String description, Collection<Integer> exp, Supplier<Spliterator<Integer>> s) {
675         testForEach(exp, s, UnaryOperator.identity());
676     }
677 
678     @Test(dataProvider = "Spliterator<Integer>")
testTryAdvance(String description, Collection<Integer> exp, Supplier<Spliterator<Integer>> s)679     public void testTryAdvance(String description, Collection<Integer> exp, Supplier<Spliterator<Integer>> s) {
680         testTryAdvance(exp, s, UnaryOperator.identity());
681     }
682 
683     @Test(dataProvider = "Spliterator<Integer>")
testMixedTryAdvanceForEach(String description, Collection<Integer> exp, Supplier<Spliterator<Integer>> s)684     public void testMixedTryAdvanceForEach(String description, Collection<Integer> exp, Supplier<Spliterator<Integer>> s) {
685         testMixedTryAdvanceForEach(exp, s, UnaryOperator.identity());
686     }
687 
688     @Test(dataProvider = "Spliterator<Integer>")
testMixedTraverseAndSplit(String description, Collection<Integer> exp, Supplier<Spliterator<Integer>> s)689     public void testMixedTraverseAndSplit(String description, Collection<Integer> exp, Supplier<Spliterator<Integer>> s) {
690         testMixedTraverseAndSplit(exp, s, UnaryOperator.identity());
691     }
692 
693     @Test(dataProvider = "Spliterator<Integer>")
testSplitAfterFullTraversal(String description, Collection<Integer> exp, Supplier<Spliterator<Integer>> s)694     public void testSplitAfterFullTraversal(String description, Collection<Integer> exp, Supplier<Spliterator<Integer>> s) {
695         testSplitAfterFullTraversal(s, UnaryOperator.identity());
696     }
697 
698     @Test(dataProvider = "Spliterator<Integer>")
testSplitOnce(String description, Collection<Integer> exp, Supplier<Spliterator<Integer>> s)699     public void testSplitOnce(String description, Collection<Integer> exp, Supplier<Spliterator<Integer>> s) {
700         testSplitOnce(exp, s, UnaryOperator.identity());
701     }
702 
703     @Test(dataProvider = "Spliterator<Integer>")
testSplitSixDeep(String description, Collection<Integer> exp, Supplier<Spliterator<Integer>> s)704     public void testSplitSixDeep(String description, Collection<Integer> exp, Supplier<Spliterator<Integer>> s) {
705         testSplitSixDeep(exp, s, UnaryOperator.identity());
706     }
707 
708     @Test(dataProvider = "Spliterator<Integer>")
testSplitUntilNull(String description, Collection<Integer> exp, Supplier<Spliterator<Integer>> s)709     public void testSplitUntilNull(String description, Collection<Integer> exp, Supplier<Spliterator<Integer>> s) {
710         testSplitUntilNull(exp, s, UnaryOperator.identity());
711     }
712 
713     //
714     private static class SpliteratorOfIntCharDataBuilder {
715         List<Object[]> data;
716 
717         String s;
718 
719         List<Integer> expChars;
720 
721         List<Integer> expCodePoints;
722 
SpliteratorOfIntCharDataBuilder(List<Object[]> data, String s)723         SpliteratorOfIntCharDataBuilder(List<Object[]> data, String s) {
724             this.data = data;
725             this.s = s;
726             this.expChars = transform(s, false);
727             this.expCodePoints = transform(s, true);
728         }
729 
transform(String s, boolean toCodePoints)730         static List<Integer> transform(String s, boolean toCodePoints) {
731             List<Integer> l = new ArrayList<>();
732 
733             if (!toCodePoints) {
734                 for (int i = 0; i < s.length(); i++) {
735                     l.add((int) s.charAt(i));
736                 }
737             }
738             else {
739                 for (int i = 0; i < s.length();) {
740                     char c1 = s.charAt(i++);
741                     int cp = c1;
742                     if (Character.isHighSurrogate(c1) && i < s.length()) {
743                         char c2 = s.charAt(i);
744                         if (Character.isLowSurrogate(c2)) {
745                             i++;
746                             cp = Character.toCodePoint(c1, c2);
747                         }
748                     }
749                     l.add(cp);
750                 }
751             }
752             return l;
753         }
754 
add(String description, Function<String, CharSequence> f)755         void add(String description, Function<String, CharSequence> f) {
756             description = description.replace("%s", s);
757             {
758                 Supplier<Spliterator.OfInt> supplier = () -> f.apply(s).chars().spliterator();
759                 data.add(new Object[]{description + ".chars().spliterator()", expChars, supplier});
760             }
761             {
762                 Supplier<Spliterator.OfInt> supplier = () -> f.apply(s).codePoints().spliterator();
763                 data.add(new Object[]{description + ".codePoints().spliterator()", expCodePoints, supplier});
764             }
765         }
766     }
767 
768     static Object[][] spliteratorOfIntDataProvider;
769 
770     @DataProvider(name = "Spliterator.OfInt")
spliteratorOfIntDataProvider()771     public static Object[][] spliteratorOfIntDataProvider() {
772         if (spliteratorOfIntDataProvider != null) {
773             return spliteratorOfIntDataProvider;
774         }
775 
776         List<Object[]> data = new ArrayList<>();
777         for (int size : SIZES) {
778             int exp[] = arrayIntRange(size);
779             SpliteratorOfIntDataBuilder db = new SpliteratorOfIntDataBuilder(data, listIntRange(size));
780 
781             db.add("Spliterators.spliterator(int[], ...)",
782                    () -> Spliterators.spliterator(exp, 0));
783 
784             db.add("Arrays.spliterator(int[], ...)",
785                    () -> Arrays.spliterator(exp));
786 
787             db.add("Spliterators.spliterator(PrimitiveIterator.OfInt, ...)",
788                    () -> Spliterators.spliterator(Spliterators.iterator(Arrays.spliterator(exp)), exp.length, 0));
789 
790             db.add("Spliterators.spliteratorUnknownSize(PrimitiveIterator.OfInt, ...)",
791                    () -> Spliterators.spliteratorUnknownSize(Spliterators.iterator(Arrays.spliterator(exp)), 0));
792 
793             class IntSpliteratorFromArray extends Spliterators.AbstractIntSpliterator {
794                 int[] a;
795                 int index = 0;
796 
797                 IntSpliteratorFromArray(int[] a) {
798                     super(a.length, Spliterator.SIZED);
799                     this.a = a;
800                 }
801 
802                 @Override
803                 public boolean tryAdvance(IntConsumer action) {
804                     if (action == null)
805                         throw new NullPointerException();
806                     if (index < a.length) {
807                         action.accept(a[index++]);
808                         return true;
809                     }
810                     else {
811                         return false;
812                     }
813                 }
814             }
815             db.add("new Spliterators.AbstractIntAdvancingSpliterator()",
816                    () -> new IntSpliteratorFromArray(exp));
817         }
818 
819         // Class for testing default methods
820         class CharSequenceImpl implements CharSequence {
821             final String s;
822 
823             public CharSequenceImpl(String s) {
824                 this.s = s;
825             }
826 
827             @Override
828             public int length() {
829                 return s.length();
830             }
831 
832             @Override
833             public char charAt(int index) {
834                 return s.charAt(index);
835             }
836 
837             @Override
838             public CharSequence subSequence(int start, int end) {
839                 return s.subSequence(start, end);
840             }
841 
842             @Override
843             public String toString() {
844                 return s;
845             }
846         }
847 
848         for (String string : STRINGS) {
849             SpliteratorOfIntCharDataBuilder cdb = new SpliteratorOfIntCharDataBuilder(data, string);
850             cdb.add("\"%s\"", s -> s);
851             cdb.add("new CharSequenceImpl(\"%s\")", CharSequenceImpl::new);
852             cdb.add("new StringBuilder(\"%s\")", StringBuilder::new);
853             cdb.add("new StringBuffer(\"%s\")", StringBuffer::new);
854             cdb.add("CharBuffer.wrap(\"%s\".toCharArray())", s -> CharBuffer.wrap(s.toCharArray()));
855         }
856 
857         return spliteratorOfIntDataProvider = data.toArray(new Object[0][]);
858     }
859 
arrayIntRange(int upTo)860     private static int[] arrayIntRange(int upTo) {
861         int[] exp = new int[upTo];
862         for (int i = 0; i < upTo; i++)
863             exp[i] = i;
864         return exp;
865     }
866 
867     @Test(dataProvider = "Spliterator.OfInt")
testIntNullPointerException(String description, Collection<Integer> exp, Supplier<Spliterator.OfInt> s)868     public void testIntNullPointerException(String description, Collection<Integer> exp, Supplier<Spliterator.OfInt> s) {
869         assertThrowsNPE(() -> s.get().forEachRemaining((IntConsumer) null));
870         assertThrowsNPE(() -> s.get().tryAdvance((IntConsumer) null));
871     }
872 
873     @Test(dataProvider = "Spliterator.OfInt")
testIntForEach(String description, Collection<Integer> exp, Supplier<Spliterator.OfInt> s)874     public void testIntForEach(String description, Collection<Integer> exp, Supplier<Spliterator.OfInt> s) {
875         testForEach(exp, s, intBoxingConsumer());
876     }
877 
878     @Test(dataProvider = "Spliterator.OfInt")
testIntTryAdvance(String description, Collection<Integer> exp, Supplier<Spliterator.OfInt> s)879     public void testIntTryAdvance(String description, Collection<Integer> exp, Supplier<Spliterator.OfInt> s) {
880         testTryAdvance(exp, s, intBoxingConsumer());
881     }
882 
883     @Test(dataProvider = "Spliterator.OfInt")
testIntMixedTryAdvanceForEach(String description, Collection<Integer> exp, Supplier<Spliterator.OfInt> s)884     public void testIntMixedTryAdvanceForEach(String description, Collection<Integer> exp, Supplier<Spliterator.OfInt> s) {
885         testMixedTryAdvanceForEach(exp, s, intBoxingConsumer());
886     }
887 
888     @Test(dataProvider = "Spliterator.OfInt")
testIntMixedTraverseAndSplit(String description, Collection<Integer> exp, Supplier<Spliterator.OfInt> s)889     public void testIntMixedTraverseAndSplit(String description, Collection<Integer> exp, Supplier<Spliterator.OfInt> s) {
890         testMixedTraverseAndSplit(exp, s, intBoxingConsumer());
891     }
892 
893     @Test(dataProvider = "Spliterator.OfInt")
testIntSplitAfterFullTraversal(String description, Collection<Integer> exp, Supplier<Spliterator.OfInt> s)894     public void testIntSplitAfterFullTraversal(String description, Collection<Integer> exp, Supplier<Spliterator.OfInt> s) {
895         testSplitAfterFullTraversal(s, intBoxingConsumer());
896     }
897 
898     @Test(dataProvider = "Spliterator.OfInt")
testIntSplitOnce(String description, Collection<Integer> exp, Supplier<Spliterator.OfInt> s)899     public void testIntSplitOnce(String description, Collection<Integer> exp, Supplier<Spliterator.OfInt> s) {
900         testSplitOnce(exp, s, intBoxingConsumer());
901     }
902 
903     @Test(dataProvider = "Spliterator.OfInt")
testIntSplitSixDeep(String description, Collection<Integer> exp, Supplier<Spliterator.OfInt> s)904     public void testIntSplitSixDeep(String description, Collection<Integer> exp, Supplier<Spliterator.OfInt> s) {
905         testSplitSixDeep(exp, s, intBoxingConsumer());
906     }
907 
908     @Test(dataProvider = "Spliterator.OfInt")
testIntSplitUntilNull(String description, Collection<Integer> exp, Supplier<Spliterator.OfInt> s)909     public void testIntSplitUntilNull(String description, Collection<Integer> exp, Supplier<Spliterator.OfInt> s) {
910         testSplitUntilNull(exp, s, intBoxingConsumer());
911     }
912 
913     //
914 
915     private static class SpliteratorOfLongDataBuilder {
916         List<Object[]> data;
917 
918         List<Long> exp;
919 
SpliteratorOfLongDataBuilder(List<Object[]> data, List<Long> exp)920         SpliteratorOfLongDataBuilder(List<Object[]> data, List<Long> exp) {
921             this.data = data;
922             this.exp = exp;
923         }
924 
add(String description, List<Long> expected, Supplier<Spliterator.OfLong> s)925         void add(String description, List<Long> expected, Supplier<Spliterator.OfLong> s) {
926             description = joiner(description).toString();
927             data.add(new Object[]{description, expected, s});
928         }
929 
add(String description, Supplier<Spliterator.OfLong> s)930         void add(String description, Supplier<Spliterator.OfLong> s) {
931             add(description, exp, s);
932         }
933 
joiner(String description)934         StringBuilder joiner(String description) {
935             return new StringBuilder(description).
936                     append(" {").
937                     append("size=").append(exp.size()).
938                     append("}");
939         }
940     }
941 
942     static Object[][] spliteratorOfLongDataProvider;
943 
944     @DataProvider(name = "Spliterator.OfLong")
spliteratorOfLongDataProvider()945     public static Object[][] spliteratorOfLongDataProvider() {
946         if (spliteratorOfLongDataProvider != null) {
947             return spliteratorOfLongDataProvider;
948         }
949 
950         List<Object[]> data = new ArrayList<>();
951         for (int size : SIZES) {
952             long exp[] = arrayLongRange(size);
953             SpliteratorOfLongDataBuilder db = new SpliteratorOfLongDataBuilder(data, listLongRange(size));
954 
955             db.add("Spliterators.spliterator(long[], ...)",
956                    () -> Spliterators.spliterator(exp, 0));
957 
958             db.add("Arrays.spliterator(long[], ...)",
959                    () -> Arrays.spliterator(exp));
960 
961             db.add("Spliterators.spliterator(PrimitiveIterator.OfLong, ...)",
962                    () -> Spliterators.spliterator(Spliterators.iterator(Arrays.spliterator(exp)), exp.length, 0));
963 
964             db.add("Spliterators.spliteratorUnknownSize(PrimitiveIterator.OfLong, ...)",
965                    () -> Spliterators.spliteratorUnknownSize(Spliterators.iterator(Arrays.spliterator(exp)), 0));
966 
967             class LongSpliteratorFromArray extends Spliterators.AbstractLongSpliterator {
968                 long[] a;
969                 int index = 0;
970 
971                 LongSpliteratorFromArray(long[] a) {
972                     super(a.length, Spliterator.SIZED);
973                     this.a = a;
974                 }
975 
976                 @Override
977                 public boolean tryAdvance(LongConsumer action) {
978                     if (action == null)
979                         throw new NullPointerException();
980                     if (index < a.length) {
981                         action.accept(a[index++]);
982                         return true;
983                     }
984                     else {
985                         return false;
986                     }
987                 }
988             }
989             db.add("new Spliterators.AbstractLongAdvancingSpliterator()",
990                    () -> new LongSpliteratorFromArray(exp));
991         }
992 
993         return spliteratorOfLongDataProvider = data.toArray(new Object[0][]);
994     }
995 
listLongRange(int upTo)996     private static List<Long> listLongRange(int upTo) {
997         List<Long> exp = new ArrayList<>();
998         for (long i = 0; i < upTo; i++)
999             exp.add(i);
1000         return Collections.unmodifiableList(exp);
1001     }
1002 
arrayLongRange(int upTo)1003     private static long[] arrayLongRange(int upTo) {
1004         long[] exp = new long[upTo];
1005         for (int i = 0; i < upTo; i++)
1006             exp[i] = i;
1007         return exp;
1008     }
1009 
1010     @Test(dataProvider = "Spliterator.OfLong")
testLongNullPointerException(String description, Collection<Long> exp, Supplier<Spliterator.OfLong> s)1011     public void testLongNullPointerException(String description, Collection<Long> exp, Supplier<Spliterator.OfLong> s) {
1012         assertThrowsNPE(() -> s.get().forEachRemaining((LongConsumer) null));
1013         assertThrowsNPE(() -> s.get().tryAdvance((LongConsumer) null));
1014     }
1015 
1016     @Test(dataProvider = "Spliterator.OfLong")
testLongForEach(String description, Collection<Long> exp, Supplier<Spliterator.OfLong> s)1017     public void testLongForEach(String description, Collection<Long> exp, Supplier<Spliterator.OfLong> s) {
1018         testForEach(exp, s, longBoxingConsumer());
1019     }
1020 
1021     @Test(dataProvider = "Spliterator.OfLong")
testLongTryAdvance(String description, Collection<Long> exp, Supplier<Spliterator.OfLong> s)1022     public void testLongTryAdvance(String description, Collection<Long> exp, Supplier<Spliterator.OfLong> s) {
1023         testTryAdvance(exp, s, longBoxingConsumer());
1024     }
1025 
1026     @Test(dataProvider = "Spliterator.OfLong")
testLongMixedTryAdvanceForEach(String description, Collection<Long> exp, Supplier<Spliterator.OfLong> s)1027     public void testLongMixedTryAdvanceForEach(String description, Collection<Long> exp, Supplier<Spliterator.OfLong> s) {
1028         testMixedTryAdvanceForEach(exp, s, longBoxingConsumer());
1029     }
1030 
1031     @Test(dataProvider = "Spliterator.OfLong")
testLongMixedTraverseAndSplit(String description, Collection<Long> exp, Supplier<Spliterator.OfLong> s)1032     public void testLongMixedTraverseAndSplit(String description, Collection<Long> exp, Supplier<Spliterator.OfLong> s) {
1033         testMixedTraverseAndSplit(exp, s, longBoxingConsumer());
1034     }
1035 
1036     @Test(dataProvider = "Spliterator.OfLong")
testLongSplitAfterFullTraversal(String description, Collection<Long> exp, Supplier<Spliterator.OfLong> s)1037     public void testLongSplitAfterFullTraversal(String description, Collection<Long> exp, Supplier<Spliterator.OfLong> s) {
1038         testSplitAfterFullTraversal(s, longBoxingConsumer());
1039     }
1040 
1041     @Test(dataProvider = "Spliterator.OfLong")
testLongSplitOnce(String description, Collection<Long> exp, Supplier<Spliterator.OfLong> s)1042     public void testLongSplitOnce(String description, Collection<Long> exp, Supplier<Spliterator.OfLong> s) {
1043         testSplitOnce(exp, s, longBoxingConsumer());
1044     }
1045 
1046     @Test(dataProvider = "Spliterator.OfLong")
testLongSplitSixDeep(String description, Collection<Long> exp, Supplier<Spliterator.OfLong> s)1047     public void testLongSplitSixDeep(String description, Collection<Long> exp, Supplier<Spliterator.OfLong> s) {
1048         testSplitSixDeep(exp, s, longBoxingConsumer());
1049     }
1050 
1051     @Test(dataProvider = "Spliterator.OfLong")
testLongSplitUntilNull(String description, Collection<Long> exp, Supplier<Spliterator.OfLong> s)1052     public void testLongSplitUntilNull(String description, Collection<Long> exp, Supplier<Spliterator.OfLong> s) {
1053         testSplitUntilNull(exp, s, longBoxingConsumer());
1054     }
1055 
1056     //
1057 
1058     private static class SpliteratorOfDoubleDataBuilder {
1059         List<Object[]> data;
1060 
1061         List<Double> exp;
1062 
SpliteratorOfDoubleDataBuilder(List<Object[]> data, List<Double> exp)1063         SpliteratorOfDoubleDataBuilder(List<Object[]> data, List<Double> exp) {
1064             this.data = data;
1065             this.exp = exp;
1066         }
1067 
add(String description, List<Double> expected, Supplier<Spliterator.OfDouble> s)1068         void add(String description, List<Double> expected, Supplier<Spliterator.OfDouble> s) {
1069             description = joiner(description).toString();
1070             data.add(new Object[]{description, expected, s});
1071         }
1072 
add(String description, Supplier<Spliterator.OfDouble> s)1073         void add(String description, Supplier<Spliterator.OfDouble> s) {
1074             add(description, exp, s);
1075         }
1076 
joiner(String description)1077         StringBuilder joiner(String description) {
1078             return new StringBuilder(description).
1079                     append(" {").
1080                     append("size=").append(exp.size()).
1081                     append("}");
1082         }
1083     }
1084 
1085     static Object[][] spliteratorOfDoubleDataProvider;
1086 
1087     @DataProvider(name = "Spliterator.OfDouble")
spliteratorOfDoubleDataProvider()1088     public static Object[][] spliteratorOfDoubleDataProvider() {
1089         if (spliteratorOfDoubleDataProvider != null) {
1090             return spliteratorOfDoubleDataProvider;
1091         }
1092 
1093         List<Object[]> data = new ArrayList<>();
1094         for (int size : SIZES) {
1095             double exp[] = arrayDoubleRange(size);
1096             SpliteratorOfDoubleDataBuilder db = new SpliteratorOfDoubleDataBuilder(data, listDoubleRange(size));
1097 
1098             db.add("Spliterators.spliterator(double[], ...)",
1099                    () -> Spliterators.spliterator(exp, 0));
1100 
1101             db.add("Arrays.spliterator(double[], ...)",
1102                    () -> Arrays.spliterator(exp));
1103 
1104             db.add("Spliterators.spliterator(PrimitiveIterator.OfDouble, ...)",
1105                    () -> Spliterators.spliterator(Spliterators.iterator(Arrays.spliterator(exp)), exp.length, 0));
1106 
1107             db.add("Spliterators.spliteratorUnknownSize(PrimitiveIterator.OfDouble, ...)",
1108                    () -> Spliterators.spliteratorUnknownSize(Spliterators.iterator(Arrays.spliterator(exp)), 0));
1109 
1110             class DoubleSpliteratorFromArray extends Spliterators.AbstractDoubleSpliterator {
1111                 double[] a;
1112                 int index = 0;
1113 
1114                 DoubleSpliteratorFromArray(double[] a) {
1115                     super(a.length, Spliterator.SIZED);
1116                     this.a = a;
1117                 }
1118 
1119                 @Override
1120                 public boolean tryAdvance(DoubleConsumer action) {
1121                     if (action == null)
1122                         throw new NullPointerException();
1123                     if (index < a.length) {
1124                         action.accept(a[index++]);
1125                         return true;
1126                     }
1127                     else {
1128                         return false;
1129                     }
1130                 }
1131             }
1132             db.add("new Spliterators.AbstractDoubleAdvancingSpliterator()",
1133                    () -> new DoubleSpliteratorFromArray(exp));
1134         }
1135 
1136         return spliteratorOfDoubleDataProvider = data.toArray(new Object[0][]);
1137     }
1138 
listDoubleRange(int upTo)1139     private static List<Double> listDoubleRange(int upTo) {
1140         List<Double> exp = new ArrayList<>();
1141         for (double i = 0; i < upTo; i++)
1142             exp.add(i);
1143         return Collections.unmodifiableList(exp);
1144     }
1145 
arrayDoubleRange(int upTo)1146     private static double[] arrayDoubleRange(int upTo) {
1147         double[] exp = new double[upTo];
1148         for (int i = 0; i < upTo; i++)
1149             exp[i] = i;
1150         return exp;
1151     }
1152 
1153     @Test(dataProvider = "Spliterator.OfDouble")
testDoubleNullPointerException(String description, Collection<Double> exp, Supplier<Spliterator.OfDouble> s)1154     public void testDoubleNullPointerException(String description, Collection<Double> exp, Supplier<Spliterator.OfDouble> s) {
1155         assertThrowsNPE(() -> s.get().forEachRemaining((DoubleConsumer) null));
1156         assertThrowsNPE(() -> s.get().tryAdvance((DoubleConsumer) null));
1157     }
1158 
1159     @Test(dataProvider = "Spliterator.OfDouble")
testDoubleForEach(String description, Collection<Double> exp, Supplier<Spliterator.OfDouble> s)1160     public void testDoubleForEach(String description, Collection<Double> exp, Supplier<Spliterator.OfDouble> s) {
1161         testForEach(exp, s, doubleBoxingConsumer());
1162     }
1163 
1164     @Test(dataProvider = "Spliterator.OfDouble")
testDoubleTryAdvance(String description, Collection<Double> exp, Supplier<Spliterator.OfDouble> s)1165     public void testDoubleTryAdvance(String description, Collection<Double> exp, Supplier<Spliterator.OfDouble> s) {
1166         testTryAdvance(exp, s, doubleBoxingConsumer());
1167     }
1168 
1169     @Test(dataProvider = "Spliterator.OfDouble")
testDoubleMixedTryAdvanceForEach(String description, Collection<Double> exp, Supplier<Spliterator.OfDouble> s)1170     public void testDoubleMixedTryAdvanceForEach(String description, Collection<Double> exp, Supplier<Spliterator.OfDouble> s) {
1171         testMixedTryAdvanceForEach(exp, s, doubleBoxingConsumer());
1172     }
1173 
1174     @Test(dataProvider = "Spliterator.OfDouble")
testDoubleMixedTraverseAndSplit(String description, Collection<Double> exp, Supplier<Spliterator.OfDouble> s)1175     public void testDoubleMixedTraverseAndSplit(String description, Collection<Double> exp, Supplier<Spliterator.OfDouble> s) {
1176         testMixedTraverseAndSplit(exp, s, doubleBoxingConsumer());
1177     }
1178 
1179     @Test(dataProvider = "Spliterator.OfDouble")
testDoubleSplitAfterFullTraversal(String description, Collection<Double> exp, Supplier<Spliterator.OfDouble> s)1180     public void testDoubleSplitAfterFullTraversal(String description, Collection<Double> exp, Supplier<Spliterator.OfDouble> s) {
1181         testSplitAfterFullTraversal(s, doubleBoxingConsumer());
1182     }
1183 
1184     @Test(dataProvider = "Spliterator.OfDouble")
testDoubleSplitOnce(String description, Collection<Double> exp, Supplier<Spliterator.OfDouble> s)1185     public void testDoubleSplitOnce(String description, Collection<Double> exp, Supplier<Spliterator.OfDouble> s) {
1186         testSplitOnce(exp, s, doubleBoxingConsumer());
1187     }
1188 
1189     @Test(dataProvider = "Spliterator.OfDouble")
testDoubleSplitSixDeep(String description, Collection<Double> exp, Supplier<Spliterator.OfDouble> s)1190     public void testDoubleSplitSixDeep(String description, Collection<Double> exp, Supplier<Spliterator.OfDouble> s) {
1191         testSplitSixDeep(exp, s, doubleBoxingConsumer());
1192     }
1193 
1194     @Test(dataProvider = "Spliterator.OfDouble")
testDoubleSplitUntilNull(String description, Collection<Double> exp, Supplier<Spliterator.OfDouble> s)1195     public void testDoubleSplitUntilNull(String description, Collection<Double> exp, Supplier<Spliterator.OfDouble> s) {
1196         testSplitUntilNull(exp, s, doubleBoxingConsumer());
1197     }
1198 
1199 }
1200