package jetbrains.mps.lang.test.runtime; /*Generated by MPS */ import jetbrains.mps.project.Project; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.RuntimeFlags; import jetbrains.mps.TestMode; import org.jetbrains.annotations.NotNull; import jetbrains.mps.tool.environment.Environment; import jetbrains.mps.tool.environment.IdeaEnvironment; import jetbrains.mps.tool.environment.EnvironmentConfig; import jetbrains.mps.lang.test.util.MpsTestRunListener; import jetbrains.mps.lang.test.util.RunEventsDispatcher; import jetbrains.mps.smodel.tempmodel.TemporaryModels; import jetbrains.mps.smodel.tempmodel.TempModuleOptions; import jetbrains.mps.generator.impl.CloneUtil; public abstract class BaseTransformationTest implements TransformationTest { private Project myProject; private SModel myModel; private SModel myTransientModel; private TestRunner myRunner; /*package*/ static final TestModelSaver CACHE = new TestModelSaver(); public static boolean isExecutionInProcess() { return RuntimeFlags.getTestMode() == TestMode.IN_PROCESS; } @NotNull private static TestRunner defaultTestRunner() { if (isExecutionInProcess()) { return new TransformationTestLightRunner(); } else { Environment ideaEnv = IdeaEnvironment.getOrCreate(EnvironmentConfig.defaultConfigNoPluginsSpecified()); return new TransformationTestRunner(ideaEnv); } } public BaseTransformationTest() { } public BaseTransformationTest(@NotNull TestRunner runner) { setTestRunner(runner); } public BaseTransformationTest(Project project, SModel modelDescriptor) { myProject = project; myModel = modelDescriptor; } public void beforeTests() { } public void afterTests() { } @Override public void setTestRunner(TestRunner runner) { myRunner = runner; } @Override public TestRunner getTestRunner() { return myRunner; } public void initTest(@NotNull String projectName, final String model) throws Exception { initTest(projectName, model, false); } public void initTest(@NotNull String projectName, final String model, boolean reOpenProject) throws Exception { if (myRunner == null) { initTests(); } myRunner.initTest(this, projectName, model, reOpenProject); } private void initTests() { setTestRunner(defaultTestRunner()); registerTestsListener(); } private void registerTestsListener() { MpsTestRunListener listener = new MpsTestRunListener() { @Override public void testRunFinished() { CACHE.clean(); afterTests(); RunEventsDispatcher.getInstance().removeListener(this); } @Override public void testRunStarted() { beforeTests(); } }; RunEventsDispatcher.getInstance().addListener(listener); } public void runTest(String className, final String methodName, final boolean runInCommand) throws Throwable { myRunner.runTest(this, className, methodName, runInCommand); } @Override public void init() { this.myTransientModel = TemporaryModels.getInstance().create(false, TempModuleOptions.forDefaultModule()); new CloneUtil(this.myModel, this.myTransientModel).cloneModelWithAllImports(); } @Override public void dispose() { TemporaryModels.getInstance().dispose(myTransientModel); myTransientModel = null; } @Override public SModel getModelDescriptor() { return myModel; } @Override public void setModelDescriptor(SModel descriptor) { myModel = descriptor; } @Override public void setTransientModelDescriptor(SModel descriptor) { myTransientModel = descriptor; } @Override public SModel getTransientModelDescriptor() { return myTransientModel; } @Override public Project getProject() { return myProject; } @Override public void setProject(Project project) { myProject = project; } }