diff --git a/documentation/src/test/java/example/ClassTemplateDemo.java b/documentation/src/test/java/example/ClassTemplateDemo.java index d1035b434348..93f669ab5be2 100644 --- a/documentation/src/test/java/example/ClassTemplateDemo.java +++ b/documentation/src/test/java/example/ClassTemplateDemo.java @@ -11,11 +11,9 @@ package example; import static java.util.Collections.singletonList; -import static java.util.Collections.unmodifiableList; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import java.util.Arrays; import java.util.List; import java.util.stream.Stream; @@ -36,7 +34,7 @@ class ClassTemplateDemo { static final List WELL_KNOWN_FRUITS // tag::custom_line_break[] - = unmodifiableList(Arrays.asList("apple", "banana", "lemon")); + = List.of("apple", "banana", "lemon"); //end::user_guide[] @Nullable diff --git a/documentation/src/test/java/example/ExternalFieldSourceDemo.java b/documentation/src/test/java/example/ExternalFieldSourceDemo.java index b6bdc67d5364..d981669d46dc 100644 --- a/documentation/src/test/java/example/ExternalFieldSourceDemo.java +++ b/documentation/src/test/java/example/ExternalFieldSourceDemo.java @@ -10,8 +10,6 @@ package example; -import java.util.Arrays; -import java.util.Collections; import java.util.List; import org.junit.jupiter.params.ParameterizedTest; @@ -30,6 +28,6 @@ void testWithExternalFieldSource(String tropicalFruit) { class FruitUtils { - public static final List tropicalFruits = Collections.unmodifiableList(Arrays.asList("pineapple", "kiwi")); + public static final List tropicalFruits = List.of("pineapple", "kiwi"); } diff --git a/junit-jupiter-api/src/main/java/org/junit/jupiter/api/AssertAll.java b/junit-jupiter-api/src/main/java/org/junit/jupiter/api/AssertAll.java index 666b7bb75dcc..14cc239ce08d 100644 --- a/junit-jupiter-api/src/main/java/org/junit/jupiter/api/AssertAll.java +++ b/junit-jupiter-api/src/main/java/org/junit/jupiter/api/AssertAll.java @@ -14,7 +14,6 @@ import java.util.Collection; import java.util.List; import java.util.Objects; -import java.util.stream.Collectors; import java.util.stream.Stream; import org.jspecify.annotations.Nullable; @@ -75,7 +74,7 @@ static void assertAll(@Nullable String heading, Stream executables) } }) // .filter(Objects::nonNull) // - .collect(Collectors.toList()); + .toList(); if (!failures.isEmpty()) { MultipleFailuresError multipleFailuresError = new MultipleFailuresError(heading, failures); diff --git a/junit-jupiter-api/src/main/java/org/junit/jupiter/api/AssertIterableEquals.java b/junit-jupiter-api/src/main/java/org/junit/jupiter/api/AssertIterableEquals.java index 6512d10e8f12..b9e70a58844d 100644 --- a/junit-jupiter-api/src/main/java/org/junit/jupiter/api/AssertIterableEquals.java +++ b/junit-jupiter-api/src/main/java/org/junit/jupiter/api/AssertIterableEquals.java @@ -198,30 +198,7 @@ private static void failIterablesNotEqual(Object expected, Object actual, Deque< .buildAndThrow(); } - private final static class Pair { - private final Object left; - private final Object right; - - public Pair(Object left, Object right) { - this.left = left; - this.right = right; - } - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; - Pair that = (Pair) o; - return Objects.equals(this.left, that.left) // - && Objects.equals(this.right, that.right); - } - - @Override - public int hashCode() { - return Objects.hash(left, right); - } + private record Pair(Object left, Object right) { } private enum Status { diff --git a/junit-jupiter-api/src/main/java/org/junit/jupiter/api/AssertLinesMatch.java b/junit-jupiter-api/src/main/java/org/junit/jupiter/api/AssertLinesMatch.java index 2f61fe53e8e1..16921e088eff 100644 --- a/junit-jupiter-api/src/main/java/org/junit/jupiter/api/AssertLinesMatch.java +++ b/junit-jupiter-api/src/main/java/org/junit/jupiter/api/AssertLinesMatch.java @@ -19,7 +19,6 @@ import java.util.Deque; import java.util.List; import java.util.regex.PatternSyntaxException; -import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; @@ -65,8 +64,8 @@ static void assertLinesMatch(Stream expectedLines, Stream actual return; } - List expectedListOfStrings = expectedLines.collect(Collectors.toList()); - List actualListOfStrings = actualLines.collect(Collectors.toList()); + List expectedListOfStrings = expectedLines.toList(); + List actualListOfStrings = actualLines.toList(); assertLinesMatch(expectedListOfStrings, actualListOfStrings, messageOrSupplier); } @@ -83,19 +82,8 @@ static void assertLinesMatch(List expectedLines, List actualLine new LinesMatcher(expectedLines, actualLines, messageOrSupplier).assertLinesMatch(); } - private static class LinesMatcher { - - private final List expectedLines; - private final List actualLines; - - @Nullable - private final Object messageOrSupplier; - - LinesMatcher(List expectedLines, List actualLines, @Nullable Object messageOrSupplier) { - this.expectedLines = expectedLines; - this.actualLines = actualLines; - this.messageOrSupplier = messageOrSupplier; - } + private record LinesMatcher(List expectedLines, List actualLines, + @Nullable Object messageOrSupplier) { void assertLinesMatch() { int expectedSize = expectedLines.size(); diff --git a/junit-jupiter-api/src/main/java/org/junit/jupiter/api/extension/ExtensionContext.java b/junit-jupiter-api/src/main/java/org/junit/jupiter/api/extension/ExtensionContext.java index e8e5133baa9e..a4f2a09a56b2 100644 --- a/junit-jupiter-api/src/main/java/org/junit/jupiter/api/extension/ExtensionContext.java +++ b/junit-jupiter-api/src/main/java/org/junit/jupiter/api/extension/ExtensionContext.java @@ -10,7 +10,6 @@ package org.junit.jupiter.api.extension; -import static java.util.Collections.unmodifiableList; import static org.apiguardian.api.API.Status.DEPRECATED; import static org.apiguardian.api.API.Status.EXPERIMENTAL; import static org.apiguardian.api.API.Status.INTERNAL; @@ -20,7 +19,6 @@ import java.lang.reflect.Method; import java.nio.file.Path; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; @@ -770,13 +768,13 @@ class Namespace { public static Namespace create(Object... parts) { Preconditions.notEmpty(parts, "parts array must not be null or empty"); Preconditions.containsNoNullElements(parts, "individual parts must not be null"); - return new Namespace(new ArrayList<>(Arrays.asList(parts))); + return new Namespace(List.of(parts)); } private final List parts; private Namespace(List parts) { - this.parts = parts; + this.parts = List.copyOf(parts); } @Override @@ -815,7 +813,7 @@ public Namespace append(Object... parts) { @API(status = INTERNAL, since = "5.13") public List getParts() { - return unmodifiableList(parts); + return parts; } } diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/AbstractExtensionContext.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/AbstractExtensionContext.java index 8a9129bc5136..b35768ca74a6 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/AbstractExtensionContext.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/AbstractExtensionContext.java @@ -221,16 +221,11 @@ public Store getStore(Namespace namespace) { @Override public Store getStore(StoreScope scope, Namespace namespace) { - // TODO [#4246] Use switch expression - switch (scope) { - case LAUNCHER_SESSION: - return launcherStoreFacade.getSessionLevelStore(namespace); - case EXECUTION_REQUEST: - return launcherStoreFacade.getRequestLevelStore(namespace); - case EXTENSION_CONTEXT: - return getStore(namespace); - } - throw new JUnitException("Unknown StoreScope: " + scope); + return switch (scope) { + case LAUNCHER_SESSION -> launcherStoreFacade.getSessionLevelStore(namespace); + case EXECUTION_REQUEST -> launcherStoreFacade.getRequestLevelStore(namespace); + case EXTENSION_CONTEXT -> getStore(namespace); + }; } @Override @@ -267,12 +262,9 @@ public List getExtensions(Class extensionType) { protected abstract Node.ExecutionMode getPlatformExecutionMode(); private ExecutionMode toJupiterExecutionMode(Node.ExecutionMode mode) { - switch (mode) { - case CONCURRENT: - return ExecutionMode.CONCURRENT; - case SAME_THREAD: - return ExecutionMode.SAME_THREAD; - } - throw new JUnitException("Unknown ExecutionMode: " + mode); + return switch (mode) { + case CONCURRENT -> ExecutionMode.CONCURRENT; + case SAME_THREAD -> ExecutionMode.SAME_THREAD; + }; } } diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/ClassTemplateTestDescriptor.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/ClassTemplateTestDescriptor.java index 35360b0b33ab..29fb3c54652d 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/ClassTemplateTestDescriptor.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/ClassTemplateTestDescriptor.java @@ -11,7 +11,6 @@ package org.junit.jupiter.engine.descriptor; import static java.util.stream.Collectors.toCollection; -import static java.util.stream.Collectors.toList; import static org.apiguardian.api.API.Status.INTERNAL; import static org.junit.jupiter.api.TestInstance.Lifecycle.PER_METHOD; import static org.junit.jupiter.engine.descriptor.LifecycleMethodUtils.validateClassTemplateInvocationLifecycleMethodsAreDeclaredCorrectly; @@ -108,9 +107,9 @@ protected JupiterTestDescriptor copyIncludingDescendants(UnaryOperator copy.childrenPrototypes.add(newChild); }); this.childrenPrototypesByIndex.forEach((index, oldChildren) -> { - List newChildren = oldChildren.stream() // + List newChildren = oldChildren.stream() // .map(oldChild -> ((JupiterTestDescriptor) oldChild).copyIncludingDescendants(uniqueIdTransformer)) // - .collect(toList()); + .toList(); copy.childrenPrototypesByIndex.put(index, newChildren); }); return copy; diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/DefaultDynamicTestInvocationContext.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/DefaultDynamicTestInvocationContext.java index 72ef0981b728..402b6478bbed 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/DefaultDynamicTestInvocationContext.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/DefaultDynamicTestInvocationContext.java @@ -18,13 +18,7 @@ * * @since 5.8 */ -class DefaultDynamicTestInvocationContext implements DynamicTestInvocationContext { - - private final Executable executable; - - DefaultDynamicTestInvocationContext(Executable executable) { - this.executable = executable; - } +record DefaultDynamicTestInvocationContext(Executable executable) implements DynamicTestInvocationContext { @Override public Executable getExecutable() { diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/DefaultTestInstanceFactoryContext.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/DefaultTestInstanceFactoryContext.java index 8414ab8c834a..096b6b4c60dc 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/DefaultTestInstanceFactoryContext.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/DefaultTestInstanceFactoryContext.java @@ -20,15 +20,8 @@ * * @since 5.3 */ -class DefaultTestInstanceFactoryContext implements TestInstanceFactoryContext { - - private final Class testClass; - private final Optional outerInstance; - - DefaultTestInstanceFactoryContext(Class testClass, Optional outerInstance) { - this.testClass = testClass; - this.outerInstance = outerInstance; - } +record DefaultTestInstanceFactoryContext(Class testClass, Optional outerInstance) + implements TestInstanceFactoryContext { @Override public Class getTestClass() { diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/DisplayNameUtils.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/DisplayNameUtils.java index edf8a8d117d0..bb8d5e5427b2 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/DisplayNameUtils.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/DisplayNameUtils.java @@ -10,8 +10,6 @@ package org.junit.jupiter.engine.descriptor; -import static java.util.Collections.emptyList; -import static java.util.Collections.unmodifiableList; import static org.junit.platform.commons.support.AnnotationSupport.findAnnotation; import java.lang.reflect.AnnotatedElement; @@ -126,7 +124,7 @@ private static Supplier createDisplayNameSupplier(Supplier Class testClass, JupiterConfiguration configuration, BiFunction>, String> generatorFunction) { return () -> { - List> enclosingInstanceTypes = makeUnmodifiable(enclosingInstanceTypesSupplier.get()); + List> enclosingInstanceTypes = List.copyOf(enclosingInstanceTypesSupplier.get()); return findDisplayNameGenerator(enclosingInstanceTypes, testClass) // .map(it -> generatorFunction.apply(it, enclosingInstanceTypes)) // .orElseGet(() -> generatorFunction.apply(configuration.getDefaultDisplayNameGenerator(), @@ -134,10 +132,6 @@ private static Supplier createDisplayNameSupplier(Supplier }; } - private static List makeUnmodifiable(List list) { - return list.isEmpty() ? emptyList() : unmodifiableList(list); - } - private static Optional findDisplayNameGenerator(List> enclosingInstanceTypes, Class testClass) { Preconditions.notNull(testClass, "Test class must not be null"); diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/ExclusiveResourceCollector.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/ExclusiveResourceCollector.java index 9e3dde197bbe..6c08e136720c 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/ExclusiveResourceCollector.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/ExclusiveResourceCollector.java @@ -12,7 +12,6 @@ import static org.junit.jupiter.api.parallel.ResourceLockTarget.SELF; import static org.junit.platform.commons.support.AnnotationSupport.findRepeatableAnnotations; -import static org.junit.platform.commons.util.CollectionUtils.toUnmodifiableList; import java.lang.reflect.AnnotatedElement; import java.util.Collection; @@ -26,7 +25,6 @@ import org.junit.jupiter.api.parallel.ResourceLock; import org.junit.jupiter.api.parallel.ResourceLockTarget; import org.junit.jupiter.api.parallel.ResourceLocksProvider; -import org.junit.platform.commons.JUnitException; import org.junit.platform.commons.util.ReflectionUtils; import org.junit.platform.commons.util.StringUtils; import org.junit.platform.engine.support.hierarchical.ExclusiveResource; @@ -106,20 +104,21 @@ Stream getDynamicResources( private List getProviders() { if (this.providers == null) { this.providers = annotations.stream() // - .flatMap(annotation -> Stream.of(annotation.providers()).map(ReflectionUtils::newInstance)) // - .collect(toUnmodifiableList()); + .flatMap(annotation -> instantiate(annotation.providers())) // + .toList(); } return providers; } + private static Stream instantiate(Class[] providers) { + return Stream.of(providers).map(ReflectionUtils::newInstance); + } + private static ExclusiveResource.LockMode toLockMode(ResourceAccessMode mode) { - switch (mode) { - case READ: - return ExclusiveResource.LockMode.READ; - case READ_WRITE: - return ExclusiveResource.LockMode.READ_WRITE; - } - throw new JUnitException("Unknown ResourceAccessMode: " + mode); + return switch (mode) { + case READ -> ExclusiveResource.LockMode.READ; + case READ_WRITE -> ExclusiveResource.LockMode.READ_WRITE; + }; } } } diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/JupiterTestDescriptor.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/JupiterTestDescriptor.java index 893234e8f017..028450c8cbfe 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/JupiterTestDescriptor.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/JupiterTestDescriptor.java @@ -41,7 +41,6 @@ import org.junit.jupiter.engine.execution.ConditionEvaluator; import org.junit.jupiter.engine.execution.JupiterEngineExecutionContext; import org.junit.jupiter.engine.extension.ExtensionRegistry; -import org.junit.platform.commons.JUnitException; import org.junit.platform.commons.util.ExceptionUtils; import org.junit.platform.commons.util.UnrecoverableExceptions; import org.junit.platform.engine.DiscoveryIssue; @@ -139,8 +138,7 @@ public ExecutionMode getExecutionMode() { return executionMode.get(); } Optional parent = getParent(); - while (parent.isPresent() && parent.get() instanceof JupiterTestDescriptor) { - JupiterTestDescriptor jupiterParent = (JupiterTestDescriptor) parent.get(); + while (parent.isPresent() && parent.get() instanceof JupiterTestDescriptor jupiterParent) { executionMode = jupiterParent.getExplicitExecutionMode(); if (executionMode.isPresent()) { return executionMode.get(); @@ -171,13 +169,10 @@ Optional getExecutionModeFromAnnotation(AnnotatedElement element) } public static ExecutionMode toExecutionMode(org.junit.jupiter.api.parallel.ExecutionMode mode) { - switch (mode) { - case CONCURRENT: - return ExecutionMode.CONCURRENT; - case SAME_THREAD: - return ExecutionMode.SAME_THREAD; - } - throw new JUnitException("Unknown ExecutionMode: " + mode); + return switch (mode) { + case CONCURRENT -> ExecutionMode.CONCURRENT; + case SAME_THREAD -> ExecutionMode.SAME_THREAD; + }; } @Override diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/LifecycleMethodUtils.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/LifecycleMethodUtils.java index 5c633980985c..954074408e1c 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/LifecycleMethodUtils.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/LifecycleMethodUtils.java @@ -13,7 +13,6 @@ import static org.junit.jupiter.engine.support.MethodReflectionUtils.getReturnType; import static org.junit.platform.commons.support.AnnotationSupport.findAnnotatedMethods; import static org.junit.platform.commons.support.AnnotationSupport.findAnnotation; -import static org.junit.platform.commons.util.CollectionUtils.toUnmodifiableList; import static org.junit.platform.engine.support.discovery.DiscoveryIssueReporter.Condition.alwaysSatisfied; import java.lang.annotation.Annotation; @@ -134,7 +133,7 @@ private static List findMethodsAndCheckVoidReturnType(Class testClass .peek(isNotPrivateWarning(issueReporter, annotationType::getSimpleName).toConsumer()) // .filter(returnsPrimitiveVoid(issueReporter, __ -> annotationType.getSimpleName()).and( additionalCondition).toPredicate()) // - .collect(toUnmodifiableList()); + .toList(); } private static Condition isStatic(DiscoveryIssueReporter issueReporter, diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/ResourceLockAware.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/ResourceLockAware.java index 47c1cf12bf6b..664462e45d6a 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/ResourceLockAware.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/ResourceLockAware.java @@ -10,8 +10,6 @@ package org.junit.jupiter.engine.descriptor; -import static java.util.Collections.emptyList; -import static java.util.Collections.unmodifiableList; import static org.junit.jupiter.api.parallel.ResourceLockTarget.CHILDREN; import java.util.ArrayDeque; @@ -80,14 +78,11 @@ static Function> enclosin @Override public Set apply(ResourceLocksProvider provider) { if (this.enclosingInstanceTypes == null) { - this.enclosingInstanceTypes = makeUnmodifiable(enclosingInstanceTypesSupplier.get()); + this.enclosingInstanceTypes = List.copyOf(enclosingInstanceTypesSupplier.get()); } return evaluator.apply(provider, this.enclosingInstanceTypes); } - private List makeUnmodifiable(List list) { - return list.isEmpty() ? emptyList() : unmodifiableList(list); - } }; } diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/TemplateExecutor.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/TemplateExecutor.java index b2537fb226c9..acb006eb0370 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/TemplateExecutor.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/TemplateExecutor.java @@ -10,8 +10,6 @@ package org.junit.jupiter.engine.descriptor; -import static java.util.stream.Collectors.toList; - import java.util.List; import java.util.Optional; import java.util.concurrent.atomic.AtomicInteger; @@ -81,7 +79,7 @@ private void executeForProvider(P provider, AtomicInteger invocationIndex, private List

validateProviders(ExtensionContext extensionContext, ExtensionRegistry extensionRegistry) { List

providers = extensionRegistry.stream(providerType) // .filter(provider -> supports(provider, extensionContext)) // - .collect(toList()); + .toList(); return Preconditions.notEmpty(providers, this::getNoRegisteredProviderErrorMessage); } diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/discovery/AbstractOrderingVisitor.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/discovery/AbstractOrderingVisitor.java index fba71e40357a..5dfedbc48ee3 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/discovery/AbstractOrderingVisitor.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/discovery/AbstractOrderingVisitor.java @@ -13,7 +13,6 @@ import static java.util.Comparator.comparing; import static java.util.Objects.requireNonNull; import static java.util.stream.Collectors.toCollection; -import static java.util.stream.Collectors.toList; import java.util.ArrayList; import java.util.HashMap; @@ -110,11 +109,11 @@ protected true, this::newClassTestDescriptor); - } - if (ClassTemplateTestDescriptor.STANDALONE_CLASS_SEGMENT_TYPE.equals(lastSegment.getType())) { - return resolveStandaloneClassUniqueId(context, lastSegment, this.predicates.isAnnotatedWithClassTemplate, - this::newClassTemplateTestDescriptor); - } - if (NestedClassTestDescriptor.SEGMENT_TYPE.equals(lastSegment.getType())) { - return resolveNestedClassUniqueId(context, uniqueId, __ -> true, this::newNestedClassTestDescriptor); - } - if (ClassTemplateTestDescriptor.NESTED_CLASS_SEGMENT_TYPE.equals(lastSegment.getType())) { - return resolveNestedClassUniqueId(context, uniqueId, this.predicates.isAnnotatedWithClassTemplate, - this::newNestedClassTemplateTestDescriptor); - } - if (ClassTemplateInvocationTestDescriptor.SEGMENT_TYPE.equals(lastSegment.getType())) { - Optional testDescriptor = context.addToParent( - () -> selectUniqueId(uniqueId.removeLastSegment()), parent -> { - int index = Integer.parseInt(lastSegment.getValue().substring(1)); - return Optional.of(newDummyClassTemplateInvocationTestDescriptor(parent, index)); - }); - return toInvocationMatch(testDescriptor) // - .map(Resolution::match) // - .orElse(unresolved()); - } - return unresolved(); + return switch (lastSegment.getType()) { + case ClassTestDescriptor.SEGMENT_TYPE -> // + resolveStandaloneClassUniqueId(context, lastSegment, __ -> true, this::newClassTestDescriptor); + case ClassTemplateTestDescriptor.STANDALONE_CLASS_SEGMENT_TYPE -> // + resolveStandaloneClassUniqueId(context, lastSegment, this.predicates.isAnnotatedWithClassTemplate, + this::newClassTemplateTestDescriptor); + case NestedClassTestDescriptor.SEGMENT_TYPE -> // + resolveNestedClassUniqueId(context, uniqueId, __ -> true, this::newNestedClassTestDescriptor); + case ClassTemplateTestDescriptor.NESTED_CLASS_SEGMENT_TYPE -> // + resolveNestedClassUniqueId(context, uniqueId, this.predicates.isAnnotatedWithClassTemplate, + this::newNestedClassTemplateTestDescriptor); + case ClassTemplateInvocationTestDescriptor.SEGMENT_TYPE -> { + Optional testDescriptor = context.addToParent( + () -> selectUniqueId(uniqueId.removeLastSegment()), parent -> { + int index = Integer.parseInt(lastSegment.getValue().substring(1)); + return Optional.of(newDummyClassTemplateInvocationTestDescriptor(parent, index)); + }); + yield toInvocationMatch(testDescriptor) // + .map(Resolution::match) // + .orElse(unresolved()); + } + default -> unresolved(); + }; } @Override diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/discovery/MethodOrderingVisitor.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/discovery/MethodOrderingVisitor.java index b4b2352aeafe..052f4cb822e9 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/discovery/MethodOrderingVisitor.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/discovery/MethodOrderingVisitor.java @@ -73,9 +73,8 @@ protected boolean shouldNonMatchingDescriptorsComeBeforeOrderedOnes() { private void orderContainedMethods(ClassBasedTestDescriptor classBasedTestDescriptor, Class testClass) { Optional methodOrderer = findAnnotation(testClass, TestMethodOrder.class)// .map(TestMethodOrder::value)// - . map(ReflectionSupport::newInstance)// - .map(Optional::of)// - .orElseGet(configuration::getDefaultTestMethodOrderer); + . map(ReflectionSupport::newInstance) // + .or(configuration::getDefaultTestMethodOrderer); orderContainedMethods(classBasedTestDescriptor, testClass, methodOrderer); } diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/discovery/MethodSelectorResolver.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/discovery/MethodSelectorResolver.java index ee187caf066f..bc69f0a0ce15 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/discovery/MethodSelectorResolver.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/discovery/MethodSelectorResolver.java @@ -12,7 +12,6 @@ import static java.util.Collections.emptyList; import static java.util.Collections.emptySet; -import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toSet; import static org.junit.platform.engine.discovery.DiscoverySelectors.selectUniqueId; import static org.junit.platform.engine.support.discovery.SelectorResolver.Resolution.matches; @@ -105,7 +104,7 @@ private Resolution resolve(Context context, List> enclosingClasses, Cla "Possible configuration error: method [%s] resulted in multiple TestDescriptors %s. " + "This is typically the result of annotating a method with multiple competing annotations " + "such as @Test, @RepeatedTest, @ParameterizedTest, @TestFactory, etc.", - method.toGenericString(), testDescriptors.map(d -> d.getClass().getName()).collect(toList())); + method.toGenericString(), testDescriptors.map(d -> d.getClass().getName()).toList()); issueReporter.reportIssue( DiscoveryIssue.builder(Severity.WARNING, message).source(MethodSource.from(method))); } @@ -138,8 +137,7 @@ public Resolution resolve(UniqueIdSelector selector, Context context) { @Override public Resolution resolve(IterationSelector selector, Context context) { - if (selector.getParentSelector() instanceof MethodSelector) { - MethodSelector methodSelector = (MethodSelector) selector.getParentSelector(); + if (selector.getParentSelector() instanceof MethodSelector methodSelector) { return resolve(context, emptyList(), methodSelector.getJavaClass(), methodSelector::getJavaMethod, (testDescriptor, childSelectorsSupplier) -> { if (testDescriptor instanceof Filterable filterable) { diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution/DefaultParameterContext.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution/DefaultParameterContext.java index 23d2ada54331..4b4f48714d8b 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution/DefaultParameterContext.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution/DefaultParameterContext.java @@ -23,17 +23,12 @@ /** * @since 5.0 */ -class DefaultParameterContext implements ParameterContext { +record DefaultParameterContext(Parameter parameter, int index, Optional target) implements ParameterContext { - private final Parameter parameter; - private final int index; - private final Optional target; - - DefaultParameterContext(Parameter parameter, int index, Optional target) { + DefaultParameterContext { Preconditions.condition(index >= 0, "index must be greater than or equal to zero"); - this.parameter = Preconditions.notNull(parameter, "parameter must not be null"); - this.index = index; - this.target = Preconditions.notNull(target, "target must not be null"); + Preconditions.notNull(parameter, "parameter must not be null"); + Preconditions.notNull(target, "target must not be null"); } @Override diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution/InvocationInterceptorChain.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution/InvocationInterceptorChain.java index 6f2352716f99..f066298ade98 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution/InvocationInterceptorChain.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution/InvocationInterceptorChain.java @@ -91,17 +91,8 @@ public interface VoidInterceptorCall { } - private static class InterceptedInvocation implements Invocation { - - private final Invocation invocation; - private final InterceptorCall call; - private final InvocationInterceptor interceptor; - - InterceptedInvocation(Invocation invocation, InterceptorCall call, InvocationInterceptor interceptor) { - this.invocation = invocation; - this.call = call; - this.interceptor = interceptor; - } + private record InterceptedInvocation(Invocation invocation, InterceptorCall call, + InvocationInterceptor interceptor) implements Invocation { @Override public T proceed() throws Throwable { diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution/ParameterResolutionUtils.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution/ParameterResolutionUtils.java index c83032af3ac8..6b8379a56f1f 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution/ParameterResolutionUtils.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution/ParameterResolutionUtils.java @@ -11,7 +11,6 @@ package org.junit.jupiter.engine.execution; import static java.util.stream.Collectors.joining; -import static java.util.stream.Collectors.toList; import static org.apiguardian.api.API.Status.INTERNAL; import static org.junit.platform.commons.util.KotlinReflectionUtils.getKotlinSuspendingFunctionParameters; import static org.junit.platform.commons.util.KotlinReflectionUtils.isKotlinSuspendingFunction; @@ -132,7 +131,7 @@ public class ParameterResolutionUtils { // @formatter:off List matchingResolvers = extensionRegistry.stream(ParameterResolver.class) .filter(resolver -> resolver.supportsParameter(parameterContext, extensionContext.get(resolver))) - .collect(toList()); + .toList(); // @formatter:on if (matchingResolvers.isEmpty()) { diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/DefaultPreInterruptContext.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/DefaultPreInterruptContext.java index 0e4be93b94e2..81fcd96f3228 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/DefaultPreInterruptContext.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/DefaultPreInterruptContext.java @@ -17,12 +17,10 @@ /** * @since 5.12 */ -class DefaultPreInterruptContext implements PreInterruptContext { - private final Thread threadToInterrupt; +record DefaultPreInterruptContext(Thread threadToInterrupt) implements PreInterruptContext { - DefaultPreInterruptContext(Thread threadToInterrupt) { + DefaultPreInterruptContext { Preconditions.notNull(threadToInterrupt, "threadToInterrupt must not be null"); - this.threadToInterrupt = threadToInterrupt; } @Override diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/DefaultRepetitionInfo.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/DefaultRepetitionInfo.java index d9ecb54a3a68..3f92be90bf40 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/DefaultRepetitionInfo.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/DefaultRepetitionInfo.java @@ -18,20 +18,8 @@ /** * Default implementation of {@link RepetitionInfo}. */ -class DefaultRepetitionInfo implements RepetitionInfo { - - final int currentRepetition; - final int totalRepetitions; - final AtomicInteger failureCount; - final int failureThreshold; - - DefaultRepetitionInfo(int currentRepetition, int totalRepetitions, AtomicInteger failureCount, - int failureThreshold) { - this.currentRepetition = currentRepetition; - this.totalRepetitions = totalRepetitions; - this.failureCount = failureCount; - this.failureThreshold = failureThreshold; - } +record DefaultRepetitionInfo(int currentRepetition, int totalRepetitions, AtomicInteger failureCount, + int failureThreshold) implements RepetitionInfo { @Override public int getCurrentRepetition() { diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/MutableExtensionRegistry.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/MutableExtensionRegistry.java index 654d52995004..fdd84569d7e1 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/MutableExtensionRegistry.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/MutableExtensionRegistry.java @@ -18,8 +18,6 @@ import java.lang.reflect.Member; import java.lang.reflect.Method; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; @@ -29,7 +27,6 @@ import java.util.Set; import java.util.function.Function; import java.util.function.Predicate; -import java.util.stream.Collectors; import java.util.stream.Stream; import org.apiguardian.api.API; @@ -53,13 +50,14 @@ public class MutableExtensionRegistry implements ExtensionRegistry, ExtensionReg private static final Logger logger = LoggerFactory.getLogger(MutableExtensionRegistry.class); - private static final List DEFAULT_STATELESS_EXTENSIONS = Collections.unmodifiableList(Arrays.asList(// + private static final List DEFAULT_STATELESS_EXTENSIONS = List.of( // new DisabledCondition(), // new AutoCloseExtension(), // new TimeoutExtension(), // new RepeatedTestExtension(), // new TestInfoParameterResolver(), // - new TestReporterParameterResolver())); + new TestReporterParameterResolver() // + ); /** * Factory for creating and populating a new root registry with the default @@ -123,7 +121,7 @@ private static void logExcludedExtensions(List> exclu List excludeExtensionNames = excludedExtensions .stream() .map(Class::getName) - .collect(Collectors.toList()); + .toList(); // @formatter:on logger.config(() -> "Excluded auto-detected extensions due to configured includes/excludes: %s".formatted( excludeExtensionNames)); diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/RepeatedTestInvocationContext.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/RepeatedTestInvocationContext.java index b4f3f74e17b6..d8a735849d7e 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/RepeatedTestInvocationContext.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/RepeatedTestInvocationContext.java @@ -36,7 +36,7 @@ public RepeatedTestInvocationContext(DefaultRepetitionInfo repetitionInfo, @Override public String getDisplayName(int invocationIndex) { - return this.formatter.format(this.repetitionInfo.currentRepetition, this.repetitionInfo.totalRepetitions); + return this.formatter.format(this.repetitionInfo.currentRepetition(), this.repetitionInfo.totalRepetitions()); } @Override diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/RepetitionExtension.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/RepetitionExtension.java index 6eac77602c66..388c8fa33840 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/RepetitionExtension.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/RepetitionExtension.java @@ -63,13 +63,13 @@ public RepetitionInfo resolveParameter(ParameterContext parameterContext, Extens @Override public void testFailed(ExtensionContext context, @Nullable Throwable cause) { - this.repetitionInfo.failureCount.incrementAndGet(); + this.repetitionInfo.failureCount().incrementAndGet(); } @Override public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) { - int failureThreshold = this.repetitionInfo.failureThreshold; - if (this.repetitionInfo.failureCount.get() >= failureThreshold) { + int failureThreshold = this.repetitionInfo.getFailureThreshold(); + if (this.repetitionInfo.getFailureCount() >= failureThreshold) { return disabled("Failure threshold [" + failureThreshold + "] exceeded"); } return enabled("Failure threshold not exceeded"); diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/SameThreadTimeoutInvocation.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/SameThreadTimeoutInvocation.java index 395726217fa9..c1df07a23e43 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/SameThreadTimeoutInvocation.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/SameThreadTimeoutInvocation.java @@ -44,7 +44,7 @@ class SameThreadTimeoutInvocation implements Invocat @Override public T proceed() throws Throwable { InterruptTask interruptTask = new InterruptTask(Thread.currentThread(), preInterruptCallback); - ScheduledFuture future = executor.schedule(interruptTask, timeout.getValue(), timeout.getUnit()); + ScheduledFuture future = executor.schedule(interruptTask, timeout.value(), timeout.unit()); Throwable failure = null; T result = null; try { diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/TempDirectory.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/TempDirectory.java index 3339a17c8f23..d352e94a358a 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/TempDirectory.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/TempDirectory.java @@ -553,9 +553,7 @@ interface FileOperations { } - private static class FieldContext implements AnnotatedElementContext { - - private final Field field; + private record FieldContext(Field field) implements AnnotatedElementContext { private FieldContext(Field field) { this.field = Preconditions.notNull(field, "field must not be null"); @@ -578,15 +576,8 @@ public String toString() { } @SuppressWarnings("deprecation") - private static class FailureTracker implements Store.CloseableResource, AutoCloseable { - - private final ExtensionContext context; - private final ExtensionContext parentContext; - - private FailureTracker(ExtensionContext context, ExtensionContext parentContext) { - this.context = context; - this.parentContext = parentContext; - } + private record FailureTracker(ExtensionContext context, ExtensionContext parentContext) + implements Store.CloseableResource, AutoCloseable { @Override public void close() { diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/TimeoutDuration.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/TimeoutDuration.java index ac99448af8a9..66c154faba5a 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/TimeoutDuration.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/TimeoutDuration.java @@ -12,7 +12,6 @@ import java.time.Duration; import java.time.temporal.ChronoUnit; -import java.util.Objects; import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.Timeout; @@ -22,46 +21,18 @@ /** * @since 5.5 */ -class TimeoutDuration { +record TimeoutDuration(long value, TimeUnit unit) { static TimeoutDuration from(Timeout timeout) { return new TimeoutDuration(timeout.value(), timeout.unit()); } - private final long value; - private final TimeUnit unit; - TimeoutDuration(long value, TimeUnit unit) { Preconditions.condition(value > 0, () -> "timeout duration must be a positive number: " + value); this.value = value; this.unit = Preconditions.notNull(unit, "timeout unit must not be null"); } - public long getValue() { - return value; - } - - public TimeUnit getUnit() { - return unit; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - TimeoutDuration that = (TimeoutDuration) o; - return value == that.value && unit == that.unit; - } - - @Override - public int hashCode() { - return Objects.hash(value, unit); - } - @Override public String toString() { String label = unit.name().toLowerCase(); @@ -76,23 +47,15 @@ public Duration toDuration() { } private ChronoUnit toChronoUnit() { - switch (unit) { - case NANOSECONDS: - return ChronoUnit.NANOS; - case MICROSECONDS: - return ChronoUnit.MICROS; - case MILLISECONDS: - return ChronoUnit.MILLIS; - case SECONDS: - return ChronoUnit.SECONDS; - case MINUTES: - return ChronoUnit.MINUTES; - case HOURS: - return ChronoUnit.HOURS; - case DAYS: - return ChronoUnit.DAYS; - default: - throw new JUnitException("Could not map TimeUnit " + unit + " to ChronoUnit"); - } + return switch (unit) { + case NANOSECONDS -> ChronoUnit.NANOS; + case MICROSECONDS -> ChronoUnit.MICROS; + case MILLISECONDS -> ChronoUnit.MILLIS; + case SECONDS -> ChronoUnit.SECONDS; + case MINUTES -> ChronoUnit.MINUTES; + case HOURS -> ChronoUnit.HOURS; + case DAYS -> ChronoUnit.DAYS; + default -> throw new JUnitException("Could not map TimeUnit " + unit + " to ChronoUnit"); + }; } } diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/TimeoutDurationParser.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/TimeoutDurationParser.java index a0f01842181e..cba8abbc873e 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/TimeoutDurationParser.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/TimeoutDurationParser.java @@ -22,8 +22,6 @@ import static java.util.regex.Pattern.UNICODE_CASE; import java.time.format.DateTimeParseException; -import java.util.Collections; -import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -37,19 +35,16 @@ class TimeoutDurationParser { private static final Pattern PATTERN = Pattern.compile("([1-9]\\d*) ?((?:[nμm]?s)|m|h|d)?", CASE_INSENSITIVE | UNICODE_CASE); - private static final Map UNITS_BY_ABBREVIATION; - static { - Map unitsByAbbreviation = new HashMap<>(); - unitsByAbbreviation.put("ns", NANOSECONDS); - unitsByAbbreviation.put("μs", MICROSECONDS); - unitsByAbbreviation.put("ms", MILLISECONDS); - unitsByAbbreviation.put("s", SECONDS); - unitsByAbbreviation.put("m", MINUTES); - unitsByAbbreviation.put("h", HOURS); - unitsByAbbreviation.put("d", DAYS); - UNITS_BY_ABBREVIATION = Collections.unmodifiableMap(unitsByAbbreviation); - } + private static final Map UNITS_BY_ABBREVIATION = Map.of( // + "ns", NANOSECONDS, // + "μs", MICROSECONDS, // + "ms", MILLISECONDS, // + "s", SECONDS, // + "m", MINUTES, // + "h", HOURS, // + "d", DAYS // + ); TimeoutDuration parse(CharSequence text) throws DateTimeParseException { Matcher matcher = PATTERN.matcher(text); diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/TimeoutExtension.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/TimeoutExtension.java index 46c6a502e2bc..c0b32bf4303d 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/TimeoutExtension.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/TimeoutExtension.java @@ -221,16 +221,12 @@ private boolean isTimeoutDisabled(ExtensionContext extensionContext) { * Determine if timeouts are disabled for the supplied mode. */ private boolean isTimeoutDisabled(String mode) { - switch (mode) { - case ENABLED_MODE_VALUE: - return false; - case DISABLED_MODE_VALUE: - return true; - case DISABLED_ON_DEBUG_MODE_VALUE: - return RuntimeUtils.isDebugMode(); - default: - throw new ExtensionConfigurationException("Unsupported timeout mode: " + mode); - } + return switch (mode) { + case ENABLED_MODE_VALUE -> false; + case DISABLED_MODE_VALUE -> true; + case DISABLED_ON_DEBUG_MODE_VALUE -> RuntimeUtils.isDebugMode(); + default -> throw new ExtensionConfigurationException("Unsupported timeout mode: " + mode); + }; } @FunctionalInterface diff --git a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/DefaultParameterInfo.java b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/DefaultParameterInfo.java index 96fffa5039d5..c74ba724ea76 100644 --- a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/DefaultParameterInfo.java +++ b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/DefaultParameterInfo.java @@ -18,15 +18,7 @@ /** * @since 5.13 */ -class DefaultParameterInfo implements ParameterInfo { - - private final ParameterDeclarations declarations; - private final ArgumentsAccessor arguments; - - DefaultParameterInfo(ParameterDeclarations declarations, ArgumentsAccessor arguments) { - this.declarations = declarations; - this.arguments = arguments; - } +record DefaultParameterInfo(ParameterDeclarations declarations, ArgumentsAccessor arguments) implements ParameterInfo { @Override public ParameterDeclarations getDeclarations() { diff --git a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedClassContext.java b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedClassContext.java index 58b022d3f17a..b6002a4ad817 100644 --- a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedClassContext.java +++ b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedClassContext.java @@ -18,7 +18,6 @@ import static org.junit.platform.commons.support.HierarchyTraversalMode.BOTTOM_UP; import static org.junit.platform.commons.support.HierarchyTraversalMode.TOP_DOWN; import static org.junit.platform.commons.support.ReflectionSupport.findFields; -import static org.junit.platform.commons.util.CollectionUtils.toUnmodifiableList; import static org.junit.platform.commons.util.ReflectionUtils.isRecordClass; import java.lang.annotation.Annotation; @@ -161,7 +160,7 @@ private static List findLifec } return new ArgumentSetLifecycleMethod(method); }) // - .collect(toUnmodifiableList()); + .toList(); } private static A getAnnotation(Method method, Class annotationType) { diff --git a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedClassInvocationContext.java b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedClassInvocationContext.java index 51f74401b29c..b4d8a5e63122 100644 --- a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedClassInvocationContext.java +++ b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedClassInvocationContext.java @@ -10,7 +10,6 @@ package org.junit.jupiter.params; -import static java.util.stream.Collectors.toList; import static org.junit.jupiter.api.TestInstance.Lifecycle.PER_METHOD; import java.util.List; @@ -22,7 +21,6 @@ import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.ParameterizedClassContext.InjectionType; import org.junit.jupiter.params.provider.Arguments; -import org.junit.platform.commons.JUnitException; import org.junit.platform.commons.util.Preconditions; class ParameterizedClassInvocationContext extends ParameterizedInvocationContext @@ -43,7 +41,7 @@ public String getDisplayName(int invocationIndex) { @Override public List getAdditionalExtensions() { return Stream.concat(Stream.of(createParameterInjector()), createLifecycleMethodInvokers()) // - .collect(toList()); + .toList(); } @Override @@ -53,13 +51,10 @@ public void prepareInvocation(ExtensionContext context) { private Extension createParameterInjector() { InjectionType injectionType = this.declarationContext.getInjectionType(); - switch (injectionType) { - case CONSTRUCTOR: - return createExtensionForConstructorInjection(); - case FIELDS: - return createExtensionForFieldInjection(); - } - throw new JUnitException("Unsupported injection type: " + injectionType); + return switch (injectionType) { + case CONSTRUCTOR -> createExtensionForConstructorInjection(); + case FIELDS -> createExtensionForFieldInjection(); + }; } private ClassTemplateConstructorParameterResolver createExtensionForConstructorInjection() { @@ -72,15 +67,12 @@ private ClassTemplateConstructorParameterResolver createExtensionForConstructorI private Extension createExtensionForFieldInjection() { ResolverFacade resolverFacade = this.declarationContext.getResolverFacade(); TestInstance.Lifecycle lifecycle = this.declarationContext.getTestInstanceLifecycle(); - switch (lifecycle) { - case PER_CLASS: - return new BeforeClassTemplateInvocationFieldInjector(resolverFacade, this.arguments, - this.invocationIndex, this.resolutionCache); - case PER_METHOD: - return new InstancePostProcessingClassTemplateFieldInjector(resolverFacade, this.arguments, - this.invocationIndex, this.resolutionCache); - } - throw new JUnitException("Unsupported lifecycle: " + lifecycle); + return switch (lifecycle) { + case PER_CLASS -> new BeforeClassTemplateInvocationFieldInjector(resolverFacade, this.arguments, + this.invocationIndex, this.resolutionCache); + case PER_METHOD -> new InstancePostProcessingClassTemplateFieldInjector(resolverFacade, this.arguments, + this.invocationIndex, this.resolutionCache); + }; } private Stream createLifecycleMethodInvokers() { diff --git a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedInvocationContext.java b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedInvocationContext.java index 62e198e0cf2a..01e1d1e7f6a7 100644 --- a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedInvocationContext.java +++ b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedInvocationContext.java @@ -79,13 +79,8 @@ private void storeParameterInfo(ExtensionContext context) { } @SuppressWarnings({ "deprecation", "try" }) - private static class CloseableArgument implements ExtensionContext.Store.CloseableResource, AutoCloseable { - - private final AutoCloseable autoCloseable; - - CloseableArgument(AutoCloseable autoCloseable) { - this.autoCloseable = autoCloseable; - } + private record CloseableArgument(AutoCloseable autoCloseable) + implements ExtensionContext.Store.CloseableResource, AutoCloseable { @Override public void close() throws Exception { diff --git a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedInvocationNameFormatter.java b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedInvocationNameFormatter.java index 22eb77dc327f..82ac1a6f40a7 100644 --- a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedInvocationNameFormatter.java +++ b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedInvocationNameFormatter.java @@ -197,29 +197,11 @@ private static String argumentsPattern(int length) { .collect(joining(", ")); } - private static class PlaceholderPosition { - - final int index; - final String placeholder; - - PlaceholderPosition(int index, String placeholder) { - this.index = index; - this.placeholder = placeholder; - } - + private record PlaceholderPosition(int index, String placeholder) { } - private static class ArgumentsContext { - - private final int invocationIndex; - private final @Nullable Object[] consumedArguments; - private final Optional argumentSetName; - - ArgumentsContext(int invocationIndex, @Nullable Object[] consumedArguments, Optional argumentSetName) { - this.invocationIndex = invocationIndex; - this.consumedArguments = consumedArguments; - this.argumentSetName = argumentSetName; - } + private record ArgumentsContext(int invocationIndex, @Nullable Object[] consumedArguments, + Optional argumentSetName) { } @FunctionalInterface @@ -231,13 +213,7 @@ private interface PartialFormatter { } - private static class ArgumentSetNameFormatter implements PartialFormatter { - - private final String annotationName; - - ArgumentSetNameFormatter(String annotationName) { - this.annotationName = annotationName; - } + private record ArgumentSetNameFormatter(String annotationName) implements PartialFormatter { @Override public void append(ArgumentsContext context, StringBuffer result) { diff --git a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ResolverFacade.java b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ResolverFacade.java index aa81b1d92c34..bdec2d6af084 100644 --- a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ResolverFacade.java +++ b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ResolverFacade.java @@ -11,10 +11,8 @@ package org.junit.jupiter.params; import static java.lang.System.lineSeparator; -import static java.util.Collections.unmodifiableList; import static java.util.Objects.requireNonNull; import static java.util.stream.Collectors.joining; -import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toMap; import static org.junit.platform.commons.support.AnnotationSupport.findAnnotation; import static org.junit.platform.commons.support.AnnotationSupport.isAnnotated; @@ -403,7 +401,7 @@ private static void validateIndexedParameters( private static void validateIndexedParameterDeclarations(int index, List declarations, List errors) { - List fields = declarations.stream().map(FieldParameterDeclaration::getField).collect(toList()); + List fields = declarations.stream().map(FieldParameterDeclaration::getField).toList(); if (index < 0) { declarations.stream() // .map( @@ -479,18 +477,12 @@ Object resolve(FieldContext fieldContext, ExtensionContext extensionContext, Eva } - private static class Converter implements Resolver { - - private final ArgumentConverter argumentConverter; + private record Converter(ArgumentConverter argumentConverter) implements Resolver { private static Converter createDefault(ExtensionContext context) { return new Converter(new DefaultArgumentConverter(context)); } - Converter(ArgumentConverter argumentConverter) { - this.argumentConverter = argumentConverter; - } - @Override public @Nullable Object resolve(ParameterContext parameterContext, int parameterIndex, ExtensionContext extensionContext, EvaluatedArgumentSet arguments, int invocationIndex) { @@ -516,7 +508,7 @@ private static Converter createDefault(ExtensionContext context) { } } - private static class Aggregator implements Resolver { + private record Aggregator(ArgumentsAggregator argumentsAggregator) implements Resolver { private static final Aggregator DEFAULT = new Aggregator(new SimpleArgumentsAggregator() { @Override @@ -526,12 +518,6 @@ protected Object aggregateArguments(ArgumentsAccessor accessor, Class targetT } }); - private final ArgumentsAggregator argumentsAggregator; - - Aggregator(ArgumentsAggregator argumentsAggregator) { - this.argumentsAggregator = argumentsAggregator; - } - @Override public @Nullable Object resolve(ParameterContext parameterContext, int parameterIndex, ExtensionContext extensionContext, EvaluatedArgumentSet arguments, int invocationIndex) { @@ -559,16 +545,9 @@ protected Object aggregateArguments(ArgumentsAccessor accessor, Class targetT } } - private static class DefaultParameterDeclarations implements ParameterDeclarations { - - private final AnnotatedElement sourceElement; - private final NavigableMap declarationsByIndex; - - DefaultParameterDeclarations(AnnotatedElement sourceElement, - NavigableMap declarationsByIndex) { - this.sourceElement = sourceElement; - this.declarationsByIndex = declarationsByIndex; - } + private record DefaultParameterDeclarations(AnnotatedElement sourceElement, + NavigableMap declarationsByIndex) + implements ParameterDeclarations { @Override public AnnotatedElement getSourceElement() { @@ -584,7 +563,7 @@ public Optional getFirst() { @Override public List getAll() { - return unmodifiableList(new ArrayList<>(this.declarationsByIndex.values())); + return List.copyOf(this.declarationsByIndex.values()); } @Override @@ -744,21 +723,11 @@ public Optional getTarget() { } } - private static class DefaultArgumentSetLifecycleMethodParameterResolver + private record DefaultArgumentSetLifecycleMethodParameterResolver(ResolverFacade originalResolverFacade, + ResolverFacade lifecycleMethodResolverFacade, + Map parameterDeclarationMapping) implements ArgumentSetLifecycleMethod.ParameterResolver { - private final ResolverFacade originalResolverFacade; - private final ResolverFacade lifecycleMethodResolverFacade; - private final Map parameterDeclarationMapping; - - DefaultArgumentSetLifecycleMethodParameterResolver(ResolverFacade originalResolverFacade, - ResolverFacade lifecycleMethodResolverFacade, - Map parameterDeclarationMapping) { - this.originalResolverFacade = originalResolverFacade; - this.lifecycleMethodResolverFacade = lifecycleMethodResolverFacade; - this.parameterDeclarationMapping = parameterDeclarationMapping; - } - @Override public boolean supports(ParameterContext parameterContext) { return this.lifecycleMethodResolverFacade.findDeclaration(parameterContext.getIndex()) // diff --git a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/provider/CsvArgumentsProvider.java b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/provider/CsvArgumentsProvider.java index 3f961f83c718..9ec3aa038417 100644 --- a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/provider/CsvArgumentsProvider.java +++ b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/provider/CsvArgumentsProvider.java @@ -12,7 +12,6 @@ import static java.util.Objects.requireNonNull; import static org.junit.jupiter.params.provider.CsvParserFactory.createParserFor; -import static org.junit.platform.commons.util.CollectionUtils.toSet; import java.io.StringReader; import java.lang.annotation.Annotation; @@ -43,7 +42,7 @@ class CsvArgumentsProvider extends AnnotationBasedArgumentsProvider { @Override protected Stream provideArguments(ParameterDeclarations parameters, ExtensionContext context, CsvSource csvSource) { - Set nullValues = toSet(csvSource.nullValues()); + Set nullValues = Set.of(csvSource.nullValues()); CsvParser csvParser = createParserFor(csvSource); final boolean textBlockDeclared = !csvSource.textBlock().isEmpty(); Preconditions.condition(csvSource.value().length > 0 ^ textBlockDeclared, @@ -59,11 +58,11 @@ private Stream parseTextBlock(CsvSource csvSource, CsvParser csvParse List argumentsList = new ArrayList<>(); try { - List csvRecords = csvParser.parseAll(new StringReader(textBlock)); + List<@Nullable String[]> csvRecords = csvParser.parseAll(new StringReader(textBlock)); String[] headers = useHeadersInDisplayName ? getHeaders(csvParser) : null; AtomicInteger index = new AtomicInteger(0); - for (String[] csvRecord : csvRecords) { + for (var csvRecord : csvRecords) { index.incrementAndGet(); Preconditions.notNull(csvRecord, () -> "Record at index " + index + " contains invalid CSV: \"\"\"\n" + textBlock + "\n\"\"\""); @@ -116,8 +115,8 @@ static String[] getHeaders(CsvParser csvParser) { * {@link Named} if necessary (for CSV header support), and returns the * CSV record wrapped in an {@link Arguments} instance. */ - static Arguments processCsvRecord(String[] csvRecord, Set nullValues, boolean useHeadersInDisplayName, - String @Nullable [] headers) { + static Arguments processCsvRecord(@Nullable String[] csvRecord, Set nullValues, + boolean useHeadersInDisplayName, String @Nullable [] headers) { // Nothing to process? if (nullValues.isEmpty() && !useHeadersInDisplayName) { @@ -132,7 +131,7 @@ static Arguments processCsvRecord(String[] csvRecord, Set nullValues, bo Object[] arguments = new Object[csvRecord.length]; for (int i = 0; i < csvRecord.length; i++) { Object column = csvRecord[i]; - if (nullValues.contains(column)) { + if (column != null && nullValues.contains(column)) { column = null; } if (useHeadersInDisplayName) { diff --git a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/provider/CsvFileArgumentsProvider.java b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/provider/CsvFileArgumentsProvider.java index a56ec8270b3a..fe5bc1583084 100644 --- a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/provider/CsvFileArgumentsProvider.java +++ b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/provider/CsvFileArgumentsProvider.java @@ -12,13 +12,11 @@ import static java.util.Objects.requireNonNull; import static java.util.Spliterators.spliteratorUnknownSize; -import static java.util.stream.Collectors.toList; import static java.util.stream.StreamSupport.stream; import static org.junit.jupiter.params.provider.CsvArgumentsProvider.getHeaders; import static org.junit.jupiter.params.provider.CsvArgumentsProvider.handleCsvException; import static org.junit.jupiter.params.provider.CsvArgumentsProvider.processCsvRecord; import static org.junit.jupiter.params.provider.CsvParserFactory.createParserFor; -import static org.junit.platform.commons.util.CollectionUtils.toSet; import java.io.IOException; import java.io.InputStream; @@ -64,7 +62,7 @@ protected Stream provideArguments(ParameterDeclarations par Stream resources = Arrays.stream(csvFileSource.resources()).map(inputStreamProvider::classpathResource); Stream files = Arrays.stream(csvFileSource.files()).map(inputStreamProvider::file); - List sources = Stream.concat(resources, files).collect(toList()); + List sources = Stream.concat(resources, files).toList(); // @formatter:off return Preconditions.notEmpty(sources, "Resources or files must not be empty") @@ -125,7 +123,7 @@ private static class CsvParserIterator implements Iterator { this.csvParser = csvParser; this.csvFileSource = csvFileSource; this.useHeadersInDisplayName = csvFileSource.useHeadersInDisplayName(); - this.nullValues = toSet(csvFileSource.nullValues()); + this.nullValues = Set.of(csvFileSource.nullValues()); advance(); } diff --git a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/provider/MethodArgumentsProvider.java b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/provider/MethodArgumentsProvider.java index d4af42cebd1f..227fefc9aa17 100644 --- a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/provider/MethodArgumentsProvider.java +++ b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/provider/MethodArgumentsProvider.java @@ -12,7 +12,6 @@ import static java.lang.String.format; import static java.util.Arrays.stream; -import static java.util.stream.Collectors.toList; import static org.junit.platform.commons.support.AnnotationSupport.isAnnotated; import static org.junit.platform.commons.util.CollectionUtils.isConvertibleToStream; @@ -154,7 +153,7 @@ private static Method findFactoryMethodBySimpleName(Class clazz, Optional candidates = ReflectionUtils.findMethods(clazz, isCandidate); - List factoryMethods = candidates.stream().filter(isFactoryMethod).collect(toList()); + List factoryMethods = candidates.stream().filter(isFactoryMethod).toList(); Preconditions.notEmpty(factoryMethods, () -> { if (candidates.isEmpty()) { diff --git a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/provider/ValueArgumentsProvider.java b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/provider/ValueArgumentsProvider.java index a3a929dfa2ba..2872c51e5ae8 100644 --- a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/provider/ValueArgumentsProvider.java +++ b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/provider/ValueArgumentsProvider.java @@ -10,8 +10,6 @@ package org.junit.jupiter.params.provider; -import static java.util.stream.Collectors.toList; - import java.lang.reflect.Array; import java.util.Arrays; import java.util.List; @@ -36,7 +34,7 @@ protected Stream provideArguments(ParameterDeclarations par private Object[] getArgumentsFromSource(ValueSource valueSource) { // @formatter:off - List arrays = + List arrays = Stream.of( valueSource.shorts(), valueSource.bytes(), @@ -50,7 +48,7 @@ private Object[] getArgumentsFromSource(ValueSource valueSource) { valueSource.classes() ) .filter(array -> Array.getLength(array) > 0) - .collect(toList()); + .toList(); // @formatter:on Preconditions.condition(arrays.size() == 1, () -> "Exactly one type of input must be provided in the @" diff --git a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/support/AnnotationConsumerInitializer.java b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/support/AnnotationConsumerInitializer.java index 5c80776b3be4..b6bdfd90f2a1 100644 --- a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/support/AnnotationConsumerInitializer.java +++ b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/support/AnnotationConsumerInitializer.java @@ -84,7 +84,7 @@ private static Class getAnnotationType(Method method) { int annotationIndex = annotationConsumingMethodSignatures.stream() // .filter(signature -> signature.isMatchingWith(method)) // .findFirst() // - .map(AnnotationConsumingMethodSignature::getAnnotationParameterIndex) // + .map(AnnotationConsumingMethodSignature::annotationParameterIndex) // .orElse(0); return (Class) method.getParameterTypes()[annotationIndex]; @@ -100,17 +100,8 @@ private static void initializeAnnotationConsumer(Annotati } } - private static class AnnotationConsumingMethodSignature { - - private final String methodName; - private final int parameterCount; - private final int annotationParameterIndex; - - AnnotationConsumingMethodSignature(String methodName, int parameterCount, int annotationParameterIndex) { - this.methodName = methodName; - this.parameterCount = parameterCount; - this.annotationParameterIndex = annotationParameterIndex; - } + private record AnnotationConsumingMethodSignature(String methodName, int parameterCount, + int annotationParameterIndex) { boolean isMatchingWith(Method method) { return method.getName().equals(methodName) // @@ -118,10 +109,6 @@ boolean isMatchingWith(Method method) { && method.getParameterTypes()[annotationParameterIndex].isAnnotation(); } - int getAnnotationParameterIndex() { - return annotationParameterIndex; - } - } } diff --git a/junit-jupiter-params/src/testFixtures/java/org/junit/jupiter/params/provider/RecordArguments.java b/junit-jupiter-params/src/testFixtures/java/org/junit/jupiter/params/provider/RecordArguments.java index 96213c64e57e..1ecc810c460c 100644 --- a/junit-jupiter-params/src/testFixtures/java/org/junit/jupiter/params/provider/RecordArguments.java +++ b/junit-jupiter-params/src/testFixtures/java/org/junit/jupiter/params/provider/RecordArguments.java @@ -12,12 +12,13 @@ import java.util.Arrays; +import org.jspecify.annotations.Nullable; import org.junit.platform.commons.support.ReflectionSupport; public interface RecordArguments extends Arguments { @Override - default Object[] get() { + default @Nullable Object[] get() { return Arrays.stream(getClass().getRecordComponents()) // .map(component -> ReflectionSupport.invokeMethod(component.getAccessor(), this)) // .toArray(); diff --git a/junit-platform-commons/src/main/java/org/junit/platform/commons/support/AnnotationSupport.java b/junit-platform-commons/src/main/java/org/junit/platform/commons/support/AnnotationSupport.java index d8a0c6164fec..a29801a7c333 100644 --- a/junit-platform-commons/src/main/java/org/junit/platform/commons/support/AnnotationSupport.java +++ b/junit-platform-commons/src/main/java/org/junit/platform/commons/support/AnnotationSupport.java @@ -443,7 +443,8 @@ public static List findAnnotatedFields(Class clazz, Class findAnnotatedFieldValues(Object instance, Class annotationType) { + public static List<@Nullable Object> findAnnotatedFieldValues(Object instance, + Class annotationType) { Preconditions.notNull(instance, "instance must not be null"); List fields = findAnnotatedFields(instance.getClass(), annotationType, ModifierSupport::isNotStatic, @@ -475,7 +476,8 @@ public static List findAnnotatedFieldValues(Object instance, Class findAnnotatedFieldValues(Class clazz, Class annotationType) { + public static List<@Nullable Object> findAnnotatedFieldValues(Class clazz, + Class annotationType) { List fields = findAnnotatedFields(clazz, annotationType, ModifierSupport::isStatic, HierarchyTraversalMode.TOP_DOWN); @@ -510,8 +512,8 @@ public static List findAnnotatedFieldValues(Class clazz, Class List findAnnotatedFieldValues(Object instance, Class annotationType, - Class fieldType) { + public static List findAnnotatedFieldValues(Object instance, + Class annotationType, Class fieldType) { Preconditions.notNull(instance, "instance must not be null"); Preconditions.notNull(fieldType, "fieldType must not be null"); @@ -552,8 +554,8 @@ public static List findAnnotatedFieldValues(Object instance, Class List findAnnotatedFieldValues(Class clazz, Class annotationType, - Class fieldType) { + public static List findAnnotatedFieldValues(Class clazz, + Class annotationType, Class fieldType) { Preconditions.notNull(fieldType, "fieldType must not be null"); diff --git a/junit-platform-commons/src/main/java/org/junit/platform/commons/support/DefaultResource.java b/junit-platform-commons/src/main/java/org/junit/platform/commons/support/DefaultResource.java index 26df8c0f876c..d8df57d38fdf 100644 --- a/junit-platform-commons/src/main/java/org/junit/platform/commons/support/DefaultResource.java +++ b/junit-platform-commons/src/main/java/org/junit/platform/commons/support/DefaultResource.java @@ -13,7 +13,6 @@ import static org.apiguardian.api.API.Status.INTERNAL; import java.net.URI; -import java.util.Objects; import org.apiguardian.api.API; import org.junit.platform.commons.util.Preconditions; @@ -29,14 +28,11 @@ * @since 1.11 */ @API(status = INTERNAL, since = "1.12") -public class DefaultResource implements Resource { +public record DefaultResource(String name, URI uri) implements Resource { - private final String name; - private final URI uri; - - public DefaultResource(String name, URI uri) { - this.name = Preconditions.notNull(name, "name must not be null"); - this.uri = Preconditions.notNull(uri, "uri must not be null"); + public DefaultResource { + Preconditions.notNull(name, "name must not be null"); + Preconditions.notNull(uri, "uri must not be null"); } @Override @@ -49,21 +45,6 @@ public URI getUri() { return uri; } - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; - DefaultResource that = (DefaultResource) o; - return name.equals(that.name) && uri.equals(that.uri); - } - - @Override - public int hashCode() { - return Objects.hash(name, uri); - } - @Override public String toString() { return new ToStringBuilder(this) // diff --git a/junit-platform-commons/src/main/java/org/junit/platform/commons/support/conversion/ConversionSupport.java b/junit-platform-commons/src/main/java/org/junit/platform/commons/support/conversion/ConversionSupport.java index 007ee26b07bf..fe3923f9cb4d 100644 --- a/junit-platform-commons/src/main/java/org/junit/platform/commons/support/conversion/ConversionSupport.java +++ b/junit-platform-commons/src/main/java/org/junit/platform/commons/support/conversion/ConversionSupport.java @@ -10,8 +10,6 @@ package org.junit.platform.commons.support.conversion; -import static java.util.Arrays.asList; -import static java.util.Collections.unmodifiableList; import static org.apiguardian.api.API.Status.EXPERIMENTAL; import static org.junit.platform.commons.util.ReflectionUtils.getWrapperType; @@ -31,7 +29,7 @@ @API(status = EXPERIMENTAL, since = "1.11") public final class ConversionSupport { - private static final List stringToObjectConverters = unmodifiableList(asList( // + private static final List stringToObjectConverters = List.of( // new StringToBooleanConverter(), // new StringToCharacterConverter(), // new StringToNumberConverter(), // @@ -40,7 +38,7 @@ public final class ConversionSupport { new StringToJavaTimeConverter(), // new StringToCommonJavaTypesConverter(), // new FallbackStringToObjectConverter() // - )); + ); private ConversionSupport() { /* no-op */ diff --git a/junit-platform-commons/src/main/java/org/junit/platform/commons/support/conversion/StringToCommonJavaTypesConverter.java b/junit-platform-commons/src/main/java/org/junit/platform/commons/support/conversion/StringToCommonJavaTypesConverter.java index ceeca4d05e09..5d0d3db7fd3b 100644 --- a/junit-platform-commons/src/main/java/org/junit/platform/commons/support/conversion/StringToCommonJavaTypesConverter.java +++ b/junit-platform-commons/src/main/java/org/junit/platform/commons/support/conversion/StringToCommonJavaTypesConverter.java @@ -10,8 +10,6 @@ package org.junit.platform.commons.support.conversion; -import static java.util.Collections.unmodifiableMap; - import java.io.File; import java.net.MalformedURLException; import java.net.URI; @@ -20,7 +18,6 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.Currency; -import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.UUID; @@ -30,25 +27,19 @@ class StringToCommonJavaTypesConverter implements StringToObjectConverter { - private static final Map, Function> CONVERTERS; - - static { - Map, Function> converters = new HashMap<>(); - + private static final Map, Function> CONVERTERS = Map.of( // // java.io and java.nio - converters.put(File.class, File::new); - converters.put(Charset.class, Charset::forName); - converters.put(Path.class, Paths::get); + File.class, File::new, // + Charset.class, Charset::forName, // + Path.class, Paths::get, // java.net - converters.put(URI.class, URI::create); - converters.put(URL.class, StringToCommonJavaTypesConverter::toURL); + URI.class, URI::create, // + URL.class, StringToCommonJavaTypesConverter::toURL, // java.util - converters.put(Currency.class, Currency::getInstance); - converters.put(Locale.class, Locale::new); - converters.put(UUID.class, UUID::fromString); - - CONVERTERS = unmodifiableMap(converters); - } + Currency.class, Currency::getInstance, // + Locale.class, Locale::new, // + UUID.class, UUID::fromString // + ); @Override public boolean canConvertTo(Class targetType) { diff --git a/junit-platform-commons/src/main/java/org/junit/platform/commons/support/conversion/StringToJavaTimeConverter.java b/junit-platform-commons/src/main/java/org/junit/platform/commons/support/conversion/StringToJavaTimeConverter.java index fb884a84fd4b..c49bd2bc8bdf 100644 --- a/junit-platform-commons/src/main/java/org/junit/platform/commons/support/conversion/StringToJavaTimeConverter.java +++ b/junit-platform-commons/src/main/java/org/junit/platform/commons/support/conversion/StringToJavaTimeConverter.java @@ -10,7 +10,7 @@ package org.junit.platform.commons.support.conversion; -import static java.util.Collections.unmodifiableMap; +import static java.util.Map.entry; import java.time.Duration; import java.time.Instant; @@ -26,7 +26,6 @@ import java.time.ZoneId; import java.time.ZoneOffset; import java.time.ZonedDateTime; -import java.util.HashMap; import java.util.Map; import java.util.function.Function; @@ -34,25 +33,22 @@ class StringToJavaTimeConverter implements StringToObjectConverter { - private static final Map, Function> CONVERTERS; - static { - Map, Function> converters = new HashMap<>(); - converters.put(Duration.class, Duration::parse); - converters.put(Instant.class, Instant::parse); - converters.put(LocalDate.class, LocalDate::parse); - converters.put(LocalDateTime.class, LocalDateTime::parse); - converters.put(LocalTime.class, LocalTime::parse); - converters.put(MonthDay.class, MonthDay::parse); - converters.put(OffsetDateTime.class, OffsetDateTime::parse); - converters.put(OffsetTime.class, OffsetTime::parse); - converters.put(Period.class, Period::parse); - converters.put(Year.class, Year::parse); - converters.put(YearMonth.class, YearMonth::parse); - converters.put(ZonedDateTime.class, ZonedDateTime::parse); - converters.put(ZoneId.class, ZoneId::of); - converters.put(ZoneOffset.class, ZoneOffset::of); - CONVERTERS = unmodifiableMap(converters); - } + private static final Map, Function> CONVERTERS = Map.ofEntries( // + entry(Duration.class, Duration::parse), // + entry(Instant.class, Instant::parse), // + entry(LocalDate.class, LocalDate::parse), // + entry(LocalDateTime.class, LocalDateTime::parse), // + entry(LocalTime.class, LocalTime::parse), // + entry(MonthDay.class, MonthDay::parse), // + entry(OffsetDateTime.class, OffsetDateTime::parse), // + entry(OffsetTime.class, OffsetTime::parse), // + entry(Period.class, Period::parse), // + entry(Year.class, Year::parse), // + entry(YearMonth.class, YearMonth::parse), // + entry(ZonedDateTime.class, ZonedDateTime::parse), // + entry(ZoneId.class, ZoneId::of), // + entry(ZoneOffset.class, ZoneOffset::of) // + ); @Override public boolean canConvertTo(Class targetType) { diff --git a/junit-platform-commons/src/main/java/org/junit/platform/commons/support/conversion/StringToNumberConverter.java b/junit-platform-commons/src/main/java/org/junit/platform/commons/support/conversion/StringToNumberConverter.java index 972cd29b07e4..f21ee0429c1b 100644 --- a/junit-platform-commons/src/main/java/org/junit/platform/commons/support/conversion/StringToNumberConverter.java +++ b/junit-platform-commons/src/main/java/org/junit/platform/commons/support/conversion/StringToNumberConverter.java @@ -10,11 +10,8 @@ package org.junit.platform.commons.support.conversion; -import static java.util.Collections.unmodifiableMap; - import java.math.BigDecimal; import java.math.BigInteger; -import java.util.HashMap; import java.util.Map; import java.util.function.Function; @@ -22,22 +19,19 @@ class StringToNumberConverter implements StringToObjectConverter { - private static final Map, Function> CONVERTERS; - static { - Map, Function> converters = new HashMap<>(); - converters.put(Byte.class, Byte::decode); - converters.put(Short.class, Short::decode); - converters.put(Integer.class, Integer::decode); - converters.put(Long.class, Long::decode); - converters.put(Float.class, Float::valueOf); - converters.put(Double.class, Double::valueOf); + private static final Map, Function> CONVERTERS = Map.of( // + Byte.class, Byte::decode, // + Short.class, Short::decode, // + Integer.class, Integer::decode, // + Long.class, Long::decode, // + Float.class, Float::valueOf, // + Double.class, Double::valueOf, // // Technically, BigInteger and BigDecimal constructors are covered by // FallbackStringToObjectConverter, but we have explicit conversion // configured for them anyway. - converters.put(BigInteger.class, BigInteger::new); - converters.put(BigDecimal.class, BigDecimal::new); - CONVERTERS = unmodifiableMap(converters); - } + BigInteger.class, BigInteger::new, // + BigDecimal.class, BigDecimal::new // + ); @Override public boolean canConvertTo(Class targetType) { diff --git a/junit-platform-commons/src/main/java/org/junit/platform/commons/support/scanning/DefaultClasspathScanner.java b/junit-platform-commons/src/main/java/org/junit/platform/commons/support/scanning/DefaultClasspathScanner.java index 0e9bb167a491..427b8867d946 100644 --- a/junit-platform-commons/src/main/java/org/junit/platform/commons/support/scanning/DefaultClasspathScanner.java +++ b/junit-platform-commons/src/main/java/org/junit/platform/commons/support/scanning/DefaultClasspathScanner.java @@ -12,7 +12,6 @@ import static java.util.Collections.emptyList; import static java.util.stream.Collectors.joining; -import static java.util.stream.Collectors.toList; import static org.apiguardian.api.API.Status.INTERNAL; import static org.junit.platform.commons.support.scanning.ClasspathFilters.CLASS_FILE_SUFFIX; import static org.junit.platform.commons.util.StringUtils.isNotBlank; @@ -131,7 +130,7 @@ private List> findClassesForUris(List baseUris, String basePackage .map(baseUri -> findClassesForUri(baseUri, basePackageName, classFilter)) .flatMap(Collection::stream) .distinct() - .collect(toList()); + .toList(); // @formatter:on } @@ -155,7 +154,7 @@ private List findResourcesForUris(List baseUris, String basePacka .map(baseUri -> findResourcesForUri(baseUri, basePackageName, resourceFilter)) .flatMap(Collection::stream) .distinct() - .collect(toList()); + .toList(); // @formatter:on } diff --git a/junit-platform-commons/src/main/java/org/junit/platform/commons/util/AnnotationUtils.java b/junit-platform-commons/src/main/java/org/junit/platform/commons/util/AnnotationUtils.java index 11b657a3fcb0..0e7d7b7e2441 100644 --- a/junit-platform-commons/src/main/java/org/junit/platform/commons/util/AnnotationUtils.java +++ b/junit-platform-commons/src/main/java/org/junit/platform/commons/util/AnnotationUtils.java @@ -13,7 +13,6 @@ import static java.util.Arrays.asList; import static java.util.Objects.requireNonNull; import static org.apiguardian.api.API.Status.INTERNAL; -import static org.junit.platform.commons.util.CollectionUtils.toUnmodifiableList; import static org.junit.platform.commons.util.ReflectionUtils.isInnerClass; import java.lang.annotation.Annotation; @@ -25,7 +24,6 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Parameter; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -295,7 +293,7 @@ public static List findRepeatableAnnotations(@Nullable Set found = new LinkedHashSet<>(16); findRepeatableAnnotations(element, annotationType, containerType, inherited, found, new HashSet<>(16)); // unmodifiable since returned from public, non-internal method(s) - return Collections.unmodifiableList(new ArrayList<>(found)); + return List.copyOf(found); } private static void findRepeatableAnnotations(AnnotatedElement element, @@ -455,7 +453,7 @@ public static List findPublicAnnotatedFields(Class clazz, Class fie // @formatter:off return Arrays.stream(clazz.getFields()) .filter(field -> fieldType.isAssignableFrom(field.getType()) && isAnnotated(field, annotationType)) - .collect(toUnmodifiableList()); + .toList(); // @formatter:on } diff --git a/junit-platform-commons/src/main/java/org/junit/platform/commons/util/ClassNamePatternFilterUtils.java b/junit-platform-commons/src/main/java/org/junit/platform/commons/util/ClassNamePatternFilterUtils.java index 0ae9e0b5da25..bfe483dd0957 100644 --- a/junit-platform-commons/src/main/java/org/junit/platform/commons/util/ClassNamePatternFilterUtils.java +++ b/junit-platform-commons/src/main/java/org/junit/platform/commons/util/ClassNamePatternFilterUtils.java @@ -10,7 +10,6 @@ package org.junit.platform.commons.util; -import static java.util.stream.Collectors.toList; import static org.apiguardian.api.API.Status.INTERNAL; import java.util.Arrays; @@ -124,7 +123,7 @@ private static List convertToRegularExpressions(String patterns) { .map(String::trim) .map(ClassNamePatternFilterUtils::replaceRegExElements) .map(Pattern::compile) - .collect(toList()); + .toList(); // @formatter:on } diff --git a/junit-platform-commons/src/main/java/org/junit/platform/commons/util/ClasspathScannerLoader.java b/junit-platform-commons/src/main/java/org/junit/platform/commons/util/ClasspathScannerLoader.java index 0560ad7e8a5f..cfa60d58369b 100644 --- a/junit-platform-commons/src/main/java/org/junit/platform/commons/util/ClasspathScannerLoader.java +++ b/junit-platform-commons/src/main/java/org/junit/platform/commons/util/ClasspathScannerLoader.java @@ -10,7 +10,6 @@ package org.junit.platform.commons.util; -import static java.util.stream.Collectors.toList; import static java.util.stream.StreamSupport.stream; import java.util.List; @@ -29,7 +28,7 @@ static ClasspathScanner getInstance() { ServiceLoader serviceLoader = ServiceLoader.load(ClasspathScanner.class, ClassLoaderUtils.getDefaultClassLoader()); - List classpathScanners = stream(serviceLoader.spliterator(), false).collect(toList()); + List classpathScanners = stream(serviceLoader.spliterator(), false).toList(); if (classpathScanners.size() == 1) { return classpathScanners.get(0); 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 ed4e255620b7..2305526dd882 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 @@ -12,8 +12,6 @@ import static java.util.Spliterator.ORDERED; import static java.util.Spliterators.spliteratorUnknownSize; -import static java.util.stream.Collectors.collectingAndThen; -import static java.util.stream.Collectors.toList; import static java.util.stream.StreamSupport.stream; import static org.apiguardian.api.API.Status.INTERNAL; import static org.junit.platform.commons.support.ReflectionSupport.invokeMethod; @@ -22,15 +20,11 @@ import java.lang.reflect.Method; import java.util.Arrays; import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.ListIterator; import java.util.Optional; -import java.util.Set; import java.util.function.Consumer; -import java.util.stream.Collector; import java.util.stream.DoubleStream; import java.util.stream.IntStream; import java.util.stream.LongStream; @@ -96,50 +90,6 @@ private CollectionUtils() { : collection.iterator().next(); } - /** - * Convert the supplied array of values to a {@link Set}. - * - * @param values the array of values; never {@code null} - * @return a set of the values - * @throws PreconditionViolationException if the array is {@code null} - * @since 1.6 - */ - @API(status = INTERNAL, since = "1.6") - public static Set toSet(T[] values) { - Preconditions.notNull(values, "values array must not be null"); - if (values.length == 0) { - return Collections.emptySet(); - } - if (values.length == 1) { - return Collections.singleton(values[0]); - } - var set = new HashSet(); - Collections.addAll(set, values); - return set; - } - - /** - * Return a {@code Collector} that accumulates the input elements into a - * new unmodifiable list, in encounter order. - * - *

There are no guarantees on the type or serializability of the list - * returned, so if more control over the returned list is required, - * consider creating a new {@code Collector} implementation like the - * following: - * - *

-	 * public static <T> Collector<T, ?, List<T>> toUnmodifiableList(Supplier<List<T>> listSupplier) {
-	 *     return Collectors.collectingAndThen(Collectors.toCollection(listSupplier), Collections::unmodifiableList);
-	 * }
- * - * @param the type of the input elements - * @return a {@code Collector} which collects all the input elements into - * an unmodifiable list, in encounter order - */ - public static Collector> toUnmodifiableList() { - return collectingAndThen(toList(), Collections::unmodifiableList); - } - /** * Determine if an instance of the supplied type can be converted into a * {@code Stream}. diff --git a/junit-platform-commons/src/main/java/org/junit/platform/commons/util/ExceptionUtils.java b/junit-platform-commons/src/main/java/org/junit/platform/commons/util/ExceptionUtils.java index c2056951ddf8..8874905af32a 100644 --- a/junit-platform-commons/src/main/java/org/junit/platform/commons/util/ExceptionUtils.java +++ b/junit-platform-commons/src/main/java/org/junit/platform/commons/util/ExceptionUtils.java @@ -171,7 +171,7 @@ public static List findNestedThrowables(Throwable rootThrowable) { } } - return Collections.unmodifiableList(new ArrayList<>(visited)); + return List.copyOf(visited); } } diff --git a/junit-platform-commons/src/main/java/org/junit/platform/commons/util/ModuleUtils.java b/junit-platform-commons/src/main/java/org/junit/platform/commons/util/ModuleUtils.java index 9b069eef54d8..3538518cfa2b 100644 --- a/junit-platform-commons/src/main/java/org/junit/platform/commons/util/ModuleUtils.java +++ b/junit-platform-commons/src/main/java/org/junit/platform/commons/util/ModuleUtils.java @@ -25,13 +25,11 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; -import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; import java.util.Optional; import java.util.Set; import java.util.function.Predicate; -import java.util.stream.Collectors; import java.util.stream.Stream; import org.apiguardian.api.API; @@ -182,7 +180,7 @@ private static List> scan(Set references, ClassFilter classes.addAll(scanner.scan(reference)); } logger.debug(() -> "Found " + classes.size() + " classes: " + classes); - return Collections.unmodifiableList(classes); + return List.copyOf(classes); } /** @@ -198,7 +196,7 @@ private static List scan(Set references, Predicate "Found " + classes.size() + " classes: " + classes); - return Collections.unmodifiableList(classes); + return List.copyOf(classes); } /** @@ -229,7 +227,7 @@ List> scan(ModuleReference reference) { .filter(classFilter::match) .map(this::loadClassUnchecked) .filter(classFilter::match) - .collect(Collectors.toList()); + .toList(); // @formatter:on } } @@ -288,7 +286,7 @@ List scan(ModuleReference reference) { return names.filter(name -> !name.endsWith(".class")) .map(this::loadResourceUnchecked) .filter(resourceFilter) - .collect(Collectors.toList()); + .toList(); // @formatter:on } } diff --git a/junit-platform-commons/src/main/java/org/junit/platform/commons/util/PackageNameUtils.java b/junit-platform-commons/src/main/java/org/junit/platform/commons/util/PackageNameUtils.java deleted file mode 100644 index 0cb6aec9e8d8..000000000000 --- a/junit-platform-commons/src/main/java/org/junit/platform/commons/util/PackageNameUtils.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2015-2025 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; - -/** - * Collection of utilities for working with package names. - * - *

DISCLAIMER

- * - *

These utilities are intended solely for usage within the JUnit framework - * itself. Any usage by external parties is not supported. - * Use at your own risk! - * - * @since 1.11.3 - */ -class PackageNameUtils { - - static String getPackageName(Class clazz) { - return clazz.getPackageName(); - } - -} diff --git a/junit-platform-commons/src/main/java/org/junit/platform/commons/util/ReflectionUtils.java b/junit-platform-commons/src/main/java/org/junit/platform/commons/util/ReflectionUtils.java index 4291635ebecb..4bdfb806fddf 100644 --- a/junit-platform-commons/src/main/java/org/junit/platform/commons/util/ReflectionUtils.java +++ b/junit-platform-commons/src/main/java/org/junit/platform/commons/util/ReflectionUtils.java @@ -16,8 +16,6 @@ import static java.util.stream.Collectors.toSet; import static org.apiguardian.api.API.Status.INTERNAL; import static org.apiguardian.api.API.Status.STABLE; -import static org.junit.platform.commons.util.CollectionUtils.toUnmodifiableList; -import static org.junit.platform.commons.util.PackageNameUtils.getPackageName; import static org.junit.platform.commons.util.ReflectionUtils.HierarchyTraversalMode.BOTTOM_UP; import static org.junit.platform.commons.util.ReflectionUtils.HierarchyTraversalMode.TOP_DOWN; @@ -628,7 +626,7 @@ public static T newInstance(Constructor constructor, @Nullable Object... * @see #tryToReadFieldValue(Field, Object) */ @API(status = INTERNAL, since = "1.4") - public static Try tryToReadFieldValue(Class clazz, String fieldName, T instance) { + public static Try tryToReadFieldValue(Class clazz, String fieldName, @Nullable T instance) { Preconditions.notNull(clazz, "Class must not be null"); Preconditions.notBlank(fieldName, "Field name must not be null or blank"); @@ -679,7 +677,7 @@ public static Try tryToReadFieldValue(Class clazz, String fieldNa * @return an immutable list of the values of the specified fields; never * {@code null} but may be empty or contain {@code null} entries */ - public static List readFieldValues(List fields, @Nullable Object instance) { + public static List<@Nullable Object> readFieldValues(List fields, @Nullable Object instance) { return readFieldValues(fields, instance, field -> true); } @@ -696,7 +694,7 @@ public static List readFieldValues(List fields, @Nullable Object * @return an immutable list of the values of the specified fields; never * {@code null} but may be empty or contain {@code null} entries */ - public static List readFieldValues(List fields, @Nullable Object instance, + public static List<@Nullable Object> readFieldValues(List fields, @Nullable Object instance, Predicate predicate) { Preconditions.notNull(fields, "fields list must not be null"); Preconditions.notNull(predicate, "Predicate must not be null"); @@ -705,9 +703,8 @@ public static List readFieldValues(List fields, @Nullable Object return fields.stream() .filter(predicate) .map(field -> - tryToReadFieldValue(field, instance) - .getOrThrow(ExceptionUtils::throwAsUncheckedException)) - .collect(toUnmodifiableList()); + tryToReadFieldValue(field, instance).getOrThrow(ExceptionUtils::throwAsUncheckedException)) + .toList(); // @formatter:on } @@ -1019,14 +1016,14 @@ public static Stream> streamAllClassesInClasspathRoot(URI root, Predica * @since 1.1 */ public static List> findAllClassesInClasspathRoot(URI root, ClassFilter classFilter) { - return Collections.unmodifiableList(classpathScanner.scanForClassesInClasspathRoot(root, classFilter)); + return List.copyOf(classpathScanner.scanForClassesInClasspathRoot(root, classFilter)); } /** * @since 1.11 */ public static List findAllResourcesInClasspathRoot(URI root, Predicate resourceFilter) { - return Collections.unmodifiableList(classpathScanner.scanForResourcesInClasspathRoot(root, resourceFilter)); + return List.copyOf(classpathScanner.scanForResourcesInClasspathRoot(root, resourceFilter)); } /** @@ -1065,15 +1062,14 @@ public static Stream> streamAllClassesInPackage(String basePackageName, * @since 1.1 */ public static List> findAllClassesInPackage(String basePackageName, ClassFilter classFilter) { - return Collections.unmodifiableList(classpathScanner.scanForClassesInPackage(basePackageName, classFilter)); + return List.copyOf(classpathScanner.scanForClassesInPackage(basePackageName, classFilter)); } /** * @since 1.11 */ public static List findAllResourcesInPackage(String basePackageName, Predicate resourceFilter) { - return Collections.unmodifiableList( - classpathScanner.scanForResourcesInPackage(basePackageName, resourceFilter)); + return List.copyOf(classpathScanner.scanForResourcesInPackage(basePackageName, resourceFilter)); } /** @@ -1114,14 +1110,14 @@ public static Stream> streamAllClassesInModule(String moduleName, Predi * @since 1.1.1 */ public static List> findAllClassesInModule(String moduleName, ClassFilter classFilter) { - return Collections.unmodifiableList(ModuleUtils.findAllClassesInModule(moduleName, classFilter)); + return List.copyOf(ModuleUtils.findAllClassesInModule(moduleName, classFilter)); } /** * @since 1.11 */ public static List findAllResourcesInModule(String moduleName, Predicate resourceFilter) { - return Collections.unmodifiableList(ModuleUtils.findAllResourcesInModule(moduleName, resourceFilter)); + return List.copyOf(ModuleUtils.findAllResourcesInModule(moduleName, resourceFilter)); } /** @@ -1150,7 +1146,7 @@ public static List> findNestedClasses(Class clazz, Predicate(candidates)); + return List.copyOf(candidates); } /** @@ -1314,7 +1310,7 @@ public static List> findConstructors(Class clazz, Predicate> findConstructors(Class clazz, Predicate findFields(Class clazz, Predicate predicate, HierarchyTraversalMode traversalMode) { - return streamFields(clazz, predicate, traversalMode).collect(toUnmodifiableList()); + return streamFields(clazz, predicate, traversalMode).toList(); } /** @@ -1594,7 +1590,7 @@ public static List findMethods(Class clazz, Predicate predica public static List findMethods(Class clazz, Predicate predicate, HierarchyTraversalMode traversalMode) { - return streamMethods(clazz, predicate, traversalMode).collect(toUnmodifiableList()); + return streamMethods(clazz, predicate, traversalMode).toList(); } /** @@ -1649,14 +1645,6 @@ private static List findAllMethodsInHierarchy(Class clazz, HierarchyT return methods; } - /** - * Custom alternative to {@link Class#getFields()} that sorts the fields - * and converts them to a mutable list. - */ - private static List getFields(Class clazz) { - return toSortedMutableList(clazz.getFields()); - } - /** * Custom alternative to {@link Class#getDeclaredFields()} that sorts the * fields and converts them to a mutable list. @@ -1878,7 +1866,7 @@ private static boolean isPackagePrivate(Member member) { } private static boolean declaredInSamePackage(Method m1, Method m2) { - return getPackageName(m1.getDeclaringClass()).equals(getPackageName(m2.getDeclaringClass())); + return m1.getDeclaringClass().getPackageName().equals(m2.getDeclaringClass().getPackageName()); } /** diff --git a/junit-platform-commons/src/main/java/org/junit/platform/commons/util/StringUtils.java b/junit-platform-commons/src/main/java/org/junit/platform/commons/util/StringUtils.java index cdef22876436..e553d7eee88c 100644 --- a/junit-platform-commons/src/main/java/org/junit/platform/commons/util/StringUtils.java +++ b/junit-platform-commons/src/main/java/org/junit/platform/commons/util/StringUtils.java @@ -304,7 +304,7 @@ private static TwoPartSplitResult splitIntoTwo(String value, int index, int leng * @see StringUtils#splitIntoTwo(String, String) */ @API(status = INTERNAL, since = "1.11") - public interface TwoPartSplitResult { + public sealed interface TwoPartSplitResult { /** * Map the result of splitting a string into two parts or throw an exception. @@ -331,13 +331,7 @@ default T mapTwo(Supplier onePartExceptionCreato } - private static final class OnePart implements TwoPartSplitResult { - - private final String value; - - OnePart(String value) { - this.value = value; - } + private record OnePart(String value) implements TwoPartSplitResult { @Override public T map(Function onePartMapper, @@ -346,15 +340,7 @@ public T map(Function onePartMapper, } } - private static final class TwoParts implements TwoPartSplitResult { - - private final String first; - private final String second; - - TwoParts(String first, String second) { - this.first = first; - this.second = second; - } + private record TwoParts(String first, String second) implements TwoPartSplitResult { @Override public T map(Function onePartMapper, diff --git a/junit-platform-console/src/main/java/org/junit/platform/console/options/ClasspathEntriesConverter.java b/junit-platform-console/src/main/java/org/junit/platform/console/options/ClasspathEntriesConverter.java index a0f2fa15774d..9de9395df764 100644 --- a/junit-platform-console/src/main/java/org/junit/platform/console/options/ClasspathEntriesConverter.java +++ b/junit-platform-console/src/main/java/org/junit/platform/console/options/ClasspathEntriesConverter.java @@ -14,7 +14,6 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; -import java.util.stream.Collectors; import java.util.stream.Stream; import picocli.CommandLine; @@ -23,7 +22,7 @@ class ClasspathEntriesConverter implements CommandLine.ITypeConverter @Override public List convert(String value) { - return Stream.of(value.split(File.pathSeparator)).map(Paths::get).collect(Collectors.toList()); + return Stream.of(value.split(File.pathSeparator)).map(Paths::get).toList(); } } diff --git a/junit-platform-console/src/main/java/org/junit/platform/console/options/TestDiscoveryOptions.java b/junit-platform-console/src/main/java/org/junit/platform/console/options/TestDiscoveryOptions.java index 030cc1475b2f..bd1ede77223b 100644 --- a/junit-platform-console/src/main/java/org/junit/platform/console/options/TestDiscoveryOptions.java +++ b/junit-platform-console/src/main/java/org/junit/platform/console/options/TestDiscoveryOptions.java @@ -13,7 +13,6 @@ import static java.util.Collections.emptyList; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonList; -import static java.util.stream.Collectors.toList; import static org.apiguardian.api.API.Status.INTERNAL; import static org.junit.platform.engine.discovery.ClassNameFilter.STANDARD_INCLUDE_PATTERN; @@ -96,7 +95,7 @@ public void setScanClasspath(boolean scanClasspath) { } public List getExistingAdditionalClasspathEntries() { - return this.additionalClasspathEntries.stream().filter(Files::exists).collect(toList()); + return this.additionalClasspathEntries.stream().filter(Files::exists).toList(); } public List getAdditionalClasspathEntries() { diff --git a/junit-platform-console/src/main/java/org/junit/platform/console/options/Theme.java b/junit-platform-console/src/main/java/org/junit/platform/console/options/Theme.java index 83d75d08fc8f..1abf7f8e0084 100644 --- a/junit-platform-console/src/main/java/org/junit/platform/console/options/Theme.java +++ b/junit-platform-console/src/main/java/org/junit/platform/console/options/Theme.java @@ -116,16 +116,11 @@ public final String skipped() { } public final String status(TestExecutionResult result) { - switch (result.getStatus()) { - case SUCCESSFUL: - return successful(); - case ABORTED: - return aborted(); - case FAILED: - return failed(); - default: - return result.getStatus().name(); - } + return switch (result.getStatus()) { + case SUCCESSFUL -> successful(); + case ABORTED -> aborted(); + case FAILED -> failed(); + }; } /** diff --git a/junit-platform-console/src/main/java/org/junit/platform/console/tasks/ConsoleTestExecutor.java b/junit-platform-console/src/main/java/org/junit/platform/console/tasks/ConsoleTestExecutor.java index eb0f3874a8e3..4c001b4d806f 100644 --- a/junit-platform-console/src/main/java/org/junit/platform/console/tasks/ConsoleTestExecutor.java +++ b/junit-platform-console/src/main/java/org/junit/platform/console/tasks/ConsoleTestExecutor.java @@ -180,21 +180,16 @@ private SummaryGeneratingListener registerListeners(PrintWriter out, Optional createDetailsPrintingListener(PrintWriter out) { ColorPalette colorPalette = getColorPalette(); Theme theme = outputOptions.getTheme(); - switch (outputOptions.getDetails()) { - case SUMMARY: - // summary listener is always created and registered - return Optional.empty(); - case FLAT: - return Optional.of(new FlatPrintingListener(out, colorPalette)); - case TREE: - return Optional.of(new TreePrintingListener(out, colorPalette, theme)); - case VERBOSE: - return Optional.of(new VerboseTreePrintingListener(out, colorPalette, 16, theme)); - case TESTFEED: - return Optional.of(new TestFeedPrintingListener(out, colorPalette)); - default: - return Optional.empty(); - } + return switch (outputOptions.getDetails()) { + case SUMMARY -> + // summary listener is always created and registered + Optional.empty(); + case FLAT -> Optional.of(new FlatPrintingListener(out, colorPalette)); + case TREE -> Optional.of(new TreePrintingListener(out, colorPalette, theme)); + case VERBOSE -> Optional.of(new VerboseTreePrintingListener(out, colorPalette, 16, theme)); + case TESTFEED -> Optional.of(new TestFeedPrintingListener(out, colorPalette)); + case NONE -> Optional.empty(); + }; } private ColorPalette getColorPalette() { diff --git a/junit-platform-console/src/main/java/org/junit/platform/console/tasks/Style.java b/junit-platform-console/src/main/java/org/junit/platform/console/tasks/Style.java index 72b2dc83ff22..5a74c39738be 100644 --- a/junit-platform-console/src/main/java/org/junit/platform/console/tasks/Style.java +++ b/junit-platform-console/src/main/java/org/junit/platform/console/tasks/Style.java @@ -21,16 +21,11 @@ enum Style { NONE, SUCCESSFUL, ABORTED, FAILED, SKIPPED, CONTAINER, TEST, DYNAMIC, REPORTED; static Style valueOf(TestExecutionResult result) { - switch (result.getStatus()) { - case SUCCESSFUL: - return Style.SUCCESSFUL; - case ABORTED: - return Style.ABORTED; - case FAILED: - return Style.FAILED; - default: - return Style.NONE; - } + return switch (result.getStatus()) { + case SUCCESSFUL -> Style.SUCCESSFUL; + case ABORTED -> Style.ABORTED; + case FAILED -> Style.FAILED; + }; } static Style valueOf(TestIdentifier testIdentifier) { diff --git a/junit-platform-engine/src/main/java/org/junit/platform/engine/Filter.java b/junit-platform-engine/src/main/java/org/junit/platform/engine/Filter.java index b500a1320a2b..83511c09bdf8 100644 --- a/junit-platform-engine/src/main/java/org/junit/platform/engine/Filter.java +++ b/junit-platform-engine/src/main/java/org/junit/platform/engine/Filter.java @@ -11,6 +11,7 @@ package org.junit.platform.engine; import static java.util.Arrays.asList; +import static org.apiguardian.api.API.Status.DEPRECATED; import static org.apiguardian.api.API.Status.STABLE; import static org.junit.platform.commons.util.CollectionUtils.getOnlyElement; import static org.junit.platform.engine.CompositeFilter.alwaysIncluded; @@ -94,6 +95,8 @@ static Filter composeFilters(Collection> filters) { * @param adaptee the filter to be adapted * @param converter the converter function to apply */ + @API(status = DEPRECATED, since = "6.0") + @Deprecated(since = "6.0", forRemoval = true) static Filter adaptFilter(Filter adaptee, Function converter) { return input -> adaptee.apply(converter.apply(input)); } diff --git a/junit-platform-engine/src/main/java/org/junit/platform/engine/TestTag.java b/junit-platform-engine/src/main/java/org/junit/platform/engine/TestTag.java index bf3ee3fc6d47..979278134116 100644 --- a/junit-platform-engine/src/main/java/org/junit/platform/engine/TestTag.java +++ b/junit-platform-engine/src/main/java/org/junit/platform/engine/TestTag.java @@ -14,9 +14,6 @@ import java.io.Serial; import java.io.Serializable; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; import java.util.Objects; import java.util.Set; @@ -54,8 +51,7 @@ public final class TestTag implements Serializable { *
  • {@code !}: exclamation point
  • * */ - public static final Set RESERVED_CHARACTERS = Collections.unmodifiableSet( - new HashSet<>(Arrays.asList(",", "(", ")", "&", "|", "!"))); + public static final Set RESERVED_CHARACTERS = Set.of(",", "(", ")", "&", "|", "!"); /** * Determine if the supplied tag name is valid with regard to the supported diff --git a/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueId.java b/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueId.java index ce1bb7654029..ab5a002a64c2 100644 --- a/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueId.java +++ b/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueId.java @@ -10,8 +10,6 @@ package org.junit.platform.engine; -import static java.util.Collections.singletonList; -import static java.util.Collections.unmodifiableList; import static org.apiguardian.api.API.Status.STABLE; import java.io.Serial; @@ -97,7 +95,7 @@ public static UniqueId root(String segmentType, String value) { private transient SoftReference toString; private UniqueId(UniqueIdFormat uniqueIdFormat, Segment segment) { - this(uniqueIdFormat, singletonList(segment)); + this(uniqueIdFormat, List.of(segment)); } /** @@ -109,7 +107,7 @@ private UniqueId(UniqueIdFormat uniqueIdFormat, Segment segment) { */ UniqueId(UniqueIdFormat uniqueIdFormat, List segments) { this.uniqueIdFormat = uniqueIdFormat; - this.segments = segments; + this.segments = List.copyOf(segments); } final Optional getRoot() { @@ -130,7 +128,7 @@ public final Optional getEngineId() { * {@code UniqueId}. */ public final List getSegments() { - return unmodifiableList(this.segments); + return this.segments; } /** @@ -218,7 +216,7 @@ public boolean hasPrefix(UniqueId potentialPrefix) { @API(status = STABLE, since = "1.5") public UniqueId removeLastSegment() { Preconditions.condition(this.segments.size() > 1, "Cannot remove last remaining segment"); - return new UniqueId(uniqueIdFormat, new ArrayList<>(this.segments.subList(0, this.segments.size() - 1))); + return new UniqueId(uniqueIdFormat, List.copyOf(this.segments.subList(0, this.segments.size() - 1))); } /** diff --git a/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueIdFormat.java b/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueIdFormat.java index 5a96a33a6846..87275e54ba4d 100644 --- a/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueIdFormat.java +++ b/junit-platform-engine/src/main/java/org/junit/platform/engine/UniqueIdFormat.java @@ -11,11 +11,9 @@ package org.junit.platform.engine; import static java.util.stream.Collectors.joining; -import static java.util.stream.Collectors.toList; import java.io.Serial; import java.io.Serializable; -import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; @@ -51,12 +49,7 @@ private static String quote(char c) { } private static String encode(char c) { - try { - return URLEncoder.encode(String.valueOf(c), StandardCharsets.UTF_8.name()); - } - catch (UnsupportedEncodingException e) { - throw new AssertionError("UTF-8 should be supported", e); - } + return URLEncoder.encode(String.valueOf(c), StandardCharsets.UTF_8); } private final char openSegment; @@ -94,7 +87,7 @@ private static String encode(char c) { */ UniqueId parse(String source) throws JUnitException { String[] parts = source.split(String.valueOf(this.segmentDelimiter)); - List segments = Arrays.stream(parts).map(this::createSegment).collect(toList()); + List segments = Arrays.stream(parts).map(this::createSegment).toList(); return new UniqueId(this, segments); } @@ -152,12 +145,7 @@ private String encode(String s) { } private static String decode(String s) { - try { - return URLDecoder.decode(s, StandardCharsets.UTF_8.name()); - } - catch (UnsupportedEncodingException e) { - throw new JUnitException("UTF-8 should be supported", e); - } + return URLDecoder.decode(s, StandardCharsets.UTF_8); } } diff --git a/junit-platform-engine/src/main/java/org/junit/platform/engine/discovery/AbstractClassNameFilter.java b/junit-platform-engine/src/main/java/org/junit/platform/engine/discovery/AbstractClassNameFilter.java index ae047beed04c..94ac57e783e4 100644 --- a/junit-platform-engine/src/main/java/org/junit/platform/engine/discovery/AbstractClassNameFilter.java +++ b/junit-platform-engine/src/main/java/org/junit/platform/engine/discovery/AbstractClassNameFilter.java @@ -11,7 +11,6 @@ package org.junit.platform.engine.discovery; import static java.util.stream.Collectors.joining; -import static java.util.stream.Collectors.toList; import java.util.Arrays; import java.util.List; @@ -36,7 +35,7 @@ abstract class AbstractClassNameFilter implements ClassNameFilter { AbstractClassNameFilter(String... patterns) { Preconditions.notEmpty(patterns, "patterns array must not be null or empty"); Preconditions.containsNoNullElements(patterns, "patterns array must not contain null elements"); - this.patterns = Arrays.stream(patterns).map(Pattern::compile).collect(toList()); + this.patterns = Arrays.stream(patterns).map(Pattern::compile).toList(); this.patternDescription = Arrays.stream(patterns).collect(joining("' OR '", "'", "'")); } diff --git a/junit-platform-engine/src/main/java/org/junit/platform/engine/discovery/DiscoverySelectors.java b/junit-platform-engine/src/main/java/org/junit/platform/engine/discovery/DiscoverySelectors.java index d65b7977ed1e..94a810396766 100644 --- a/junit-platform-engine/src/main/java/org/junit/platform/engine/discovery/DiscoverySelectors.java +++ b/junit-platform-engine/src/main/java/org/junit/platform/engine/discovery/DiscoverySelectors.java @@ -10,10 +10,8 @@ package org.junit.platform.engine.discovery; -import static java.util.stream.Collectors.toList; import static org.apiguardian.api.API.Status.EXPERIMENTAL; import static org.apiguardian.api.API.Status.STABLE; -import static org.junit.platform.commons.util.CollectionUtils.toUnmodifiableList; import java.io.File; import java.io.IOException; @@ -262,7 +260,7 @@ public static List selectClasspathRoots(Set classpa .map(Path::toUri) .map(ClasspathRootSelector::new) // unmodifiable since selectClasspathRoots is a public, non-internal method - .collect(toUnmodifiableList()); + .toList(); // @formatter:on } @@ -354,7 +352,7 @@ public static ClasspathResourceSelector selectClasspathResource(String classpath public static ClasspathResourceSelector selectClasspathResource(Set classpathResources) { Preconditions.notEmpty(classpathResources, "classpath resources must not be null or empty"); Preconditions.containsNoNullElements(classpathResources, "individual classpath resources must not be null"); - List resourceNames = classpathResources.stream().map(Resource::getName).distinct().collect(toList()); + List resourceNames = classpathResources.stream().map(Resource::getName).distinct().toList(); Preconditions.condition(resourceNames.size() == 1, "all classpath resources must have the same name"); Preconditions.notBlank(resourceNames.get(0), "classpath resource names must not be null or blank"); return new ClasspathResourceSelector(classpathResources); @@ -394,7 +392,7 @@ public static List selectModules(Set moduleNames) { return moduleNames.stream() .map(DiscoverySelectors::selectModule) // unmodifiable since this is a public, non-internal method - .collect(toUnmodifiableList()); + .toList(); // @formatter:on } diff --git a/junit-platform-engine/src/main/java/org/junit/platform/engine/discovery/NestedClassSelector.java b/junit-platform-engine/src/main/java/org/junit/platform/engine/discovery/NestedClassSelector.java index 8c2b67753525..31f48c893358 100644 --- a/junit-platform-engine/src/main/java/org/junit/platform/engine/discovery/NestedClassSelector.java +++ b/junit-platform-engine/src/main/java/org/junit/platform/engine/discovery/NestedClassSelector.java @@ -11,11 +11,9 @@ package org.junit.platform.engine.discovery; import static java.util.stream.Collectors.joining; -import static java.util.stream.Collectors.toList; import static org.apiguardian.api.API.Status.EXPERIMENTAL; import static org.apiguardian.api.API.Status.INTERNAL; import static org.apiguardian.api.API.Status.STABLE; -import static org.junit.platform.commons.util.CollectionUtils.toUnmodifiableList; import java.util.Arrays; import java.util.List; @@ -65,13 +63,13 @@ public class NestedClassSelector implements DiscoverySelector { this.classLoader = classLoader; this.enclosingClassSelectors = enclosingClassNames.stream() // .map(className -> new ClassSelector(classLoader, className)) // - .collect(toUnmodifiableList()); + .toList(); this.nestedClassSelector = new ClassSelector(classLoader, nestedClassName); } NestedClassSelector(List> enclosingClasses, Class nestedClass) { this.classLoader = nestedClass.getClassLoader(); - this.enclosingClassSelectors = enclosingClasses.stream().map(ClassSelector::new).collect(toList()); + this.enclosingClassSelectors = enclosingClasses.stream().map(ClassSelector::new).toList(); this.nestedClassSelector = new ClassSelector(nestedClass); } @@ -90,7 +88,7 @@ public class NestedClassSelector implements DiscoverySelector { * Get the names of the classes enclosing the selected nested class. */ public List getEnclosingClassNames() { - return this.enclosingClassSelectors.stream().map(ClassSelector::getClassName).collect(toList()); + return this.enclosingClassSelectors.stream().map(ClassSelector::getClassName).toList(); } /** @@ -103,7 +101,7 @@ public List getEnclosingClassNames() { * {@link PreconditionViolationException} if the classes cannot be loaded. */ public List> getEnclosingClasses() { - return this.enclosingClassSelectors.stream().map(ClassSelector::getJavaClass).collect(toList()); + return this.enclosingClassSelectors.stream().map(ClassSelector::getJavaClass).toList(); } /** diff --git a/junit-platform-engine/src/main/java/org/junit/platform/engine/support/descriptor/CompositeTestSource.java b/junit-platform-engine/src/main/java/org/junit/platform/engine/support/descriptor/CompositeTestSource.java index cfff2d02cc4a..15438b93c4b1 100644 --- a/junit-platform-engine/src/main/java/org/junit/platform/engine/support/descriptor/CompositeTestSource.java +++ b/junit-platform-engine/src/main/java/org/junit/platform/engine/support/descriptor/CompositeTestSource.java @@ -10,11 +10,9 @@ package org.junit.platform.engine.support.descriptor; -import static java.util.Collections.unmodifiableList; import static org.apiguardian.api.API.Status.STABLE; import java.io.Serial; -import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -57,7 +55,7 @@ public static CompositeTestSource from(Collection sources) private CompositeTestSource(Collection sources) { Preconditions.notEmpty(sources, "TestSource collection must not be null or empty"); Preconditions.containsNoNullElements(sources, "individual TestSources must not be null"); - this.sources = unmodifiableList(new ArrayList<>(sources)); + this.sources = List.copyOf(sources); } /** diff --git a/junit-platform-engine/src/main/java/org/junit/platform/engine/support/descriptor/DefaultUriSource.java b/junit-platform-engine/src/main/java/org/junit/platform/engine/support/descriptor/DefaultUriSource.java index 334c1d6f4e93..a11f3af851a8 100644 --- a/junit-platform-engine/src/main/java/org/junit/platform/engine/support/descriptor/DefaultUriSource.java +++ b/junit-platform-engine/src/main/java/org/junit/platform/engine/support/descriptor/DefaultUriSource.java @@ -12,7 +12,6 @@ import java.io.Serial; import java.net.URI; -import java.util.Objects; import org.junit.platform.commons.util.Preconditions; import org.junit.platform.commons.util.ToStringBuilder; @@ -22,15 +21,13 @@ * * @since 1.3 */ -class DefaultUriSource implements UriSource { +record DefaultUriSource(URI uri) implements UriSource { @Serial private static final long serialVersionUID = 1L; - private final URI uri; - - DefaultUriSource(URI uri) { - this.uri = Preconditions.notNull(uri, "URI must not be null"); + DefaultUriSource { + Preconditions.notNull(uri, "URI must not be null"); } @Override @@ -38,23 +35,6 @@ public URI getUri() { return uri; } - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - DefaultUriSource that = (DefaultUriSource) o; - return Objects.equals(this.uri, that.uri); - } - - @Override - public int hashCode() { - return this.uri.hashCode(); - } - @Override public String toString() { return new ToStringBuilder(this).append("uri", this.uri).toString(); diff --git a/junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/CompositeLock.java b/junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/CompositeLock.java index 76dbbb6b984c..7ac65a73e6a1 100644 --- a/junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/CompositeLock.java +++ b/junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/CompositeLock.java @@ -10,8 +10,6 @@ package org.junit.platform.engine.support.hierarchical; -import static java.util.Collections.unmodifiableList; - import java.util.ArrayList; import java.util.List; import java.util.concurrent.ForkJoinPool; @@ -31,7 +29,7 @@ class CompositeLock implements ResourceLock { CompositeLock(List resources, List locks) { Preconditions.condition(resources.size() == locks.size(), "Resources and locks must have the same size"); - this.resources = unmodifiableList(resources); + this.resources = List.copyOf(resources); this.locks = Preconditions.notEmpty(locks, "Locks must not be empty"); this.exclusive = resources.stream().anyMatch( resource -> resource.getLockMode() == ExclusiveResource.LockMode.READ_WRITE); diff --git a/junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/LockManager.java b/junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/LockManager.java index 988d52efb69e..3171c31d2b66 100644 --- a/junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/LockManager.java +++ b/junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/LockManager.java @@ -15,7 +15,6 @@ import static java.util.stream.Collectors.groupingBy; import static java.util.stream.Collectors.toList; import static org.junit.platform.commons.util.CollectionUtils.getOnlyElement; -import static org.junit.platform.commons.util.CollectionUtils.toUnmodifiableList; import static org.junit.platform.engine.support.hierarchical.ExclusiveResource.GLOBAL_READ; import static org.junit.platform.engine.support.hierarchical.ExclusiveResource.GLOBAL_READ_WRITE; import static org.junit.platform.engine.support.hierarchical.ExclusiveResource.LockMode.READ; @@ -66,19 +65,16 @@ private List toDistinctSortedResources(Collection resourcesWithSameKey.get(0)) - .collect(toUnmodifiableList()); + .toList(); // @formatter:on } private ResourceLock toResourceLock(List resources) { - switch (resources.size()) { - case 0: - return NopLock.INSTANCE; - case 1: - return toSingleLock(getOnlyElement(resources)); - default: - return new CompositeLock(resources, toLocks(resources)); - } + return switch (resources.size()) { + case 0 -> NopLock.INSTANCE; + case 1 -> toSingleLock(getOnlyElement(resources)); + default -> new CompositeLock(resources, toLocks(resources)); + }; } private SingleLock toSingleLock(ExclusiveResource resource) { @@ -92,7 +88,7 @@ private SingleLock toSingleLock(ExclusiveResource resource) { } private List toLocks(List resources) { - return resources.stream().map(this::toLock).collect(toUnmodifiableList()); + return resources.stream().map(this::toLock).toList(); } private Lock toLock(ExclusiveResource resource) { diff --git a/junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/NodeTestTask.java b/junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/NodeTestTask.java index 5ad5e15a37a4..95af64b24296 100644 --- a/junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/NodeTestTask.java +++ b/junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/NodeTestTask.java @@ -81,12 +81,12 @@ class NodeTestTask implements TestTask { @Override public ResourceLock getResourceLock() { - return taskContext.getExecutionAdvisor().getResourceLock(testDescriptor); + return taskContext.executionAdvisor().getResourceLock(testDescriptor); } @Override public ExecutionMode getExecutionMode() { - return taskContext.getExecutionAdvisor().getForcedExecutionMode(testDescriptor) // + return taskContext.executionAdvisor().getForcedExecutionMode(testDescriptor) // .orElseGet(node::getExecutionMode); } @@ -102,7 +102,7 @@ void setParentContext(@Nullable C parentContext) { @Override public void execute() { try { - throwableCollector = taskContext.getThrowableCollectorFactory().create(); + throwableCollector = taskContext.throwableCollectorFactory().create(); prepare(); if (throwableCollector.isEmpty()) { checkWhetherSkipped(); @@ -148,7 +148,7 @@ private void checkWhetherSkipped() { } private void executeRecursively() { - taskContext.getListener().executionStarted(testDescriptor); + taskContext.listener().executionStarted(testDescriptor); started = true; var throwableCollector = requiredThrowableCollector(); @@ -170,7 +170,7 @@ private void executeRecursively() { if (!children.isEmpty()) { children.forEach(child -> child.setParentContext(context)); - taskContext.getExecutorService().invokeAll(children); + taskContext.executorService().invokeAll(children); } throwableCollector.execute(dynamicTestExecutor::awaitFinished); @@ -199,12 +199,12 @@ private void reportCompletion() { logger.debug(throwable, () -> "Failed to invoke nodeSkipped() on Node %s".formatted(testDescriptor.getUniqueId())); } - taskContext.getListener().executionSkipped(testDescriptor, skipResult.getReason().orElse("")); + taskContext.listener().executionSkipped(testDescriptor, skipResult.getReason().orElse("")); return; } if (!started) { // Call executionStarted first to comply with the contract of EngineExecutionListener. - taskContext.getListener().executionStarted(testDescriptor); + taskContext.listener().executionStarted(testDescriptor); } try { node.nodeFinished(requiredContext(), testDescriptor, throwableCollector.toTestExecutionResult()); @@ -214,7 +214,7 @@ private void reportCompletion() { logger.debug(throwable, () -> "Failed to invoke nodeFinished() on Node %s".formatted(testDescriptor.getUniqueId())); } - taskContext.getListener().executionFinished(testDescriptor, throwableCollector.toTestExecutionResult()); + taskContext.listener().executionFinished(testDescriptor, throwableCollector.toTestExecutionResult()); this.throwableCollector = null; } @@ -235,7 +235,7 @@ private class DefaultDynamicTestExecutor implements DynamicTestExecutor { @Override public void execute(TestDescriptor testDescriptor) { - execute(testDescriptor, taskContext.getListener()); + execute(testDescriptor, taskContext.listener()); } @Override @@ -257,7 +257,7 @@ public Future execute(TestDescriptor testDescriptor, EngineExecutionListener testDescriptor, () -> unfinishedTasks.remove(uniqueId)); nodeTestTask.setParentContext(context); unfinishedTasks.put(uniqueId, DynamicTaskState.unscheduled()); - Future future = taskContext.getExecutorService().submit(nodeTestTask); + Future future = taskContext.executorService().submit(nodeTestTask); unfinishedTasks.computeIfPresent(uniqueId, (__, state) -> DynamicTaskState.scheduled(future)); return future; } diff --git a/junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/NodeTestTaskContext.java b/junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/NodeTestTaskContext.java index a6298847d59a..005d8ab6d02c 100644 --- a/junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/NodeTestTaskContext.java +++ b/junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/NodeTestTaskContext.java @@ -15,20 +15,8 @@ /** * @since 1.3.1 */ -class NodeTestTaskContext { - - private final EngineExecutionListener listener; - private final HierarchicalTestExecutorService executorService; - private final ThrowableCollector.Factory throwableCollectorFactory; - private final NodeExecutionAdvisor executionAdvisor; - - public NodeTestTaskContext(EngineExecutionListener listener, HierarchicalTestExecutorService executorService, - ThrowableCollector.Factory throwableCollectorFactory, NodeExecutionAdvisor executionAdvisor) { - this.listener = listener; - this.executorService = executorService; - this.throwableCollectorFactory = throwableCollectorFactory; - this.executionAdvisor = executionAdvisor; - } +record NodeTestTaskContext(EngineExecutionListener listener, HierarchicalTestExecutorService executorService, + ThrowableCollector.Factory throwableCollectorFactory, NodeExecutionAdvisor executionAdvisor) { NodeTestTaskContext withListener(EngineExecutionListener listener) { if (this.listener == listener) { @@ -37,19 +25,4 @@ NodeTestTaskContext withListener(EngineExecutionListener listener) { return new NodeTestTaskContext(listener, executorService, throwableCollectorFactory, executionAdvisor); } - EngineExecutionListener getListener() { - return listener; - } - - HierarchicalTestExecutorService getExecutorService() { - return executorService; - } - - ThrowableCollector.Factory getThrowableCollectorFactory() { - return throwableCollectorFactory; - } - - NodeExecutionAdvisor getExecutionAdvisor() { - return executionAdvisor; - } } diff --git a/junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/ResourceLock.java b/junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/ResourceLock.java index 4f62637aa6ef..5022d88d0101 100644 --- a/junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/ResourceLock.java +++ b/junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/ResourceLock.java @@ -90,6 +90,6 @@ default boolean isCompatible(ResourceLock other) { .filter(resource -> ExclusiveResource.COMPARATOR.compare(resource, ownResources.get(ownResources.size() - 1)) < 0); - return !(potentiallyDeadlockCausingAdditionalResource.isPresent()); + return potentiallyDeadlockCausingAdditionalResource.isEmpty(); } } diff --git a/junit-platform-engine/src/main/java/org/junit/platform/engine/support/store/Namespace.java b/junit-platform-engine/src/main/java/org/junit/platform/engine/support/store/Namespace.java index dcf06d571833..31de08b01692 100644 --- a/junit-platform-engine/src/main/java/org/junit/platform/engine/support/store/Namespace.java +++ b/junit-platform-engine/src/main/java/org/junit/platform/engine/support/store/Namespace.java @@ -13,7 +13,6 @@ import static org.apiguardian.api.API.Status.EXPERIMENTAL; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -48,7 +47,7 @@ public class Namespace { public static Namespace create(Object... parts) { Preconditions.notEmpty(parts, "parts array must not be null or empty"); Preconditions.containsNoNullElements(parts, "individual parts must not be null"); - return new Namespace(Arrays.asList(parts)); + return new Namespace(List.of(parts)); } /** @@ -68,7 +67,7 @@ public static Namespace create(List objects) { private final List parts; private Namespace(List parts) { - this.parts = new ArrayList<>(parts); + this.parts = List.copyOf(parts); } @Override diff --git a/junit-platform-engine/src/main/java/org/junit/platform/engine/support/store/NamespacedHierarchicalStore.java b/junit-platform-engine/src/main/java/org/junit/platform/engine/support/store/NamespacedHierarchicalStore.java index 3f3c46278352..074d4ecdd329 100644 --- a/junit-platform-engine/src/main/java/org/junit/platform/engine/support/store/NamespacedHierarchicalStore.java +++ b/junit-platform-engine/src/main/java/org/junit/platform/engine/support/store/NamespacedHierarchicalStore.java @@ -17,7 +17,6 @@ import static org.junit.platform.commons.util.ReflectionUtils.isAssignableTo; import java.util.Comparator; -import java.util.Objects; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -327,44 +326,16 @@ private void rejectIfClosed() { } } - private static class CompositeKey { + private record CompositeKey(N namespace, Object key) { - private final N namespace; - private final Object key; - - private CompositeKey(N namespace, Object key) { - this.namespace = Preconditions.notNull(namespace, "namespace must not be null"); - this.key = Preconditions.notNull(key, "key must not be null"); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - CompositeKey that = (CompositeKey) o; - return this.namespace.equals(that.namespace) && this.key.equals(that.key); - } - - @Override - public int hashCode() { - return Objects.hash(this.namespace, this.key); + CompositeKey { + Preconditions.notNull(namespace, "namespace must not be null"); + Preconditions.notNull(key, "key must not be null"); } } - private static class StoredValue { - - private final int order; - private final Supplier<@Nullable Object> supplier; - - StoredValue(int order, Supplier<@Nullable Object> supplier) { - this.order = order; - this.supplier = supplier; - } + private record StoredValue(int order, Supplier<@Nullable Object> supplier) { private @Nullable EvaluatedValue evaluateSafely(CompositeKey compositeKey) { try { @@ -386,23 +357,11 @@ private static class StoredValue { } - private static class EvaluatedValue { + private record EvaluatedValue(CompositeKey compositeKey, int order, @Nullable Object value) { private static final Comparator> REVERSE_INSERT_ORDER = comparing( (EvaluatedValue it) -> it.order).reversed(); - private final CompositeKey compositeKey; - private final int order; - - @Nullable - private final Object value; - - private EvaluatedValue(CompositeKey compositeKey, int order, @Nullable Object value) { - this.compositeKey = compositeKey; - this.order = order; - this.value = value; - } - private void close(CloseAction closeAction) throws Throwable { if (this.value != null) { closeAction.close(this.compositeKey.namespace, this.compositeKey.key, this.value); @@ -456,13 +415,7 @@ private synchronized void computeValue() { } } - private static class Failure { - - private final Throwable throwable; - - public Failure(Throwable throwable) { - this.throwable = throwable; - } + private record Failure(Throwable throwable) { } } diff --git a/junit-platform-engine/src/testFixtures/java/org/junit/platform/engine/support/hierarchical/DemoEngineExecutionContext.java b/junit-platform-engine/src/testFixtures/java/org/junit/platform/engine/support/hierarchical/DemoEngineExecutionContext.java index 2bb72762e96d..eb6f00ff5ec3 100644 --- a/junit-platform-engine/src/testFixtures/java/org/junit/platform/engine/support/hierarchical/DemoEngineExecutionContext.java +++ b/junit-platform-engine/src/testFixtures/java/org/junit/platform/engine/support/hierarchical/DemoEngineExecutionContext.java @@ -15,12 +15,5 @@ /** * @since 1.0 */ -public class DemoEngineExecutionContext implements EngineExecutionContext { - - public final ExecutionRequest request; - - public DemoEngineExecutionContext(ExecutionRequest request) { - this.request = request; - } - +public record DemoEngineExecutionContext(ExecutionRequest request) implements EngineExecutionContext { } diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/AbstractMethodFilter.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/AbstractMethodFilter.java index 6c2eb66988da..83d02375b47b 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/AbstractMethodFilter.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/AbstractMethodFilter.java @@ -11,7 +11,6 @@ package org.junit.platform.launcher; import static java.util.stream.Collectors.joining; -import static java.util.stream.Collectors.toList; import java.util.Arrays; import java.util.List; @@ -39,7 +38,7 @@ abstract class AbstractMethodFilter implements MethodFilter { AbstractMethodFilter(String... patterns) { Preconditions.notEmpty(patterns, "patterns array must not be null or empty"); Preconditions.containsNoNullElements(patterns, "patterns array must not contain null elements"); - this.patterns = Arrays.stream(patterns).map(Pattern::compile).collect(toList()); + this.patterns = Arrays.stream(patterns).map(Pattern::compile).toList(); this.patternDescription = Arrays.stream(patterns).collect(joining("' OR '", "'", "'")); } diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/EngineFilter.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/EngineFilter.java index bd3f183d6652..6c8c7363fb86 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/EngineFilter.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/EngineFilter.java @@ -10,7 +10,6 @@ package org.junit.platform.launcher; -import static java.util.stream.Collectors.toList; import static org.apiguardian.api.API.Status.INTERNAL; import static org.apiguardian.api.API.Status.STABLE; import static org.junit.platform.engine.FilterResult.includedIf; @@ -150,7 +149,7 @@ private static List validateAndTrim(List engineIds) { return engineIds.stream() .map(id -> Preconditions.notBlank(id, "engine ID must not be null or blank").trim()) .distinct() - .collect(toList()); + .toList(); // @formatter:on } diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/TagFilter.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/TagFilter.java index 51e37f95dbc6..413a4521424a 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/TagFilter.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/TagFilter.java @@ -12,7 +12,6 @@ import static java.util.Arrays.asList; import static org.apiguardian.api.API.Status.STABLE; -import static org.junit.platform.commons.util.CollectionUtils.toUnmodifiableList; import java.util.List; import java.util.Set; @@ -173,7 +172,7 @@ private static String formatToString(List tagExpressions) { } private static List parseAll(List tagExpressions) { - return tagExpressions.stream().map(TagFilter::parse).collect(toUnmodifiableList()); + return tagExpressions.stream().map(TagFilter::parse).toList(); } private static TagExpression parse(@Nullable String tagExpression) { diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/TestIdentifier.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/TestIdentifier.java index bd4329d26afc..4e96c47cb659 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/TestIdentifier.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/TestIdentifier.java @@ -98,14 +98,11 @@ private TestIdentifier(UniqueId uniqueId, String displayName, @Nullable TestSour } private Set copyOf(Set tags) { - switch (tags.size()) { - case 0: - return emptySet(); - case 1: - return singleton(getOnlyElement(tags)); - default: - return new LinkedHashSet<>(tags); - } + return switch (tags.size()) { + case 0 -> emptySet(); + case 1 -> singleton(getOnlyElement(tags)); + default -> new LinkedHashSet<>(tags); + }; } /** diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/ClasspathAlignmentChecker.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/ClasspathAlignmentChecker.java index 08d811926ec3..108761077cd0 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/ClasspathAlignmentChecker.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/ClasspathAlignmentChecker.java @@ -10,11 +10,9 @@ package org.junit.platform.launcher.core; -import static java.util.Collections.unmodifiableList; import static java.util.Comparator.comparing; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -24,7 +22,6 @@ import org.jspecify.annotations.Nullable; import org.junit.platform.commons.JUnitException; -import org.junit.platform.commons.support.ReflectionSupport; import org.junit.platform.commons.util.ClassLoaderUtils; /** @@ -33,7 +30,7 @@ class ClasspathAlignmentChecker { // VisibleForTesting - static final List WELL_KNOWN_PACKAGES = unmodifiableList(Arrays.asList( // + static final List WELL_KNOWN_PACKAGES = List.of( // "org.junit.jupiter.api", // "org.junit.jupiter.engine", // "org.junit.jupiter.migrationsupport", // @@ -49,15 +46,11 @@ class ClasspathAlignmentChecker { "org.junit.platform.suite.engine", // "org.junit.platform.testkit", // "org.junit.vintage.engine" // - )); + ); static Optional check(LinkageError error) { ClassLoader classLoader = ClassLoaderUtils.getClassLoader(ClasspathAlignmentChecker.class); - Function packageLookup = name -> ReflectionSupport.findMethod(ClassLoader.class, - "getDefinedPackage", String.class) // - .map(m -> (Package) ReflectionSupport.invokeMethod(m, classLoader, name)) // - .orElseGet(() -> getPackage(name)); - return check(error, packageLookup); + return check(error, classLoader::getDefinedPackage); } // VisibleForTesting diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/CompositeTestExecutionListener.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/CompositeTestExecutionListener.java index c47461c561b0..f514df6da9a2 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/CompositeTestExecutionListener.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/CompositeTestExecutionListener.java @@ -10,8 +10,6 @@ package org.junit.platform.launcher.core; -import static java.util.stream.Collectors.toList; - import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; @@ -39,7 +37,7 @@ class CompositeTestExecutionListener implements TestExecutionListener { this.eagerTestExecutionListeners = this.testExecutionListeners.stream() // .filter(EagerTestExecutionListener.class::isInstance) // .map(EagerTestExecutionListener.class::cast) // - .collect(toList()); + .toList(); } @Override diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/DefaultDiscoveryRequest.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/DefaultDiscoveryRequest.java index 70106c48fb72..2951e31764f3 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/DefaultDiscoveryRequest.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/DefaultDiscoveryRequest.java @@ -10,9 +10,6 @@ package org.junit.platform.launcher.core; -import static java.util.Collections.unmodifiableList; -import static java.util.stream.Collectors.toList; - import java.util.List; import org.junit.platform.commons.util.Preconditions; @@ -58,10 +55,10 @@ final class DefaultDiscoveryRequest implements LauncherDiscoveryRequest { List> discoveryFilters, List postDiscoveryFilters, LauncherConfigurationParameters configurationParameters, LauncherDiscoveryListener discoveryListener, OutputDirectoryProvider outputDirectoryProvider) { - this.selectors = selectors; - this.engineFilters = engineFilters; - this.discoveryFilters = discoveryFilters; - this.postDiscoveryFilters = postDiscoveryFilters; + this.selectors = List.copyOf(selectors); + this.engineFilters = List.copyOf(engineFilters); + this.discoveryFilters = List.copyOf(discoveryFilters); + this.postDiscoveryFilters = List.copyOf(postDiscoveryFilters); this.configurationParameters = configurationParameters; this.discoveryListener = discoveryListener; this.outputDirectoryProvider = outputDirectoryProvider; @@ -70,23 +67,23 @@ final class DefaultDiscoveryRequest implements LauncherDiscoveryRequest { @Override public List getSelectorsByType(Class selectorType) { Preconditions.notNull(selectorType, "selectorType must not be null"); - return this.selectors.stream().filter(selectorType::isInstance).map(selectorType::cast).collect(toList()); + return this.selectors.stream().filter(selectorType::isInstance).map(selectorType::cast).toList(); } @Override public List getEngineFilters() { - return unmodifiableList(this.engineFilters); + return this.engineFilters; } @Override public > List getFiltersByType(Class filterType) { Preconditions.notNull(filterType, "filterType must not be null"); - return this.discoveryFilters.stream().filter(filterType::isInstance).map(filterType::cast).collect(toList()); + return this.discoveryFilters.stream().filter(filterType::isInstance).map(filterType::cast).toList(); } @Override public List getPostDiscoveryFilters() { - return unmodifiableList(this.postDiscoveryFilters); + return this.postDiscoveryFilters; } @Override diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/DiscoveryIssueNotifier.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/DiscoveryIssueNotifier.java index 6dbae69407c3..1e515657ce9b 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/DiscoveryIssueNotifier.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/DiscoveryIssueNotifier.java @@ -10,12 +10,11 @@ package org.junit.platform.launcher.core; -import static java.util.Collections.emptyList; import static java.util.Comparator.comparing; import static java.util.stream.Collectors.partitioningBy; +import static java.util.stream.Collectors.toUnmodifiableList; import static org.junit.platform.commons.util.ExceptionUtils.readStackTrace; -import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.function.Consumer; @@ -36,7 +35,7 @@ */ class DiscoveryIssueNotifier { - static final DiscoveryIssueNotifier NO_ISSUES = new DiscoveryIssueNotifier(emptyList(), emptyList(), emptyList()); + static final DiscoveryIssueNotifier NO_ISSUES = new DiscoveryIssueNotifier(List.of(), List.of(), List.of()); private static final Logger logger = LoggerFactory.getLogger(DiscoveryIssueNotifier.class); private final List allIssues; @@ -48,21 +47,22 @@ static DiscoveryIssueNotifier from(Severity criticalSeverity, List criticalIssues = issuesByCriticality.get(true); List nonCriticalIssues = issuesByCriticality.get(false); - return new DiscoveryIssueNotifier(new ArrayList<>(issues), criticalIssues, nonCriticalIssues); + return new DiscoveryIssueNotifier(issues, criticalIssues, nonCriticalIssues); } private static Map> partitionByCriticality(Severity criticalSeverity, List issues) { return issues.stream() // .sorted(comparing(DiscoveryIssue::severity).reversed()) // - .collect(partitioningBy(issue -> issue.severity().compareTo(criticalSeverity) >= 0)); + .collect( + partitioningBy(issue -> issue.severity().compareTo(criticalSeverity) >= 0, toUnmodifiableList())); } private DiscoveryIssueNotifier(List allIssues, List criticalIssues, List nonCriticalIssues) { - this.allIssues = allIssues; - this.criticalIssues = criticalIssues; - this.nonCriticalIssues = nonCriticalIssues; + this.allIssues = List.copyOf(allIssues); + this.criticalIssues = List.copyOf(criticalIssues); + this.nonCriticalIssues = List.copyOf(nonCriticalIssues); } List getAllIssues() { @@ -98,17 +98,11 @@ private void logIssues(TestEngine testEngine, List issues, Strin } private static Consumer> logger(Severity severity) { - // TODO [#4246] Use switch expression - switch (severity) { - case INFO: - return logger::info; - case WARNING: - return logger::warn; - case ERROR: - return logger::error; - default: - throw new IllegalArgumentException("Unknown severity: " + severity); - } + return switch (severity) { + case INFO -> logger::info; + case WARNING -> logger::warn; + case ERROR -> logger::error; + }; } private static String formatMessage(TestEngine testEngine, List issues, String adjective) { diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/EngineIdValidator.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/EngineIdValidator.java index 80df2561c5e5..7aa014de4179 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/EngineIdValidator.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/EngineIdValidator.java @@ -58,22 +58,21 @@ private static boolean validateReservedIds(TestEngine testEngine) { if (!engineId.startsWith("junit-")) { return true; } - switch (engineId) { - case "junit-jupiter": { + return switch (engineId) { + case "junit-jupiter" -> { validateWellKnownClassName(testEngine, "org.junit.jupiter.engine.JupiterTestEngine"); - return true; + yield true; } - case "junit-vintage": { + case "junit-vintage" -> { validateWellKnownClassName(testEngine, "org.junit.vintage.engine.VintageTestEngine"); - return true; + yield true; } - case "junit-platform-suite": { + case "junit-platform-suite" -> { validateWellKnownClassName(testEngine, "org.junit.platform.suite.engine.SuiteTestEngine"); - return true; + yield true; } - default: - return false; - } + default -> false; + }; } private static void validateWellKnownClassName(TestEngine testEngine, String expectedClassName) { diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/LauncherConfigurationParameters.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/LauncherConfigurationParameters.java index ebb0f19a3df4..cfea8896710d 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/LauncherConfigurationParameters.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/LauncherConfigurationParameters.java @@ -155,10 +155,6 @@ private interface ParameterProvider { @Nullable String getValue(String key); - default int size() { - return 0; - } - Set keySet(); static ParameterProvider explicit(Map configParams) { @@ -168,11 +164,6 @@ static ParameterProvider explicit(Map configParams) { return configParams.get(key); } - @Override - public int size() { - return configParams.size(); - } - @Override public Set keySet() { return configParams.keySet(); diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/LauncherDiscoveryResult.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/LauncherDiscoveryResult.java index 9be73b2ed4c8..6827cd0246a0 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/LauncherDiscoveryResult.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/LauncherDiscoveryResult.java @@ -21,7 +21,6 @@ import java.util.Map; import java.util.Optional; import java.util.function.Predicate; -import java.util.stream.Collectors; import org.apiguardian.api.API; import org.jspecify.annotations.Nullable; @@ -84,7 +83,7 @@ boolean containsCriticalIssuesOrContainsTests() { Collection getEngineTestDescriptors() { return this.testEngineResults.values().stream() // .map(EngineResultInfo::getRootDescriptor) // - .collect(Collectors.toList()); + .toList(); } public LauncherDiscoveryResult withRetainedEngines(Predicate predicate) { diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/ServiceLoaderRegistry.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/ServiceLoaderRegistry.java index f090b2bbdf12..eebd6de021f7 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/ServiceLoaderRegistry.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/ServiceLoaderRegistry.java @@ -10,8 +10,6 @@ package org.junit.platform.launcher.core; -import static java.util.stream.Collectors.toList; - import java.util.ArrayList; import java.util.List; import java.util.ServiceLoader; @@ -58,7 +56,7 @@ private static List load(Class type, Predicate classNameFilter Function, String> logMessageSupplier) { ServiceLoader serviceLoader = ServiceLoader.load(type, ClassLoaderUtils.getDefaultClassLoader()); Predicate> providerPredicate = clazz -> classNameFilter.test(clazz.getName()); - List instances = ServiceLoaderUtils.filter(serviceLoader, providerPredicate).collect(toList()); + List instances = ServiceLoaderUtils.filter(serviceLoader, providerPredicate).toList(); getLogger().config(() -> logMessageSupplier.apply(instances)); return instances; } diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/StackTracePruningEngineExecutionListener.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/StackTracePruningEngineExecutionListener.java index 4fa0a8023fdb..835a272e0af9 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/StackTracePruningEngineExecutionListener.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/StackTracePruningEngineExecutionListener.java @@ -13,7 +13,6 @@ import java.util.List; import java.util.Objects; import java.util.Optional; -import java.util.stream.Collectors; import org.junit.platform.commons.util.ExceptionUtils; import org.junit.platform.engine.EngineExecutionListener; @@ -63,7 +62,7 @@ else if (source instanceof MethodSource methodSource) { } }) // .filter(Objects::nonNull) // - .collect(Collectors.toList()); + .toList(); } } diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/listeners/MutableTestExecutionSummary.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/listeners/MutableTestExecutionSummary.java index f53d3381756d..483e67293da9 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/listeners/MutableTestExecutionSummary.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/listeners/MutableTestExecutionSummary.java @@ -14,6 +14,7 @@ import static java.util.Collections.synchronizedList; import java.io.PrintWriter; +import java.io.Serial; import java.time.Duration; import java.util.ArrayList; import java.util.Collections; @@ -282,18 +283,11 @@ private int numberOfCommonFrames(StackTraceElement[] currentTrace, StackTraceEle return currentTrace.length - 1 - currentIndex; } - private static class DefaultFailure implements Failure { + private record DefaultFailure(TestIdentifier testIdentifier, Throwable exception) implements Failure { + @Serial private static final long serialVersionUID = 1L; - private final TestIdentifier testIdentifier; - private final Throwable exception; - - DefaultFailure(TestIdentifier testIdentifier, Throwable exception) { - this.testIdentifier = testIdentifier; - this.exception = exception; - } - @Override public TestIdentifier getTestIdentifier() { return testIdentifier; diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/listeners/discovery/CompositeLauncherDiscoveryListener.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/listeners/discovery/CompositeLauncherDiscoveryListener.java index a9ba957786e4..f8695a9fc09d 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/listeners/discovery/CompositeLauncherDiscoveryListener.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/listeners/discovery/CompositeLauncherDiscoveryListener.java @@ -12,8 +12,6 @@ import static org.junit.platform.commons.util.CollectionUtils.forEachInReverseOrder; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; import org.junit.platform.engine.DiscoveryIssue; @@ -33,7 +31,7 @@ class CompositeLauncherDiscoveryListener implements LauncherDiscoveryListener { private final List listeners; CompositeLauncherDiscoveryListener(List listeners) { - this.listeners = Collections.unmodifiableList(new ArrayList<>(listeners)); + this.listeners = List.copyOf(listeners); } @Override diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/listeners/session/CompositeLauncherSessionListener.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/listeners/session/CompositeLauncherSessionListener.java index c1c13327652c..e03a6940f237 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/listeners/session/CompositeLauncherSessionListener.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/listeners/session/CompositeLauncherSessionListener.java @@ -12,8 +12,6 @@ import static org.junit.platform.commons.util.CollectionUtils.forEachInReverseOrder; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; import org.junit.platform.launcher.LauncherSession; @@ -28,7 +26,7 @@ class CompositeLauncherSessionListener implements LauncherSessionListener { private final List listeners; CompositeLauncherSessionListener(List listeners) { - this.listeners = Collections.unmodifiableList(new ArrayList<>(listeners)); + this.listeners = List.copyOf(listeners); } @Override diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression/Operator.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression/Operator.java index 1d6731b7f2e3..55c483abbe93 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression/Operator.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression/Operator.java @@ -45,9 +45,9 @@ static Operator unaryOperator(String representation, int precedence, Associativi return new Operator(representation, precedence, 1, associativity, (expressions, operatorToken) -> { TokenWith rhs = expressions.pop(); - if (operatorToken.isLeftOf(rhs.token)) { - Token combinedToken = operatorToken.concatenate(rhs.token); - expressions.push(new TokenWith<>(combinedToken, unaryExpression.apply(rhs.element))); + if (operatorToken.isLeftOf(rhs.token())) { + Token combinedToken = operatorToken.concatenate(rhs.token()); + expressions.push(new TokenWith<>(combinedToken, unaryExpression.apply(rhs.element()))); return success(); } return missingRhsOperand(operatorToken, representation); @@ -61,13 +61,13 @@ static Operator binaryOperator(String representation, int precedence, Associativ return new Operator(representation, precedence, 2, associativity, (expressions, operatorToken) -> { TokenWith rhs = expressions.pop(); TokenWith lhs = expressions.pop(); - Token lhsToken = lhs.token; - if (lhsToken.isLeftOf(operatorToken) && operatorToken.isLeftOf(rhs.token)) { - Token combinedToken = lhsToken.concatenate(operatorToken).concatenate(rhs.token); - expressions.push(new TokenWith<>(combinedToken, binaryExpression.apply(lhs.element, rhs.element))); + Token lhsToken = lhs.token(); + if (lhsToken.isLeftOf(operatorToken) && operatorToken.isLeftOf(rhs.token())) { + Token combinedToken = lhsToken.concatenate(operatorToken).concatenate(rhs.token()); + expressions.push(new TokenWith<>(combinedToken, binaryExpression.apply(lhs.element(), rhs.element()))); return success(); } - if (rhs.token.isLeftOf(operatorToken)) { + if (rhs.token().isLeftOf(operatorToken)) { return missingRhsOperand(operatorToken, representation); } if (operatorToken.isLeftOf(lhsToken)) { @@ -134,7 +134,8 @@ private String createMissingOperandMessage(Stack> expre if (2 == mismatch) { return "missing lhs and rhs operand"; } - return missingOneOperand(operatorToken.isLeftOf(requireNonNull(expressions.peek()).token) ? "lhs" : "rhs"); + return missingOneOperand( + operatorToken.isLeftOf(requireNonNull(expressions.peek()).token()) ? "lhs" : "rhs"); } return "missing operand"; } diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression/ParseStatus.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression/ParseStatus.java index 06aa9db6703b..9f1b124c6133 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression/ParseStatus.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression/ParseStatus.java @@ -45,8 +45,8 @@ static ParseStatus errorAt(Token token, String operatorRepresentation, String me } static ParseStatus missingOperatorBetween(TokenWith lhs, TokenWith rhs) { - String lhsString = "'" + lhs.element.toString() + "' at index " + format(lhs.token.lastCharacterIndex()); - String rhsString = "'" + rhs.element.toString() + "' at index " + format(rhs.token.trimmedTokenStartIndex()); + String lhsString = "'" + lhs.element() + "' at index " + format(lhs.token().lastCharacterIndex()); + String rhsString = "'" + rhs.element() + "' at index " + format(rhs.token().trimmedTokenStartIndex()); return error("missing operator between " + lhsString + " and " + rhsString); } diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression/ShuntingYard.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression/ShuntingYard.java index 3808ad6c6f5b..8a1922012d2d 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression/ShuntingYard.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression/ShuntingYard.java @@ -56,7 +56,7 @@ public ParseResult execute() { if (parseStatus.isError()) { return ParseResults.error(requireNonNull(parseStatus.errorMessage)); } - return ParseResults.success(expressions.pop().element); + return ParseResults.success(expressions.pop().element()); } private ParseStatus processTokens() { @@ -97,11 +97,11 @@ private TagExpression convertLeafTokenToExpression(String trimmed) { private ParseStatus findMatchingLeftParenthesis(Token token) { while (!operators.isEmpty()) { TokenWith tokenWithWithOperator = operators.pop(); - Operator operator = tokenWithWithOperator.element; + Operator operator = tokenWithWithOperator.element(); if (LeftParenthesis.equals(operator)) { return success(); } - ParseStatus parseStatus = operator.createAndAddExpressionTo(expressions, tokenWithWithOperator.token); + ParseStatus parseStatus = operator.createAndAddExpressionTo(expressions, tokenWithWithOperator.token()); if (parseStatus.isError()) { return parseStatus; } @@ -113,8 +113,8 @@ private ParseStatus findOperands(Token token, Operator currentOperator) { while (currentOperator.hasLowerPrecedenceThan(previousOperator()) || currentOperator.hasSamePrecedenceAs(previousOperator()) && currentOperator.isLeftAssociative()) { TokenWith tokenWithWithOperator = operators.pop(); - ParseStatus parseStatus = tokenWithWithOperator.element.createAndAddExpressionTo(expressions, - tokenWithWithOperator.token); + ParseStatus parseStatus = tokenWithWithOperator.element().createAndAddExpressionTo(expressions, + tokenWithWithOperator.token()); if (parseStatus.isError()) { return parseStatus; } @@ -124,7 +124,7 @@ private ParseStatus findOperands(Token token, Operator currentOperator) { } private Operator previousOperator() { - return operators.peek().element; + return operators.peek().element(); } private void pushExpressionAt(Token token, TagExpression tagExpression) { @@ -138,11 +138,11 @@ private void pushOperatorAt(Token token, Operator operator) { private ParseStatus consumeRemainingOperators() { while (!operators.isEmpty()) { TokenWith tokenWithWithOperator = operators.pop(); - Operator operator = tokenWithWithOperator.element; + Operator operator = tokenWithWithOperator.element(); if (LeftParenthesis.equals(operator)) { - return missingClosingParenthesis(tokenWithWithOperator.token, operator.representation()); + return missingClosingParenthesis(tokenWithWithOperator.token(), operator.representation()); } - ParseStatus parseStatus = operator.createAndAddExpressionTo(expressions, tokenWithWithOperator.token); + ParseStatus parseStatus = operator.createAndAddExpressionTo(expressions, tokenWithWithOperator.token()); if (parseStatus.isError()) { return parseStatus; } diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression/Token.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression/Token.java index 4b90dd72c915..b239179f68e2 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression/Token.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression/Token.java @@ -13,15 +13,7 @@ /** * @since 1.1 */ -class Token { - - final int startIndex; - final String rawString; - - Token(int startIndex, String rawString) { - this.startIndex = startIndex; - this.rawString = rawString; - } +record Token(int startIndex, String rawString) { String string() { return rawString.trim(); diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression/TokenWith.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression/TokenWith.java index 161cb229f6e7..1e387dd83eaa 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression/TokenWith.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression/TokenWith.java @@ -13,14 +13,5 @@ /** * @since 1.1 */ -class TokenWith { - - final Token token; - final T element; - - TokenWith(Token token, T element) { - this.token = token; - this.element = element; - } - +record TokenWith(Token token, T element) { } diff --git a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression/Tokenizer.java b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression/Tokenizer.java index 042f97eb12b1..57a5e6cbe687 100644 --- a/junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression/Tokenizer.java +++ b/junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression/Tokenizer.java @@ -25,7 +25,7 @@ */ class Tokenizer { - private static final Pattern PATTERN = Pattern.compile("\\s*(?:(?:(?:any|none)\\(\\))|[()!|&]|(?:[^\\s()!|&]+))", + private static final Pattern PATTERN = Pattern.compile("\\s*(?:(?:any|none)\\(\\)|[()!|&]|[^\\s()!|&]+)", CASE_INSENSITIVE); List tokenize(@Nullable String infixTagExpression) { diff --git a/junit-platform-reporting/src/main/java/org/junit/platform/reporting/legacy/xml/XmlReportData.java b/junit-platform-reporting/src/main/java/org/junit/platform/reporting/legacy/xml/XmlReportData.java index 477c314d2541..cf78931aca0d 100644 --- a/junit-platform-reporting/src/main/java/org/junit/platform/reporting/legacy/xml/XmlReportData.java +++ b/junit-platform-reporting/src/main/java/org/junit/platform/reporting/legacy/xml/XmlReportData.java @@ -11,7 +11,6 @@ package org.junit.platform.reporting.legacy.xml; import static java.util.Collections.emptyList; -import static java.util.stream.Collectors.toList; import static org.junit.platform.engine.TestExecutionResult.Status.ABORTED; import java.time.Clock; @@ -110,7 +109,7 @@ List getResults(TestIdentifier testIdentifier) { return getAncestors(testIdentifier).stream() // .map(this.finishedTests::get) // .filter(Objects::nonNull) // - .collect(toList()); + .toList(); } List getReportEntries(TestIdentifier testIdentifier) { diff --git a/junit-platform-reporting/src/main/java/org/junit/platform/reporting/legacy/xml/XmlReportWriter.java b/junit-platform-reporting/src/main/java/org/junit/platform/reporting/legacy/xml/XmlReportWriter.java index 203cac3e3f15..5847b73cbb7c 100644 --- a/junit-platform-reporting/src/main/java/org/junit/platform/reporting/legacy/xml/XmlReportWriter.java +++ b/junit-platform-reporting/src/main/java/org/junit/platform/reporting/legacy/xml/XmlReportWriter.java @@ -13,7 +13,6 @@ import static java.text.MessageFormat.format; import static java.time.format.DateTimeFormatter.ISO_LOCAL_DATE_TIME; import static java.util.Collections.emptyList; -import static java.util.Collections.unmodifiableMap; import static java.util.Comparator.naturalOrder; import static java.util.Objects.requireNonNull; import static java.util.function.Function.identity; @@ -41,7 +40,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.EnumSet; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; @@ -75,14 +73,11 @@ class XmlReportWriter { static final char ILLEGAL_CHARACTER_REPLACEMENT = '\uFFFD'; - private static final Map REPLACEMENTS_IN_ATTRIBUTE_VALUES; - static { - Map tmp = new HashMap<>(3); - tmp.put('\n', " "); - tmp.put('\r', " "); - tmp.put('\t', " "); - REPLACEMENTS_IN_ATTRIBUTE_VALUES = unmodifiableMap(tmp); - } + private static final Map REPLACEMENTS_IN_ATTRIBUTE_VALUES = Map.of( // + '\n', " ", // + '\r', " ", // + '\t', " " // + ); // Using zero-width assertions in the split pattern simplifies the splitting process: All split parts // (including the first and last one) can be used directly, without having to re-add separator characters. diff --git a/junit-platform-reporting/src/main/java/org/junit/platform/reporting/open/xml/OpenTestReportGeneratingListener.java b/junit-platform-reporting/src/main/java/org/junit/platform/reporting/open/xml/OpenTestReportGeneratingListener.java index 4726702e5a30..46f41fa50f64 100644 --- a/junit-platform-reporting/src/main/java/org/junit/platform/reporting/open/xml/OpenTestReportGeneratingListener.java +++ b/junit-platform-reporting/src/main/java/org/junit/platform/reporting/open/xml/OpenTestReportGeneratingListener.java @@ -393,15 +393,11 @@ public void executionFinished(TestIdentifier testIdentifier, TestExecutionResult } private Result.Status convertStatus(TestExecutionResult.Status status) { - switch (status) { - case FAILED: - return Result.Status.FAILED; - case SUCCESSFUL: - return Result.Status.SUCCESSFUL; - case ABORTED: - return Result.Status.ABORTED; - } - throw new JUnitException("Unhandled status: " + status); + return switch (status) { + case FAILED -> Result.Status.FAILED; + case SUCCESSFUL -> Result.Status.SUCCESSFUL; + case ABORTED -> Result.Status.ABORTED; + }; } } diff --git a/junit-platform-suite-commons/src/main/java/org/junit/platform/suite/commons/AdditionalDiscoverySelectors.java b/junit-platform-suite-commons/src/main/java/org/junit/platform/suite/commons/AdditionalDiscoverySelectors.java index 969fe04e9376..bbfe6aa026ac 100644 --- a/junit-platform-suite-commons/src/main/java/org/junit/platform/suite/commons/AdditionalDiscoverySelectors.java +++ b/junit-platform-suite-commons/src/main/java/org/junit/platform/suite/commons/AdditionalDiscoverySelectors.java @@ -41,7 +41,7 @@ static List selectUris(String... uris) { return uniqueStreamOf(uris) .filter(StringUtils::isNotBlank) .map(DiscoverySelectors::selectUri) - .collect(Collectors.toList()); + .toList(); // @formatter:on } @@ -53,7 +53,7 @@ static List selectDirectories(String... paths) { return uniqueStreamOf(paths) .filter(StringUtils::isNotBlank) .map(DiscoverySelectors::selectDirectory) - .collect(Collectors.toList()); + .toList(); // @formatter:on } @@ -64,7 +64,7 @@ static List selectPackages(String... packageNames) { // @formatter:off return uniqueStreamOf(packageNames) .map(DiscoverySelectors::selectPackage) - .collect(Collectors.toList()); + .toList(); // @formatter:on } @@ -113,9 +113,9 @@ static ClasspathResourceSelector selectClasspathResource(String classpathResourc return DiscoverySelectors.selectClasspathResource(classpathResourceName, FilePosition.from(line, column)); } - static List parseIdentifiers(String[] identifiers) { + static List parseIdentifiers(String[] identifiers) { return DiscoverySelectors.parseAll(identifiers) // - .collect(Collectors.toList()); + .toList(); } private static Stream uniqueStreamOf(T[] elements) { diff --git a/junit-platform-suite-commons/src/main/java/org/junit/platform/suite/commons/SuiteLauncherDiscoveryRequestBuilder.java b/junit-platform-suite-commons/src/main/java/org/junit/platform/suite/commons/SuiteLauncherDiscoveryRequestBuilder.java index 8176e6b070a5..52da2210aafb 100644 --- a/junit-platform-suite-commons/src/main/java/org/junit/platform/suite/commons/SuiteLauncherDiscoveryRequestBuilder.java +++ b/junit-platform-suite-commons/src/main/java/org/junit/platform/suite/commons/SuiteLauncherDiscoveryRequestBuilder.java @@ -10,7 +10,6 @@ package org.junit.platform.suite.commons; -import static java.util.stream.Collectors.toList; import static org.apiguardian.api.API.Status.DEPRECATED; import static org.apiguardian.api.API.Status.INTERNAL; import static org.junit.platform.commons.support.AnnotationSupport.findAnnotation; @@ -462,7 +461,7 @@ private List selectClasses(Class suiteClass, SelectClasses ann return toClassSelectors(suiteClass, annotation) // .distinct() // .peek(selector -> this.selectedClassNames.add(selector.getClassName())) // - .collect(toList()); + .toList(); } private static Stream toClassSelectors(Class suiteClass, SelectClasses annotation) { diff --git a/junit-platform-suite-engine/src/main/java/org/junit/platform/suite/engine/LifecycleMethodUtils.java b/junit-platform-suite-engine/src/main/java/org/junit/platform/suite/engine/LifecycleMethodUtils.java index 2509ff0e4e87..214d036a35d5 100644 --- a/junit-platform-suite-engine/src/main/java/org/junit/platform/suite/engine/LifecycleMethodUtils.java +++ b/junit-platform-suite-engine/src/main/java/org/junit/platform/suite/engine/LifecycleMethodUtils.java @@ -11,7 +11,6 @@ package org.junit.platform.suite.engine; import static org.junit.platform.commons.support.AnnotationSupport.findAnnotatedMethods; -import static org.junit.platform.commons.util.CollectionUtils.toUnmodifiableList; import java.lang.annotation.Annotation; import java.lang.reflect.Method; @@ -59,7 +58,7 @@ private static List findMethodsAndCheckStaticAndNonPrivate(Class test .and(isNotPrivate(annotationType, issueReporter)) // .and(hasNoParameters(annotationType, issueReporter)) // .toPredicate()) // - .collect(toUnmodifiableList()); + .toList(); } private static DiscoveryIssueReporter.Condition isStatic(Class annotationType, diff --git a/junit-platform-suite-engine/src/main/java/org/junit/platform/suite/engine/SuiteTestDescriptor.java b/junit-platform-suite-engine/src/main/java/org/junit/platform/suite/engine/SuiteTestDescriptor.java index d5e474519108..e9c78c58ff6c 100644 --- a/junit-platform-suite-engine/src/main/java/org/junit/platform/suite/engine/SuiteTestDescriptor.java +++ b/junit-platform-suite-engine/src/main/java/org/junit/platform/suite/engine/SuiteTestDescriptor.java @@ -230,7 +230,9 @@ private static class LifecycleMethods { } } - private static class DiscoveryIssueForwardingListener implements LauncherDiscoveryListener { + private record DiscoveryIssueForwardingListener(EngineDiscoveryListener discoveryListener, + BiFunction issueTransformer) + implements LauncherDiscoveryListener { private static final Predicate SUITE_SEGMENTS = where(Segment::getType, isEqual(SEGMENT_TYPE)); @@ -256,15 +258,6 @@ static DiscoveryIssueForwardingListener create(UniqueId id, EngineDiscoveryListe })); } - private final EngineDiscoveryListener discoveryListener; - private final BiFunction issueTransformer; - - private DiscoveryIssueForwardingListener(EngineDiscoveryListener discoveryListener, - BiFunction issueTransformer) { - this.discoveryListener = discoveryListener; - this.issueTransformer = issueTransformer; - } - @Override public void issueEncountered(UniqueId engineUniqueId, DiscoveryIssue issue) { DiscoveryIssue transformedIssue = this.issueTransformer.apply(engineUniqueId, issue); diff --git a/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/Assertions.java b/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/Assertions.java index 3a2a471980fc..2f7d3e157304 100644 --- a/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/Assertions.java +++ b/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/Assertions.java @@ -12,7 +12,6 @@ import java.util.List; import java.util.Objects; -import java.util.stream.Collectors; import java.util.stream.Stream; import org.junit.platform.commons.util.Preconditions; @@ -50,7 +49,7 @@ static void assertAll(String heading, Stream executables) { } }) // .filter(Objects::nonNull) // - .collect(Collectors.toList()); + .toList(); if (!failures.isEmpty()) { MultipleFailuresError multipleFailuresError = new MultipleFailuresError(heading, failures); diff --git a/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/EngineDiscoveryResults.java b/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/EngineDiscoveryResults.java index 901462794d31..250efe604803 100644 --- a/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/EngineDiscoveryResults.java +++ b/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/EngineDiscoveryResults.java @@ -10,7 +10,6 @@ package org.junit.platform.testkit.engine; -import static java.util.Collections.unmodifiableList; import static org.apiguardian.api.API.Status.EXPERIMENTAL; import java.util.List; @@ -36,7 +35,7 @@ public class EngineDiscoveryResults { EngineDiscoveryResults(TestDescriptor engineDescriptor, List discoveryIssues) { this.engineDescriptor = Preconditions.notNull(engineDescriptor, "Engine descriptor must not be null"); - this.discoveryIssues = unmodifiableList( + this.discoveryIssues = List.copyOf( Preconditions.notNull(discoveryIssues, "Discovery issues list must not be null")); Preconditions.containsNoNullElements(discoveryIssues, "Discovery issues list must not contain null elements"); } diff --git a/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/EngineTestKit.java b/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/EngineTestKit.java index 96e8fbcad24f..619acc7c5cbe 100644 --- a/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/EngineTestKit.java +++ b/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/EngineTestKit.java @@ -33,13 +33,10 @@ import org.junit.platform.engine.DiscoveryFilter; import org.junit.platform.engine.DiscoveryIssue; import org.junit.platform.engine.DiscoverySelector; -import org.junit.platform.engine.EngineDiscoveryRequest; import org.junit.platform.engine.EngineExecutionListener; -import org.junit.platform.engine.ExecutionRequest; import org.junit.platform.engine.Filter; import org.junit.platform.engine.TestDescriptor; import org.junit.platform.engine.TestEngine; -import org.junit.platform.engine.UniqueId; import org.junit.platform.engine.reporting.OutputDirectoryProvider; import org.junit.platform.engine.support.store.Namespace; import org.junit.platform.engine.support.store.NamespacedHierarchicalStore; @@ -251,17 +248,6 @@ public static EngineExecutionResults execute(TestEngine testEngine, LauncherDisc return executionRecorder.getExecutionResults(); } - private static void executeDirectly(TestEngine testEngine, EngineDiscoveryRequest discoveryRequest, - EngineExecutionListener listener) { - UniqueId engineUniqueId = UniqueId.forEngine(testEngine.getId()); - TestDescriptor engineTestDescriptor = testEngine.discover(discoveryRequest, engineUniqueId); - withRequestLevelStore(store -> { - ExecutionRequest request = ExecutionRequest.create(engineTestDescriptor, listener, - discoveryRequest.getConfigurationParameters(), discoveryRequest.getOutputDirectoryProvider(), store); - testEngine.execute(request); - }); - } - private static void executeUsingLauncherOrchestration(TestEngine testEngine, LauncherDiscoveryRequest discoveryRequest, EngineExecutionListener listener) { LauncherDiscoveryResult discoveryResult = discoverUsingOrchestrator(testEngine, discoveryRequest); diff --git a/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/EventConditions.java b/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/EventConditions.java index 92e746a4968c..2cb550ed304c 100644 --- a/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/EventConditions.java +++ b/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/EventConditions.java @@ -11,7 +11,6 @@ package org.junit.platform.testkit.engine; import static java.util.function.Predicate.isEqual; -import static java.util.stream.Collectors.toList; import static org.apiguardian.api.API.Status.EXPERIMENTAL; import static org.apiguardian.api.API.Status.MAINTAINED; import static org.apiguardian.api.API.Status.STABLE; @@ -326,7 +325,7 @@ public static Condition uniqueIdSubstrings(String... uniqueIdSubstrings) */ public static Condition uniqueIdSubstrings(List uniqueIdSubstrings) { // The following worked with AssertJ 3.13.2 - // return allOf(uniqueIdSubstrings.stream().map(EventConditions::uniqueIdSubstring).collect(toList())); + // return allOf(uniqueIdSubstrings.stream().map(EventConditions::uniqueIdSubstring).toList()); // Workaround for a regression in AssertJ 3.14.0 that loses the individual descriptions // when multiple conditions are supplied as an Iterable instead of as an array. @@ -336,8 +335,8 @@ public static Condition uniqueIdSubstrings(List uniqueIdSubstring // does not track all descriptions. List> conditions = uniqueIdSubstrings.stream()// .map(EventConditions::uniqueIdSubstring)// - .collect(toList()); - List descriptions = conditions.stream().map(Condition::description).collect(toList()); + .toList(); + List descriptions = conditions.stream().map(Condition::description).toList(); return allOf(conditions).describedAs(new JoinDescription("all of :[", "]", descriptions)); } diff --git a/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/Events.java b/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/Events.java index ff1f6ae4af51..d2241a0d4a24 100644 --- a/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/Events.java +++ b/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/Events.java @@ -12,7 +12,6 @@ import static java.util.Collections.sort; import static java.util.function.Predicate.isEqual; -import static java.util.stream.Collectors.toList; import static org.apiguardian.api.API.Status.EXPERIMENTAL; import static org.apiguardian.api.API.Status.MAINTAINED; import static org.junit.platform.commons.util.FunctionUtils.where; @@ -24,7 +23,6 @@ import java.io.Writer; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -58,14 +56,14 @@ public final class Events { private final String category; Events(Stream events, String category) { - this(Preconditions.notNull(events, "Event stream must not be null").collect(toList()), category); + this(Preconditions.notNull(events, "Event stream must not be null").toList(), category); } Events(List events, String category) { Preconditions.notNull(events, "Event list must not be null"); Preconditions.containsNoNullElements(events, "Event list must not contain null elements"); - this.events = Collections.unmodifiableList(events); + this.events = List.copyOf(events); this.category = category; } @@ -447,7 +445,7 @@ private static void assertEventsMatchLooselyInOrder(List events, Conditio .map(condition -> findEvent(events, softly, condition)) .filter(Objects::nonNull) .map(events::indexOf) - .collect(toList()); + .toList(); // @formatter:on if (isNotInIncreasingOrder(indices)) { diff --git a/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/Executions.java b/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/Executions.java index fae09e861905..d17173d11c79 100644 --- a/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/Executions.java +++ b/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/Executions.java @@ -10,7 +10,6 @@ package org.junit.platform.testkit.engine; -import static java.util.stream.Collectors.toList; import static org.apiguardian.api.API.Status.MAINTAINED; import java.io.OutputStream; @@ -18,7 +17,6 @@ import java.io.Writer; import java.time.Instant; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -48,7 +46,7 @@ public final class Executions { private Executions(Stream executions, String category) { Preconditions.notNull(executions, "Execution stream must not be null"); - this.executions = Collections.unmodifiableList(executions.collect(toList())); + this.executions = executions.toList(); this.category = category; } @@ -56,7 +54,7 @@ private Executions(Stream executions, String category) { Preconditions.notNull(events, "Event list must not be null"); Preconditions.containsNoNullElements(events, "Event list must not contain null elements"); - this.executions = Collections.unmodifiableList(createExecutions(events)); + this.executions = List.copyOf(createExecutions(events)); this.category = category; } diff --git a/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/TestExecutionResultConditions.java b/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/TestExecutionResultConditions.java index f9b1b1f9c53c..ad3da44665fa 100644 --- a/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/TestExecutionResultConditions.java +++ b/junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/TestExecutionResultConditions.java @@ -11,7 +11,6 @@ package org.junit.platform.testkit.engine; import static java.util.function.Predicate.isEqual; -import static java.util.stream.Collectors.toList; import static org.apiguardian.api.API.Status.EXPERIMENTAL; import static org.apiguardian.api.API.Status.MAINTAINED; import static org.junit.platform.commons.util.FunctionUtils.where; @@ -63,7 +62,7 @@ public static Condition status(Status expectedStatus) { public static Condition throwable(Condition... conditions) { List> list = Arrays.stream(conditions)// .map(TestExecutionResultConditions::throwable)// - .collect(toList()); + .toList(); return Assertions.allOf(list); } @@ -81,7 +80,7 @@ public static Condition throwable(Condition... c public static Condition cause(Condition... conditions) { List> list = Arrays.stream(conditions)// .map(TestExecutionResultConditions::cause)// - .collect(toList()); + .toList(); return Assertions.allOf(list); } @@ -101,7 +100,7 @@ public static Condition cause(Condition... conditions) { public static Condition rootCause(Condition... conditions) { List> list = Arrays.stream(conditions)// .map(TestExecutionResultConditions::rootCause)// - .collect(toList()); + .toList(); return Assertions.allOf(list); } @@ -119,7 +118,7 @@ public static Condition rootCause(Condition... conditions) public static Condition suppressed(int index, Condition... conditions) { List> list = Arrays.stream(conditions)// .map(condition -> suppressed(index, condition))// - .collect(toList()); + .toList(); return Assertions.allOf(list); } diff --git a/junit-vintage-engine/src/main/java/org/junit/vintage/engine/descriptor/TestSourceProvider.java b/junit-vintage-engine/src/main/java/org/junit/vintage/engine/descriptor/TestSourceProvider.java index 78fd2afbb585..65a748aa89ec 100644 --- a/junit-vintage-engine/src/main/java/org/junit/vintage/engine/descriptor/TestSourceProvider.java +++ b/junit-vintage-engine/src/main/java/org/junit/vintage/engine/descriptor/TestSourceProvider.java @@ -12,7 +12,6 @@ import static java.util.Collections.synchronizedMap; import static java.util.function.Predicate.isEqual; -import static java.util.stream.Collectors.toList; import static org.apiguardian.api.API.Status.INTERNAL; import static org.junit.platform.commons.support.HierarchyTraversalMode.TOP_DOWN; import static org.junit.platform.commons.support.ReflectionSupport.findMethods; @@ -77,14 +76,14 @@ private String sanitizeMethodName(String methodName) { List methods = methodsCache.computeIfAbsent(testClass, clazz -> findMethods(clazz, m -> true, TOP_DOWN)).stream() // .filter(where(Method::getName, isEqual(methodName))) // - .collect(toList()); + .toList(); if (methods.isEmpty()) { return null; } if (methods.size() == 1) { return methods.get(0); } - methods = methods.stream().filter(ModifierSupport::isPublic).collect(toList()); + methods = methods.stream().filter(ModifierSupport::isPublic).toList(); if (methods.size() == 1) { return methods.get(0); } diff --git a/junit-vintage-engine/src/main/java/org/junit/vintage/engine/execution/TestRun.java b/junit-vintage-engine/src/main/java/org/junit/vintage/engine/execution/TestRun.java index 8ddde9d15c66..1b7814a8a106 100644 --- a/junit-vintage-engine/src/main/java/org/junit/vintage/engine/execution/TestRun.java +++ b/junit-vintage-engine/src/main/java/org/junit/vintage/engine/execution/TestRun.java @@ -13,7 +13,6 @@ import static java.util.Collections.emptyList; import static java.util.Objects.requireNonNull; import static java.util.stream.Collectors.toCollection; -import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toMap; import static java.util.stream.Stream.concat; import static org.junit.platform.engine.TestExecutionResult.failed; @@ -198,7 +197,7 @@ TestExecutionResult getStoredResultOrSuccessful(TestDescriptor testDescriptor) { .stream() .map(TestExecutionResult::getThrowable) .map(Optional::orElseThrow) - .collect(toList()); + .toList(); // @formatter:on MultipleFailuresError multipleFailuresError = new MultipleFailuresError("", failures); failures.forEach(multipleFailuresError::addSuppressed); diff --git a/junit-vintage-engine/src/main/java/org/junit/vintage/engine/execution/VintageExecutor.java b/junit-vintage-engine/src/main/java/org/junit/vintage/engine/execution/VintageExecutor.java index 64bc1dc03b1a..6ba96f93bbfd 100644 --- a/junit-vintage-engine/src/main/java/org/junit/vintage/engine/execution/VintageExecutor.java +++ b/junit-vintage-engine/src/main/java/org/junit/vintage/engine/execution/VintageExecutor.java @@ -11,7 +11,6 @@ package org.junit.vintage.engine.execution; import static java.util.Objects.requireNonNullElse; -import static java.util.stream.Collectors.toList; import static org.apiguardian.api.API.Status.INTERNAL; import static org.junit.vintage.engine.Constants.PARALLEL_CLASS_EXECUTION; import static org.junit.vintage.engine.Constants.PARALLEL_EXECUTION_ENABLED; @@ -131,7 +130,7 @@ private List collectRunnerTestDescriptors(ExecutorService return engineDescriptor.getModifiableChildren().stream() // .map(RunnerTestDescriptor.class::cast) // .map(it -> methods ? parallelMethodExecutor(it, executorService) : it) // - .collect(toList()); + .toList(); } private RunnerTestDescriptor parallelMethodExecutor(RunnerTestDescriptor runnerTestDescriptor, diff --git a/junit-vintage-engine/src/test/java/org/junit/vintage/engine/support/UniqueIdStringifierTests.java b/junit-vintage-engine/src/test/java/org/junit/vintage/engine/support/UniqueIdStringifierTests.java index d8859b1e1c31..b2a5d0482872 100644 --- a/junit-vintage-engine/src/test/java/org/junit/vintage/engine/support/UniqueIdStringifierTests.java +++ b/junit-vintage-engine/src/test/java/org/junit/vintage/engine/support/UniqueIdStringifierTests.java @@ -17,6 +17,7 @@ import java.io.InvalidObjectException; import java.io.ObjectInputStream; import java.io.ObjectStreamException; +import java.io.Serial; import java.io.Serializable; import java.util.Base64; @@ -45,7 +46,7 @@ void serializesUnknownTypes() throws Exception { var deserializedObject = deserialize(decodeBase64(serialized)); assertThat(deserializedObject).isInstanceOf(MyCustomId.class); - assertEquals(42, ((MyCustomId) deserializedObject).getValue()); + assertEquals(42, ((MyCustomId) deserializedObject).value()); } @Test @@ -68,26 +69,19 @@ private Object deserialize(byte[] bytes) throws Exception { } } - private static class MyCustomId implements Serializable { + private record MyCustomId(int value) implements Serializable { + @Serial private static final long serialVersionUID = 1L; - private final int value; - - MyCustomId(int value) { - this.value = value; - } - - int getValue() { - return value; - } - } private static class ClassWithErroneousSerialization implements Serializable { + @Serial private static final long serialVersionUID = 1L; + @Serial Object writeReplace() throws ObjectStreamException { throw new InvalidObjectException("failed on purpose"); } diff --git a/junit-vintage-engine/src/testFixtures/java/org/junit/vintage/engine/samples/junit4/RunnerWithCustomUniqueIdsAndDisplayNames.java b/junit-vintage-engine/src/testFixtures/java/org/junit/vintage/engine/samples/junit4/RunnerWithCustomUniqueIdsAndDisplayNames.java index f3af1814485d..e449e256ec4d 100644 --- a/junit-vintage-engine/src/testFixtures/java/org/junit/vintage/engine/samples/junit4/RunnerWithCustomUniqueIdsAndDisplayNames.java +++ b/junit-vintage-engine/src/testFixtures/java/org/junit/vintage/engine/samples/junit4/RunnerWithCustomUniqueIdsAndDisplayNames.java @@ -53,28 +53,18 @@ private String getLabel(Annotatable element, Supplier fallback) { return label == null ? fallback.get() : label.value(); } - private static class CustomUniqueId implements Serializable { + private record CustomUniqueId(String testName) implements Serializable { @Serial private static final long serialVersionUID = 1L; - private final String testName; - - public CustomUniqueId(String testName) { - this.testName = testName; - } - @Override public boolean equals(Object obj) { - if (obj instanceof CustomUniqueId that) { - return Objects.equals(this.testName, that.testName); + if (obj instanceof CustomUniqueId(String name)) { + return Objects.equals(this.testName, name); } return false; } - @Override - public int hashCode() { - return testName.hashCode(); - } } } diff --git a/jupiter-tests/src/test/java/org/junit/jupiter/api/AssertLinesMatchAssertionsTests.java b/jupiter-tests/src/test/java/org/junit/jupiter/api/AssertLinesMatchAssertionsTests.java index a1d9720c7cda..9cbb09c270ec 100644 --- a/jupiter-tests/src/test/java/org/junit/jupiter/api/AssertLinesMatchAssertionsTests.java +++ b/jupiter-tests/src/test/java/org/junit/jupiter/api/AssertLinesMatchAssertionsTests.java @@ -27,7 +27,6 @@ import java.util.List; import java.util.Random; import java.util.function.Supplier; -import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; @@ -242,8 +241,8 @@ void assertLinesMatchMatches() { @Test void largeListsThatDoNotMatchAreTruncated() { - var expected = IntStream.range(1, 999).boxed().map(Object::toString).collect(Collectors.toList()); - var actual = IntStream.range(0, 1000).boxed().map(Object::toString).collect(Collectors.toList()); + var expected = IntStream.range(1, 999).boxed().map(Object::toString).toList(); + var actual = IntStream.range(0, 1000).boxed().map(Object::toString).toList(); var error = assertThrows(AssertionFailedError.class, () -> assertLinesMatch(expected, actual, "custom message")); var expectedMessage = String.join(System.lineSeparator(), List.of( // diff --git a/jupiter-tests/src/test/java/org/junit/jupiter/api/DynamicTestTests.java b/jupiter-tests/src/test/java/org/junit/jupiter/api/DynamicTestTests.java index 5f33ded5be82..409940b6212d 100644 --- a/jupiter-tests/src/test/java/org/junit/jupiter/api/DynamicTestTests.java +++ b/jupiter-tests/src/test/java/org/junit/jupiter/api/DynamicTestTests.java @@ -24,7 +24,6 @@ import java.util.List; import java.util.Locale; import java.util.function.Function; -import java.util.stream.Collectors; import java.util.stream.Stream; import org.jspecify.annotations.Nullable; @@ -160,7 +159,7 @@ void streamFromIteratorWithNamedExecutables() throws Throwable { } private void assertStream(Stream stream) throws Throwable { - List dynamicTests = stream.collect(Collectors.toList()); + List dynamicTests = stream.toList(); assertThat(dynamicTests).extracting(DynamicTest::getDisplayName).containsExactly("FOO", "BAR", "BAZ"); diff --git a/jupiter-tests/src/test/java/org/junit/jupiter/engine/descriptor/TestFactoryTestDescriptorTests.java b/jupiter-tests/src/test/java/org/junit/jupiter/engine/descriptor/TestFactoryTestDescriptorTests.java index da14c6c3ae6c..287dcb25c0d9 100644 --- a/jupiter-tests/src/test/java/org/junit/jupiter/engine/descriptor/TestFactoryTestDescriptorTests.java +++ b/jupiter-tests/src/test/java/org/junit/jupiter/engine/descriptor/TestFactoryTestDescriptorTests.java @@ -203,13 +203,7 @@ private void prepareMockForTestInstanceWithCustomStream(Stream stream) { } - private static class CustomStreamTestCase { - - private final Stream mockStream; - - CustomStreamTestCase(Stream mockStream) { - this.mockStream = mockStream; - } + private record CustomStreamTestCase(Stream mockStream) { @TestFactory Stream customStream() { diff --git a/jupiter-tests/src/test/java/org/junit/jupiter/engine/execution/ParameterResolutionUtilsTests.java b/jupiter-tests/src/test/java/org/junit/jupiter/engine/execution/ParameterResolutionUtilsTests.java index cd68a46daf63..fbf2f4a9fb39 100644 --- a/jupiter-tests/src/test/java/org/junit/jupiter/engine/execution/ParameterResolutionUtilsTests.java +++ b/jupiter-tests/src/test/java/org/junit/jupiter/engine/execution/ParameterResolutionUtilsTests.java @@ -346,15 +346,7 @@ static class ArgumentRecordingParameterResolver implements ParameterResolver { ArgumentRecordingParameterResolver.@Nullable Arguments supportsArguments; ArgumentRecordingParameterResolver.@Nullable Arguments resolveArguments; - static class Arguments { - - final ParameterContext parameterContext; - final ExtensionContext extensionContext; - - Arguments(ParameterContext parameterContext, ExtensionContext extensionContext) { - this.parameterContext = parameterContext; - this.extensionContext = extensionContext; - } + record Arguments(ParameterContext parameterContext, ExtensionContext extensionContext) { } @Override diff --git a/jupiter-tests/src/test/java/org/junit/jupiter/engine/extension/ProgrammaticExtensionRegistrationTests.java b/jupiter-tests/src/test/java/org/junit/jupiter/engine/extension/ProgrammaticExtensionRegistrationTests.java index 49519b77b131..61dd3d5bb089 100644 --- a/jupiter-tests/src/test/java/org/junit/jupiter/engine/extension/ProgrammaticExtensionRegistrationTests.java +++ b/jupiter-tests/src/test/java/org/junit/jupiter/engine/extension/ProgrammaticExtensionRegistrationTests.java @@ -466,13 +466,7 @@ void test(String wisdom) { } - private static class CrystalBall implements ParameterResolver { - - private final String wisdom; - - public CrystalBall(String wisdom) { - this.wisdom = wisdom; - } + private record CrystalBall(String wisdom) implements ParameterResolver { @Override public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) { diff --git a/jupiter-tests/src/test/java/org/junit/jupiter/migrationsupport/rules/AbstractTestRuleAdapterTests.java b/jupiter-tests/src/test/java/org/junit/jupiter/migrationsupport/rules/AbstractTestRuleAdapterTests.java index 9890182b4a40..40fb18c29adf 100644 --- a/jupiter-tests/src/test/java/org/junit/jupiter/migrationsupport/rules/AbstractTestRuleAdapterTests.java +++ b/jupiter-tests/src/test/java/org/junit/jupiter/migrationsupport/rules/AbstractTestRuleAdapterTests.java @@ -65,13 +65,7 @@ private static class TestableTestRuleAdapter extends AbstractTestRuleAdapter { } } - private static class SimpleRuleAnnotatedMember implements TestRuleAnnotatedMember { - - private final TestRule testRule; - - SimpleRuleAnnotatedMember(TestRule testRule) { - this.testRule = testRule; - } + private record SimpleRuleAnnotatedMember(TestRule testRule) implements TestRuleAnnotatedMember { @Override public TestRule getTestRule() { diff --git a/jupiter-tests/src/test/java/org/junit/jupiter/params/ParameterizedTestIntegrationTests.java b/jupiter-tests/src/test/java/org/junit/jupiter/params/ParameterizedTestIntegrationTests.java index bf6653dce499..379efee6ca38 100644 --- a/jupiter-tests/src/test/java/org/junit/jupiter/params/ParameterizedTestIntegrationTests.java +++ b/jupiter-tests/src/test/java/org/junit/jupiter/params/ParameterizedTestIntegrationTests.java @@ -225,7 +225,7 @@ void executesLinesFromClasspathResourceUsingTableFormatAndHeadersAndNullValues(S assertFruitTable(fruit, rank, testInfo); } - private void assertFruitTable(String fruit, double rank, TestInfo testInfo) { + private void assertFruitTable(@Nullable String fruit, double rank, TestInfo testInfo) { String displayName = testInfo.getDisplayName(); if (fruit == null) { diff --git a/jupiter-tests/src/test/java/org/junit/jupiter/params/aggregator/AggregatorIntegrationTests.java b/jupiter-tests/src/test/java/org/junit/jupiter/params/aggregator/AggregatorIntegrationTests.java index b90fe9521334..1d57fbf27f51 100644 --- a/jupiter-tests/src/test/java/org/junit/jupiter/params/aggregator/AggregatorIntegrationTests.java +++ b/jupiter-tests/src/test/java/org/junit/jupiter/params/aggregator/AggregatorIntegrationTests.java @@ -253,17 +253,7 @@ enum Gender { } @NullUnmarked - static class Address { - - final String street; - final String city; - final int zipCode; - - Address(String street, String city, int zipCode) { - this.street = street; - this.city = city; - this.zipCode = zipCode; - } + record Address(String street, String city, int zipCode) { } @Retention(RetentionPolicy.RUNTIME) diff --git a/platform-tests/src/test/java/org/junit/platform/StackTracePruningTests.java b/platform-tests/src/test/java/org/junit/platform/StackTracePruningTests.java index d5dbca29324e..5f7b97f88728 100644 --- a/platform-tests/src/test/java/org/junit/platform/StackTracePruningTests.java +++ b/platform-tests/src/test/java/org/junit/platform/StackTracePruningTests.java @@ -182,7 +182,7 @@ private static Throwable getThrowable(EngineExecutionResults results) { private static void assertStackTraceMatch(List stackTrace, String expectedLines) { List stackStraceAsLines = stackTrace.stream() // .map(StackTraceElement::toString) // - .collect(Collectors.toList()); + .toList(); assertLinesMatch(expectedLines.lines().toList(), stackStraceAsLines); } diff --git a/platform-tests/src/test/java/org/junit/platform/commons/support/scanning/DefaultClasspathScannerTests.java b/platform-tests/src/test/java/org/junit/platform/commons/support/scanning/DefaultClasspathScannerTests.java index 8f40d780c8a5..d407c2f0401c 100644 --- a/platform-tests/src/test/java/org/junit/platform/commons/support/scanning/DefaultClasspathScannerTests.java +++ b/platform-tests/src/test/java/org/junit/platform/commons/support/scanning/DefaultClasspathScannerTests.java @@ -40,7 +40,6 @@ import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.spi.ToolProvider; -import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.fixtures.TrackLogRecords; @@ -334,12 +333,12 @@ private void checkModules2500(ModuleFinder finder) { ReflectionUtils::tryToLoadClass); { var classes = classpathScanner.scanForClassesInPackage("foo", allClasses); - var classNames = classes.stream().map(Class::getName).collect(Collectors.toList()); + var classNames = classes.stream().map(Class::getName).toList(); assertThat(classNames).hasSize(2).contains("foo.Foo", "foo.bar.FooBar"); } { var classes = classpathScanner.scanForClassesInPackage("foo.bar", allClasses); - var classNames = classes.stream().map(Class::getName).collect(Collectors.toList()); + var classNames = classes.stream().map(Class::getName).toList(); assertThat(classNames).hasSize(1).contains("foo.bar.FooBar"); } } 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 12ef9107f8ce..6c11ca4a55b7 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 @@ -16,7 +16,6 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.DynamicTest.dynamicTest; -import static org.junit.platform.commons.util.CollectionUtils.toUnmodifiableList; import java.lang.reflect.Array; import java.util.ArrayList; @@ -121,16 +120,6 @@ void collectionWithNullValues() { } } - @Nested - class UnmodifiableList { - - @Test - void throwsOnMutation() { - var numbers = Stream.of(1).collect(toUnmodifiableList()); - assertThrows(UnsupportedOperationException.class, numbers::clear); - } - } - @Nested class StreamConversion { diff --git a/platform-tests/src/test/java/org/junit/platform/engine/discovery/DiscoverySelectorsTests.java b/platform-tests/src/test/java/org/junit/platform/engine/discovery/DiscoverySelectorsTests.java index fdc03244c95a..85ca8917a208 100644 --- a/platform-tests/src/test/java/org/junit/platform/engine/discovery/DiscoverySelectorsTests.java +++ b/platform-tests/src/test/java/org/junit/platform/engine/discovery/DiscoverySelectorsTests.java @@ -42,7 +42,6 @@ import java.util.List; import java.util.Optional; import java.util.Set; -import java.util.stream.Collectors; import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; @@ -441,7 +440,7 @@ void selectModuleByNamePreconditions() { @Test void selectModulesByNames() { var selectors = selectModules(Set.of("a", "b")); - var names = selectors.stream().map(ModuleSelector::getModuleName).collect(Collectors.toList()); + var names = selectors.stream().map(ModuleSelector::getModuleName).toList(); assertThat(names).containsExactlyInAnyOrder("b", "a"); } diff --git a/platform-tests/src/test/java/org/junit/platform/launcher/tagexpression/TokenTests.java b/platform-tests/src/test/java/org/junit/platform/launcher/tagexpression/TokenTests.java index edee8f37edaf..46d8fd92b86e 100644 --- a/platform-tests/src/test/java/org/junit/platform/launcher/tagexpression/TokenTests.java +++ b/platform-tests/src/test/java/org/junit/platform/launcher/tagexpression/TokenTests.java @@ -43,8 +43,8 @@ void concatenateTwoTokens() { var one = tokens.get(0); var two = tokens.get(1); var joined = one.concatenate(two); - assertThat(joined.rawString).isEqualTo(" ! foo"); - assertThat(joined.startIndex).isEqualTo(0); + assertThat(joined.rawString()).isEqualTo(" ! foo"); + assertThat(joined.startIndex()).isEqualTo(0); } } diff --git a/platform-tests/src/test/java/org/junit/platform/launcher/tagexpression/TokenizerTests.java b/platform-tests/src/test/java/org/junit/platform/launcher/tagexpression/TokenizerTests.java index f305c8b26362..659174d43310 100644 --- a/platform-tests/src/test/java/org/junit/platform/launcher/tagexpression/TokenizerTests.java +++ b/platform-tests/src/test/java/org/junit/platform/launcher/tagexpression/TokenizerTests.java @@ -79,11 +79,11 @@ void extractStartPositionOfRawString() { } private Stream startIndicesExtractedFrom(String expression) { - return tokensExtractedFrom(expression).map(token -> token.startIndex); + return tokensExtractedFrom(expression).map(token -> token.startIndex()); } private Stream rawStringsExtractedFrom(String expression) { - return tokensExtractedFrom(expression).map(token -> token.rawString); + return tokensExtractedFrom(expression).map(token -> token.rawString()); } private List tokenStringsExtractedFrom(@Nullable String expression) { diff --git a/platform-tests/src/test/java/org/junit/platform/reporting/open/xml/OpenTestReportGeneratingListenerTests.java b/platform-tests/src/test/java/org/junit/platform/reporting/open/xml/OpenTestReportGeneratingListenerTests.java index 80a076abaa59..115ae191ff2b 100644 --- a/platform-tests/src/test/java/org/junit/platform/reporting/open/xml/OpenTestReportGeneratingListenerTests.java +++ b/platform-tests/src/test/java/org/junit/platform/reporting/open/xml/OpenTestReportGeneratingListenerTests.java @@ -81,7 +81,7 @@ void writesValidXmlReport(@TempDir Path tempDirectory) throws Exception { var engine = new DemoHierarchicalTestEngine("dummy"); engine.addTest("failingTest", "display<-->Name 😎", (context, descriptor) -> { try { - var listener = context.request.getEngineExecutionListener(); + var listener = context.request().getEngineExecutionListener(); listener.reportingEntryPublished(descriptor, ReportEntry.from("key", "value")); listener.fileEntryPublished(descriptor, FileEntry.from( Files.writeString(tempDirectory.resolve("test.txt"), "Hello, world!"), "text/plain"));