package org.junit.jupiter.engine.discovery.predicates;
import static org.junit.platform.commons.util.AnnotationUtils.isAnnotated;
import static org.junit.platform.commons.util.ReflectionUtils.isAbstract;
import static org.junit.platform.commons.util.ReflectionUtils.isPrivate;
import static org.junit.platform.commons.util.ReflectionUtils.isStatic;
import static org.junit.platform.commons.util.ReflectionUtils.returnsVoid;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.function.Predicate;
abstract class IsTestableMethod implements Predicate<Method> {
private final Class<? extends Annotation> annotationType;
private final boolean mustReturnVoid;
IsTestableMethod(Class<? extends Annotation> annotationType, boolean mustReturnVoid) {
this.annotationType = annotationType;
this.mustReturnVoid = mustReturnVoid;
}
@Override
public boolean test(Method candidate) {
if (isStatic(candidate)) {
return false;
}
if (isPrivate(candidate)) {
return false;
}
if (isAbstract(candidate)) {
return false;
}
if (returnsVoid(candidate) != this.mustReturnVoid) {
return false;
}
return isAnnotated(candidate, this.annotationType);
}
}