1a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin/*
2a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
3a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin *
5a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin * This code is free software; you can redistribute it and/or modify it
6a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin * under the terms of the GNU General Public License version 2 only, as
7a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin * published by the Free Software Foundation.
8a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin *
9a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin * This code is distributed in the hope that it will be useful, but WITHOUT
10a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin * version 2 for more details (a copy is included in the LICENSE file that
13a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin * accompanied this code).
14a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin *
15a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin * You should have received a copy of the GNU General Public License version
16a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin * 2 along with this work; if not, write to the Free Software Foundation,
17a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin *
19a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin * or visit www.oracle.com if you need additional information or have any
21a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin * questions.
22a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin */
23a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinpackage org.openjdk.tests.java.util.stream;
24a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
25289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport org.openjdk.testlib.java.util.stream.DoubleStreamTestDataProvider;
26289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport org.openjdk.testlib.java.util.stream.IntStreamTestDataProvider;
27289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport org.openjdk.testlib.java.util.stream.LambdaTestHelpers;
28289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport org.openjdk.testlib.java.util.stream.LongStreamTestDataProvider;
29289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport org.openjdk.testlib.java.util.stream.OpTestCase;
30289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport org.openjdk.testlib.java.util.stream.SpliteratorTestHelper;
31289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport org.openjdk.testlib.java.util.stream.StreamTestDataProvider;
32289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport org.openjdk.testlib.java.util.stream.TestData;
33289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
34a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.Arrays;
35a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.Comparator;
36a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.List;
37a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.Spliterator;
38a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.function.Consumer;
39a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.function.DoubleConsumer;
40a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.function.Function;
41a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.function.IntConsumer;
42a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.function.LongConsumer;
43a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.function.UnaryOperator;
44a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.stream.DoubleStream;
45a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.stream.IntStream;
46a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.stream.LongStream;
47a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.stream.Stream;
48a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.stream.StreamSupport;
49a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
50a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport org.testng.Assert;
51a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport org.testng.annotations.Test;
52a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
53289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport static org.openjdk.testlib.java.util.stream.LambdaTestHelpers.countTo;
54289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport static org.openjdk.testlib.java.util.stream.LambdaTestHelpers.dpEven;
55289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport static org.openjdk.testlib.java.util.stream.LambdaTestHelpers.ipEven;
56289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport static org.openjdk.testlib.java.util.stream.LambdaTestHelpers.irDoubler;
57289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport static org.openjdk.testlib.java.util.stream.LambdaTestHelpers.lpEven;
58289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport static org.openjdk.testlib.java.util.stream.LambdaTestHelpers.mDoubler;
59289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport static org.openjdk.testlib.java.util.stream.LambdaTestHelpers.pEven;
60289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport static org.openjdk.testlib.java.util.stream.LambdaTestHelpers.permuteStreamFunctions;
61a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
62a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin@Test
63a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinpublic class StreamSpliteratorTest extends OpTestCase {
64a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
65a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    private static class ProxyNoExactSizeSpliterator<T> implements Spliterator<T> {
66a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        final Spliterator<T> sp;
67a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        final boolean proxyEstimateSize;
68a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        int splits = 0;
69a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        int prefixSplits = 0;
70a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
71a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        long sizeOnTraversal = -1;
72a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
73a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        ProxyNoExactSizeSpliterator(Spliterator<T> sp, boolean proxyEstimateSize) {
74a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            this.sp = sp;
75a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            this.proxyEstimateSize = proxyEstimateSize;
76a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
77a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
78a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        @Override
79a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        public Spliterator<T> trySplit() {
80a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            splits++;
81a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            Spliterator<T> prefix = sp.trySplit();
82a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            if (prefix != null)
83a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                prefixSplits++;
84a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            return prefix;
85a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
86a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
87a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        @Override
88a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        public boolean tryAdvance(Consumer<? super T> consumer) {
89a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            if (sizeOnTraversal == -1)
90a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                sizeOnTraversal = sp.getExactSizeIfKnown();
91a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            return sp.tryAdvance(consumer);
92a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
93a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
94a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        @Override
95a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        public void forEachRemaining(Consumer<? super T> consumer) {
96a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            sizeOnTraversal = sp.getExactSizeIfKnown();
97a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            sp.forEachRemaining(consumer);
98a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
99a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
100a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        @Override
101a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        public long estimateSize() {
102a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            return proxyEstimateSize ? sp.estimateSize() : Long.MAX_VALUE;
103a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
104a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
105a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        @Override
106a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        public Comparator<? super T> getComparator() {
107a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            return sp.getComparator();
108a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
109a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
110a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        @Override
111a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        public int characteristics() {
112a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            if (proxyEstimateSize)
113a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                return sp.characteristics();
114a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            else
115a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                return sp.characteristics() & ~(Spliterator.SUBSIZED | Spliterator.SIZED);
116a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
117a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
118a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        private static class OfInt extends ProxyNoExactSizeSpliterator<Integer> implements Spliterator.OfInt {
119a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            final Spliterator.OfInt psp;
120a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
121a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            private OfInt(Spliterator.OfInt sp, boolean proxyEstimateSize) {
122a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                super(sp, proxyEstimateSize);
123a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                this.psp = sp;
124a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
125a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
126a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            @Override
127a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            public Spliterator.OfInt trySplit() {
128a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                splits++;
129a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                Spliterator.OfInt prefix = psp.trySplit();
130a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                if (prefix != null)
131a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    prefixSplits++;
132a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                return prefix;
133a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
134a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
135a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            @Override
136a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            public boolean tryAdvance(Consumer<? super Integer> consumer) {
137a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                return Spliterator.OfInt.super.tryAdvance(consumer);
138a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
139a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
140a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            @Override
141a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            public void forEachRemaining(Consumer<? super Integer> consumer) {
142a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                Spliterator.OfInt.super.forEachRemaining(consumer);
143a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
144a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
145a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            @Override
146a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            public boolean tryAdvance(IntConsumer consumer) {
147a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                if (sizeOnTraversal == -1)
148a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    sizeOnTraversal = sp.getExactSizeIfKnown();
149a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                return psp.tryAdvance(consumer);
150a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
151a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
152a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            @Override
153a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            public void forEachRemaining(IntConsumer consumer) {
154a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                sizeOnTraversal = sp.getExactSizeIfKnown();
155a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                psp.forEachRemaining(consumer);
156a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
157a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
158a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
159a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        private static class OfLong extends ProxyNoExactSizeSpliterator<Long> implements Spliterator.OfLong {
160a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            final Spliterator.OfLong psp;
161a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
162a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            private OfLong(Spliterator.OfLong sp, boolean proxyEstimateSize) {
163a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                super(sp, proxyEstimateSize);
164a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                this.psp = sp;
165a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
166a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
167a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            @Override
168a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            public Spliterator.OfLong trySplit() {
169a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                splits++;
170a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                Spliterator.OfLong prefix = psp.trySplit();
171a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                if (prefix != null)
172a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    prefixSplits++;
173a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                return prefix;
174a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
175a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
176a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            @Override
177a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            public boolean tryAdvance(Consumer<? super Long> consumer) {
178a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                return Spliterator.OfLong.super.tryAdvance(consumer);
179a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
180a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
181a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            @Override
182a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            public void forEachRemaining(Consumer<? super Long> consumer) {
183a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                Spliterator.OfLong.super.forEachRemaining(consumer);
184a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
185a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
186a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            @Override
187a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            public boolean tryAdvance(LongConsumer consumer) {
188a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                if (sizeOnTraversal == -1)
189a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    sizeOnTraversal = sp.getExactSizeIfKnown();
190a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                return psp.tryAdvance(consumer);
191a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
192a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
193a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            @Override
194a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            public void forEachRemaining(LongConsumer consumer) {
195a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                sizeOnTraversal = sp.getExactSizeIfKnown();
196a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                psp.forEachRemaining(consumer);
197a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
198a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
199a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
200a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        private static class OfDouble extends ProxyNoExactSizeSpliterator<Double>
201a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                implements Spliterator.OfDouble {
202a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            final Spliterator.OfDouble psp;
203a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
204a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            private OfDouble(Spliterator.OfDouble sp, boolean proxyEstimateSize) {
205a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                super(sp, proxyEstimateSize);
206a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                this.psp = sp;
207a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
208a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
209a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            @Override
210a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            public Spliterator.OfDouble trySplit() {
211a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                splits++;
212a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                Spliterator.OfDouble prefix = psp.trySplit();
213a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                if (prefix != null)
214a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    prefixSplits++;
215a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                return prefix;
216a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
217a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
218a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            @Override
219a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            public boolean tryAdvance(Consumer<? super Double> consumer) {
220a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                return Spliterator.OfDouble.super.tryAdvance(consumer);
221a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
222a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
223a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            @Override
224a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            public void forEachRemaining(Consumer<? super Double> consumer) {
225a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                Spliterator.OfDouble.super.forEachRemaining(consumer);
226a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
227a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
228a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            @Override
229a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            public boolean tryAdvance(DoubleConsumer consumer) {
230a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                if (sizeOnTraversal == -1)
231a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    sizeOnTraversal = sp.getExactSizeIfKnown();
232a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                return psp.tryAdvance(consumer);
233a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
234a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
235a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            @Override
236a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            public void forEachRemaining(DoubleConsumer consumer) {
237a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                sizeOnTraversal = sp.getExactSizeIfKnown();
238a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                psp.forEachRemaining(consumer);
239a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
240a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
241a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
242a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
243a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testSplitting() {
244a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Size is assumed to be larger than the target size for no splitting
245a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // @@@ Need way to obtain the target size
246a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        List<Integer> l = countTo(1000);
247a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
248a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        List<Consumer<Stream<Integer>>> terminalOps = Arrays.asList(
249a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                s -> s.toArray(),
250a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                s -> s.forEach(e -> { }),
251a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                s -> s.reduce(Integer::sum)
252a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        );
253a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
254a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        List<UnaryOperator<Stream<Integer>>> intermediateOps = Arrays.asList(
255a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                s -> s.parallel(),
256a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                // The following ensures the wrapping spliterator is tested
257a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                s -> s.map(LambdaTestHelpers.identity()).parallel()
258a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        );
259a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
260a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        for (int i = 0; i < terminalOps.size(); i++) {
261a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            setContext("termOpIndex", i);
262a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            Consumer<Stream<Integer>> terminalOp = terminalOps.get(i);
263a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            for (int j = 0; j < intermediateOps.size(); j++) {
264a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                setContext("intOpIndex", j);
265a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                UnaryOperator<Stream<Integer>> intermediateOp = intermediateOps.get(j);
266a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                for (boolean proxyEstimateSize : new boolean[] {false, true}) {
267a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    setContext("proxyEstimateSize", proxyEstimateSize);
268a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    Spliterator<Integer> sp = intermediateOp.apply(l.stream()).spliterator();
269a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    ProxyNoExactSizeSpliterator<Integer> psp = new ProxyNoExactSizeSpliterator<>(sp, proxyEstimateSize);
270a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    Stream<Integer> s = StreamSupport.stream(psp, true);
271a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    terminalOp.accept(s);
272a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    Assert.assertTrue(psp.splits > 0,
273a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                      String.format("Number of splits should be greater that zero when proxyEstimateSize is %s",
274a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                                    proxyEstimateSize));
275a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    Assert.assertTrue(psp.prefixSplits > 0,
276a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                      String.format("Number of non-null prefix splits should be greater that zero when proxyEstimateSize is %s",
277a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                                    proxyEstimateSize));
278a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    Assert.assertTrue(psp.sizeOnTraversal < l.size(),
279a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                      String.format("Size on traversal of last split should be less than the size of the list, %d, when proxyEstimateSize is %s",
280a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                                    l.size(), proxyEstimateSize));
281a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                }
282a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
283a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
284a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
285a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
286a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "StreamTestData<Integer>",
287a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin          dataProviderClass = StreamTestDataProvider.class,
288a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin          groups = { "serialization-hostile" })
289a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testStreamSpliterators(String name, TestData.OfRef<Integer> data) {
290a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        for (Function<Stream<Integer>, Stream<Integer>> f : streamFunctions()) {
291a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            withData(data).
292a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    stream((Stream<Integer> in) -> {
293a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                        Stream<Integer> out = f.apply(in);
294a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                        return StreamSupport.stream(() -> out.spliterator(), OpTestCase.getStreamFlags(out), false);
295a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    }).
296a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    exercise();
297a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
298a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            withData(data).
299a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    stream((Stream<Integer> in) -> {
300a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                        Stream<Integer> out = f.apply(in);
301a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                        return StreamSupport.stream(() -> out.spliterator(), OpTestCase.getStreamFlags(out), true);
302a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    }).
303a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    exercise();
304a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
305a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
306a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
307a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class)
308a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testSpliterators(String name, TestData.OfRef<Integer> data) {
309a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        for (Function<Stream<Integer>, Stream<Integer>> f : streamFunctions()) {
310a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            SpliteratorTestHelper.testSpliterator(() -> f.apply(data.stream()).spliterator());
311a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
312a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
313a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
314a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class)
315a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testParSpliterators(String name, TestData.OfRef<Integer> data) {
316a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        for (Function<Stream<Integer>, Stream<Integer>> f : streamFunctions()) {
317a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            SpliteratorTestHelper.testSpliterator(() -> f.apply(data.parallelStream()).spliterator());
318a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
319a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
320a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
321a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    private List<Function<Stream<Integer>, Stream<Integer>>> streamFunctions;
322a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
323a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    List<Function<Stream<Integer>, Stream<Integer>>> streamFunctions() {
324a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        if (streamFunctions == null) {
325a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            List<Function<Stream<Integer>, Stream<Integer>>> opFunctions = Arrays.asList(
326a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    s -> s.filter(pEven),
327a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    s -> s.map(mDoubler),
328a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    // @@@ Add distinct once asserting results with or without order
329a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    //     is correctly supported
330a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin//                    s -> s.distinct(),
331a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    s -> s.sorted());
332a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
333a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            streamFunctions = permuteStreamFunctions(opFunctions);
334a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
335a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
336a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        return streamFunctions;
337a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
338a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
339a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    //
340a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
341a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testIntSplitting() {
342a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        List<Consumer<IntStream>> terminalOps = Arrays.asList(
343a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                s -> s.toArray(),
344a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                s -> s.forEach(e -> {}),
345a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                s -> s.reduce(Integer::sum)
346a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        );
347a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
348a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        List<UnaryOperator<IntStream>> intermediateOps = Arrays.asList(
349a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                s -> s.parallel(),
350a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                // The following ensures the wrapping spliterator is tested
351a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                s -> s.map(i -> i).parallel()
352a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        );
353a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
354a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        for (int i = 0; i < terminalOps.size(); i++) {
355a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            setContext("termOpIndex", i);
356a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            Consumer<IntStream> terminalOp = terminalOps.get(i);
357a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            for (int j = 0; j < intermediateOps.size(); j++) {
358a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                setContext("intOpIndex", j);
359a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                UnaryOperator<IntStream> intermediateOp = intermediateOps.get(j);
360a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                for (boolean proxyEstimateSize : new boolean[] {false, true}) {
361a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    setContext("proxyEstimateSize", proxyEstimateSize);
362a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    // Size is assumed to be larger than the target size for no splitting
363a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    // @@@ Need way to obtain the target size
364a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    Spliterator.OfInt sp = intermediateOp.apply(IntStream.range(0, 1000)).spliterator();
365a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    ProxyNoExactSizeSpliterator.OfInt psp = new ProxyNoExactSizeSpliterator.OfInt(sp, proxyEstimateSize);
366a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    IntStream s = StreamSupport.intStream(psp, true);
367a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    terminalOp.accept(s);
368a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    Assert.assertTrue(psp.splits > 0,
369a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                      String.format("Number of splits should be greater that zero when proxyEstimateSize is %s",
370a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                                    proxyEstimateSize));
371a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    Assert.assertTrue(psp.prefixSplits > 0,
372a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                      String.format("Number of non-null prefix splits should be greater that zero when proxyEstimateSize is %s",
373a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                                    proxyEstimateSize));
374a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    Assert.assertTrue(psp.sizeOnTraversal < 1000,
375a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                      String.format("Size on traversal of last split should be less than the size of the list, %d, when proxyEstimateSize is %s",
376a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                                    1000, proxyEstimateSize));
377a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                }
378a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
379a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
380a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
381a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
382a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "IntStreamTestData",
383a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin          dataProviderClass = IntStreamTestDataProvider.class,
384a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin          groups = { "serialization-hostile" })
385a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testIntStreamSpliterators(String name, TestData.OfInt data) {
386a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        for (Function<IntStream, IntStream> f : intStreamFunctions()) {
387a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            withData(data).
388a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    stream(in -> {
389a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                        IntStream out = f.apply(in);
390a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                        return StreamSupport.intStream(() -> out.spliterator(), OpTestCase.getStreamFlags(out), false);
391a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    }).
392a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    exercise();
393a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
394a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            withData(data).
395a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    stream((in) -> {
396a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                        IntStream out = f.apply(in);
397a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                        return StreamSupport.intStream(() -> out.spliterator(), OpTestCase.getStreamFlags(out), true);
398a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    }).
399a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    exercise();
400a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
401a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
402a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
403a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "IntStreamTestData", dataProviderClass = IntStreamTestDataProvider.class)
404a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testIntSpliterators(String name, TestData.OfInt data) {
405a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        for (Function<IntStream, IntStream> f : intStreamFunctions()) {
406a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            SpliteratorTestHelper.testIntSpliterator(() -> f.apply(data.stream()).spliterator());
407a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
408a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
409a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
410a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "IntStreamTestData", dataProviderClass = IntStreamTestDataProvider.class)
411a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testIntParSpliterators(String name, TestData.OfInt data) {
412a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        for (Function<IntStream, IntStream> f : intStreamFunctions()) {
413a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            SpliteratorTestHelper.testIntSpliterator(() -> f.apply(data.parallelStream()).spliterator());
414a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
415a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
416a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
417a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    private List<Function<IntStream, IntStream>> intStreamFunctions;
418a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
419a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    List<Function<IntStream, IntStream>> intStreamFunctions() {
420a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        if (intStreamFunctions == null) {
421a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            List<Function<IntStream, IntStream>> opFunctions = Arrays.asList(
422a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    s -> s.filter(ipEven),
423a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    s -> s.map(irDoubler),
424a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    s -> s.sorted());
425a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
426a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            intStreamFunctions = permuteStreamFunctions(opFunctions);
427a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
428a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
429a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        return intStreamFunctions;
430a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
431a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
432a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    //
433a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
434a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testLongSplitting() {
435a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        List<Consumer<LongStream>> terminalOps = Arrays.asList(
436a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                s -> s.toArray(),
437a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                s -> s.forEach(e -> {}),
438a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                s -> s.reduce(Long::sum)
439a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        );
440a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
441a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        List<UnaryOperator<LongStream>> intermediateOps = Arrays.asList(
442a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                s -> s.parallel(),
443a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                // The following ensures the wrapping spliterator is tested
444a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                s -> s.map(i -> i).parallel()
445a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        );
446a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
447a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        for (int i = 0; i < terminalOps.size(); i++) {
448a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            Consumer<LongStream> terminalOp = terminalOps.get(i);
449a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            setContext("termOpIndex", i);
450a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            for (int j = 0; j < intermediateOps.size(); j++) {
451a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                setContext("intOpIndex", j);
452a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                UnaryOperator<LongStream> intermediateOp = intermediateOps.get(j);
453a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                for (boolean proxyEstimateSize : new boolean[] {false, true}) {
454a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    setContext("proxyEstimateSize", proxyEstimateSize);
455a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    // Size is assumed to be larger than the target size for no splitting
456a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    // @@@ Need way to obtain the target size
457a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    Spliterator.OfLong sp = intermediateOp.apply(LongStream.range(0, 1000)).spliterator();
458a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    ProxyNoExactSizeSpliterator.OfLong psp = new ProxyNoExactSizeSpliterator.OfLong(sp, proxyEstimateSize);
459a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    LongStream s = StreamSupport.longStream(psp, true);
460a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    terminalOp.accept(s);
461a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    Assert.assertTrue(psp.splits > 0,
462a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                      String.format("Number of splits should be greater that zero when proxyEstimateSize is %s",
463a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                                    proxyEstimateSize));
464a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    Assert.assertTrue(psp.prefixSplits > 0,
465a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                      String.format("Number of non-null prefix splits should be greater that zero when proxyEstimateSize is %s",
466a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                                    proxyEstimateSize));
467a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    Assert.assertTrue(psp.sizeOnTraversal < 1000,
468a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                      String.format("Size on traversal of last split should be less than the size of the list, %d, when proxyEstimateSize is %s",
469a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                                    1000, proxyEstimateSize));
470a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                }
471a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
472a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
473a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
474a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
475a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "LongStreamTestData",
476a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin          dataProviderClass = LongStreamTestDataProvider.class,
477a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin          groups = { "serialization-hostile" })
478a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testLongStreamSpliterators(String name, TestData.OfLong data) {
479a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        for (Function<LongStream, LongStream> f : longStreamFunctions()) {
480a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            withData(data).
481a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    stream(in -> {
482a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                        LongStream out = f.apply(in);
483a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                        return StreamSupport.longStream(() -> out.spliterator(), OpTestCase.getStreamFlags(out), false);
484a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    }).
485a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    exercise();
486a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
487a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            withData(data).
488a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    stream((in) -> {
489a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                        LongStream out = f.apply(in);
490a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                        return StreamSupport.longStream(() -> out.spliterator(), OpTestCase.getStreamFlags(out), true);
491a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    }).
492a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    exercise();
493a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
494a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
495a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
496a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "LongStreamTestData", dataProviderClass = LongStreamTestDataProvider.class)
497a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testLongSpliterators(String name, TestData.OfLong data) {
498a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        for (Function<LongStream, LongStream> f : longStreamFunctions()) {
499a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            SpliteratorTestHelper.testLongSpliterator(() -> f.apply(data.stream()).spliterator());
500a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
501a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
502a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
503a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "LongStreamTestData", dataProviderClass = LongStreamTestDataProvider.class)
504a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testLongParSpliterators(String name, TestData.OfLong data) {
505a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        for (Function<LongStream, LongStream> f : longStreamFunctions()) {
506a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            SpliteratorTestHelper.testLongSpliterator(() -> f.apply(data.parallelStream()).spliterator());
507a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
508a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
509a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
510a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    private List<Function<LongStream, LongStream>> longStreamFunctions;
511a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
512a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    List<Function<LongStream, LongStream>> longStreamFunctions() {
513a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        if (longStreamFunctions == null) {
514a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            List<Function<LongStream, LongStream>> opFunctions = Arrays.asList(
515a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    s -> s.filter(lpEven),
516a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    s -> s.map(x -> x * 2L),
517a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    s -> s.sorted());
518a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
519a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            longStreamFunctions = permuteStreamFunctions(opFunctions);
520a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
521a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
522a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        return longStreamFunctions;
523a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
524a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
525a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    //
526a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
527a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testDoubleSplitting() {
528a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        List<Consumer<DoubleStream>> terminalOps = Arrays.asList(
529a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                s -> s.toArray(),
530a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                s -> s.forEach(e -> {}),
531a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                s -> s.reduce(Double::sum)
532a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        );
533a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
534a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        List<UnaryOperator<DoubleStream>> intermediateOps = Arrays.asList(
535a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                s -> s.parallel(),
536a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                // The following ensures the wrapping spliterator is tested
537a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                s -> s.map(i -> i).parallel()
538a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        );
539a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
540a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        for (int i = 0; i < terminalOps.size(); i++) {
541a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            Consumer<DoubleStream> terminalOp = terminalOps.get(i);
542a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            setContext("termOpIndex", i);
543a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            for (int j = 0; j < intermediateOps.size(); j++) {
544a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                UnaryOperator<DoubleStream> intermediateOp = intermediateOps.get(j);
545a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                setContext("intOpIndex", j);
546a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                for (boolean proxyEstimateSize : new boolean[] {false, true}) {
547a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    setContext("proxyEstimateSize", proxyEstimateSize);
548a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    // Size is assumed to be larger than the target size for no splitting
549a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    // @@@ Need way to obtain the target size
550a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    Spliterator.OfDouble sp = intermediateOp.apply(IntStream.range(0, 1000).asDoubleStream()).spliterator();
551a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    ProxyNoExactSizeSpliterator.OfDouble psp = new ProxyNoExactSizeSpliterator.OfDouble(sp, proxyEstimateSize);
552a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    DoubleStream s = StreamSupport.doubleStream(psp, true);
553a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    terminalOp.accept(s);
554a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    Assert.assertTrue(psp.splits > 0,
555a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                      String.format("Number of splits should be greater that zero when proxyEstimateSize is %s",
556a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                                    proxyEstimateSize));
557a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    Assert.assertTrue(psp.prefixSplits > 0,
558a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                      String.format("Number of non-null prefix splits should be greater that zero when proxyEstimateSize is %s",
559a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                                    proxyEstimateSize));
560a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    Assert.assertTrue(psp.sizeOnTraversal < 1000,
561a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                      String.format("Size on traversal of last split should be less than the size of the list, %d, when proxyEstimateSize is %s",
562a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                                    1000, proxyEstimateSize));
563a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                }
564a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
565a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
566a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
567a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
568a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "DoubleStreamTestData",
569a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin          dataProviderClass = DoubleStreamTestDataProvider.class,
570a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin          groups = { "serialization-hostile" })
571a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testDoubleStreamSpliterators(String name, TestData.OfDouble data) {
572a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        for (Function<DoubleStream, DoubleStream> f : doubleStreamFunctions()) {
573a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            withData(data).
574a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    stream(in -> {
575a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                        DoubleStream out = f.apply(in);
576a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                        return StreamSupport.doubleStream(() -> out.spliterator(), OpTestCase.getStreamFlags(out), false);
577a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    }).
578a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    exercise();
579a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
580a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            withData(data).
581a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    stream((in) -> {
582a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                        DoubleStream out = f.apply(in);
583a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                        return StreamSupport.doubleStream(() -> out.spliterator(), OpTestCase.getStreamFlags(out), true);
584a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    }).
585a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    exercise();
586a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
587a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
588a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
589a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "DoubleStreamTestData", dataProviderClass = DoubleStreamTestDataProvider.class)
590a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testDoubleSpliterators(String name, TestData.OfDouble data) {
591a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        for (Function<DoubleStream, DoubleStream> f : doubleStreamFunctions()) {
592a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            SpliteratorTestHelper.testDoubleSpliterator(() -> f.apply(data.stream()).spliterator());
593a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
594a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
595a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
596a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "DoubleStreamTestData", dataProviderClass = DoubleStreamTestDataProvider.class)
597a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testDoubleParSpliterators(String name, TestData.OfDouble data) {
598a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        for (Function<DoubleStream, DoubleStream> f : doubleStreamFunctions()) {
599a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            SpliteratorTestHelper.testDoubleSpliterator(() -> f.apply(data.parallelStream()).spliterator());
600a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
601a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
602a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
603a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    private List<Function<DoubleStream, DoubleStream>> doubleStreamFunctions;
604a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
605a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    List<Function<DoubleStream, DoubleStream>> doubleStreamFunctions() {
606a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        if (doubleStreamFunctions == null) {
607a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            List<Function<DoubleStream, DoubleStream>> opFunctions = Arrays.asList(
608a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    s -> s.filter(dpEven),
609a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    s -> s.map(x -> x * 2.0),
610a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    s -> s.sorted());
611a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
612a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            doubleStreamFunctions = permuteStreamFunctions(opFunctions);
613a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
614a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
615a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        return doubleStreamFunctions;
616a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
617a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin}
618