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