package jetbrains.mps.testbench.junit.runners; /*Generated by MPS */ import java.util.List; import org.junit.runner.Runner; import org.junit.runners.model.RunnerBuilder; import java.util.ArrayList; import org.junit.runner.Description; import org.junit.runner.notification.RunNotifier; import jetbrains.mps.testbench.junit.WatchingRunNotifier; import org.junit.runner.manipulation.Sorter; import jetbrains.mps.testbench.junit.OrderComparator; import org.junit.runners.model.TestClass; import org.junit.runners.model.FrameworkMethod; import org.junit.runners.Parameterized; import java.lang.reflect.Modifier; import org.junit.runners.BlockJUnit4ClassRunner; import org.junit.runners.model.InitializationError; import org.junit.runners.model.Statement; /** * + watching */ public class TeamCityParameterizedRunner extends BaseMpsRunner { private final List<Runner> children; public TeamCityParameterizedRunner(Class<?> klass, RunnerBuilder builder) throws Throwable { super(klass); children = createChildRunners(klass, builder); } private List<Runner> createChildRunners(Class<?> aClass, RunnerBuilder builder) throws Throwable { List<Runner> runners = new ArrayList<Runner>(); List<Object[]> parametersList = getParametersList(getTestClass()); for (int i = 0; i < parametersList.size(); i++) { TeamCityParameterizedRunner.TestClassRunnerForParameters runner = new TeamCityParameterizedRunner.TestClassRunnerForParameters(getTestClass().getJavaClass(), parametersList, i); runners.add(runner); } return runners; } protected List<Runner> getChildren() { return children; } protected Description describeChild(Runner child) { return child.getDescription(); } protected void runChild(Runner runner, RunNotifier notifier) { WatchingRunNotifier runNotifier = new WatchingRunNotifier(notifier); try { new Sorter(new OrderComparator()).apply(runner); runner.run(runNotifier); } finally { runNotifier.dispose(); } } @SuppressWarnings("unchecked") private static List<Object[]> getParametersList(TestClass klass) throws Throwable { return (List<Object[]>) getParametersMethod(klass).invokeExplosively(null); } private static FrameworkMethod getParametersMethod(TestClass testClass) throws Exception { List<FrameworkMethod> methods = testClass.getAnnotatedMethods(Parameterized.Parameters.class); for (FrameworkMethod each : methods) { int modifiers = each.getMethod().getModifiers(); if (Modifier.isStatic(modifiers) && Modifier.isPublic(modifiers)) { return each; } } throw new Exception("No public static parameters method on class " + testClass.getName()); } private class TestClassRunnerForParameters extends BlockJUnit4ClassRunner { private final int fParameterSetNumber; private final List<Object[]> fParameterList; /*package*/ TestClassRunnerForParameters(Class<?> type, List<Object[]> parameterList, int i) throws InitializationError { super(type); fParameterList = parameterList; fParameterSetNumber = i; } @Override public Object createTest() throws Exception { return getTestClass().getOnlyConstructor().newInstance(computeParams()); } private Object[] computeParams() throws Exception { try { return fParameterList.get(fParameterSetNumber); } catch (ClassCastException e) { throw new Exception(String.format("%s.%s() must return a Collection of arrays.", getTestClass().getName(), TeamCityParameterizedRunner.getParametersMethod(getTestClass()).getName())); } } @Override protected String getName() { Object firstArg = fParameterList.get(fParameterSetNumber)[0]; return String.format("%s", String.valueOf(firstArg)); } @Override protected String testName(final FrameworkMethod method) { return String.format("%s (%s)", method.getName(), fParameterList.get(fParameterSetNumber)[0]); } @Override protected void validateConstructor(List<Throwable> errors) { validateOnlyOneConstructor(errors); } @Override protected Statement classBlock(RunNotifier notifier) { return childrenInvoker(notifier); } } }