1289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin/*
2289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
3289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin *
5289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * This code is free software; you can redistribute it and/or modify it
6289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * under the terms of the GNU General Public License version 2 only, as
7289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * published by the Free Software Foundation.
8289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin *
9289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * This code is distributed in the hope that it will be useful, but WITHOUT
10289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * version 2 for more details (a copy is included in the LICENSE file that
13289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * accompanied this code).
14289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin *
15289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * You should have received a copy of the GNU General Public License version
16289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * 2 along with this work; if not, write to the Free Software Foundation,
17289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin *
19289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * or visit www.oracle.com if you need additional information or have any
21289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * questions.
22289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin */
23289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinpackage org.openjdk.testlib.java.util.stream;
24289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
25289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.Arrays;
26289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.Collection;
27289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.Iterator;
28289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.PrimitiveIterator;
29289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.Spliterator;
30289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.Spliterators;
31289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.DoubleConsumer;
32289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.Function;
33289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.IntConsumer;
34289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.LongConsumer;
35289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.Supplier;
36289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.function.ToIntFunction;
37289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport java.util.stream.*;
38289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
39289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin/** Describes a test data set for use in stream tests */
40289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinpublic interface TestData<T, S extends BaseStream<T, S>>
41289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        extends Iterable<T> {
42289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
43289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    default int size() {
44289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        throw new UnsupportedOperationException();
45289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
46289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
47289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    @Override
48289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    default Iterator<T> iterator() {
49289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        return Spliterators.iterator(spliterator());
50289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
51289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
52289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    Spliterator<T> spliterator();
53289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
54289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    default boolean isOrdered() {
55289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        return spliterator().hasCharacteristics(Spliterator.ORDERED);
56289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
57289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
58289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    StreamShape getShape();
59289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
60289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    default <A extends Collection<? super T>> A into(A target) {
61289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        spliterator().forEachRemaining(target::add);
62289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        return target;
63289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
64289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
65289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    S stream();
66289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
67289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    S parallelStream();
68289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
69289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public interface OfRef<T> extends TestData<T, Stream<T>> { }
70289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
71289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public interface OfInt extends TestData<Integer, IntStream> { }
72289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
73289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public interface OfLong extends TestData<Long, LongStream> { }
74289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
75289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public interface OfDouble extends TestData<Double, DoubleStream> { }
76289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
77289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    // @@@ Temporary garbage class to avoid triggering bugs with lambdas in static methods in interfaces
78289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    public static class Factory {
79289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public static <T> OfRef<T> ofArray(String name, T[] array) {
80289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            return new AbstractTestData.RefTestData<>(name, array, Arrays::stream, a -> Arrays.stream(a).parallel(),
81289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      Arrays::spliterator, a -> a.length);
82289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
83289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
84289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public static <T> OfRef<T> ofCollection(String name, Collection<T> collection) {
85289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            return new AbstractTestData.RefTestData<>(name, collection, Collection::stream, Collection::parallelStream,
86289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      Collection::spliterator, Collection::size);
87289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
88289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
89289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public static <T> OfRef<T> ofSpinedBuffer(String name, SpinedBuffer<T> buffer) {
90289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            return new AbstractTestData.RefTestData<>(name, buffer,
91289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      b -> StreamSupport.stream(b.spliterator(), false),
92289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      b -> StreamSupport.stream(b.spliterator(), true),
93289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      SpinedBuffer::spliterator,
94289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      b -> (int) b.count());
95289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
96289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
97289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public static <T> OfRef<T> ofSupplier(String name, Supplier<Stream<T>> supplier) {
98289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            return new AbstractTestData.RefTestData<>(name, supplier,
99289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      Supplier::get,
100289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      s -> s.get().parallel(),
101289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      s -> s.get().spliterator(),
102289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      s -> (int) s.get().spliterator().getExactSizeIfKnown());
103289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
104289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
105289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public static <T> OfRef<T> ofRefNode(String name, Node<T> node) {
106289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            return new AbstractTestData.RefTestData<>(name, node,
107289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      n -> StreamSupport.stream(n::spliterator, Spliterator.SIZED | Spliterator.ORDERED, false),
108289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      n -> StreamSupport.stream(n::spliterator, Spliterator.SIZED | Spliterator.ORDERED, true),
109289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      Node::spliterator,
110289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      n -> (int) n.count());
111289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
112289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
113289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        // int factories
114289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public static <T> OfInt ofArray(String name, int[] array) {
115289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            return new AbstractTestData.IntTestData<>(name, array, Arrays::stream, a -> Arrays.stream(a).parallel(),
116289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      Arrays::spliterator, a -> a.length);
117289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
118289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
119289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public static OfInt ofSpinedBuffer(String name, SpinedBuffer.OfInt buffer) {
120289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            return new AbstractTestData.IntTestData<>(name, buffer,
121289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      b -> StreamSupport.intStream(b.spliterator(), false),
122289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      b -> StreamSupport.intStream(b.spliterator(), true),
123289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      SpinedBuffer.OfInt::spliterator,
124289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      b -> (int) b.count());
125289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
126289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
127289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public static OfInt ofIntSupplier(String name, Supplier<IntStream> supplier) {
128289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            return new AbstractTestData.IntTestData<>(name, supplier,
129289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      Supplier::get,
130289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      s -> s.get().parallel(),
131289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      s -> s.get().spliterator(),
132289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      s -> (int) s.get().spliterator().getExactSizeIfKnown());
133289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
134289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
135289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public static OfInt ofNode(String name, Node.OfInt node) {
136289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            int characteristics = Spliterator.SIZED | Spliterator.ORDERED;
137289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            return new AbstractTestData.IntTestData<>(name, node,
138289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      n -> StreamSupport.intStream(n::spliterator, characteristics, false),
139289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      n -> StreamSupport.intStream(n::spliterator, characteristics, true),
140289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      Node.OfInt::spliterator,
141289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      n -> (int) n.count());
142289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
143289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
144289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        // long factories
145289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public static <T> OfLong ofArray(String name, long[] array) {
146289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            return new AbstractTestData.LongTestData<>(name, array, Arrays::stream, a -> Arrays.stream(a).parallel(),
147289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                       Arrays::spliterator, a -> a.length);
148289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
149289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
150289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public static OfLong ofSpinedBuffer(String name, SpinedBuffer.OfLong buffer) {
151289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            return new AbstractTestData.LongTestData<>(name, buffer,
152289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      b -> StreamSupport.longStream(b.spliterator(), false),
153289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      b -> StreamSupport.longStream(b.spliterator(), true),
154289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      SpinedBuffer.OfLong::spliterator,
155289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      b -> (int) b.count());
156289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
157289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
158289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public static OfLong ofLongSupplier(String name, Supplier<LongStream> supplier) {
159289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            return new AbstractTestData.LongTestData<>(name, supplier,
160289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      Supplier::get,
161289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      s -> s.get().parallel(),
162289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      s -> s.get().spliterator(),
163289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      s -> (int) s.get().spliterator().getExactSizeIfKnown());
164289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
165289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
166289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public static OfLong ofNode(String name, Node.OfLong node) {
167289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            int characteristics = Spliterator.SIZED | Spliterator.ORDERED;
168289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            return new AbstractTestData.LongTestData<>(name, node,
169289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      n -> StreamSupport.longStream(n::spliterator, characteristics, false),
170289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      n -> StreamSupport.longStream(n::spliterator, characteristics, true),
171289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      Node.OfLong::spliterator,
172289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                      n -> (int) n.count());
173289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
174289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
175289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        // double factories
176289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public static <T> OfDouble ofArray(String name, double[] array) {
177289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            return new AbstractTestData.DoubleTestData<>(name, array, Arrays::stream, a -> Arrays.stream(a).parallel(),
178289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                         Arrays::spliterator, a -> a.length);
179289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
180289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
181289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public static OfDouble ofSpinedBuffer(String name, SpinedBuffer.OfDouble buffer) {
182289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            return new AbstractTestData.DoubleTestData<>(name, buffer,
183289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                         b -> StreamSupport.doubleStream(b.spliterator(), false),
184289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                         b -> StreamSupport.doubleStream(b.spliterator(), true),
185289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                         SpinedBuffer.OfDouble::spliterator,
186289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                         b -> (int) b.count());
187289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
188289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
189289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public static OfDouble ofDoubleSupplier(String name, Supplier<DoubleStream> supplier) {
190289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            return new AbstractTestData.DoubleTestData<>(name, supplier,
191289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                         Supplier::get,
192289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                         s -> s.get().parallel(),
193289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                         s -> s.get().spliterator(),
194289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                         s -> (int) s.get().spliterator().getExactSizeIfKnown());
195289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
196289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
197289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public static OfDouble ofNode(String name, Node.OfDouble node) {
198289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            int characteristics = Spliterator.SIZED | Spliterator.ORDERED;
199289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            return new AbstractTestData.DoubleTestData<>(name, node,
200289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                         n -> StreamSupport.doubleStream(n::spliterator, characteristics, false),
201289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                         n -> StreamSupport.doubleStream(n::spliterator, characteristics, true),
202289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                         Node.OfDouble::spliterator,
203289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                                         n -> (int) n.count());
204289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
205289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
206289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
207289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
208289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    abstract class AbstractTestData<T, S extends BaseStream<T, S>,
209289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            T_STATE,
210289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                    T_SPLITR extends Spliterator<T>>
211289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            implements TestData<T, S> {
212289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        private final String name;
213289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        private final StreamShape shape;
214289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        protected final T_STATE state;
215289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        private final ToIntFunction<T_STATE> sizeFn;
216289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        private final Function<T_STATE, S> streamFn;
217289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        private final Function<T_STATE, S> parStreamFn;
218289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        private final Function<T_STATE, T_SPLITR> splitrFn;
219289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
220289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        AbstractTestData(String name,
221289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                         StreamShape shape,
222289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                         T_STATE state,
223289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                         Function<T_STATE, S> streamFn,
224289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                         Function<T_STATE, S> parStreamFn,
225289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                         Function<T_STATE, T_SPLITR> splitrFn,
226289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                         ToIntFunction<T_STATE> sizeFn) {
227289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            this.name = name;
228289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            this.shape = shape;
229289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            this.state = state;
230289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            this.streamFn = streamFn;
231289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            this.parStreamFn = parStreamFn;
232289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            this.splitrFn = splitrFn;
233289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            this.sizeFn = sizeFn;
234289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
235289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
236289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        @Override
237289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public StreamShape getShape() {
238289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            return shape;
239289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
240289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
241289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        @Override
242289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public String toString() {
243289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            return getClass().getSimpleName() + "[" + name + "]";
244289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
245289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
246289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        @Override
247289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public int size() {
248289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            return sizeFn.applyAsInt(state);
249289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
250289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
251289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        @Override
252289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public T_SPLITR spliterator() {
253289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            return splitrFn.apply(state);
254289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
255289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
256289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        @Override
257289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public S stream() {
258289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            return streamFn.apply(state);
259289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
260289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
261289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        @Override
262289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public S parallelStream() {
263289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            return parStreamFn.apply(state);
264289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
265289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
266289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        public static class RefTestData<T, I>
267289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                extends AbstractTestData<T, Stream<T>, I, Spliterator<T>>
268289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                implements TestData.OfRef<T> {
269289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
270289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            protected RefTestData(String name,
271289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                  I state,
272289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                  Function<I, Stream<T>> streamFn,
273289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                  Function<I, Stream<T>> parStreamFn,
274289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                  Function<I, Spliterator<T>> splitrFn,
275289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                  ToIntFunction<I> sizeFn) {
276289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                super(name, StreamShape.REFERENCE, state, streamFn, parStreamFn, splitrFn, sizeFn);
277289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            }
278289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
279289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
280289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
281289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        static class IntTestData<I>
282289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                extends AbstractTestData<Integer, IntStream, I, Spliterator.OfInt>
283289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                implements TestData.OfInt {
284289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
285289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            protected IntTestData(String name,
286289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                  I state,
287289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                  Function<I, IntStream> streamFn,
288289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                  Function<I, IntStream> parStreamFn,
289289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                  Function<I, Spliterator.OfInt> splitrFn,
290289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                  ToIntFunction<I> sizeFn) {
291289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                super(name, StreamShape.INT_VALUE, state, streamFn, parStreamFn, splitrFn, sizeFn);
292289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            }
293289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
294289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            @Override
295289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public PrimitiveIterator.OfInt iterator() {
296289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                return Spliterators.iterator(spliterator());
297289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            }
298289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
299289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            @Override
300289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public <A extends Collection<? super Integer>> A into(A target) {
301289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                spliterator().forEachRemaining((IntConsumer) target::add);
302289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                return target;
303289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            }
304289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
305289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
306289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        static class LongTestData<I>
307289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                extends AbstractTestData<Long, LongStream, I, Spliterator.OfLong>
308289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                implements TestData.OfLong {
309289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
310289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            protected LongTestData(String name,
311289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                   I state,
312289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                   Function<I, LongStream> streamFn,
313289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                   Function<I, LongStream> parStreamFn,
314289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                   Function<I, Spliterator.OfLong> splitrFn,
315289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                   ToIntFunction<I> sizeFn) {
316289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                super(name, StreamShape.LONG_VALUE, state, streamFn, parStreamFn, splitrFn, sizeFn);
317289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            }
318289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
319289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            @Override
320289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public PrimitiveIterator.OfLong iterator() {
321289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                return Spliterators.iterator(spliterator());
322289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            }
323289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
324289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            @Override
325289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public <A extends Collection<? super Long>> A into(A target) {
326289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                spliterator().forEachRemaining((LongConsumer) target::add);
327289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                return target;
328289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            }
329289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
330289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
331289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        static class DoubleTestData<I>
332289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                extends AbstractTestData<Double, DoubleStream, I, Spliterator.OfDouble>
333289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                implements OfDouble {
334289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
335289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            protected DoubleTestData(String name,
336289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                     I state,
337289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                     Function<I, DoubleStream> streamFn,
338289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                     Function<I, DoubleStream> parStreamFn,
339289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                     Function<I, Spliterator.OfDouble> splitrFn,
340289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                                     ToIntFunction<I> sizeFn) {
341289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                super(name, StreamShape.DOUBLE_VALUE, state, streamFn, parStreamFn, splitrFn, sizeFn);
342289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            }
343289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
344289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            @Override
345289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public PrimitiveIterator.OfDouble iterator() {
346289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                return Spliterators.iterator(spliterator());
347289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            }
348289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
349289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            @Override
350289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            public <A extends Collection<? super Double>> A into(A target) {
351289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                spliterator().forEachRemaining((DoubleConsumer) target::add);
352289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin                return target;
353289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin            }
354289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin        }
355289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin    }
356289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin}
357