1a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin/*
2a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin * Copyright (c) 2012, 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 org.openjdk.tests.java.util.stream;
24a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
25a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport org.testng.annotations.DataProvider;
26a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport org.testng.annotations.Test;
27a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
28289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport org.openjdk.testlib.java.util.stream.OpTestCase;
29289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport org.openjdk.testlib.java.util.stream.StreamTestDataProvider;
30289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport org.openjdk.testlib.java.util.stream.TestData;
31289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport org.openjdk.testlib.java.util.stream.DoubleStreamTestScenario;
32289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport org.openjdk.testlib.java.util.stream.IntStreamTestScenario;
33289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport org.openjdk.testlib.java.util.stream.LongStreamTestScenario;
34289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport org.openjdk.testlib.java.util.stream.LambdaTestHelpers;
35289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport org.openjdk.testlib.java.util.stream.StreamTestScenario;
36289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
37a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.lang.reflect.InvocationHandler;
38a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.lang.reflect.Method;
39a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.lang.reflect.Proxy;
40a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.ArrayList;
41a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.List;
42a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.Spliterator;
43a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.function.Function;
44a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.function.UnaryOperator;
45a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.stream.DoubleStream;
46a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.stream.IntStream;
47a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.stream.LongStream;
48a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.stream.Stream;
49a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.stream.StreamSupport;
50a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
51289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport static org.openjdk.testlib.java.util.stream.LambdaTestHelpers.assertUnique;
52a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
53a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
54a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin@Test
55a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinpublic class InfiniteStreamWithLimitOpTest extends OpTestCase {
56a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
57a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    private static final long SKIP_LIMIT_SIZE = 1 << 16;
58a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
59a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @DataProvider(name = "Stream.limit")
60a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @SuppressWarnings("rawtypes")
61a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public static Object[][] sliceFunctionsDataProvider() {
62a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        Function<String, String> f = s -> String.format(s, SKIP_LIMIT_SIZE);
63a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
64a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        List<Object[]> data = new ArrayList<>();
65a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
66a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        data.add(new Object[]{f.apply("Stream.limit(%d)"),
67a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                (UnaryOperator<Stream>) s -> s.limit(SKIP_LIMIT_SIZE)});
68a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        data.add(new Object[]{f.apply("Stream.skip(%1$d).limit(%1$d)"),
69a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                (UnaryOperator<Stream>) s -> s.skip(SKIP_LIMIT_SIZE).limit(SKIP_LIMIT_SIZE)});
70a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
71a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        return data.toArray(new Object[0][]);
72a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
73a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
74a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @DataProvider(name = "IntStream.limit")
75a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public static Object[][] intSliceFunctionsDataProvider() {
76a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        Function<String, String> f = s -> String.format(s, SKIP_LIMIT_SIZE);
77a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
78a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        List<Object[]> data = new ArrayList<>();
79a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
80a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        data.add(new Object[]{f.apply("IntStream.limit(%d)"),
81a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                (UnaryOperator<IntStream>) s -> s.limit(SKIP_LIMIT_SIZE)});
82a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        data.add(new Object[]{f.apply("IntStream.skip(%1$d).limit(%1$d)"),
83a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                (UnaryOperator<IntStream>) s -> s.skip(SKIP_LIMIT_SIZE).limit(SKIP_LIMIT_SIZE)});
84a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
85a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        return data.toArray(new Object[0][]);
86a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
87a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
88a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @DataProvider(name = "LongStream.limit")
89a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public static Object[][] longSliceFunctionsDataProvider() {
90a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        Function<String, String> f = s -> String.format(s, SKIP_LIMIT_SIZE);
91a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
92a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        List<Object[]> data = new ArrayList<>();
93a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
94a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        data.add(new Object[]{f.apply("LongStream.limit(%d)"),
95a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                (UnaryOperator<LongStream>) s -> s.limit(SKIP_LIMIT_SIZE)});
96a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        data.add(new Object[]{f.apply("LongStream.skip(%1$d).limit(%1$d)"),
97a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                (UnaryOperator<LongStream>) s -> s.skip(SKIP_LIMIT_SIZE).limit(SKIP_LIMIT_SIZE)});
98a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
99a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        return data.toArray(new Object[0][]);
100a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
101a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
102a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @DataProvider(name = "DoubleStream.limit")
103a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public static Object[][] doubleSliceFunctionsDataProvider() {
104a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        Function<String, String> f = s -> String.format(s, SKIP_LIMIT_SIZE);
105a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
106a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        List<Object[]> data = new ArrayList<>();
107a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
108a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        data.add(new Object[]{f.apply("DoubleStream.limit(%d)"),
109a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                (UnaryOperator<DoubleStream>) s -> s.limit(SKIP_LIMIT_SIZE)});
110a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        data.add(new Object[]{f.apply("DoubleStream.skip(%1$d).limit(%1$d)"),
111a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                (UnaryOperator<DoubleStream>) s -> s.skip(SKIP_LIMIT_SIZE).limit(SKIP_LIMIT_SIZE)});
112a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
113a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        return data.toArray(new Object[0][]);
114a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
115a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
116a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    private <T> ResultAsserter<Iterable<T>> unorderedAsserter() {
117a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        return (act, exp, ord, par) -> {
118a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            if (par & !ord) {
119a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                // Can only assert that all elements of the actual result
120a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                // are distinct and that the count is the limit size
121a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                // any element within the range [0, Long.MAX_VALUE) may be
122a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                // present
123a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                assertUnique(act);
124a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                long count = 0;
125a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                for (T l : act) {
126a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    count++;
127a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                }
128a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                assertEquals(count, SKIP_LIMIT_SIZE, "size not equal");
129a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
130a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            else {
131a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                LambdaTestHelpers.assertContents(act, exp);
132a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
133a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        };
134a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
135a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
136a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    private TestData.OfRef<Long> refLongs() {
137a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        return refLongRange(0, Long.MAX_VALUE);
138a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
139a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
140a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    private TestData.OfRef<Long> refLongRange(long l, long u) {
141a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        return TestData.Factory.ofSupplier(
142a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                String.format("[%d, %d)", l, u),
143a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                () -> LongStream.range(l, u).boxed());
144a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
145a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
146a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    private TestData.OfInt ints() {
147a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        return intRange(0, Integer.MAX_VALUE);
148a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
149a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
150a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    private TestData.OfInt intRange(int l, int u) {
151a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        return TestData.Factory.ofIntSupplier(
152a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                String.format("[%d, %d)", l, u),
153a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                () -> IntStream.range(l, u));
154a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
155a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
156a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    private TestData.OfLong longs() {
157a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        return longRange(0, Long.MAX_VALUE);
158a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
159a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
160a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    private TestData.OfLong longRange(long l, long u) {
161a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        return TestData.Factory.ofLongSupplier(
162a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                String.format("[%d, %d)", l, u),
163a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                () -> LongStream.range(l, u));
164a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
165a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
166a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    private TestData.OfDouble doubles() {
167a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        return doubleRange(0, 1L << 53);
168a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
169a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
170a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    private TestData.OfDouble doubleRange(long l, long u) {
171a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        return TestData.Factory.ofDoubleSupplier(
172a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                String.format("[%d, %d)", l, u),
173a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                () -> LongStream.range(l, u).mapToDouble(i -> (double) i));
174a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
175a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
176a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
177a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    // Sized/subsized range
178a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
179a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "Stream.limit")
180a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testSubsizedWithRange(String description, UnaryOperator<Stream<Long>> fs) {
181a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Range is [0, Long.MAX_VALUE), splits are SUBSIZED
182a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Such a size will induce out of memory errors for incorrect
183a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // slice implementations
184a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        withData(refLongs()).
185a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                stream(s -> fs.apply(s)).
186a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                without(StreamTestScenario.CLEAR_SIZED_SCENARIOS).
187a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                exercise();
188a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
189a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
190a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "IntStream.limit")
191a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testIntSubsizedWithRange(String description, UnaryOperator<IntStream> fs) {
192a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Range is [0, Integer.MAX_VALUE), splits are SUBSIZED
193a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Such a size will induce out of memory errors for incorrect
194a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // slice implementations
195a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        withData(ints()).
196a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                stream(s -> fs.apply(s)).
197a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                without(IntStreamTestScenario.CLEAR_SIZED_SCENARIOS).
198a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                exercise();
199a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
200a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
201a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "LongStream.limit")
202a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testLongSubsizedWithRange(String description, UnaryOperator<LongStream> fs) {
203a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Range is [0, Long.MAX_VALUE), splits are SUBSIZED
204a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Such a size will induce out of memory errors for incorrect
205a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // slice implementations
206a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        withData(longs()).
207a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                stream(s -> fs.apply(s)).
208a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                without(LongStreamTestScenario.CLEAR_SIZED_SCENARIOS).
209a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                exercise();
210a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
211a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
212a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "DoubleStream.limit")
213a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testDoubleSubsizedWithRange(String description, UnaryOperator<DoubleStream> fs) {
214a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Range is [0, 2^53), splits are SUBSIZED
215a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Such a size will induce out of memory errors for incorrect
216a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // slice implementations
217a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        withData(doubles()).
218a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                stream(s -> fs.apply(s)).
219a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                without(DoubleStreamTestScenario.CLEAR_SIZED_SCENARIOS).
220a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                exercise();
221a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
222a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
223a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
224a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    // Unordered finite not SIZED/SUBSIZED
225a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
226a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "Stream.limit")
227a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testUnorderedFinite(String description, UnaryOperator<Stream<Long>> fs) {
228a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Range is [0, Long.MAX_VALUE), splits are SUBSIZED
229a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Such a size will induce out of memory errors for incorrect
230a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // slice implementations
231a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        withData(longs()).
232a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                stream(s -> fs.apply(s.filter(i -> true).unordered().boxed())).
233a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                resultAsserter(unorderedAsserter()).
234a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                exercise();
235a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
236a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
237a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "IntStream.limit")
238a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testIntUnorderedFinite(String description, UnaryOperator<IntStream> fs) {
239a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Range is [0, Integer.MAX_VALUE), splits are SUBSIZED
240a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Such a size will induce out of memory errors for incorrect
241a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // slice implementations
242a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        withData(ints()).
243a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                stream(s -> fs.apply(s.filter(i -> true).unordered())).
244a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                resultAsserter(unorderedAsserter()).
245a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                exercise();
246a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
247a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
248a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "LongStream.limit")
249a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testLongUnorderedFinite(String description, UnaryOperator<LongStream> fs) {
250a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Range is [0, Long.MAX_VALUE), splits are SUBSIZED
251a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Such a size will induce out of memory errors for incorrect
252a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // slice implementations
253a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        withData(longs()).
254a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                stream(s -> fs.apply(s.filter(i -> true).unordered())).
255a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                resultAsserter(unorderedAsserter()).
256a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                exercise();
257a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
258a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
259a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "DoubleStream.limit")
260a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testDoubleUnorderedFinite(String description, UnaryOperator<DoubleStream> fs) {
261a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Range is [0, 1L << 53), splits are SUBSIZED
262a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Such a size will induce out of memory errors for incorrect
263a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // slice implementations
264a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Upper bound ensures values mapped to doubles will be unique
265a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        withData(doubles()).
266a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                stream(s -> fs.apply(s.filter(i -> true).unordered())).
267a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                resultAsserter(unorderedAsserter()).
268a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                exercise();
269a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
270a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
271a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
272a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    // Unordered finite not SUBSIZED
273a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
274a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @SuppressWarnings({"rawtypes", "unchecked"})
275a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    private Spliterator.OfLong proxyNotSubsized(Spliterator.OfLong s) {
276a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        InvocationHandler ih = new InvocationHandler() {
277a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            @Override
278a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
279a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                switch (method.getName()) {
280a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    case "characteristics": {
281a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                        int c = (Integer) method.invoke(s, args);
282a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                        return c & ~Spliterator.SUBSIZED;
283a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    }
284a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    case "hasCharacteristics": {
285a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                        int c = (Integer) args[0];
286a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                        boolean b = (Boolean) method.invoke(s, args);
287a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                        return b & ((c & Spliterator.SUBSIZED) == 0);
288a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    }
289a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    default:
290a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                        return method.invoke(s, args);
291a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                }
292a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
293a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        };
294a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
295a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        return (Spliterator.OfLong) Proxy.newProxyInstance(this.getClass().getClassLoader(),
296a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                                           new Class[]{Spliterator.OfLong.class},
297a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                                                           ih);
298a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
299a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
300a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    private TestData.OfLong proxiedLongRange(long l, long u) {
301a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        return TestData.Factory.ofLongSupplier(
302a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                String.format("[%d, %d)", l, u),
303a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                () -> StreamSupport.longStream(proxyNotSubsized(LongStream.range(l, u).spliterator()), false));
304a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
305a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
306a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "Stream.limit")
307a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testUnorderedSizedNotSubsizedFinite(String description, UnaryOperator<Stream<Long>> fs) {
308a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Range is [0, Long.MAX_VALUE), splits are not SUBSIZED (proxy clears
309a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // the SUBSIZED characteristic)
310a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Such a size will induce out of memory errors for incorrect
311a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // slice implementations
312a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        withData(proxiedLongRange(0, Long.MAX_VALUE)).
313a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                stream(s -> fs.apply(s.unordered().boxed())).
314a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                resultAsserter(unorderedAsserter()).
315a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                exercise();
316a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
317a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
318a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "IntStream.limit")
319a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testIntUnorderedSizedNotSubsizedFinite(String description, UnaryOperator<IntStream> fs) {
320a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Range is [0, Integer.MAX_VALUE), splits are not SUBSIZED (proxy clears
321a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // the SUBSIZED characteristic)
322a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Such a size will induce out of memory errors for incorrect
323a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // slice implementations
324a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        withData(proxiedLongRange(0, Integer.MAX_VALUE)).
325a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                stream(s -> fs.apply(s.unordered().mapToInt(i -> (int) i))).
326a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                resultAsserter(unorderedAsserter()).
327a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                exercise();
328a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
329a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
330a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "LongStream.limit")
331a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testLongUnorderedSizedNotSubsizedFinite(String description, UnaryOperator<LongStream> fs) {
332a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Range is [0, Long.MAX_VALUE), splits are not SUBSIZED (proxy clears
333a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // the SUBSIZED characteristic)
334a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Such a size will induce out of memory errors for incorrect
335a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // slice implementations
336a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        withData(proxiedLongRange(0, Long.MAX_VALUE)).
337a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                stream(s -> fs.apply(s.unordered())).
338a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                resultAsserter(unorderedAsserter()).
339a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                exercise();
340a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
341a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
342a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "DoubleStream.limit")
343a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testDoubleUnorderedSizedNotSubsizedFinite(String description, UnaryOperator<DoubleStream> fs) {
344a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Range is [0, Double.MAX_VALUE), splits are not SUBSIZED (proxy clears
345a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // the SUBSIZED characteristic)
346a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Such a size will induce out of memory errors for incorrect
347a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // slice implementations
348a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        withData(proxiedLongRange(0, 1L << 53)).
349a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                stream(s -> fs.apply(s.unordered().mapToDouble(i -> (double) i))).
350a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                resultAsserter(unorderedAsserter()).
351a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                exercise();
352a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
353a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
354a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
355a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    // Unordered generation
356a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
357a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "Stream.limit")
358a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testUnorderedGenerator(String description, UnaryOperator<Stream<Long>> fs) {
359a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Source is spliterator of infinite size
360a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        TestData.OfRef<Long> generator = TestData.Factory.ofSupplier(
361a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                "[1L, 1L, ...]", () -> Stream.generate(() -> 1L));
362a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
363a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        withData(generator).
364a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                stream(s -> fs.apply(s.filter(i -> true).unordered())).
365a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                exercise();
366a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
367a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
368a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "IntStream.limit")
369a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testIntUnorderedGenerator(String description, UnaryOperator<IntStream> fs) {
370a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Source is spliterator of infinite size
371a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        TestData.OfInt generator = TestData.Factory.ofIntSupplier(
372a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                "[1, 1, ...]", () -> IntStream.generate(() -> 1));
373a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
374a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        withData(generator).
375a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                stream(s -> fs.apply(s.filter(i -> true).unordered())).
376a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                exercise();
377a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
378a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
379a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "LongStream.limit")
380a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testLongUnorderedGenerator(String description, UnaryOperator<LongStream> fs) {
381a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Source is spliterator of infinite size
382a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        TestData.OfLong generator = TestData.Factory.ofLongSupplier(
383a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                "[1L, 1L, ...]", () -> LongStream.generate(() -> 1));
384a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
385a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        withData(generator).
386a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                stream(s -> fs.apply(s.filter(i -> true).unordered())).
387a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                exercise();
388a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
389a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
390a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "DoubleStream.limit")
391a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testDoubleUnorderedGenerator(String description, UnaryOperator<DoubleStream> fs) {
392a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Source is spliterator of infinite size
393a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        TestData.OfDouble generator = TestData.Factory.ofDoubleSupplier(
394a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                "[1.0, 1.0, ...]", () -> DoubleStream.generate(() -> 1.0));
395a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
396a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        withData(generator).
397a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                stream(s -> fs.apply(s.filter(i -> true).unordered())).
398a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                exercise();
399a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
400a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
401a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
402a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    // Unordered iteration
403a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
404a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "Stream.limit")
405a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testUnorderedIteration(String description, UnaryOperator<Stream<Long>> fs) {
406a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Source is a right-balanced tree of infinite size
407a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        TestData.OfRef<Long> iterator = TestData.Factory.ofSupplier(
408a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                "[1L, 2L, 3L, ...]", () -> Stream.iterate(1L, i -> i + 1L));
409a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
410a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Ref
411a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        withData(iterator).
412a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                stream(s -> fs.apply(s.unordered())).
413a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                resultAsserter(unorderedAsserter()).
414a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                exercise();
415a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
416a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
417a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "IntStream.limit")
418a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testIntUnorderedIteration(String description, UnaryOperator<IntStream> fs) {
419a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Source is a right-balanced tree of infinite size
420a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        TestData.OfInt iterator = TestData.Factory.ofIntSupplier(
421a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                "[1, 2, 3, ...]", () -> IntStream.iterate(1, i -> i + 1));
422a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
423a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Ref
424a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        withData(iterator).
425a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                stream(s -> fs.apply(s.unordered())).
426a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                resultAsserter(unorderedAsserter()).
427a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                exercise();
428a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
429a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
430a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "LongStream.limit")
431a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testLongUnorderedIteration(String description, UnaryOperator<LongStream> fs) {
432a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Source is a right-balanced tree of infinite size
433a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        TestData.OfLong iterator = TestData.Factory.ofLongSupplier(
434a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                "[1L, 2L, 3L, ...]", () -> LongStream.iterate(1, i -> i + 1));
435a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
436a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Ref
437a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        withData(iterator).
438a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                stream(s -> fs.apply(s.unordered())).
439a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                resultAsserter(unorderedAsserter()).
440a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                exercise();
441a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
442a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
443a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    @Test(dataProvider = "DoubleStream.limit")
444a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testDoubleUnorderedIteration(String description, UnaryOperator<DoubleStream> fs) {
445a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Source is a right-balanced tree of infinite size
446a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        TestData.OfDouble iterator = TestData.Factory.ofDoubleSupplier(
447a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                "[1.0, 2.0, 3.0, ...]", () -> DoubleStream.iterate(1, i -> i + 1));
448a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
449a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Ref
450a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        withData(iterator).
451a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                stream(s -> fs.apply(s.unordered())).
452a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                resultAsserter(unorderedAsserter()).
453a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                exercise();
454a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
455a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin}
456