package com.redhat.lightblue.client.integration.test;
import java.util.List;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.internal.runners.statements.RunAfters;
import org.junit.internal.runners.statements.RunBefores;
import org.junit.rules.RunRules;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
import org.junit.runners.model.TestClass;
public class BeforeAfterTestRule implements TestRule {
private final TestClass[] extensions;
public BeforeAfterTestRule(TestClass... extensions) {
this.extensions = extensions;
}
@Override
public Statement apply(Statement base, Description description) {
//Create statement chain
Statement newStatement = base;
for (TestClass extension : extensions) {
newStatement = prepareBeforeClasses(extension, newStatement);
newStatement = prepareAfterClasses(extension, newStatement);
newStatement = prepareRules(extension, newStatement, description);
newStatement = prepareBefores(extension, newStatement, null);
newStatement = prepareAfters(extension, newStatement, null);
}
return newStatement;
}
protected Statement prepareBeforeClasses(TestClass extension, Statement base) {
return new RunBefores(
base, extension.getAnnotatedMethods(BeforeClass.class), null);
}
protected Statement prepareAfterClasses(TestClass extension, Statement base) {
return new RunAfters(
base, extension.getAnnotatedMethods(AfterClass.class), null);
}
protected Statement prepareBefores(TestClass extension, Statement base, Object target) {
return new RunBefores(
base, extension.getAnnotatedMethods(Before.class), target);
}
protected Statement prepareAfters(TestClass extension, Statement base, Object target) {
return new RunAfters(
base, extension.getAnnotatedMethods(After.class), target);
}
protected Statement prepareRules(TestClass extension, Statement base, Description description) {
List<TestRule> rules = extension.getAnnotatedFieldValues(null, Rule.class, TestRule.class);
rules.addAll(extension.getAnnotatedFieldValues(null, ClassRule.class, TestRule.class));
return new RunRules(base, rules, description);
}
}