diff --git a/junit-tests/src/test/java/org/junit/gen5/engine/junit5/extension/BeforeAndAfterEachTests.java b/junit-tests/src/test/java/org/junit/gen5/engine/junit5/extension/BeforeAndAfterEachTests.java index 605846ec732..7375a9ad4ae 100644 --- a/junit-tests/src/test/java/org/junit/gen5/engine/junit5/extension/BeforeAndAfterEachTests.java +++ b/junit-tests/src/test/java/org/junit/gen5/engine/junit5/extension/BeforeAndAfterEachTests.java @@ -226,8 +226,7 @@ private static class InnermostAndOutermost implements ExtensionRegistrar { @Override public void registerExtensions(ExtensionPointRegistry registry) { - registry.register((BeforeEachCallback) ctx -> callSequence.add("innermostBefore"), - Position.INNERMOST); + registry.register((BeforeEachCallback) ctx -> callSequence.add("innermostBefore"), Position.INNERMOST); registry.register((AfterEachCallback) this::innermostAfter, Position.INNERMOST); registry.register((BeforeEachCallback) this::outermostBefore, Position.OUTERMOST); registry.register((AfterEachCallback) this::outermostAfter, Position.OUTERMOST); diff --git a/junit-tests/src/test/java/org/junit/gen5/engine/junit5/extension/ExtensionRegistryTests.java b/junit-tests/src/test/java/org/junit/gen5/engine/junit5/extension/ExtensionRegistryTests.java index a1adcaed3d8..ac4397cc059 100644 --- a/junit-tests/src/test/java/org/junit/gen5/engine/junit5/extension/ExtensionRegistryTests.java +++ b/junit-tests/src/test/java/org/junit/gen5/engine/junit5/extension/ExtensionRegistryTests.java @@ -17,7 +17,7 @@ import java.util.Optional; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Stream; import org.junit.gen5.api.Test; import org.junit.gen5.api.extension.ContainerExecutionCondition; @@ -118,12 +118,11 @@ public void canStreamOverRegisteredExtensionPoint() throws Exception { AtomicBoolean hasRun = new AtomicBoolean(false); - registry.stream(MyExtensionPoint.class, ExtensionRegistry.ApplicationOrder.FORWARD).forEach( - registeredExtensionPoint -> { - assertEquals(MyExtension.class.getName(), registeredExtensionPoint.getSource().getClass().getName()); - assertEquals(Position.DEFAULT, registeredExtensionPoint.getPosition()); - hasRun.set(true); - }); + stream(registry, MyExtensionPoint.class).forEach(registeredExtensionPoint -> { + assertEquals(MyExtension.class.getName(), registeredExtensionPoint.getSource().getClass().getName()); + assertEquals(Position.DEFAULT, registeredExtensionPoint.getPosition()); + hasRun.set(true); + }); assertTrue(hasRun.get()); } @@ -155,24 +154,24 @@ private void assertBehaviorForExtensionPointRegisteredFromLambdaExpressionOrMeth ExtensionRegistry registry) throws Exception { AtomicBoolean hasRun = new AtomicBoolean(false); - registry.stream(MyExtensionPoint.class, ExtensionRegistry.ApplicationOrder.FORWARD).forEach( - registeredExtensionPoint -> { - Class lambdaType = registeredExtensionPoint.getExtensionPoint().getClass(); - assertTrue(lambdaType.getName().contains("$Lambda$")); - assertEquals(getClass().getName(), registeredExtensionPoint.getSource().getClass().getName()); - assertEquals(Position.DEFAULT, registeredExtensionPoint.getPosition()); - hasRun.set(true); - }); + stream(registry, MyExtensionPoint.class).forEach(registeredExtensionPoint -> { + Class lambdaType = registeredExtensionPoint.getExtensionPoint().getClass(); + assertTrue(lambdaType.getName().contains("$Lambda$")); + assertEquals(getClass().getName(), registeredExtensionPoint.getSource().getClass().getName()); + assertEquals(Position.DEFAULT, registeredExtensionPoint.getPosition()); + hasRun.set(true); + }); assertTrue(hasRun.get()); } - private int countExtensionPoints(ExtensionRegistry registry, Class extensionPointType) - throws Exception { - AtomicInteger counter = new AtomicInteger(); - registry.stream(extensionPointType, ExtensionRegistry.ApplicationOrder.FORWARD).forEach( - registeredExtensionPoint -> counter.incrementAndGet()); - return counter.get(); + private Stream> stream(ExtensionRegistry registry, + Class extensionType) { + return registry.getRegisteredExtensionPoints(extensionType).stream(); + } + + private long countExtensionPoints(ExtensionRegistry registry, Class extensionType) { + return registry.stream(extensionType).count(); } private void assertExtensionRegistered(ExtensionRegistry registry, Class extensionClass) { diff --git a/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/descriptor/AbstractExtensionContext.java b/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/descriptor/AbstractExtensionContext.java index 4ad0b00ef7a..c2980477fe0 100644 --- a/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/descriptor/AbstractExtensionContext.java +++ b/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/descriptor/AbstractExtensionContext.java @@ -10,8 +10,12 @@ package org.junit.gen5.engine.junit5.descriptor; -import java.util.*; -import java.util.stream.Collectors; +import static java.util.stream.Collectors.toCollection; + +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Optional; +import java.util.Set; import org.junit.gen5.api.extension.ExtensionContext; import org.junit.gen5.engine.EngineExecutionListener; @@ -68,6 +72,7 @@ public Store getStore(Namespace namespace) { @Override public Set getTags() { - return testDescriptor.getTags().stream().map(TestTag::getName).collect(Collectors.toSet()); + return testDescriptor.getTags().stream().map(TestTag::getName).collect(toCollection(LinkedHashSet::new)); } + } diff --git a/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/descriptor/ClassTestDescriptor.java b/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/descriptor/ClassTestDescriptor.java index c97183f9003..839795c77a7 100644 --- a/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/descriptor/ClassTestDescriptor.java +++ b/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/descriptor/ClassTestDescriptor.java @@ -19,7 +19,6 @@ import java.util.Set; import java.util.function.BiConsumer; import java.util.function.BiFunction; -import java.util.function.Consumer; import org.junit.gen5.api.AfterAll; import org.junit.gen5.api.AfterEach; @@ -47,7 +46,6 @@ import org.junit.gen5.engine.junit5.execution.TestInstanceProvider; import org.junit.gen5.engine.junit5.execution.ThrowableCollector; import org.junit.gen5.engine.junit5.extension.ExtensionRegistry; -import org.junit.gen5.engine.junit5.extension.RegisteredExtensionPoint; import org.junit.gen5.engine.support.descriptor.JavaSource; import org.junit.gen5.engine.support.hierarchical.Container; @@ -136,10 +134,8 @@ public SkipResult shouldBeSkipped(JUnit5EngineExecutionContext context) throws E @Override public JUnit5EngineExecutionContext beforeAll(JUnit5EngineExecutionContext context) throws Exception { - ExtensionRegistry extensionRegistry = context.getExtensionRegistry(); - ContainerExtensionContext containerExtensionContext = (ContainerExtensionContext) context.getExtensionContext(); - - invokeBeforeAllCallbacks(extensionRegistry, containerExtensionContext); + invokeBeforeAllCallbacks(context.getExtensionRegistry(), + (ContainerExtensionContext) context.getExtensionContext()); return context; } @@ -160,25 +156,20 @@ protected TestInstanceProvider testInstanceProvider(JUnit5EngineExecutionContext return () -> ReflectionUtils.newInstance(testClass); } - private void invokeBeforeAllCallbacks(ExtensionRegistry newExtensionRegistry, - ContainerExtensionContext containerExtensionContext) throws Exception { - - Consumer> applyBeforeEach = registeredExtensionPoint -> executeAndMaskThrowable( - () -> registeredExtensionPoint.getExtensionPoint().beforeAll(containerExtensionContext)); - - newExtensionRegistry.stream(BeforeAllCallback.class, ExtensionRegistry.ApplicationOrder.FORWARD).forEach( - applyBeforeEach); + private void invokeBeforeAllCallbacks(ExtensionRegistry registry, ContainerExtensionContext context) { + // @formatter:off + registry.stream(BeforeAllCallback.class) + .forEach(extension -> executeAndMaskThrowable(() -> extension.beforeAll(context))); + // @formatter:on } - private void invokeAfterAllCallbacks(ExtensionRegistry newExtensionRegistry, - ContainerExtensionContext containerExtensionContext, ThrowableCollector throwableCollector) - throws Exception { - - Consumer> applyAfterAll = registeredExtensionPoint -> throwableCollector.execute( - () -> registeredExtensionPoint.getExtensionPoint().afterAll(containerExtensionContext)); + private void invokeAfterAllCallbacks(ExtensionRegistry registry, ContainerExtensionContext context, + ThrowableCollector throwableCollector) { - newExtensionRegistry.stream(AfterAllCallback.class, ExtensionRegistry.ApplicationOrder.BACKWARD).forEach( - applyAfterAll); + // @formatter:off + registry.reverseStream(AfterAllCallback.class) + .forEach(extension -> throwableCollector.execute(() -> extension.afterAll(context))); + // @formatter:on } private void registerBeforeAllMethods(ExtensionRegistry extensionRegistry) { @@ -225,14 +216,14 @@ private AfterAllCallback synthesizeAfterAllCallback(ExtensionRegistry registry, } private BeforeEachCallback synthesizeBeforeEachCallback(ExtensionRegistry registry, Method method) { - return extensionContext -> runMethodInTestExtensionContext(method, extensionContext, registry); + return extensionContext -> invokeMethodInTestExtensionContext(method, extensionContext, registry); } private AfterEachCallback synthesizeAfterEachCallback(ExtensionRegistry registry, Method method) { - return extensionContext -> runMethodInTestExtensionContext(method, extensionContext, registry); + return extensionContext -> invokeMethodInTestExtensionContext(method, extensionContext, registry); } - private void runMethodInTestExtensionContext(Method method, TestExtensionContext context, + private void invokeMethodInTestExtensionContext(Method method, TestExtensionContext context, ExtensionRegistry registry) { // @formatter:off diff --git a/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/descriptor/MethodTestDescriptor.java b/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/descriptor/MethodTestDescriptor.java index f72712935b5..5e69d35df7a 100644 --- a/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/descriptor/MethodTestDescriptor.java +++ b/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/descriptor/MethodTestDescriptor.java @@ -10,14 +10,13 @@ package org.junit.gen5.engine.junit5.descriptor; +import static java.util.stream.Collectors.toList; import static org.junit.gen5.commons.meta.API.Usage.Internal; import static org.junit.gen5.engine.junit5.execution.MethodInvocationContextFactory.methodInvocationContext; import java.lang.reflect.Method; import java.util.List; import java.util.Set; -import java.util.function.Consumer; -import java.util.stream.Collectors; import org.junit.gen5.api.extension.AfterEachCallback; import org.junit.gen5.api.extension.AfterTestMethodCallback; @@ -40,8 +39,6 @@ import org.junit.gen5.engine.junit5.execution.MethodInvoker; import org.junit.gen5.engine.junit5.execution.ThrowableCollector; import org.junit.gen5.engine.junit5.extension.ExtensionRegistry; -import org.junit.gen5.engine.junit5.extension.ExtensionRegistry.ApplicationOrder; -import org.junit.gen5.engine.junit5.extension.RegisteredExtensionPoint; import org.junit.gen5.engine.support.descriptor.JavaSource; import org.junit.gen5.engine.support.hierarchical.Leaf; @@ -156,37 +153,25 @@ public JUnit5EngineExecutionContext execute(JUnit5EngineExecutionContext context return context; } - private void invokeInstancePostProcessors(ExtensionRegistry extensionRegistry, - TestExtensionContext testExtensionContext) throws Exception { - - Consumer> applyInstancePostProcessor = registeredExtensionPoint -> { - executeAndMaskThrowable( - () -> registeredExtensionPoint.getExtensionPoint().postProcessTestInstance(testExtensionContext)); - }; - - extensionRegistry.stream(InstancePostProcessor.class).forEach(applyInstancePostProcessor); + private void invokeInstancePostProcessors(ExtensionRegistry registry, TestExtensionContext context) { + // @formatter:off + registry.stream(InstancePostProcessor.class) + .forEach(extension -> executeAndMaskThrowable(() -> extension.postProcessTestInstance(context))); + // @formatter:on } - private void invokeBeforeEachCallbacks(ExtensionRegistry extensionRegistry, - TestExtensionContext testExtensionContext) throws Exception { - - Consumer> applyBeforeEach = registeredExtensionPoint -> { - executeAndMaskThrowable( - () -> registeredExtensionPoint.getExtensionPoint().beforeEach(testExtensionContext)); - }; - - extensionRegistry.stream(BeforeEachCallback.class).forEach(applyBeforeEach); + private void invokeBeforeEachCallbacks(ExtensionRegistry registry, TestExtensionContext context) { + // @formatter:off + registry.stream(BeforeEachCallback.class) + .forEach(extension -> executeAndMaskThrowable(() -> extension.beforeEach(context))); + // @formatter:on } - private void invokeBeforeTestMethodCallbacks(ExtensionRegistry extensionRegistry, - TestExtensionContext testExtensionContext) throws Exception { - - Consumer> action = registeredExtensionPoint -> { - executeAndMaskThrowable( - () -> registeredExtensionPoint.getExtensionPoint().beforeTestMethod(testExtensionContext)); - }; - - extensionRegistry.stream(BeforeTestMethodCallback.class).forEachOrdered(action); + private void invokeBeforeTestMethodCallbacks(ExtensionRegistry registry, TestExtensionContext context) { + // @formatter:off + registry.stream(BeforeTestMethodCallback.class) + .forEach(extension -> executeAndMaskThrowable(() -> extension.beforeTestMethod(context))); + // @formatter:on } private void invokeTestMethod(ExtensionRegistry ExtensionRegistry, TestExtensionContext testExtensionContext, @@ -201,58 +186,47 @@ private void invokeTestMethod(ExtensionRegistry ExtensionRegistry, TestExtension catch (Throwable throwable) { invokeExceptionHandlers(ExtensionRegistry, testExtensionContext, throwable); } - }); } - private void invokeExceptionHandlers(ExtensionRegistry extensionRegistry, - TestExtensionContext testExtensionContext, Throwable throwable) { + private void invokeExceptionHandlers(ExtensionRegistry registry, TestExtensionContext context, Throwable ex) { + List exceptionHandlers = registry.stream(ExceptionHandler.class).collect(toList()); - // Necessary because mere streaming over exception handlers does not suffice. - List exceptionHandlers = collectExceptionHandlers(extensionRegistry); - invokeExceptionHandlers(throwable, exceptionHandlers, testExtensionContext); + invokeExceptionHandlers(ex, exceptionHandlers, context); } - private List collectExceptionHandlers(ExtensionRegistry extensionRegistry) { - return extensionRegistry.stream(ExceptionHandler.class).map( - RegisteredExtensionPoint::getExtensionPoint).collect(Collectors.toList()); - } - - private void invokeExceptionHandlers(Throwable throwable, List exceptionHandlers, - TestExtensionContext testExtensionContext) { + private void invokeExceptionHandlers(Throwable ex, List handlers, TestExtensionContext context) { // No handlers left? - if (exceptionHandlers.isEmpty()) { - ExceptionUtils.throwAsUncheckedException(throwable); + if (handlers.isEmpty()) { + ExceptionUtils.throwAsUncheckedException(ex); } try { // Invoke next available handler - exceptionHandlers.remove(0).handleException(testExtensionContext, throwable); + handlers.remove(0).handleException(context, ex); } catch (Throwable t) { - invokeExceptionHandlers(t, exceptionHandlers, testExtensionContext); + invokeExceptionHandlers(t, handlers, context); } } - private void invokeAfterTestMethodCallbacks(ExtensionRegistry extensionRegistry, - TestExtensionContext testExtensionContext, ThrowableCollector throwableCollector) throws Exception { + private void invokeAfterTestMethodCallbacks(ExtensionRegistry registry, TestExtensionContext context, + ThrowableCollector throwableCollector) { - extensionRegistry.stream(AfterTestMethodCallback.class, ApplicationOrder.BACKWARD).forEach( - registeredExtensionPoint -> { - throwableCollector.execute( - () -> registeredExtensionPoint.getExtensionPoint().afterTestMethod(testExtensionContext)); - }); + // @formatter:off + registry.reverseStream(AfterTestMethodCallback.class) + .forEach(extension -> throwableCollector.execute(() -> extension.afterTestMethod(context))); + // @formatter:on } - private void invokeAfterEachCallbacks(ExtensionRegistry extensionRegistry, - TestExtensionContext testExtensionContext, ThrowableCollector throwableCollector) throws Exception { + private void invokeAfterEachCallbacks(ExtensionRegistry registry, TestExtensionContext context, + ThrowableCollector throwableCollector) { - extensionRegistry.stream(AfterEachCallback.class, ApplicationOrder.BACKWARD).forEach( - registeredExtensionPoint -> { - throwableCollector.execute( - () -> registeredExtensionPoint.getExtensionPoint().afterEach(testExtensionContext)); - }); + // @formatter:off + registry.reverseStream(AfterEachCallback.class) + .forEach(extension -> throwableCollector.execute(() -> extension.afterEach(context))); + // @formatter:on } } diff --git a/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/execution/ConditionEvaluator.java b/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/execution/ConditionEvaluator.java index 3159a704332..62b62bb6a2a 100644 --- a/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/execution/ConditionEvaluator.java +++ b/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/execution/ConditionEvaluator.java @@ -21,7 +21,6 @@ import org.junit.gen5.api.extension.TestExtensionContext; import org.junit.gen5.commons.meta.API; import org.junit.gen5.engine.junit5.extension.ExtensionRegistry; -import org.junit.gen5.engine.junit5.extension.RegisteredExtensionPoint; /** * {@code ConditionEvaluator} evaluates {@link ContainerExecutionCondition} @@ -51,8 +50,7 @@ public class ConditionEvaluator { public ConditionEvaluationResult evaluateForContainer(ExtensionRegistry extensionRegistry, ContainerExtensionContext context) { // @formatter:off - return extensionRegistry.stream(ContainerExecutionCondition.class, ExtensionRegistry.ApplicationOrder.FORWARD) - .map(RegisteredExtensionPoint::getExtensionPoint) + return extensionRegistry.stream(ContainerExecutionCondition.class) .map(condition -> evaluate(condition, context)) .filter(ConditionEvaluationResult::isDisabled) .findFirst() @@ -72,8 +70,7 @@ public ConditionEvaluationResult evaluateForContainer(ExtensionRegistry extensio public ConditionEvaluationResult evaluateForTest(ExtensionRegistry extensionRegistry, TestExtensionContext context) { // @formatter:off - return extensionRegistry.stream(TestExecutionCondition.class, ExtensionRegistry.ApplicationOrder.FORWARD) - .map(RegisteredExtensionPoint::getExtensionPoint) + return extensionRegistry.stream(TestExecutionCondition.class) .map(condition -> evaluate(condition, context)) .filter(ConditionEvaluationResult::isDisabled) .findFirst() diff --git a/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/execution/MethodInvoker.java b/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/execution/MethodInvoker.java index d3dbd027709..4e9e94725d0 100644 --- a/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/execution/MethodInvoker.java +++ b/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/execution/MethodInvoker.java @@ -27,7 +27,6 @@ import org.junit.gen5.commons.meta.API; import org.junit.gen5.commons.util.ReflectionUtils; import org.junit.gen5.engine.junit5.extension.ExtensionRegistry; -import org.junit.gen5.engine.junit5.extension.RegisteredExtensionPoint; /** * {@code MethodInvoker} encapsulates the invocation of a method, including @@ -76,7 +75,6 @@ private Object resolveParameter(Parameter parameter, MethodInvocationContext met try { // @formatter:off List matchingResolvers = extensionRegistry.stream(MethodParameterResolver.class) - .map(RegisteredExtensionPoint::getExtensionPoint) .filter(extensionPoint -> extensionPoint.supports(parameter, methodInvocationContext, extensionContext)) .collect(toList()); // @formatter:on diff --git a/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/extension/ExtensionPointSorter.java b/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/extension/ExtensionPointSorter.java index a6e0d91ac0e..c9036463224 100644 --- a/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/extension/ExtensionPointSorter.java +++ b/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/extension/ExtensionPointSorter.java @@ -10,7 +10,6 @@ package org.junit.gen5.engine.junit5.extension; -import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -42,7 +41,7 @@ class ExtensionPointSorter { public void sort(List> registeredExtensionPoints) { checkPositionUnique(registeredExtensionPoints, Position.INNERMOST); checkPositionUnique(registeredExtensionPoints, Position.OUTERMOST); - registeredExtensionPoints.sort(new DefaultComparator()); + registeredExtensionPoints.sort(null); } private void checkPositionUnique( @@ -73,13 +72,4 @@ private List conflictingExtensions( // @formatter:on } - private static class DefaultComparator implements Comparator> { - - @Override - public int compare(RegisteredExtensionPoint first, RegisteredExtensionPoint second) { - return Integer.compare(first.getPosition().ordinal(), second.getPosition().ordinal()); - } - - } - } diff --git a/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/extension/ExtensionRegistry.java b/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/extension/ExtensionRegistry.java index 744a8236ad7..2ecfea71f21 100644 --- a/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/extension/ExtensionRegistry.java +++ b/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/extension/ExtensionRegistry.java @@ -48,10 +48,6 @@ @API(Internal) public class ExtensionRegistry { - public enum ApplicationOrder { - FORWARD, BACKWARD - } - /** * Factory for creating and populating a new registry from a list of * extension types and a parent registry. @@ -85,6 +81,8 @@ public static ExtensionRegistry newRootRegistryWithDefaultExtensions() { private static final List> DEFAULT_EXTENSIONS = Collections.unmodifiableList( Arrays.asList(DisabledCondition.class, TestInfoParameterResolver.class, TestReporterParameterResolver.class)); + private static final ExtensionPointSorter extensionSorter = new ExtensionPointSorter(); + private final Set> registeredExtensionTypes = new LinkedHashSet<>(); private final List> registeredExtensionPoints = new ArrayList<>(); @@ -107,8 +105,7 @@ Set> getRegisteredExtensionTypes() { } @SuppressWarnings("unchecked") - private List> getRegisteredExtensionPoints( - Class extensionType) { + List> getRegisteredExtensionPoints(Class extensionType) { List> allExtensionPoints = new ArrayList<>(); this.parent.ifPresent( @@ -124,33 +121,39 @@ private List> getRegister } /** - * Return a stream for iterating over all registered extension points - * of the specified type, using {@link ApplicationOrder#FORWARD}. + * Generate a stream for iterating over all registered extensions of the + * specified type. * - * @param extensionPointType the type of {@link ExtensionPoint} to stream - * @see #stream(Class, ApplicationOrder) + * @param extensionType the type of {@link ExtensionPoint} to stream */ - public Stream> stream(Class extensionPointType) { - return stream(extensionPointType, ApplicationOrder.FORWARD); + public Stream stream(Class extensionType) { + return stream(extensionType, false); } /** - * Return a stream for iterating over all registered extension points - * of the specified type. + * Generate a stream for iterating over all registered extensions of the + * specified type in reverse order. * - * @param extensionPointType the type of {@link ExtensionPoint} to stream - * @param order the order in which to apply the extension points after sorting - * @see #stream(Class) + * @param extensionType the type of {@link ExtensionPoint} to stream */ - public Stream> stream(Class extensionPointType, - ApplicationOrder order) { + public Stream reverseStream(Class extensionType) { + return stream(extensionType, true); + } - List> registeredExtensionPoints = getRegisteredExtensionPoints(extensionPointType); - new ExtensionPointSorter().sort(registeredExtensionPoints); - if (order == ApplicationOrder.BACKWARD) { + /** + * Generate a stream for iterating over all registered extensions of the + * specified type, using the supplied application order. + * + * @param extensionType the type of {@link ExtensionPoint} to stream + * @param reverse whether the extensions should be applied in reverse order + */ + private Stream stream(Class extensionType, boolean reverse) { + List> registeredExtensionPoints = getRegisteredExtensionPoints(extensionType); + extensionSorter.sort(registeredExtensionPoints); + if (reverse) { Collections.reverse(registeredExtensionPoints); } - return registeredExtensionPoints.stream(); + return registeredExtensionPoints.stream().map(RegisteredExtensionPoint::getExtensionPoint); } /** diff --git a/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/extension/RegisteredExtensionPoint.java b/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/extension/RegisteredExtensionPoint.java index 04d3c394d61..138eb66337f 100644 --- a/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/extension/RegisteredExtensionPoint.java +++ b/junit5-engine/src/main/java/org/junit/gen5/engine/junit5/extension/RegisteredExtensionPoint.java @@ -25,7 +25,7 @@ * @since 5.0 */ @API(Internal) -public class RegisteredExtensionPoint { +public class RegisteredExtensionPoint implements Comparable> { private final E extensionPoint; @@ -90,6 +90,11 @@ public Position getPosition() { return this.position; } + @Override + public int compareTo(RegisteredExtensionPoint that) { + return Integer.compare(this.getPosition().ordinal(), that.getPosition().ordinal()); + } + @Override public String toString() { // @formatter:off