diff --git a/junit-platform-commons/src/main/java/org/junit/platform/commons/util/CollectionUtils.java b/junit-platform-commons/src/main/java/org/junit/platform/commons/util/CollectionUtils.java
index c4b790e2f20b..d563c7f934e2 100644
--- a/junit-platform-commons/src/main/java/org/junit/platform/commons/util/CollectionUtils.java
+++ b/junit-platform-commons/src/main/java/org/junit/platform/commons/util/CollectionUtils.java
@@ -36,7 +36,9 @@
import java.util.stream.Stream;
import org.apiguardian.api.API;
+import org.junit.platform.commons.JUnitException;
import org.junit.platform.commons.PreconditionViolationException;
+import org.junit.platform.commons.function.Try;
/**
* Collection of utilities for working with {@link Collection Collections}.
@@ -140,12 +142,12 @@ public static boolean isConvertibleToStream(Class> type) {
|| LongStream.class.isAssignableFrom(type)//
|| Iterable.class.isAssignableFrom(type)//
|| Iterator.class.isAssignableFrom(type)//
- || Spliterator.class.isAssignableFrom(type)//
|| Object[].class.isAssignableFrom(type)//
|| (type.isArray() && type.getComponentType().isPrimitive())//
|| Arrays.stream(type.getMethods())//
+ .filter(m -> m.getName().equals("iterator"))//
.map(Method::getReturnType)//
- .anyMatch(returnType -> returnType == Iterator.class || returnType == Spliterator.class));
+ .anyMatch(returnType -> returnType == Iterator.class));
}
/**
@@ -159,10 +161,9 @@ public static boolean isConvertibleToStream(Class> type) {
*
{@link Collection}
* {@link Iterable}
* {@link Iterator}
- * {@link Spliterator}
* {@link Object} array
* primitive array
- * An object that contains an iterator or spliterator returning method
+ * An object that contains a method with name `iterator` returning an Iterator object
*
*
* @param object the object to convert into a stream; never {@code null}
@@ -194,9 +195,6 @@ public static Stream> toStream(Object object) {
if (object instanceof Iterator) {
return stream(spliteratorUnknownSize((Iterator>) object, ORDERED), false);
}
- if (object instanceof Spliterator) {
- return stream((Spliterator>) object, false);
- }
if (object instanceof Object[]) {
return Arrays.stream((Object[]) object);
}
@@ -212,7 +210,31 @@ public static Stream> toStream(Object object) {
if (object.getClass().isArray() && object.getClass().getComponentType().isPrimitive()) {
return IntStream.range(0, Array.getLength(object)).mapToObj(i -> Array.get(object, i));
}
- return StreamUtils.tryConvertToStreamByReflection(object);
+ return tryConvertToStreamByReflection(object);
+ }
+
+ private static Stream> tryConvertToStreamByReflection(Object object) {
+ Preconditions.notNull(object, "Object must not be null");
+ try {
+ String name = "iterator";
+ Method method = object.getClass().getMethod(name);
+ if (method.getReturnType() == Iterator.class) {
+ return stream(() -> tryIteratorToSpliterator(object, method), ORDERED, false);
+ }
+ else {
+ throw new PreconditionViolationException(
+ "Method with name 'iterator' does not return " + Iterator.class.getName());
+ }
+ }
+ catch (NoSuchMethodException | IllegalStateException e) {
+ throw new PreconditionViolationException(//
+ "Cannot convert instance of " + object.getClass().getName() + " into a Stream: " + object, e);
+ }
+ }
+
+ private static Spliterator> tryIteratorToSpliterator(Object object, Method method) {
+ return Try.call(() -> spliteratorUnknownSize((Iterator>) method.invoke(object), ORDERED))//
+ .getOrThrow(e -> new JUnitException("Cannot invoke method " + method.getName() + " onto " + object, e));//
}
/**
diff --git a/junit-platform-commons/src/main/java/org/junit/platform/commons/util/StreamUtils.java b/junit-platform-commons/src/main/java/org/junit/platform/commons/util/StreamUtils.java
deleted file mode 100644
index 1c629d251f71..000000000000
--- a/junit-platform-commons/src/main/java/org/junit/platform/commons/util/StreamUtils.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright 2015-2023 the original author or authors.
- *
- * All rights reserved. This program and the accompanying materials are
- * made available under the terms of the Eclipse Public License v2.0 which
- * accompanies this distribution and is available at
- *
- * https://www.eclipse.org/legal/epl-v20.html
- */
-
-package org.junit.platform.commons.util;
-
-import static java.util.Spliterator.ORDERED;
-import static java.util.Spliterators.spliteratorUnknownSize;
-import static java.util.stream.StreamSupport.stream;
-
-import java.lang.reflect.Method;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.Optional;
-import java.util.Spliterator;
-import java.util.stream.Stream;
-
-import org.junit.platform.commons.JUnitException;
-import org.junit.platform.commons.PreconditionViolationException;
-import org.junit.platform.commons.function.Try;
-
-/**
- * Collection of utilities for working with {@link Stream Streams}.
- *
- * @since 5.10
- */
-final class StreamUtils {
-
- private StreamUtils() {
- }
-
- static Stream> tryConvertToStreamByReflection(Object object) {
- Preconditions.notNull(object, "Object must not be null");
- Class> theClass = object.getClass();
- try {
- String name = "iterator";
- Method method = theClass.getMethod(name);
- if (method.getReturnType() == Iterator.class) {
- return stream(() -> tryIteratorToSpliterator(object, method), ORDERED, false);
- }
- else {
- throw new IllegalStateException(
- "Method with name 'iterator' does not return " + Iterator.class.getName());
- }
- }
- catch (NoSuchMethodException | IllegalStateException e) {
- return tryConvertToStreamBySpliterator(object, e);
- }
- }
-
- private static Stream> tryConvertToStreamBySpliterator(Object object, Exception e) {
- try {
- String name = "spliterator";
- Method method = object.getClass().getMethod(name);
- if (method.getReturnType() == Spliterator.class) {
- return stream(() -> tryInvokeSpliterator(object, method), ORDERED, false);
- }
- else {
- throw new IllegalStateException(
- "Method with name '" + name + "' does not return " + Spliterator.class.getName());
- }
- }
- catch (NoSuchMethodException | IllegalStateException ex) {
- ex.addSuppressed(e);
- return tryConvertByIteratorSpliteratorReturnType(object, ex);
- }
- }
-
- private static Stream> tryConvertByIteratorSpliteratorReturnType(Object object, Exception ex) {
- return streamFromSpliteratorSupplier(object)//
- .orElseGet(() -> streamFromIteratorSupplier(object)//
- .orElseThrow(() -> //
- new PreconditionViolationException(//
- "Cannot convert instance of " + object.getClass().getName() + " into a Stream: " + object,
- ex)));
- }
-
- private static Optional> streamFromSpliteratorSupplier(Object object) {
- return Arrays.stream(object.getClass().getMethods())//
- .filter(m -> m.getReturnType() == Spliterator.class)//
- .findFirst()//
- .map(m -> stream(() -> tryInvokeSpliterator(object, m), ORDERED, false));//
- }
-
- private static Optional> streamFromIteratorSupplier(Object object) {
- return Arrays.stream(object.getClass().getMethods())//
- .filter(m -> m.getReturnType() == Iterator.class)//
- .findFirst()//
- .map(m -> stream(() -> tryIteratorToSpliterator(object, m), ORDERED, false));//
- }
-
- private static Spliterator> tryInvokeSpliterator(Object object, Method method) {
- return Try.call(() -> (Spliterator>) method.invoke(object))//
- .getOrThrow(e -> new JUnitException("Cannot invoke method " + method.getName() + " onto " + object, e));//
- }
-
- private static Spliterator> tryIteratorToSpliterator(Object object, Method method) {
- return Try.call(() -> method.invoke(object))//
- .andThen(m -> Try.call(() -> spliteratorUnknownSize((Iterator>) m, ORDERED)))//
- .getOrThrow(e -> new JUnitException("Cannot invoke method " + method.getName() + " onto " + object, e));//
- }
-
-}
diff --git a/platform-tests/src/test/java/org/junit/platform/commons/util/CollectionUtilsTests.java b/platform-tests/src/test/java/org/junit/platform/commons/util/CollectionUtilsTests.java
index 642159695910..d4a5e41efb5e 100644
--- a/platform-tests/src/test/java/org/junit/platform/commons/util/CollectionUtilsTests.java
+++ b/platform-tests/src/test/java/org/junit/platform/commons/util/CollectionUtilsTests.java
@@ -99,9 +99,7 @@ void toUnmodifiableListThrowsOnMutation() {
Collection.class, //
Iterable.class, //
Iterator.class, //
- Spliterator.class, //
- MySpliteratorProvider.class, //
- MyIteratorProvider.class, //
+ IteratorProvider.class, //
Object[].class, //
String[].class, //
int[].class, //
@@ -123,12 +121,11 @@ static Stream