| /* |
| * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| package org.openjdk.tests.java.util.stream; |
| |
| import org.testng.annotations.Test; |
| |
| import java.util.*; |
| import java.util.function.Function; |
| import java.util.stream.*; |
| |
| import static java.util.stream.LambdaTestHelpers.*; |
| import static org.testng.Assert.assertEquals; |
| |
| |
| /** |
| * ToArrayOpTest |
| * |
| */ |
| @Test |
| public class ToArrayOpTest extends OpTestCase { |
| |
| public void testToArray() { |
| assertCountSum(Arrays.asList(countTo(0).stream().toArray()), 0, 0); |
| assertCountSum(Arrays.asList(countTo(10).stream().toArray()), 10, 55); |
| } |
| |
| @Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class) |
| public void testOps(String name, TestData.OfRef<Integer> data) { |
| exerciseTerminalOps(data, s -> s.toArray()); |
| } |
| |
| @Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class) |
| public void testOpsWithMap(String name, TestData.OfRef<Integer> data) { |
| // Retain the size of the source |
| // This should kick in the parallel evaluation optimization for tasks stuffing elements into a shared array |
| |
| Object[] objects = exerciseTerminalOps(data, s -> s.map(i -> (Integer) (i + i)), s -> s.toArray()); |
| assertTrue(objects.length == data.size()); |
| } |
| |
| @Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class) |
| public void testOpsWithSorted(String name, TestData.OfRef<Integer> data) { |
| // Retain the size of the source |
| // This should kick in the parallel evaluation optimization for tasks stuffing elements into a shared array |
| |
| Object[] objects = exerciseTerminalOps(data, s -> s.sorted(), s -> s.toArray()); |
| assertTrue(objects.length == data.size()); |
| } |
| |
| @Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class) |
| public void testOpsWithFlatMap(String name, TestData.OfRef<Integer> data) { |
| // Double the size of the source |
| // Fixed size optimizations will not be used |
| |
| Object[] objects = exerciseTerminalOps(data, |
| s -> s.flatMap(e -> Arrays.stream(new Object[] { e, e })), |
| s -> s.toArray()); |
| assertTrue(objects.length == data.size() * 2); |
| } |
| |
| @Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class) |
| public void testOpsWithFilter(String name, TestData.OfRef<Integer> data) { |
| // Reduce the size of the source |
| // Fixed size optimizations will not be used |
| |
| exerciseTerminalOps(data, s -> s.filter(LambdaTestHelpers.pEven), s -> s.toArray()); |
| } |
| |
| public void testAsArrayWithType() { |
| exerciseTerminalOps( |
| TestData.Factory.ofCollection("", Arrays.asList(1.1, 2.2, 3.4, 4.4)), |
| s -> // First pipeline slice using Object[] with Double elements |
| s.sorted() |
| // Second pipeline slice using Integer[] with Integer elements |
| .map((Double d) -> Integer.valueOf(d.intValue())).sorted(), |
| s -> s.toArray(Integer[]::new)); |
| } |
| |
| private List<Function<Stream<Integer>, Stream<Integer>>> uniqueAndSortedPermutations = |
| LambdaTestHelpers.permuteStreamFunctions(Arrays.asList( |
| s -> s.distinct(), |
| s -> s.distinct(), |
| s -> s.sorted(), |
| s -> s.sorted() |
| )); |
| |
| @Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class) |
| public void testDistinctAndSortedPermutations(String name, TestData.OfRef<Integer> data) { |
| for (Function<Stream<Integer>, Stream<Integer>> f : uniqueAndSortedPermutations) { |
| exerciseTerminalOps(data, f, s -> s.toArray()); |
| |
| Integer[] is = exerciseTerminalOps(data, f, s -> s.toArray(Integer[]::new)); |
| assertEquals(is.getClass(), Integer[].class); |
| |
| Number[] ns = exerciseTerminalOps(data, f, s -> s.toArray(Number[]::new)); |
| assertEquals(ns.getClass(), Number[].class); |
| |
| if (data.size() > 0) { |
| Exception caught = null; |
| try { |
| exerciseTerminalOps(data, f, s -> s.toArray(String[]::new)); |
| } catch (Exception e) { |
| caught = e; |
| } |
| assertTrue(caught != null); |
| assertEquals(caught.getClass(), ArrayStoreException.class); |
| } |
| } |
| } |
| |
| private List<Function<Stream<Integer>, Stream<Integer>>> statefulOpPermutations = |
| LambdaTestHelpers.permuteStreamFunctions(Arrays.asList( |
| s -> s.limit(10), |
| s -> s.distinct(), |
| s -> s.sorted() |
| )); |
| |
| private <T extends Object> ResultAsserter<T[]> statefulOpResultAsserter(TestData.OfRef<Integer> data) { |
| return (act, exp, ord, par) -> { |
| if (par) { |
| if (!data.isOrdered()) { |
| // Relax the checking if the data source is unordered |
| // It is not exactly possible to determine if the limit |
| // operation is present and if it is before or after |
| // the sorted operation |
| // If the limit operation is present and before the sorted |
| // operation then the sub-set output after limit is a |
| // non-deterministic sub-set of the source |
| List<Integer> expected = new ArrayList<>(); |
| data.forEach(expected::add); |
| |
| List<T> actual = Arrays.asList(act); |
| |
| assertEquals(actual.size(), exp.length); |
| assertTrue(expected.containsAll(actual)); |
| return; |
| } |
| else if (!ord) { |
| LambdaTestHelpers.assertContentsUnordered(Arrays.asList(act), |
| Arrays.asList(exp)); |
| return; |
| } |
| } |
| assertEquals(act, exp); |
| }; |
| } |
| |
| @Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class, |
| groups = { "serialization-hostile" }) |
| public void testStatefulOpPermutations(String name, TestData.OfRef<Integer> data) { |
| for (Function<Stream<Integer>, Stream<Integer>> f : statefulOpPermutations) { |
| withData(data).terminal(f, s -> s.toArray()) |
| .resultAsserter(statefulOpResultAsserter(data)) |
| .exercise(); |
| |
| Integer[] is = withData(data).terminal(f, s -> s.toArray(Integer[]::new)) |
| .resultAsserter(statefulOpResultAsserter(data)) |
| .exercise(); |
| assertEquals(is.getClass(), Integer[].class); |
| |
| Number[] ns = withData(data).terminal(f, s -> s.toArray(Number[]::new)) |
| .resultAsserter(statefulOpResultAsserter(data)) |
| .exercise(); |
| assertEquals(ns.getClass(), Number[].class); |
| |
| if (data.size() > 0) { |
| Exception caught = null; |
| try { |
| exerciseTerminalOps(data, f, s -> s.toArray(String[]::new)); |
| } catch (Exception e) { |
| caught = e; |
| } |
| assertTrue(caught != null); |
| assertEquals(caught.getClass(), ArrayStoreException.class); |
| } |
| } |
| } |
| |
| // |
| |
| @Test(dataProvider = "IntStreamTestData", dataProviderClass = IntStreamTestDataProvider.class) |
| public void testIntOps(String name, TestData.OfInt data) { |
| exerciseTerminalOps(data, s -> s.toArray()); |
| } |
| |
| @Test(dataProvider = "IntStreamTestData", dataProviderClass = IntStreamTestDataProvider.class) |
| public void testIntOpsWithMap(String name, TestData.OfInt data) { |
| // Retain the size of the source |
| // This should kick in the parallel evaluation optimization for tasks stuffing elements into a shared array |
| |
| int[] ints = exerciseTerminalOps(data, s -> s.map(i -> i + i), s -> s.toArray()); |
| assertTrue(ints.length == data.size()); |
| } |
| |
| @Test(dataProvider = "IntStreamTestData", dataProviderClass = IntStreamTestDataProvider.class) |
| public void testIntOpsWithSorted(String name, TestData.OfInt data) { |
| // Retain the size of the source |
| // This should kick in the parallel evaluation optimization for tasks stuffing elements into a shared array |
| |
| int[] ints = exerciseTerminalOps(data, s -> s.sorted(), (IntStream s) -> s.toArray()); |
| assertTrue(ints.length == data.size()); |
| } |
| |
| @Test(dataProvider = "IntStreamTestData", dataProviderClass = IntStreamTestDataProvider.class) |
| public void testIntOpsWithFlatMap(String name, TestData.OfInt data) { |
| // Int the size of the source |
| // Fixed size optimizations will not be used |
| |
| int[] objects = exerciseTerminalOps(data, |
| s -> s.flatMap(e -> Arrays.stream(new int[] { e, e })), |
| s -> s.toArray()); |
| assertTrue(objects.length == data.size() * 2); |
| } |
| |
| @Test(dataProvider = "IntStreamTestData", dataProviderClass = IntStreamTestDataProvider.class) |
| public void testIntOpsWithFilter(String name, TestData.OfInt data) { |
| // Reduce the size of the source |
| // Fixed size optimizations will not be used |
| |
| exerciseTerminalOps(data, s -> s.filter(LambdaTestHelpers.ipEven), s -> s.toArray()); |
| } |
| |
| private List<Function<IntStream, IntStream>> intUniqueAndSortedPermutations = |
| LambdaTestHelpers.permuteStreamFunctions(Arrays.asList( |
| s -> s.distinct(), |
| s -> s.distinct(), |
| s -> s.sorted(), |
| s -> s.sorted() |
| )); |
| |
| @Test(dataProvider = "IntStreamTestData", dataProviderClass = IntStreamTestDataProvider.class) |
| public void testIntDistinctAndSortedPermutations(String name, TestData.OfInt data) { |
| for (Function<IntStream, IntStream> f : intUniqueAndSortedPermutations) { |
| exerciseTerminalOps(data, f, s -> s.toArray()); |
| } |
| } |
| |
| private List<Function<IntStream, IntStream>> intStatefulOpPermutations = |
| LambdaTestHelpers.permuteStreamFunctions(Arrays.asList( |
| s -> s.limit(10), |
| s -> s.distinct(), |
| s -> s.sorted() |
| )); |
| |
| @Test(dataProvider = "IntStreamTestData", dataProviderClass = IntStreamTestDataProvider.class) |
| public void testIntStatefulOpPermutations(String name, TestData.OfInt data) { |
| for (Function<IntStream, IntStream> f : intStatefulOpPermutations) { |
| exerciseTerminalOps(data, f, s -> s.toArray()); |
| } |
| } |
| |
| // |
| |
| @Test(dataProvider = "LongStreamTestData", dataProviderClass = LongStreamTestDataProvider.class) |
| public void testLongOps(String name, TestData.OfLong data) { |
| exerciseTerminalOps(data, s -> s.toArray()); |
| } |
| |
| @Test(dataProvider = "LongStreamTestData", dataProviderClass = LongStreamTestDataProvider.class) |
| public void testLongOpsWithMap(String name, TestData.OfLong data) { |
| // Retain the size of the source |
| // This should kick in the parallel evaluation optimization for tasks stuffing elements into a shared array |
| |
| long[] longs = exerciseTerminalOps(data, s -> s.map(i -> i + i), s -> s.toArray()); |
| assertTrue(longs.length == data.size()); |
| } |
| |
| @Test(dataProvider = "LongStreamTestData", dataProviderClass = LongStreamTestDataProvider.class) |
| public void testLongOpsWithSorted(String name, TestData.OfLong data) { |
| // Retain the size of the source |
| // This should kick in the parallel evaluation optimization for tasks stuffing elements into a shared array |
| |
| long[] longs = exerciseTerminalOps(data, s -> s.sorted(), (LongStream s) -> s.toArray()); |
| assertTrue(longs.length == data.size()); |
| } |
| |
| @Test(dataProvider = "LongStreamTestData", dataProviderClass = LongStreamTestDataProvider.class) |
| public void testLongOpsWithFlatMap(String name, TestData.OfLong data) { |
| // Long the size of the source |
| // Fixed size optimizations will not be used |
| |
| long[] objects = exerciseTerminalOps(data, |
| s -> s.flatMap(e -> Arrays.stream(new long[] { e, e })), |
| s -> s.toArray()); |
| assertTrue(objects.length == data.size() * 2); |
| } |
| |
| @Test(dataProvider = "LongStreamTestData", dataProviderClass = LongStreamTestDataProvider.class) |
| public void testLongOpsWithFilter(String name, TestData.OfLong data) { |
| // Reduce the size of the source |
| // Fixed size optimizations will not be used |
| |
| exerciseTerminalOps(data, s -> s.filter(LambdaTestHelpers.lpEven), s -> s.toArray()); |
| } |
| |
| private List<Function<LongStream, LongStream>> longUniqueAndSortedPermutations = |
| LambdaTestHelpers.permuteStreamFunctions(Arrays.asList( |
| s -> s.distinct(), |
| s -> s.distinct(), |
| s -> s.sorted(), |
| s -> s.sorted() |
| )); |
| |
| @Test(dataProvider = "LongStreamTestData", dataProviderClass = LongStreamTestDataProvider.class) |
| public void testLongDistinctAndSortedPermutations(String name, TestData.OfLong data) { |
| for (Function<LongStream, LongStream> f : longUniqueAndSortedPermutations) { |
| exerciseTerminalOps(data, f, s -> s.toArray()); |
| } |
| } |
| |
| private List<Function<LongStream, LongStream>> longStatefulOpPermutations = |
| LambdaTestHelpers.permuteStreamFunctions(Arrays.asList( |
| s -> s.limit(10), |
| s -> s.distinct(), |
| s -> s.sorted() |
| )); |
| |
| @Test(dataProvider = "LongStreamTestData", dataProviderClass = LongStreamTestDataProvider.class) |
| public void testLongStatefulOpPermutations(String name, TestData.OfLong data) { |
| for (Function<LongStream, LongStream> f : longStatefulOpPermutations) { |
| exerciseTerminalOps(data, f, s -> s.toArray()); |
| } |
| } |
| |
| // |
| |
| @Test(dataProvider = "DoubleStreamTestData", dataProviderClass = DoubleStreamTestDataProvider.class) |
| public void testDoubleOps(String name, TestData.OfDouble data) { |
| exerciseTerminalOps(data, s -> s.toArray()); |
| } |
| |
| @Test(dataProvider = "DoubleStreamTestData", dataProviderClass = DoubleStreamTestDataProvider.class) |
| public void testDoubleOpsWithMap(String name, TestData.OfDouble data) { |
| // Retain the size of the source |
| // This should kick in the parallel evaluation optimization for tasks stuffing elements into a shared array |
| |
| double[] doubles = exerciseTerminalOps(data, s -> s.map(i -> i + i), s -> s.toArray()); |
| assertTrue(doubles.length == data.size()); |
| } |
| |
| @Test(dataProvider = "DoubleStreamTestData", dataProviderClass = DoubleStreamTestDataProvider.class) |
| public void testDoubleOpsWithSorted(String name, TestData.OfDouble data) { |
| // Retain the size of the source |
| // This should kick in the parallel evaluation optimization for tasks stuffing elements into a shared array |
| |
| double[] doubles = exerciseTerminalOps(data, s -> s.sorted(), (DoubleStream s) -> s.toArray()); |
| assertTrue(doubles.length == data.size()); |
| } |
| |
| @Test(dataProvider = "DoubleStreamTestData", dataProviderClass = DoubleStreamTestDataProvider.class) |
| public void testDoubleOpsWithFlatMap(String name, TestData.OfDouble data) { |
| // Double the size of the source |
| // Fixed size optimizations will not be used |
| |
| double[] objects = exerciseTerminalOps(data, |
| s -> s.flatMap(e -> Arrays.stream(new double[] { e, e })), |
| s -> s.toArray()); |
| assertTrue(objects.length == data.size() * 2); |
| } |
| |
| @Test(dataProvider = "DoubleStreamTestData", dataProviderClass = DoubleStreamTestDataProvider.class) |
| public void testDoubleOpsWithFilter(String name, TestData.OfDouble data) { |
| // Reduce the size of the source |
| // Fixed size optimizations will not be used |
| |
| exerciseTerminalOps(data, s -> s.filter(LambdaTestHelpers.dpEven), s -> s.toArray()); |
| } |
| |
| private List<Function<DoubleStream, DoubleStream>> doubleUniqueAndSortedPermutations = |
| LambdaTestHelpers.permuteStreamFunctions(Arrays.asList( |
| s -> s.distinct(), |
| s -> s.distinct(), |
| s -> s.sorted(), |
| s -> s.sorted() |
| )); |
| |
| @Test(dataProvider = "DoubleStreamTestData", dataProviderClass = DoubleStreamTestDataProvider.class) |
| public void testDoubleDistinctAndSortedPermutations(String name, TestData.OfDouble data) { |
| for (Function<DoubleStream, DoubleStream> f : doubleUniqueAndSortedPermutations) { |
| exerciseTerminalOps(data, f, s -> s.toArray()); |
| } |
| } |
| |
| private List<Function<DoubleStream, DoubleStream>> doubleStatefulOpPermutations = |
| LambdaTestHelpers.permuteStreamFunctions(Arrays.asList( |
| s -> s.limit(10), |
| s -> s.distinct(), |
| s -> s.sorted() |
| )); |
| |
| @Test(dataProvider = "DoubleStreamTestData", dataProviderClass = DoubleStreamTestDataProvider.class) |
| public void testDoubleStatefulOpPermutations(String name, TestData.OfDouble data) { |
| for (Function<DoubleStream, DoubleStream> f : doubleStatefulOpPermutations) { |
| exerciseTerminalOps(data, f, s -> s.toArray()); |
| } |
| } |
| } |