package org.simantics.tests.modelled.junit.v2; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.runner.Description; import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunNotifier; import org.junit.runners.ParentRunner; import org.junit.runners.model.InitializationError; import org.simantics.scl.compiler.module.coverage.CombinedCoverage; import org.simantics.tests.modelled.utils.ModelledSTSSuite; import org.simantics.tests.modelled.utils.ModelledSTSTest; import org.simantics.tests.modelled.utils.ModelledSTSTest.CommandSessionVariable; public class ModelledSTSSuiteRunner extends ParentRunner { private final ModelledSTSSuite suite; private final List children; private Map> storedVariables = new HashMap<>(); public ModelledSTSSuiteRunner(ModelledSTSSuite suite) throws InitializationError { super(ModelledSTSSuiteRunner.class); this.suite = suite; this.children = new ArrayList<>(suite.getChildren().size()); for (ModelledSTSTest test : suite.getSortedChildren()) { children.add(new ModelledSTSTestRunner(test)); } } @Override protected String getName() { return suite.getName(); } @Override protected List getChildren() { return children; } @Override protected Description describeChild(ModelledSTSTestRunner child) { return child.getDescription(); } @Override protected void runChild(ModelledSTSTestRunner child, RunNotifier notifier) { Description description = describeChild(child); if (isIgnored(child)) { notifier.fireTestIgnored(description); } else { try { List variables = new ArrayList<>(); for (String dep : child.getTest().getDependencies()) { List storedVars = storedVariables.get(dep); if (storedVars != null) { variables.addAll(storedVars); } } notifier.fireTestStarted(description); List newVars = child.runWithVars(variables); storedVariables.put(child.getTest().getName(), newVars); notifier.fireTestFinished(description); } catch (Throwable e) { notifier.fireTestFailure(new Failure(description, e)); } } } @Override protected boolean isIgnored(ModelledSTSTestRunner child) { return child.isIgnored(); } public CombinedCoverage getCoverage() { return suite.getCoverage(); } }