blob: 6125803f9fca72fc0793550ba5e46515e04589cc [file] [log] [blame]
package junitparams.internal;
import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Ignore;
import org.junit.runner.Description;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.TestClass;
import junitparams.internal.annotation.FrameworkMethodAnnotations;
import junitparams.internal.parameters.ParametersReader;
import junitparams.naming.MacroSubstitutionNamingStrategy;
import junitparams.naming.TestCaseNamingStrategy;
/**
* A wrapper for a test method
*
* @author Pawel Lipinski
*/
public class TestMethod {
private FrameworkMethod frameworkMethod;
FrameworkMethodAnnotations frameworkMethodAnnotations;
private Class<?> testClass;
private ParametersReader parametersReader;
private Object[] cachedParameters;
private TestCaseNamingStrategy namingStrategy;
public TestMethod(FrameworkMethod method, TestClass testClass) {
this.frameworkMethod = method;
this.testClass = testClass.getJavaClass();
frameworkMethodAnnotations = new FrameworkMethodAnnotations(method);
parametersReader = new ParametersReader(testClass(), frameworkMethod);
namingStrategy = new MacroSubstitutionNamingStrategy(this);
}
public String name() {
return frameworkMethod.getName();
}
public static List<TestMethod> listFrom(List<FrameworkMethod> annotatedMethods, TestClass testClass) {
List<TestMethod> methods = new ArrayList<TestMethod>();
for (FrameworkMethod frameworkMethod : annotatedMethods)
methods.add(new TestMethod(frameworkMethod, testClass));
return methods;
}
@Override
public int hashCode() {
return frameworkMethod.hashCode();
}
@Override
public boolean equals(Object obj) {
return (obj instanceof TestMethod)
&& hasTheSameNameAsFrameworkMethod((TestMethod) obj)
&& hasTheSameParameterTypesAsFrameworkMethod((TestMethod) obj);
}
private boolean hasTheSameNameAsFrameworkMethod(TestMethod testMethod) {
return frameworkMethod.getName().equals(testMethod.frameworkMethod.getName());
}
private boolean hasTheSameParameterTypesAsFrameworkMethod(TestMethod testMethod) {
Class<?>[] frameworkMethodParameterTypes = frameworkMethod.getMethod().getParameterTypes();
Class<?>[] testMethodParameterTypes = testMethod.frameworkMethod.getMethod().getParameterTypes();
return Arrays.equals(frameworkMethodParameterTypes, testMethodParameterTypes);
}
Class<?> testClass() {
return testClass;
}
public boolean isIgnored() {
return hasIgnoredAnnotation() || hasNoParameters();
}
private boolean hasIgnoredAnnotation() {
return frameworkMethodAnnotations.hasAnnotation(Ignore.class);
}
private boolean hasNoParameters() {
return isParameterised() && parametersSets().length == 0;
}
public boolean isNotIgnored() {
return !isIgnored();
}
public <T extends Annotation> T getAnnotation(Class<T> annotationType) {
return frameworkMethodAnnotations.getAnnotation(annotationType);
}
Description describe() {
if (isNotIgnored() && !describeFlat()) {
Description parametrised = Description.createSuiteDescription(name());
Object[] params = parametersSets();
for (int i = 0; i < params.length; i++) {
Object paramSet = params[i];
String name = namingStrategy.getTestCaseName(i, paramSet);
String uniqueMethodId = Utils.uniqueMethodId(i, paramSet, name());
parametrised.addChild(
Description.createTestDescription(testClass().getName(), name, uniqueMethodId)
);
}
return parametrised;
} else {
return Description.createTestDescription(testClass(), name(), frameworkMethodAnnotations.allAnnotations());
}
}
private boolean describeFlat() {
return System.getProperty("JUnitParams.flat") != null;
}
public Object[] parametersSets() {
if (cachedParameters == null) {
cachedParameters = parametersReader.read();
}
return cachedParameters;
}
void warnIfNoParamsGiven() {
if (isNotIgnored() && isParameterised() && parametersSets().length == 0)
System.err.println("Method " + name() + " gets empty list of parameters, so it's being ignored!");
}
public FrameworkMethod frameworkMethod() {
return frameworkMethod;
}
boolean isParameterised() {
return frameworkMethodAnnotations.isParametrised();
}
}