blob: 0ac9d68f43fdbd442a5ec301ed0710f78eee1d88 [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 java.util.stream;
import org.testng.annotations.Test;
import java.util.function.Function;
import static org.testng.Assert.fail;
/**
* StreamReuseTest
*
* @author Brian Goetz
*/
@Test
public class StreamReuseTest {
private <T, U, E, S extends BaseStream<E, S>, D extends TestData<E, S>> void assertSecondFails(
D data,
Function<S, T> first,
Function<S, U> second,
Class<? extends Throwable> exception,
String text) {
S stream = data.stream();
T fr = first.apply(stream);
try {
U sr = second.apply(stream);
fail(text + " (seq)");
}
catch (Throwable e) {
if (exception.isAssignableFrom(e.getClass())) {
// Expected
}
else if (e instanceof Error)
throw (Error) e;
else if (e instanceof RuntimeException)
throw (RuntimeException) e;
else
throw new AssertionError("Unexpected exception " + e.getClass(), e);
}
stream = data.parallelStream();
fr = first.apply(stream);
try {
U sr = second.apply(stream);
fail(text + " (par)");
}
catch (Throwable e) {
if (exception.isAssignableFrom(e.getClass())) {
// Expected
}
else if (e instanceof Error)
throw (Error) e;
else if (e instanceof RuntimeException)
throw (RuntimeException) e;
else
throw new AssertionError("Unexpected exception " + e.getClass(), e);
}
}
// Stream
@Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class)
public void testTwoStreams(String name, TestData<Integer, Stream<Integer>> data) {
assertSecondFails(data,
(Stream<Integer> s) -> s.map(i -> i), (Stream<Integer> s) -> s.map(i -> i),
IllegalStateException.class,
"Stream map / map succeeded erroneously");
assertSecondFails(data,
Stream::distinct, (Stream<Integer> s) -> s.map(i -> i),
IllegalStateException.class,
"Stream distinct / map succeeded erroneously");
assertSecondFails(data,
(Stream<Integer> s) -> s.map(i -> i), Stream::distinct,
IllegalStateException.class,
"Stream map / distinct succeeded erroneously");
assertSecondFails(data,
Stream::distinct, Stream::distinct,
IllegalStateException.class,
"Stream distinct / distinct succeeded erroneously");
}
@Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class)
public void testTwoTerminals(String name, TestData<Integer, Stream<Integer>> data) {
assertSecondFails(data,
Stream::findFirst, Stream::findFirst,
IllegalStateException.class,
"Stream findFirst / findFirst succeeded erroneously");
}
@Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class)
public void testTerminalStream(String name, TestData<Integer, Stream<Integer>> data) {
assertSecondFails(data,
Stream::findFirst, (Stream<Integer> s) -> s.map(i -> i),
IllegalStateException.class,
"Stream findFirst / map succeeded erroneously");
assertSecondFails(data,
(Stream<Integer> s) -> s.map(i -> i), Stream::findFirst,
IllegalStateException.class,
"Stream map / findFirst succeeded erroneously");
assertSecondFails(data,
Stream::findFirst, Stream::distinct,
IllegalStateException.class,
"Stream findFirst / distinct succeeded erroneously");
assertSecondFails(data,
Stream::distinct, Stream::findFirst,
IllegalStateException.class,
"Stream distinct / findFirst succeeded erroneously");
}
@Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class)
public void testTwoIterators(String name, TestData<Integer, Stream<Integer>> data) {
assertSecondFails(data,
Stream::iterator, Stream::iterator,
IllegalStateException.class,
"Stream iterator / iterator succeeded erroneously");
}
@Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class)
public void testTerminalIterator(String name, TestData<Integer, Stream<Integer>> data) {
assertSecondFails(data,
Stream::iterator, Stream::findFirst,
IllegalStateException.class,
"Stream iterator / findFirst succeeded erroneously");
assertSecondFails(data,
Stream::findFirst, Stream::iterator,
IllegalStateException.class,
"Stream findFirst / iterator succeeded erroneously");
}
@Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class)
public void testStreamIterator(String name, TestData<Integer, Stream<Integer>> data) {
assertSecondFails(data,
Stream::iterator, (Stream<Integer> s) -> s.map(i -> i),
IllegalStateException.class,
"Stream iterator / map succeeded erroneously");
assertSecondFails(data,
(Stream<Integer> s) -> s.map(i -> i), Stream::iterator,
IllegalStateException.class,
"Stream map / iterator succeeded erroneously");
assertSecondFails(data,
Stream::iterator, Stream::distinct,
IllegalStateException.class,
"Stream iterator / distinct succeeded erroneously");
assertSecondFails(data,
Stream::distinct, Stream::iterator,
IllegalStateException.class,
"Stream distinct / iterator succeeded erroneously");
}
// IntStream
@Test(dataProvider = "IntStreamTestData", dataProviderClass = IntStreamTestDataProvider.class)
public void testTwoStreams(String name, TestData.OfInt data) {
assertSecondFails(data,
(IntStream s) -> s.mapToObj(i -> i), (IntStream s) -> s.mapToObj(i -> i),
IllegalStateException.class,
"IntStream map / map succeeded erroneously");
assertSecondFails(data,
IntStream::distinct, (IntStream s) -> s.mapToObj(i -> i),
IllegalStateException.class,
"IntStream distinct / map succeeded erroneously");
assertSecondFails(data,
(IntStream s) -> s.mapToObj(i -> i), IntStream::distinct,
IllegalStateException.class,
"IntStream map / distinct succeeded erroneously");
assertSecondFails(data,
IntStream::distinct, IntStream::distinct,
IllegalStateException.class,
"IntStream distinct / distinct succeeded erroneously");
}
@Test(dataProvider = "IntStreamTestData", dataProviderClass = IntStreamTestDataProvider.class)
public void testTwoTerminals(String name, TestData.OfInt data) {
assertSecondFails(data,
IntStream::sum, IntStream::sum,
IllegalStateException.class,
"IntStream sum / sum succeeded erroneously");
}
@Test(dataProvider = "IntStreamTestData", dataProviderClass = IntStreamTestDataProvider.class)
public void testTerminalStream(String name, TestData.OfInt data) {
assertSecondFails(data,
IntStream::sum, (IntStream s) -> s.mapToObj(i -> i),
IllegalStateException.class,
"IntStream sum / map succeeded erroneously");
assertSecondFails(data,
(IntStream s) -> s.mapToObj(i -> i), IntStream::sum,
IllegalStateException.class,
"IntStream map / sum succeeded erroneously");
assertSecondFails(data,
IntStream::sum, IntStream::distinct,
IllegalStateException.class,
"IntStream sum / distinct succeeded erroneously");
assertSecondFails(data,
IntStream::distinct, IntStream::sum,
IllegalStateException.class,
"IntStream distinct / sum succeeded erroneously");
}
@Test(dataProvider = "IntStreamTestData", dataProviderClass = IntStreamTestDataProvider.class)
public void testTwoIterators(String name, TestData.OfInt data) {
assertSecondFails(data,
IntStream::iterator, IntStream::iterator,
IllegalStateException.class,
"IntStream iterator / iterator succeeded erroneously");
}
@Test(dataProvider = "IntStreamTestData", dataProviderClass = IntStreamTestDataProvider.class)
public void testTerminalIterator(String name, TestData.OfInt data) {
assertSecondFails(data,
IntStream::iterator, IntStream::sum,
IllegalStateException.class,
"IntStream iterator / sum succeeded erroneously");
assertSecondFails(data,
IntStream::sum, IntStream::iterator,
IllegalStateException.class,
"Stream sum / iterator succeeded erroneously");
}
@Test(dataProvider = "IntStreamTestData", dataProviderClass = IntStreamTestDataProvider.class)
public void testStreamIterator(String name, TestData.OfInt data) {
assertSecondFails(data,
IntStream::iterator, (IntStream s) -> s.mapToObj(i -> i),
IllegalStateException.class,
"IntStream iterator / map succeeded erroneously");
assertSecondFails(data,
(IntStream s) -> s.mapToObj(i -> i), IntStream::iterator,
IllegalStateException.class,
"IntStream map / iterator succeeded erroneously");
assertSecondFails(data,
IntStream::iterator, IntStream::distinct,
IllegalStateException.class,
"IntStream iterator / distinct succeeded erroneously");
assertSecondFails(data,
IntStream::distinct, IntStream::iterator,
IllegalStateException.class,
"IntStream distinct / iterator succeeded erroneously");
}
// LongStream
@Test(dataProvider = "LongStreamTestData", dataProviderClass = LongStreamTestDataProvider.class)
public void testTwoStreams(String name, TestData.OfLong data) {
assertSecondFails(data,
(LongStream s) -> s.mapToObj(i -> i), (LongStream s) -> s.mapToObj(i -> i),
IllegalStateException.class,
"LongStream map / map succeeded erroneously");
assertSecondFails(data,
LongStream::distinct, (LongStream s) -> s.mapToObj(i -> i),
IllegalStateException.class,
"LongStream distinct / map succeeded erroneously");
assertSecondFails(data,
(LongStream s) -> s.mapToObj(i -> i), LongStream::distinct,
IllegalStateException.class,
"LongStream map / distinct succeeded erroneously");
assertSecondFails(data,
LongStream::distinct, LongStream::distinct,
IllegalStateException.class,
"LongStream distinct / distinct succeeded erroneously");
}
@Test(dataProvider = "LongStreamTestData", dataProviderClass = LongStreamTestDataProvider.class)
public void testTwoTerminals(String name, TestData.OfLong data) {
assertSecondFails(data,
LongStream::sum, LongStream::sum,
IllegalStateException.class,
"LongStream sum / sum succeeded erroneously");
}
@Test(dataProvider = "LongStreamTestData", dataProviderClass = LongStreamTestDataProvider.class)
public void testTerminalStream(String name, TestData.OfLong data) {
assertSecondFails(data,
LongStream::sum, (LongStream s) -> s.mapToObj(i -> i),
IllegalStateException.class,
"LongStream sum / map succeeded erroneously");
assertSecondFails(data,
(LongStream s) -> s.mapToObj(i -> i), LongStream::sum,
IllegalStateException.class,
"LongStream map / sum succeeded erroneously");
assertSecondFails(data,
LongStream::sum, LongStream::distinct,
IllegalStateException.class,
"LongStream sum / distinct succeeded erroneously");
assertSecondFails(data,
LongStream::distinct, LongStream::sum,
IllegalStateException.class,
"LongStream distinct / sum succeeded erroneously");
}
@Test(dataProvider = "LongStreamTestData", dataProviderClass = LongStreamTestDataProvider.class)
public void testTwoIterators(String name, TestData.OfLong data) {
assertSecondFails(data,
LongStream::iterator, LongStream::iterator,
IllegalStateException.class,
"LongStream iterator / iterator succeeded erroneously");
}
@Test(dataProvider = "LongStreamTestData", dataProviderClass = LongStreamTestDataProvider.class)
public void testTerminalIterator(String name, TestData.OfLong data) {
assertSecondFails(data,
LongStream::iterator, LongStream::sum,
IllegalStateException.class,
"LongStream iterator / sum succeeded erroneously");
assertSecondFails(data,
LongStream::sum, LongStream::iterator,
IllegalStateException.class,
"Stream sum / iterator succeeded erroneously");
}
@Test(dataProvider = "LongStreamTestData", dataProviderClass = LongStreamTestDataProvider.class)
public void testStreamIterator(String name, TestData.OfLong data) {
assertSecondFails(data,
LongStream::iterator, (LongStream s) -> s.mapToObj(i -> i),
IllegalStateException.class,
"LongStream iterator / map succeeded erroneously");
assertSecondFails(data,
(LongStream s) -> s.mapToObj(i -> i), LongStream::iterator,
IllegalStateException.class,
"LongStream map / iterator succeeded erroneously");
assertSecondFails(data,
LongStream::iterator, LongStream::distinct,
IllegalStateException.class,
"LongStream iterator / distinct succeeded erroneously");
assertSecondFails(data,
LongStream::distinct, LongStream::iterator,
IllegalStateException.class,
"LongStream distinct / iterator succeeded erroneously");
}
// DoubleStream
@Test(dataProvider = "DoubleStreamTestData", dataProviderClass = DoubleStreamTestDataProvider.class)
public void testTwoStreams(String name, TestData.OfDouble data) {
assertSecondFails(data,
(DoubleStream s) -> s.mapToObj(i -> i), (DoubleStream s) -> s.mapToObj(i -> i),
IllegalStateException.class,
"DoubleStream map / map succeeded erroneously");
assertSecondFails(data,
DoubleStream::distinct, (DoubleStream s) -> s.mapToObj(i -> i),
IllegalStateException.class,
"DoubleStream distinct / map succeeded erroneously");
assertSecondFails(data,
(DoubleStream s) -> s.mapToObj(i -> i), DoubleStream::distinct,
IllegalStateException.class,
"DoubleStream map / distinct succeeded erroneously");
assertSecondFails(data,
DoubleStream::distinct, DoubleStream::distinct,
IllegalStateException.class,
"DoubleStream distinct / distinct succeeded erroneously");
}
@Test(dataProvider = "DoubleStreamTestData", dataProviderClass = DoubleStreamTestDataProvider.class)
public void testTwoTerminals(String name, TestData.OfDouble data) {
assertSecondFails(data,
DoubleStream::sum, DoubleStream::sum,
IllegalStateException.class,
"DoubleStream sum / sum succeeded erroneously");
}
@Test(dataProvider = "DoubleStreamTestData", dataProviderClass = DoubleStreamTestDataProvider.class)
public void testTerminalStream(String name, TestData.OfDouble data) {
assertSecondFails(data,
DoubleStream::sum, (DoubleStream s) -> s.mapToObj(i -> i),
IllegalStateException.class,
"DoubleStream sum / map succeeded erroneously");
assertSecondFails(data,
(DoubleStream s) -> s.mapToObj(i -> i), DoubleStream::sum,
IllegalStateException.class,
"DoubleStream map / sum succeeded erroneously");
assertSecondFails(data,
DoubleStream::sum, DoubleStream::distinct,
IllegalStateException.class,
"DoubleStream sum / distinct succeeded erroneously");
assertSecondFails(data,
DoubleStream::distinct, DoubleStream::sum,
IllegalStateException.class,
"DoubleStream distinct / sum succeeded erroneously");
}
@Test(dataProvider = "DoubleStreamTestData", dataProviderClass = DoubleStreamTestDataProvider.class)
public void testTwoIterators(String name, TestData.OfDouble data) {
assertSecondFails(data,
DoubleStream::iterator, DoubleStream::iterator,
IllegalStateException.class,
"DoubleStream iterator / iterator succeeded erroneously");
}
@Test(dataProvider = "DoubleStreamTestData", dataProviderClass = DoubleStreamTestDataProvider.class)
public void testTerminalIterator(String name, TestData.OfDouble data) {
assertSecondFails(data,
DoubleStream::iterator, DoubleStream::sum,
IllegalStateException.class,
"DoubleStream iterator / sum succeeded erroneously");
assertSecondFails(data,
DoubleStream::sum, DoubleStream::iterator,
IllegalStateException.class,
"Stream sum / iterator succeeded erroneously");
}
@Test(dataProvider = "DoubleStreamTestData", dataProviderClass = DoubleStreamTestDataProvider.class)
public void testStreamIterator(String name, TestData.OfDouble data) {
assertSecondFails(data,
DoubleStream::iterator, (DoubleStream s) -> s.mapToObj(i -> i),
IllegalStateException.class,
"DoubleStream iterator / map succeeded erroneously");
assertSecondFails(data,
(DoubleStream s) -> s.mapToObj(i -> i), DoubleStream::iterator,
IllegalStateException.class,
"DoubleStream map / iterator succeeded erroneously");
assertSecondFails(data,
DoubleStream::iterator, DoubleStream::distinct,
IllegalStateException.class,
"DoubleStream iterator / distinct succeeded erroneously");
assertSecondFails(data,
DoubleStream::distinct, DoubleStream::iterator,
IllegalStateException.class,
"DoubleStream distinct / iterator succeeded erroneously");
}
}