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.OpTestCase;
26289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport org.openjdk.testlib.java.util.stream.SpliteratorTestHelper;
27289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinimport org.openjdk.testlib.java.util.stream.TestData;
28289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin
29a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.Arrays;
30a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.Optional;
31a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.Spliterator;
32a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.stream.IntStream;
33a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.stream.LongStream;
34a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport java.util.stream.Stream;
35a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
36a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinimport org.testng.annotations.Test;
37a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
38a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin/**
39a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin * Primitive range tests
40a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin *
41a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin * @author Brian Goetz
42a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin */
43a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin@Test
44a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkinpublic class RangeTest extends OpTestCase {
45a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
46a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testInfiniteRangeFindFirst() {
47a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        Integer first = Stream.iterate(0, i -> i + 1).filter(i -> i > 10000).findFirst().get();
48a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        assertEquals(first, Stream.iterate(0, i -> i + 1).parallel().filter(i -> i > 10000).findFirst().get());
49a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
50a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Limit is required to transform the infinite stream to a finite stream
51a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // since the exercising requires a finite stream
52a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        withData(TestData.Factory.ofSupplier(
53a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                "", () -> Stream.iterate(0, i -> i + 1).filter(i -> i > 10000).limit(20000))).
54a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                terminal(s->s.findFirst()).expectedResult(Optional.of(10001)).exercise();
55a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
56a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
57a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    //
58a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
59a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testIntRange() {
60a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Half-open
61a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        for (int start : Arrays.asList(1, 10, -1, -10)) {
62a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            setContext("start", start);
63a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            for (int end : Arrays.asList(1, 10, -1, -10)) {
64a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                setContext("end", end);
65a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                int size = (start < end) ? end - start : 0;
66a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                int[] exp = new int[size];
67a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                for (int i = start, p = 0; i < end; i++, p++) {
68a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    exp[p] = i;
69a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                }
70a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
71a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                int[] inc = IntStream.range(start, end).toArray();
72a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                assertEquals(inc.length, size);
73a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                assertTrue(Arrays.equals(exp, inc));
74a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
75a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                withData(intRangeData(start, end)).stream(s -> s).
76a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                        expectedResult(exp).exercise();
77a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
78a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
79a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
80a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Closed
81a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        for (int start : Arrays.asList(1, 10, -1, -10)) {
82a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            setContext("start", start);
83a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            for (int end : Arrays.asList(1, 10, -1, -10)) {
84a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                setContext("end", end);
85a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                int size = (start <= end) ? end - start + 1 : 0;
86a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                int[] exp = new int[size];
87a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                for (int i = start, p = 0; i <= end; i++, p++) {
88a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    exp[p] = i;
89a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                }
90a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
91a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                int[] inc = IntStream.rangeClosed(start, end).toArray();
92a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                assertEquals(inc.length, size);
93a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                assertTrue(Arrays.equals(exp, inc));
94a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
95a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                withData(intRangeClosedData(start, end)).stream(s -> s).
96a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                        expectedResult(exp).exercise();
97a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
98a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
99a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
100a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Closed, maximum upper bound of Integer.MAX_VALUE
101a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        {
102a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            int[] inc = IntStream.rangeClosed(Integer.MAX_VALUE - 1, Integer.MAX_VALUE).toArray();
103a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertEquals(2, inc.length);
104a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertEquals(Integer.MAX_VALUE - 1, inc[0]);
105a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertEquals(Integer.MAX_VALUE, inc[1]);
106a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
107a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            inc = IntStream.rangeClosed(Integer.MAX_VALUE, Integer.MAX_VALUE).toArray();
108a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertEquals(1, inc.length);
109a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertEquals(Integer.MAX_VALUE, inc[0]);
110a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
111a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            SpliteratorTestHelper.testIntSpliterator(
112a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    () -> IntStream.rangeClosed(Integer.MAX_VALUE - 8, Integer.MAX_VALUE).spliterator());
113a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
114a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
115a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Range wider than Integer.MAX_VALUE
116a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        {
117a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            Spliterator.OfInt s = IntStream.rangeClosed(Integer.MIN_VALUE, Integer.MAX_VALUE).
118a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    spliterator();
119a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertEquals(s.estimateSize(), 1L << 32);
120a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
121a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
122a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
123a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    TestData.OfInt intRangeData(int start, int end) {
124a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        return TestData.Factory.ofIntSupplier("int range", () -> IntStream.range(start, end));
125a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
126a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
127a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    TestData.OfInt intRangeClosedData(int start, int end) {
128a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        return TestData.Factory.ofIntSupplier("int rangeClosed", () -> IntStream.rangeClosed(start, end));
129a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
130a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
131a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void tesIntRangeReduce() {
132a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        withData(intRangeData(0, 10000)).
133a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                terminal(s -> s.reduce(0, Integer::sum)).exercise();
134a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
135a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
136a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testIntInfiniteRangeLimit() {
137a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        withData(TestData.Factory.ofIntSupplier(
138a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                "int range", () -> IntStream.iterate(0, i -> i + 1).limit(10000))).
139a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                terminal(s -> s.reduce(0, Integer::sum)).exercise();
140a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
141a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
142a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testIntInfiniteRangeFindFirst() {
143a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        int first = IntStream.iterate(0, i -> i + 1).filter(i -> i > 10000).findFirst().getAsInt();
144a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        assertEquals(first, IntStream.iterate(0, i -> i + 1).parallel().filter(i -> i > 10000).findFirst().getAsInt());
145a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
146a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
147a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    //
148a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
149a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testLongRange() {
150a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Half-open
151a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        for (long start : Arrays.asList(1, 1000, -1, -1000)) {
152a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            setContext("start", start);
153a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            for (long end : Arrays.asList(1, 1000, -1, -1000)) {
154a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                setContext("end", end);
155a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                long size = start < end ? end - start : 0;
156a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                long[] exp = new long[(int) size];
157a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                for (long i = start, p = 0; i < end; i++, p++) {
158a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    exp[(int) p] = i;
159a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                }
160a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
161a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                long[] inc = LongStream.range(start, end).toArray();
162a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                assertEquals(inc.length, size);
163a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                assertTrue(Arrays.equals(exp, inc));
164a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
165a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                withData(longRangeData(start, end)).stream(s -> s).
166a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                        expectedResult(exp).exercise();
167a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
168a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
169a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
170a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Closed
171a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        for (long start : Arrays.asList(1, 1000, -1, -1000)) {
172a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            setContext("start", start);
173a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            for (long end : Arrays.asList(1, 1000, -1, -1000)) {
174a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                setContext("end", end);
175a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                long size = start <= end ? end - start + 1: 0;
176a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                long[] exp = new long[(int) size];
177a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                for (long i = start, p = 0; i <= end; i++, p++) {
178a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    exp[(int) p] = i;
179a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                }
180a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
181a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                long[] inc = LongStream.rangeClosed(start, end).toArray();
182a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                assertEquals(inc.length, size);
183a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                assertTrue(Arrays.equals(exp, inc));
184a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
185a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                withData(longRangeClosedData(start, end)).stream(s -> s).
186a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                        expectedResult(exp).exercise();
187a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            }
188a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
189a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
190a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Closed, maximum upper bound of Long.MAX_VALUE
191a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        {
192a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            long[] inc = LongStream.rangeClosed(Long.MAX_VALUE - 1, Long.MAX_VALUE).toArray();
193a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertEquals(2, inc.length);
194a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertEquals(Long.MAX_VALUE - 1, inc[0]);
195a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertEquals(Long.MAX_VALUE, inc[1]);
196a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
197a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            inc = LongStream.rangeClosed(Long.MAX_VALUE, Long.MAX_VALUE).toArray();
198a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertEquals(1, inc.length);
199a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertEquals(Long.MAX_VALUE, inc[0]);
200a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
201a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            SpliteratorTestHelper.testLongSpliterator(
202a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                    () -> LongStream.rangeClosed(Long.MAX_VALUE - 8, Long.MAX_VALUE).spliterator());
203a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
204a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
205a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
206a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    TestData.OfLong longRangeData(long start, long end) {
207a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        return TestData.Factory.ofLongSupplier("long range", () -> LongStream.range(start, end));
208a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
209a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
210a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    TestData.OfLong longRangeClosedData(long start, long end) {
211a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        return TestData.Factory.ofLongSupplier("long rangeClosed", () -> LongStream.rangeClosed(start, end));
212a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
213a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
214a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testLongRangeReduce() {
215a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        withData(longRangeData(0, 10000)).
216a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                terminal(s -> s.reduce(0, Long::sum)).exercise();
217a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
218a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
219a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testLongInfiniteRangeLimit() {
220a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        withData(TestData.Factory.ofLongSupplier(
221a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                "long range", () -> LongStream.iterate(0, i -> i + 1).limit(10000))).
222a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                terminal(s -> s.reduce(0, Long::sum)).exercise();
223a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
224a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
225a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testLongInfiniteRangeFindFirst() {
226a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        long first = LongStream.iterate(0, i -> i + 1).filter(i -> i > 10000).findFirst().getAsLong();
227a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        assertEquals(first, LongStream.iterate(0, i -> i + 1).parallel().filter(i -> i > 10000).findFirst().getAsLong());
228a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
229a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
230a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    private static void assertSizedAndSubSized(Spliterator<?> s) {
231a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        assertTrue(s.hasCharacteristics(Spliterator.SIZED | Spliterator.SUBSIZED));
232a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
233a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
234a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    private static void assertNotSizedAndSubSized(Spliterator<?> s) {
235a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        assertFalse(s.hasCharacteristics(Spliterator.SIZED | Spliterator.SUBSIZED));
236a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
237a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
238a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testLongLongRange() {
239a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Test [Long.MIN_VALUE, Long.MAX_VALUE)
240a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // This will concatenate streams of three ranges
241a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        //   [Long.MIN_VALUE, x) [x, 0) [0, Long.MAX_VALUE)
242a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // where x = Long.divideUnsigned(0 - Long.MIN_VALUE, 2) + 1
243a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        {
244a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            Spliterator.OfLong s = LongStream.range(Long.MIN_VALUE, Long.MAX_VALUE).spliterator();
245a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
246a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertEquals(s.estimateSize(), Long.MAX_VALUE);
247a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertNotSizedAndSubSized(s);
248a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
249a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            Spliterator.OfLong s1 = s.trySplit();
250a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertNotSizedAndSubSized(s1);
251a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertSizedAndSubSized(s);
252a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
253a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            Spliterator.OfLong s2 = s1.trySplit();
254a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertSizedAndSubSized(s1);
255a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertSizedAndSubSized(s2);
256a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
257a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertTrue(s.estimateSize() == Long.MAX_VALUE);
258a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertTrue(s1.estimateSize() < Long.MAX_VALUE);
259a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertTrue(s2.estimateSize() < Long.MAX_VALUE);
260a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
261a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertEquals(s.estimateSize() + s1.estimateSize() + s2.estimateSize(),
262a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                         Long.MAX_VALUE - Long.MIN_VALUE);
263a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
264a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
265a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        long[][] ranges = { {Long.MIN_VALUE, 0}, {-1, Long.MAX_VALUE} };
266a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        for (int i = 0; i < ranges.length; i++) {
267a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            long start = ranges[i][0];
268a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            long end = ranges[i][1];
269a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
270a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            Spliterator.OfLong s = LongStream.range(start, end).spliterator();
271a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
272a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertEquals(s.estimateSize(), Long.MAX_VALUE);
273a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertNotSizedAndSubSized(s);
274a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
275a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            Spliterator.OfLong s1 = s.trySplit();
276a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertSizedAndSubSized(s1);
277a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertSizedAndSubSized(s);
278a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
279a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertTrue(s.estimateSize() < Long.MAX_VALUE);
280a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertTrue(s1.estimateSize() < Long.MAX_VALUE);
281a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
282a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertEquals(s.estimateSize() + s1.estimateSize(), end - start);
283a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
284a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
285a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
286a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    public void testLongLongRangeClosed() {
287a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // Test [Long.MIN_VALUE, Long.MAX_VALUE]
288a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // This will concatenate streams of four ranges
289a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        //   [Long.MIN_VALUE, x) [x, 0) [0, y) [y, Long.MAX_VALUE]
290a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        // where x = Long.divideUnsigned(0 - Long.MIN_VALUE, 2) + 1
291a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        //       y = Long.divideUnsigned(Long.MAX_VALUE, 2) + 1
292a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
293a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        {
294a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            Spliterator.OfLong s = LongStream.rangeClosed(Long.MIN_VALUE, Long.MAX_VALUE).spliterator();
295a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
296a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertEquals(s.estimateSize(), Long.MAX_VALUE);
297a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertNotSizedAndSubSized(s);
298a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
299a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            Spliterator.OfLong s1 = s.trySplit();
300a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertNotSizedAndSubSized(s1);
301a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertNotSizedAndSubSized(s);
302a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
303a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            Spliterator.OfLong s2 = s1.trySplit();
304a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertSizedAndSubSized(s1);
305a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertSizedAndSubSized(s2);
306a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
307a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            Spliterator.OfLong s3 = s.trySplit();
308a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertSizedAndSubSized(s3);
309a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertSizedAndSubSized(s);
310a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
311a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertTrue(s.estimateSize() < Long.MAX_VALUE);
312a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertTrue(s3.estimateSize() < Long.MAX_VALUE);
313a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertTrue(s1.estimateSize() < Long.MAX_VALUE);
314a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertTrue(s2.estimateSize() < Long.MAX_VALUE);
315a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
316a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertEquals(s.estimateSize() + s3.estimateSize() + s1.estimateSize() + s2.estimateSize(),
317a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin                         Long.MAX_VALUE - Long.MIN_VALUE + 1);
318a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
319a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
320a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        long[][] ranges = { {Long.MIN_VALUE, 0}, {-1, Long.MAX_VALUE} };
321a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        for (int i = 0; i < ranges.length; i++) {
322a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            long start = ranges[i][0];
323a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            long end = ranges[i][1];
324a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
325a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            Spliterator.OfLong s = LongStream.rangeClosed(start, end).spliterator();
326a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
327a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertEquals(s.estimateSize(), Long.MAX_VALUE);
328a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertNotSizedAndSubSized(s);
329a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
330a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            Spliterator.OfLong s1 = s.trySplit();
331a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertSizedAndSubSized(s1);
332a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertSizedAndSubSized(s);
333a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
334a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertTrue(s.estimateSize() < Long.MAX_VALUE);
335a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertTrue(s1.estimateSize() < Long.MAX_VALUE);
336a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin
337a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin            assertEquals(s.estimateSize() + s1.estimateSize(), end - start + 1);
338a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin        }
339a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin    }
340a405b7ea164e472bcf6b75d9890021bd82e4d60dIgor Murashkin}
341