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