Skip to content

Commit

Permalink
Collapsed 3 methods of ElementResolver into one
Browse files Browse the repository at this point in the history
  • Loading branch information
jlink authored and bechte committed Apr 29, 2016
1 parent cb16a89 commit 24e0a90
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 51 deletions.
Expand Up @@ -21,6 +21,7 @@
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.logging.Logger;
import java.util.stream.Collectors;

import org.junit.gen5.commons.util.ReflectionUtils;
Expand All @@ -34,6 +35,7 @@
import org.junit.gen5.engine.junit5.discovery.JUnit5EngineDescriptor;

public class DiscoverySelectorResolver {

private final JUnit5EngineDescriptor engineDescriptor;
private final Set<ElementResolver> resolvers = new HashSet<>();

Expand Down Expand Up @@ -129,18 +131,18 @@ private Set<TestDescriptor> resolve(AnnotatedElement element, TestDescriptor par

private Set<TestDescriptor> tryToResolveWithResolver(AnnotatedElement element, TestDescriptor parent,
ElementResolver resolver) {
if (!resolver.canResolveElement(element, parent))
return Collections.emptySet();

UniqueId uniqueId = resolver.createUniqueId(element, parent);
Set<TestDescriptor> resolvedDescriptors = resolver.resolve(element, parent);

Optional<TestDescriptor> optionalMethodTestDescriptor = findTestDescriptorByUniqueId(uniqueId);
if (optionalMethodTestDescriptor.isPresent())
return Collections.singleton(optionalMethodTestDescriptor.get());
resolvedDescriptors.forEach(testDescriptor -> {
Optional<TestDescriptor> existingTestDescriptor = findTestDescriptorByUniqueId(
testDescriptor.getUniqueId());
if (!existingTestDescriptor.isPresent()) {
parent.addChild(testDescriptor);
}
});

Set<TestDescriptor> newDescriptors = resolver.resolve(element, parent, uniqueId);
newDescriptors.forEach(parent::addChild);
return newDescriptors;
return resolvedDescriptors;
}

@SuppressWarnings("unchecked")
Expand Down
Expand Up @@ -18,19 +18,10 @@

public interface ElementResolver {

boolean canResolveElement(AnnotatedElement element, TestDescriptor parent);

/**
* Will only be called if {@linkplain #canResolveElement(AnnotatedElement, TestDescriptor)} returns true.
*/
UniqueId createUniqueId(AnnotatedElement element, TestDescriptor parent);

/**
* Will only be called if {@linkplain #canResolveElement(AnnotatedElement, TestDescriptor)} returns true.
*
* <p>Must return a non empty {@code Set<TestDescriptor>}
* Return a set of {@linkplain TestDescriptor testDescriptors} that can be resolved by this resolver
*/
Set<TestDescriptor> resolve(AnnotatedElement element, TestDescriptor parent, UniqueId uniqueId);
Set<TestDescriptor> resolve(AnnotatedElement element, TestDescriptor parent);

boolean canResolveUniqueId(UniqueId.Segment segment, TestDescriptor parent);

Expand Down
Expand Up @@ -10,10 +10,13 @@

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

import static java.lang.String.format;

import java.lang.reflect.AnnotatedElement;
import java.util.Collections;
import java.util.Optional;
import java.util.Set;
import java.util.logging.Logger;

import org.junit.gen5.commons.util.ReflectionUtils;
import org.junit.gen5.engine.TestDescriptor;
Expand All @@ -23,36 +26,40 @@

public class TestContainerResolver implements ElementResolver {

private static final Logger LOG = Logger.getLogger(TestContainerResolver.class.getName());

private static final String SEGMENT_TYPE = "class";

@Override
public boolean canResolveElement(AnnotatedElement element, TestDescriptor parent) {
//Do not collapse
public Set<TestDescriptor> resolve(AnnotatedElement element, TestDescriptor parent) {
if (!(element instanceof Class))
return false;
return new IsPotentialTestContainer().test((Class<?>) element);
}
return Collections.emptySet();

@Override
public UniqueId createUniqueId(AnnotatedElement element, TestDescriptor parent) {
Class<?> testClass = (Class<?>) element;
return parent.getUniqueId().append(SEGMENT_TYPE, testClass.getName());
}
Class<?> clazz = (Class<?>) element;
if (!isPotentialTestContainer(clazz)) {
LOG.warning(() -> {
String classDescription = clazz.getName();
return format("Class '%s' is not a test container", classDescription);
});
return Collections.emptySet();
}
;

@Override
public Set<TestDescriptor> resolve(AnnotatedElement element, TestDescriptor parent, UniqueId uniqueId) {
return Collections.singleton(resolveClass((Class<?>) element, parent, uniqueId));
UniqueId uniqueId = createUniqueId(clazz, parent);
return Collections.singleton(resolveClass(clazz, parent, uniqueId));
}

@Override
public boolean canResolveUniqueId(UniqueId.Segment segment, TestDescriptor parent) {
//Do not collapse
if (!segment.getType().equals(SEGMENT_TYPE))
return false;

Optional<Class<?>> optionalContainerClass = ReflectionUtils.loadClass(segment.getValue());
if (!optionalContainerClass.isPresent())
return false;
return canResolveElement(optionalContainerClass.get(), parent);

return isPotentialTestContainer(optionalContainerClass.get());
}

@Override
Expand All @@ -61,6 +68,14 @@ public TestDescriptor resolve(UniqueId.Segment segment, TestDescriptor parent, U
return resolveClass(optionalContainerClass.get(), parent, uniqueId);
}

private boolean isPotentialTestContainer(Class<?> element) {
return new IsPotentialTestContainer().test(element);
}

private UniqueId createUniqueId(Class<?> testClass, TestDescriptor parent) {
return parent.getUniqueId().append(SEGMENT_TYPE, testClass.getName());
}

private TestDescriptor resolveClass(Class<?> testClass, TestDescriptor parent, UniqueId uniqueId) {
return new ClassTestDescriptor(uniqueId, testClass);
}
Expand Down
Expand Up @@ -27,8 +27,7 @@ public class TestMethodResolver implements ElementResolver {

public static final String SEGMENT_TYPE = "method";

@Override
public boolean canResolveElement(AnnotatedElement element, TestDescriptor parent) {
private boolean canResolveElement(AnnotatedElement element, TestDescriptor parent) {
//Do not collapse
if (!(element instanceof Method))
return false;
Expand All @@ -37,36 +36,36 @@ public boolean canResolveElement(AnnotatedElement element, TestDescriptor parent
return isTestMethod((Method) element);
}

private boolean isTestMethod(Method candidate) {
return new IsTestMethod().test(candidate);
}

@Override
public UniqueId createUniqueId(AnnotatedElement element, TestDescriptor parent) {
public Set<TestDescriptor> resolve(AnnotatedElement element, TestDescriptor parent) {
if (!(element instanceof Method))
return Collections.emptySet();

if (!(parent instanceof ClassTestDescriptor))
return Collections.emptySet();

Method testMethod = (Method) element;
return parent.getUniqueId().append(SEGMENT_TYPE, testMethod.getName() + "()");
}
if (!isTestMethod(testMethod)) {
return Collections.emptySet();
}

@Override
public Set<TestDescriptor> resolve(AnnotatedElement element, TestDescriptor parent, UniqueId uniqueId) {
return Collections.singleton(resolveMethod((Method) element, (ClassTestDescriptor) parent, uniqueId));
UniqueId uniqueId = createUniqueId(testMethod, parent);
return Collections.singleton(resolveMethod(testMethod, (ClassTestDescriptor) parent, uniqueId));
}

@Override
public boolean canResolveUniqueId(UniqueId.Segment segment, TestDescriptor parent) {
//Do not collapse
if (!segment.getType().equals(SEGMENT_TYPE))
return false;

if (!(parent instanceof ClassTestDescriptor))
return false;

Optional<Method> optionalMethod = findMethod(segment, (ClassTestDescriptor) parent);
if (!optionalMethod.isPresent())
return false;
return isTestMethod(optionalMethod.get());
}

private Optional<Method> findMethod(UniqueId.Segment segment, ClassTestDescriptor parent) {
return new MethodFinder().findMethod(segment.getValue(), parent.getTestClass());
return isTestMethod(optionalMethod.get());
}

@Override
Expand All @@ -75,6 +74,18 @@ public TestDescriptor resolve(UniqueId.Segment segment, TestDescriptor parent, U
return resolveMethod(optionalMethod.get(), (ClassTestDescriptor) parent, uniqueId);
}

private boolean isTestMethod(Method candidate) {
return new IsTestMethod().test(candidate);
}

private UniqueId createUniqueId(Method testMethod, TestDescriptor parent) {
return parent.getUniqueId().append(SEGMENT_TYPE, testMethod.getName() + "()");
}

private Optional<Method> findMethod(UniqueId.Segment segment, ClassTestDescriptor parent) {
return new MethodFinder().findMethod(segment.getValue(), parent.getTestClass());
}

private TestDescriptor resolveMethod(Method testMethod, ClassTestDescriptor parentClassDescriptor,
UniqueId uniqueId) {
return new MethodTestDescriptor(uniqueId, parentClassDescriptor.getTestClass(), testMethod);
Expand Down

0 comments on commit 24e0a90

Please sign in to comment.