1a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin/*
2a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin * Copyright (c) 2013, 2015, 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 java.util.stream;
24a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
25a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.Collections;
26a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.EnumSet;
27a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.PrimitiveIterator;
28a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.Set;
29a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.Spliterator;
30a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.function.Consumer;
31a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.function.DoubleConsumer;
32a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.function.Function;
33a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
34a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin/**
35a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin * Test scenarios for double streams.
36a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin *
37a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin * Each scenario is provided with a data source, a function that maps a fresh
38a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin * stream (as provided by the data source) to a new stream, and a sink to
39a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin * receive results.  Each scenario describes a different way of computing the
40a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin * stream contents.  The test driver will ensure that all scenarios produce
41a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin * the same output (modulo allowable differences in ordering).
42a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin */
43a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin@SuppressWarnings({"rawtypes", "unchecked"})
44a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinpublic enum DoubleStreamTestScenario implements OpTestCase.BaseStreamTestScenario {
45a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
46a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    STREAM_FOR_EACH_WITH_CLOSE(false) {
47a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        <T, S_IN extends BaseStream<T, S_IN>>
48a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        void _run(TestData<T, S_IN> data, DoubleConsumer b, Function<S_IN, DoubleStream> m) {
49a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            DoubleStream s = m.apply(data.stream());
50a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            if (s.isParallel()) {
51a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                s = s.sequential();
52a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
53a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            s.forEach(b);
54a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            s.close();
55a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
56a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    },
57a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
58a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    STREAM_TO_ARRAY(false) {
59a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        <T, S_IN extends BaseStream<T, S_IN>>
60a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        void _run(TestData<T, S_IN> data, DoubleConsumer b, Function<S_IN, DoubleStream> m) {
61a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            for (double t : m.apply(data.stream()).toArray()) {
62a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                b.accept(t);
63a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
64a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
65a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    },
66a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
67a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    STREAM_ITERATOR(false) {
68a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        <T, S_IN extends BaseStream<T, S_IN>>
69a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        void _run(TestData<T, S_IN> data, DoubleConsumer b, Function<S_IN, DoubleStream> m) {
70a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            for (PrimitiveIterator.OfDouble seqIter = m.apply(data.stream()).iterator(); seqIter.hasNext(); )
71a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                b.accept(seqIter.nextDouble());
72a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
73a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    },
74a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
75a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    // Wrap as stream, and spliterate then iterate in pull mode
76a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    STREAM_SPLITERATOR(false) {
77a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        <T, S_IN extends BaseStream<T, S_IN>>
78a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        void _run(TestData<T, S_IN> data, DoubleConsumer b, Function<S_IN, DoubleStream> m) {
79a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            for (Spliterator.OfDouble spl = m.apply(data.stream()).spliterator(); spl.tryAdvance(b); ) {
80a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
81a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
82a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    },
83a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
84a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    // Wrap as stream, spliterate, then split a few times mixing advances with forEach
85a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    STREAM_SPLITERATOR_WITH_MIXED_TRAVERSE_AND_SPLIT(false) {
86a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        <T, S_IN extends BaseStream<T, S_IN>>
87a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        void _run(TestData<T, S_IN> data, DoubleConsumer b, Function<S_IN, DoubleStream> m) {
88a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            SpliteratorTestHelper.mixedTraverseAndSplit(b, m.apply(data.stream()).spliterator());
89a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
90a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    },
91a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
92a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    // Wrap as stream, and spliterate then iterate in pull mode
93a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    STREAM_SPLITERATOR_FOREACH(false) {
94a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        <T, S_IN extends BaseStream<T, S_IN>>
95a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        void _run(TestData<T, S_IN> data, DoubleConsumer b, Function<S_IN, DoubleStream> m) {
96a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            m.apply(data.stream()).spliterator().forEachRemaining(b);
97a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
98a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    },
99a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
100a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    PAR_STREAM_SEQUENTIAL_FOR_EACH(true) {
101a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        <T, S_IN extends BaseStream<T, S_IN>>
102a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        void _run(TestData<T, S_IN> data, DoubleConsumer b, Function<S_IN, DoubleStream> m) {
103a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            m.apply(data.parallelStream()).sequential().forEach(b);
104a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
105a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    },
106a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
107a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    // Wrap as parallel stream + forEachOrdered
108a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    PAR_STREAM_FOR_EACH_ORDERED(true) {
109a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        <T, S_IN extends BaseStream<T, S_IN>>
110a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        void _run(TestData<T, S_IN> data, DoubleConsumer b, Function<S_IN, DoubleStream> m) {
111a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            // @@@ Want to explicitly select ordered equalator
112a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            m.apply(data.parallelStream()).forEachOrdered(b);
113a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
114a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    },
115a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
116a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    // Wrap as stream, and spliterate then iterate sequentially
117a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    PAR_STREAM_SPLITERATOR(true) {
118a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        <T, S_IN extends BaseStream<T, S_IN>>
119a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        void _run(TestData<T, S_IN> data, DoubleConsumer b, Function<S_IN, DoubleStream> m) {
120a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            for (Spliterator.OfDouble spl = m.apply(data.parallelStream()).spliterator(); spl.tryAdvance(b); ) {
121a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
122a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
123a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    },
124a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
125a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    // Wrap as stream, and spliterate then iterate sequentially
126a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    PAR_STREAM_SPLITERATOR_FOREACH(true) {
127a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        <T, S_IN extends BaseStream<T, S_IN>>
128a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        void _run(TestData<T, S_IN> data, DoubleConsumer b, Function<S_IN, DoubleStream> m) {
129a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            m.apply(data.parallelStream()).spliterator().forEachRemaining(b);
130a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
131a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    },
132a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
133a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    PAR_STREAM_TO_ARRAY(true) {
134a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        <T, S_IN extends BaseStream<T, S_IN>>
135a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        void _run(TestData<T, S_IN> data, DoubleConsumer b, Function<S_IN, DoubleStream> m) {
136a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            for (double t : m.apply(data.parallelStream()).toArray())
137a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                b.accept(t);
138a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
139a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    },
140a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
141a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    // Wrap as parallel stream, get the spliterator, wrap as a stream + toArray
142a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    PAR_STREAM_SPLITERATOR_STREAM_TO_ARRAY(true) {
143a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        <T, S_IN extends BaseStream<T, S_IN>>
144a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        void _run(TestData<T, S_IN> data, DoubleConsumer b, Function<S_IN, DoubleStream> m) {
145a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            DoubleStream s = m.apply(data.parallelStream());
146a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            Spliterator.OfDouble sp = s.spliterator();
147a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            DoubleStream ss = StreamSupport.doubleStream(() -> sp,
148a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                                         StreamOpFlag.toCharacteristics(OpTestCase.getStreamFlags(s))
149a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                                         | (sp.getExactSizeIfKnown() < 0 ? 0 : Spliterator.SIZED), true);
150a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            for (double t : ss.toArray())
151a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                b.accept(t);
152a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
153a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    },
154a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
155a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    PAR_STREAM_TO_ARRAY_CLEAR_SIZED(true) {
156a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        <T, S_IN extends BaseStream<T, S_IN>>
157a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        void _run(TestData<T, S_IN> data, DoubleConsumer b, Function<S_IN, DoubleStream> m) {
158a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            S_IN pipe1 = (S_IN) OpTestCase.chain(data.parallelStream(),
159a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                                 new FlagDeclaringOp(StreamOpFlag.NOT_SIZED, data.getShape()));
160a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            DoubleStream pipe2 = m.apply(pipe1);
161a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
162a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            for (double t : pipe2.toArray())
163a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                b.accept(t);
164a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
165a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    },
166a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
167a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    // Wrap as parallel stream + forEach synchronizing
168a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    PAR_STREAM_FOR_EACH(true, false) {
169a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        <T, S_IN extends BaseStream<T, S_IN>>
170a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        void _run(TestData<T, S_IN> data, DoubleConsumer b, Function<S_IN, DoubleStream> m) {
171a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            m.apply(data.parallelStream()).forEach(e -> {
172a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                synchronized (data) {
173a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    b.accept(e);
174a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                }
175a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            });
176a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
177a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    },
178a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
179a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    // Wrap as parallel stream + forEach synchronizing and clear SIZED flag
180a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    PAR_STREAM_FOR_EACH_CLEAR_SIZED(true, false) {
181a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        <T, S_IN extends BaseStream<T, S_IN>>
182a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        void _run(TestData<T, S_IN> data, DoubleConsumer b, Function<S_IN, DoubleStream> m) {
183a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            S_IN pipe1 = (S_IN) OpTestCase.chain(data.parallelStream(),
184a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                                 new FlagDeclaringOp(StreamOpFlag.NOT_SIZED, data.getShape()));
185a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            m.apply(pipe1).forEach(e -> {
186a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                synchronized (data) {
187a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    b.accept(e);
188a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                }
189a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            });
190a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
191a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    },
192a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    ;
193a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
194a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    // The set of scenarios that clean the SIZED flag
195a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public static final Set<DoubleStreamTestScenario> CLEAR_SIZED_SCENARIOS = Collections.unmodifiableSet(
196a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            EnumSet.of(PAR_STREAM_TO_ARRAY_CLEAR_SIZED, PAR_STREAM_FOR_EACH_CLEAR_SIZED));
197a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
198a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    private boolean isParallel;
199a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
200a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    private final boolean isOrdered;
201a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
202a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    DoubleStreamTestScenario(boolean isParallel) {
203a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        this(isParallel, true);
204a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
205a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
206a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    DoubleStreamTestScenario(boolean isParallel, boolean isOrdered) {
207a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        this.isParallel = isParallel;
208a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        this.isOrdered = isOrdered;
209a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
210a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
211a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public StreamShape getShape() {
212a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        return StreamShape.DOUBLE_VALUE;
213a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
214a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
215a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public boolean isParallel() {
216a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        return isParallel;
217a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
218a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
219a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public boolean isOrdered() {
220a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        return isOrdered;
221a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
222a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
223a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public <T, U, S_IN extends BaseStream<T, S_IN>, S_OUT extends BaseStream<U, S_OUT>>
224a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    void run(TestData<T, S_IN> data, Consumer<U> b, Function<S_IN, S_OUT> m) {
225a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        _run(data, (DoubleConsumer) b, (Function<S_IN, DoubleStream>) m);
226a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
227a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
228a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    abstract <T, S_IN extends BaseStream<T, S_IN>>
229a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    void _run(TestData<T, S_IN> data, DoubleConsumer b, Function<S_IN, DoubleStream> m);
230a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
231a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin}
232