Skip to content

Commit

Permalink
Revise TestExtensionRegistry and related classes
Browse files Browse the repository at this point in the history
- Revised visibility of methods in TestExtensionRegistry.
- Renamed addExtension() to registerExtension() in TestExtensionRegistry.
- Renamed LocalExtensionRegistry to DelegatingExtensionRegistry,
  documented its purpose, and avoided duplicate instantiation.
- Removed superfluous use of generics in TestExtensionRegistry.
- Overhauled documentation TestExtensionRegistry.
- Removed extensionInstance in RegisteredExtensionPoint since it
  effectively duplicated extensionPoint.

Issue: #112
  • Loading branch information
sbrannen committed Jan 13, 2016
1 parent b9e2aeb commit 9d0ea36
Show file tree
Hide file tree
Showing 6 changed files with 141 additions and 123 deletions.
Expand Up @@ -10,7 +10,9 @@


package org.junit.gen5.engine.junit5.execution; package org.junit.gen5.engine.junit5.execution;


import static org.junit.gen5.api.Assertions.*; import static org.junit.gen5.api.Assertions.assertEquals;
import static org.junit.gen5.api.Assertions.assertTrue;
import static org.junit.gen5.api.Assertions.expectThrows;


import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
Expand All @@ -32,7 +34,6 @@ public class ExtensionPointSortingTests {


private ExtensionPointSorter sorter; private ExtensionPointSorter sorter;
private List<RegisteredExtensionPoint<LocalExtensionPoint>> pointsToSort; private List<RegisteredExtensionPoint<LocalExtensionPoint>> pointsToSort;
private int pointIndex = 0;


@BeforeEach @BeforeEach
public void init() { public void init() {
Expand Down Expand Up @@ -148,7 +149,7 @@ protected void assertSorting(RegisteredExtensionPoint... points) {


protected RegisteredExtensionPoint<LocalExtensionPoint> createExtensionPoint(Position position) { protected RegisteredExtensionPoint<LocalExtensionPoint> createExtensionPoint(Position position) {
return new RegisteredExtensionPoint<>(() -> { return new RegisteredExtensionPoint<>(() -> {
}, position, "" + ++pointIndex); }, position);
} }


@FunctionalInterface @FunctionalInterface
Expand Down
Expand Up @@ -30,6 +30,9 @@
import org.junit.gen5.engine.junit5.extension.DisabledCondition; import org.junit.gen5.engine.junit5.extension.DisabledCondition;
import org.junit.gen5.engine.junit5.extension.TestInfoParameterResolver; import org.junit.gen5.engine.junit5.extension.TestInfoParameterResolver;


/**
* @since 5.0
*/
public class TestExtensionRegistryTests { public class TestExtensionRegistryTests {


private TestExtensionRegistry registry; private TestExtensionRegistry registry;
Expand All @@ -41,17 +44,17 @@ public void initRegistry() {


@Test @Test
public void checkDefaultExtensions() { public void checkDefaultExtensions() {
assertEquals(2, TestExtensionRegistry.getDefaultExtensionClasses().size()); assertEquals(2, TestExtensionRegistry.getDefaultExtensionTypes().size());


assertDefaultExtensionType(DisabledCondition.class); assertDefaultExtensionType(DisabledCondition.class);
assertDefaultExtensionType(TestInfoParameterResolver.class); assertDefaultExtensionType(TestInfoParameterResolver.class);
} }


@Test @Test
public void newRegistryWithoutParentHasDefaultExtensions() throws Exception { public void newRegistryWithoutParentHasDefaultExtensions() throws Exception {
Set<Class<? extends TestExtension>> extensions = registry.getRegisteredExtensionClasses(); Set<Class<? extends TestExtension>> extensions = registry.getRegisteredExtensionTypes();


assertEquals(TestExtensionRegistry.getDefaultExtensionClasses().size(), extensions.size()); assertEquals(TestExtensionRegistry.getDefaultExtensionTypes().size(), extensions.size());
assertExtensionRegistered(registry, DisabledCondition.class); assertExtensionRegistered(registry, DisabledCondition.class);
assertExtensionRegistered(registry, TestInfoParameterResolver.class); assertExtensionRegistered(registry, TestInfoParameterResolver.class);


Expand All @@ -63,28 +66,28 @@ public void newRegistryWithoutParentHasDefaultExtensions() throws Exception {
@Test @Test
public void registerExtensionByImplementingClass() throws Exception { public void registerExtensionByImplementingClass() throws Exception {


registry.addExtension(MyExtension.class); registry.registerExtension(MyExtension.class);


assertExtensionRegistered(registry, MyExtension.class); assertExtensionRegistered(registry, MyExtension.class);


int rememberSize = registry.getRegisteredExtensionClasses().size(); int rememberSize = registry.getRegisteredExtensionTypes().size();
registry.addExtension(MyExtension.class); registry.registerExtension(MyExtension.class);
registry.addExtension(MyExtension.class); registry.registerExtension(MyExtension.class);
registry.addExtension(MyExtension.class); registry.registerExtension(MyExtension.class);


assertEquals(rememberSize, registry.getRegisteredExtensionClasses().size()); assertEquals(rememberSize, registry.getRegisteredExtensionTypes().size());
assertExtensionRegistered(registry, MyExtension.class); assertExtensionRegistered(registry, MyExtension.class);
assertEquals(1, countExtensionPoints(MyExtensionPoint.class)); assertEquals(1, countExtensionPoints(MyExtensionPoint.class));


registry.addExtension(YourExtension.class); registry.registerExtension(YourExtension.class);
assertExtensionRegistered(registry, YourExtension.class); assertExtensionRegistered(registry, YourExtension.class);
assertEquals(2, countExtensionPoints(MyExtensionPoint.class)); assertEquals(2, countExtensionPoints(MyExtensionPoint.class));
} }


@Test @Test
public void registerTestExtensionThatImplementsMultipleExtensionPoints() throws Exception { public void registerTestExtensionThatImplementsMultipleExtensionPoints() throws Exception {


registry.addExtension(MultipleExtension.class); registry.registerExtension(MultipleExtension.class);


assertExtensionRegistered(registry, MultipleExtension.class); assertExtensionRegistered(registry, MultipleExtension.class);


Expand All @@ -96,10 +99,10 @@ public void registerTestExtensionThatImplementsMultipleExtensionPoints() throws
public void extensionsAreInheritedFromParent() throws Exception { public void extensionsAreInheritedFromParent() throws Exception {


TestExtensionRegistry parent = new TestExtensionRegistry(); TestExtensionRegistry parent = new TestExtensionRegistry();
parent.addExtension(MyExtension.class); parent.registerExtension(MyExtension.class);


registry = new TestExtensionRegistry(parent); registry = new TestExtensionRegistry(parent);
registry.addExtension(YourExtension.class); registry.registerExtension(YourExtension.class);


assertExtensionRegistered(registry, MyExtension.class); assertExtensionRegistered(registry, MyExtension.class);
assertExtensionRegistered(registry, YourExtension.class); assertExtensionRegistered(registry, YourExtension.class);
Expand All @@ -114,7 +117,7 @@ public void extensionsAreInheritedFromParent() throws Exception {
@Test @Test
public void registerExtensionPointsByExtensionRegistrar() throws Exception { public void registerExtensionPointsByExtensionRegistrar() throws Exception {


registry.addExtension(MyExtensionRegistrar.class); registry.registerExtension(MyExtensionRegistrar.class);


assertExtensionRegistered(registry, MyExtensionRegistrar.class); assertExtensionRegistered(registry, MyExtensionRegistrar.class);
assertEquals(1, countExtensionPoints(MyExtensionPoint.class)); assertEquals(1, countExtensionPoints(MyExtensionPoint.class));
Expand All @@ -124,15 +127,15 @@ public void registerExtensionPointsByExtensionRegistrar() throws Exception {
@Test @Test
public void canStreamOverRegisteredExceptionPoint() throws Exception { public void canStreamOverRegisteredExceptionPoint() throws Exception {


registry.addExtension(MyExtension.class); registry.registerExtension(MyExtension.class);


AtomicBoolean hasRun = new AtomicBoolean(false); AtomicBoolean hasRun = new AtomicBoolean(false);


registry.stream(MyExtensionPoint.class, TestExtensionRegistry.ApplicationOrder.FORWARD).forEach( registry.stream(MyExtensionPoint.class, TestExtensionRegistry.ApplicationOrder.FORWARD).forEach(
registeredExtensionPoint -> { registeredExtensionPoint -> {
assertEquals(MyExtension.class, registeredExtensionPoint.getExtensionInstance().getClass());
assertEquals(Position.DEFAULT, registeredExtensionPoint.getPosition());
assertTrue(registeredExtensionPoint.getExtensionPoint() instanceof MyExtensionPoint); assertTrue(registeredExtensionPoint.getExtensionPoint() instanceof MyExtensionPoint);
assertEquals(MyExtension.class.getName(), registeredExtensionPoint.getExtensionName());
assertEquals(Position.DEFAULT, registeredExtensionPoint.getPosition());
hasRun.set(true); hasRun.set(true);
}); });


Expand All @@ -143,16 +146,17 @@ public void canStreamOverRegisteredExceptionPoint() throws Exception {
@Test @Test
public void registerExtensionPointDirectly() throws Exception { public void registerExtensionPointDirectly() throws Exception {


registry.registerExtension((MyExtensionPoint) test -> { registry.registerExtensionPoint((MyExtensionPoint) test -> {
}, Position.INNERMOST, "anonymous extension"); }, Position.INNERMOST);


AtomicBoolean hasRun = new AtomicBoolean(false); AtomicBoolean hasRun = new AtomicBoolean(false);


registry.stream(MyExtensionPoint.class, TestExtensionRegistry.ApplicationOrder.FORWARD).forEach( registry.stream(MyExtensionPoint.class, TestExtensionRegistry.ApplicationOrder.FORWARD).forEach(
registeredExtensionPoint -> { registeredExtensionPoint -> {
assertEquals("anonymous extension", registeredExtensionPoint.getExtensionName());
assertEquals(Position.INNERMOST, registeredExtensionPoint.getPosition());
assertTrue(registeredExtensionPoint.getExtensionPoint() instanceof MyExtensionPoint); assertTrue(registeredExtensionPoint.getExtensionPoint() instanceof MyExtensionPoint);
assertTrue(registeredExtensionPoint.getExtensionName().startsWith(getClass().getName() + "$$Lambda$"));
assertTrue(registeredExtensionPoint.getExtensionName().contains("$Lambda$"));
assertEquals(Position.INNERMOST, registeredExtensionPoint.getPosition());
hasRun.set(true); hasRun.set(true);
}); });


Expand All @@ -169,12 +173,12 @@ private int countExtensionPoints(Class<? extends ExtensionPoint> extensionPointT


private void assertExtensionRegistered(TestExtensionRegistry registry, private void assertExtensionRegistered(TestExtensionRegistry registry,
Class<? extends TestExtension> extensionClass) { Class<? extends TestExtension> extensionClass) {
assertTrue(registry.getRegisteredExtensionClasses().contains(extensionClass), assertTrue(registry.getRegisteredExtensionTypes().contains(extensionClass),
() -> extensionClass.getSimpleName() + " should be present"); () -> extensionClass.getSimpleName() + " should be present");
} }


private void assertDefaultExtensionType(Class<?> extensionType) { private void assertDefaultExtensionType(Class<?> extensionType) {
assertTrue(TestExtensionRegistry.getDefaultExtensionClasses().contains(extensionType), assertTrue(TestExtensionRegistry.getDefaultExtensionTypes().contains(extensionType),
() -> extensionType.getName() + " should be a default extension"); () -> extensionType.getName() + " should be a default extension");
} }


Expand Down
Expand Up @@ -212,8 +212,7 @@ private void registerAnnotatedMethodsAsExtensions(TestExtensionRegistry extensio
findAnnotatedMethods(testClass, annotationType, MethodSortOrder.HierarchyDown).stream() findAnnotatedMethods(testClass, annotationType, MethodSortOrder.HierarchyDown).stream()
.peek(method -> methodValidator.accept(extensionType, method)) .peek(method -> methodValidator.accept(extensionType, method))
.forEach(method -> .forEach(method ->
extensionRegistry.registerExtension(extensionPointSynthesizer.apply(extensionRegistry, method), extensionRegistry.registerExtensionPoint(extensionPointSynthesizer.apply(extensionRegistry, method)));
ExtensionPoint.Position.DEFAULT, method));
// @formatter:on // @formatter:on
} }


Expand Down
Expand Up @@ -19,8 +19,13 @@
import org.junit.gen5.api.extension.ExtensionPoint.Position; import org.junit.gen5.api.extension.ExtensionPoint.Position;


/** /**
* Class for sorting {@linkplain RegisteredExtensionPoint points} according to their {@linkplain Position}: * Utility for sorting {@linkplain RegisteredExtensionPoint extension points}
* {@code OUTERMOST -> OUTSIDE_DEFAULT -> DEFAULT -> INSIDE_DEFAULT -> INNERMOST} * according to their {@linkplain Position}:
* {@link Position#OUTERMOST OUTERMOST} &raquo;
* {@link Position#OUTSIDE_DEFAULT OUTSIDE_DEFAULT} &raquo;
* {@link Position#DEFAULT DEFAULT} &raquo;
* {@link Position#INSIDE_DEFAULT INSIDE_DEFAULT} &raquo;
* {@link Position#INNERMOST INNERMOST}.
* *
* @since 5.0 * @since 5.0
*/ */
Expand All @@ -29,13 +34,12 @@ public class ExtensionPointSorter {
/** /**
* Sort the list of extension points according to their specified {@linkplain Position}. * Sort the list of extension points according to their specified {@linkplain Position}.
* *
* <p>The list instance will be resorted. * <p>Note: the supplied list instance will be resorted.
* *
* @param registeredExtensionPoints List of extension points in order of registration * @param registeredExtensionPoints list of extension points in order of registration
* @param <T> concrete subtype of {@link ExtensionPoint} * @param <T> concrete subtype of {@link ExtensionPoint}
*/ */
public <T extends ExtensionPoint> void sort(List<RegisteredExtensionPoint<T>> registeredExtensionPoints) { public <T extends ExtensionPoint> void sort(List<RegisteredExtensionPoint<T>> registeredExtensionPoints) {

checkPositionUnique(registeredExtensionPoints, Position.INNERMOST); checkPositionUnique(registeredExtensionPoints, Position.INNERMOST);
checkPositionUnique(registeredExtensionPoints, Position.OUTERMOST); checkPositionUnique(registeredExtensionPoints, Position.OUTERMOST);
registeredExtensionPoints.sort(new DefaultComparator()); registeredExtensionPoints.sort(new DefaultComparator());
Expand Down
Expand Up @@ -18,45 +18,38 @@
* Represents an {@linkplain ExtensionPoint extension} registered in a * Represents an {@linkplain ExtensionPoint extension} registered in a
* {@link TestExtensionRegistry}. * {@link TestExtensionRegistry}.
* *
* @param <T> the concrete subtype of {@link ExtensionPoint} to be registered * @param <E> the type of registered {@link ExtensionPoint}
* @since 5.0 * @since 5.0
*/ */
public class RegisteredExtensionPoint<T extends ExtensionPoint> { public class RegisteredExtensionPoint<E extends ExtensionPoint> {


private final T extensionPoint; private final E extensionPoint;


private final Position position; private final Position position;


private final Object extensionInstance; public RegisteredExtensionPoint(E extensionPoint, Position position) {

public RegisteredExtensionPoint(T extensionPoint, Position position, Object extensionInstance) {
this.extensionPoint = extensionPoint; this.extensionPoint = extensionPoint;
this.position = position; this.position = position;
this.extensionInstance = extensionInstance;
} }


public T getExtensionPoint() { public E getExtensionPoint() {
return extensionPoint; return this.extensionPoint;
} }


public Position getPosition() { public Position getPosition() {
return position; return this.position;
}

public Object getExtensionInstance() {
return extensionInstance;
} }


public String getExtensionName() { public String getExtensionName() {
return extensionInstance.toString(); return this.extensionPoint.getClass().getName();
} }


@Override @Override
public String toString() { public String toString() {
// @formatter:off // @formatter:off
return new ToStringBuilder(this) return new ToStringBuilder(this)
.append("position", this.position) .append("position", this.position)
.append("extensionInstance", this.extensionInstance) .append("extensionPoint", this.extensionPoint)
.toString(); .toString();
// @formatter:on // @formatter:on
} }
Expand Down

0 comments on commit 9d0ea36

Please sign in to comment.