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 83c7e7b commit dd82aad
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;

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.Arrays;
Expand All @@ -32,7 +34,6 @@ public class ExtensionPointSortingTests {

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

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

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

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

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

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

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

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

@Test
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, TestInfoParameterResolver.class);

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

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

assertExtensionRegistered(registry, MyExtension.class);

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

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

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

@Test
public void registerTestExtensionThatImplementsMultipleExtensionPoints() throws Exception {

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

assertExtensionRegistered(registry, MultipleExtension.class);

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

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

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

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

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

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

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

AtomicBoolean hasRun = new AtomicBoolean(false);

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

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

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

AtomicBoolean hasRun = new AtomicBoolean(false);

registry.stream(MyExtensionPoint.class, TestExtensionRegistry.ApplicationOrder.FORWARD).forEach(
registeredExtensionPoint -> {
assertEquals("anonymous extension", registeredExtensionPoint.getExtensionName());
assertEquals(Position.INNERMOST, registeredExtensionPoint.getPosition());
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);
});

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

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

private void assertDefaultExtensionType(Class<?> extensionType) {
assertTrue(TestExtensionRegistry.getDefaultExtensionClasses().contains(extensionType),
assertTrue(TestExtensionRegistry.getDefaultExtensionTypes().contains(extensionType),
() -> 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()
.peek(method -> methodValidator.accept(extensionType, method))
.forEach(method ->
extensionRegistry.registerExtension(extensionPointSynthesizer.apply(extensionRegistry, method),
ExtensionPoint.Position.DEFAULT, method));
extensionRegistry.registerExtensionPoint(extensionPointSynthesizer.apply(extensionRegistry, method)));
// @formatter:on
}

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

/**
* Class for sorting {@linkplain RegisteredExtensionPoint points} according to their {@linkplain Position}:
* {@code OUTERMOST -> OUTSIDE_DEFAULT -> DEFAULT -> INSIDE_DEFAULT -> INNERMOST}
* Utility for sorting {@linkplain RegisteredExtensionPoint extension points}
* 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
*/
Expand All @@ -29,13 +34,12 @@ public class ExtensionPointSorter {
/**
* 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}
*/
public <T extends ExtensionPoint> void sort(List<RegisteredExtensionPoint<T>> registeredExtensionPoints) {

checkPositionUnique(registeredExtensionPoints, Position.INNERMOST);
checkPositionUnique(registeredExtensionPoints, Position.OUTERMOST);
registeredExtensionPoints.sort(new DefaultComparator());
Expand Down
Expand Up @@ -18,45 +18,38 @@
* Represents an {@linkplain ExtensionPoint extension} registered in a
* {@link TestExtensionRegistry}.
*
* @param <T> the concrete subtype of {@link ExtensionPoint} to be registered
* @param <E> the type of registered {@link ExtensionPoint}
* @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 Object extensionInstance;

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

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

public Position getPosition() {
return position;
}

public Object getExtensionInstance() {
return extensionInstance;
return this.position;
}

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

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

0 comments on commit dd82aad

Please sign in to comment.