blob: e7df8bfcd85fbc9475473227adff7f9226658e13 [file] [log] [blame]
package org.junit.internal.runners.rules;
import java.lang.annotation.Annotation;
import java.util.List;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.rules.TestRule;
import org.junit.runners.model.FrameworkField;
import org.junit.runners.model.TestClass;
/**
* A RuleFieldValidator validates the rule fields of a
* {@link org.junit.runners.model.TestClass}. All reasons for rejecting the
* {@code TestClass} are written to a list of errors.
*
* There are two slightly different validators. The {@link #CLASS_RULE_VALIDATOR}
* validates fields with a {@link ClassRule} annotation and the
* {@link #RULE_VALIDATOR} validates fields with a {@link Rule} annotation.
*/
public enum RuleFieldValidator {
/**
* Validates fields with a {@link ClassRule} annotation.
*/
CLASS_RULE_VALIDATOR(ClassRule.class, true),
/**
* Validates fields with a {@link Rule} annotation.
*/
RULE_VALIDATOR(Rule.class, false);
private final Class<? extends Annotation> fAnnotation;
private final boolean fOnlyStaticFields;
private RuleFieldValidator(Class<? extends Annotation> annotation,
boolean onlyStaticFields) {
this.fAnnotation= annotation;
this.fOnlyStaticFields= onlyStaticFields;
}
/**
* Validate the {@link org.junit.runners.model.TestClass} and adds reasons
* for rejecting the class to a list of errors.
* @param target the {@code TestClass} to validate.
* @param errors the list of errors.
*/
public void validate(TestClass target, List<Throwable> errors) {
List<FrameworkField> fields= target.getAnnotatedFields(fAnnotation);
for (FrameworkField each : fields)
validateField(each, errors);
}
private void validateField(FrameworkField field, List<Throwable> errors) {
optionallyValidateStatic(field, errors);
validatePublic(field, errors);
validateTestRuleOrMethodRule(field, errors);
}
private void optionallyValidateStatic(FrameworkField field,
List<Throwable> errors) {
if (fOnlyStaticFields && !field.isStatic())
addError(errors, field, "must be static.");
}
private void validatePublic(FrameworkField field, List<Throwable> errors) {
if (!field.isPublic())
addError(errors, field, "must be public.");
}
private void validateTestRuleOrMethodRule(FrameworkField field,
List<Throwable> errors) {
if (!isMethodRule(field) && !isTestRule(field))
addError(errors, field, "must implement MethodRule or TestRule.");
}
private boolean isTestRule(FrameworkField target) {
return TestRule.class.isAssignableFrom(target.getType());
}
@SuppressWarnings("deprecation")
private boolean isMethodRule(FrameworkField target) {
return org.junit.rules.MethodRule.class.isAssignableFrom(target
.getType());
}
private void addError(List<Throwable> errors, FrameworkField field,
String suffix) {
String message= "The @" + fAnnotation.getSimpleName() + " '"
+ field.getName() + "' " + suffix;
errors.add(new Exception(message));
}
}