blob: 5132d9d91ecc180844f59938c10fced05de46e8e [file] [log] [blame]
/*
* 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());
}
}
}