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