package jetbrains.mps.testbench;
/*Generated by MPS */
import org.jetbrains.annotations.NotNull;
import jetbrains.mps.tool.environment.Environment;
import jetbrains.mps.tool.environment.EnvironmentContainer;
import jetbrains.mps.project.Project;
import java.io.File;
import org.jetbrains.mps.openapi.module.SModule;
import jetbrains.mps.smodel.ModuleRepositoryFacade;
import jetbrains.mps.project.Solution;
import jetbrains.mps.smodel.Language;
import jetbrains.mps.smodel.Generator;
import org.jetbrains.mps.openapi.model.SModel;
import org.jetbrains.mps.openapi.persistence.PersistenceFacade;
import jetbrains.mps.util.FileUtil;
import jetbrains.mps.util.UnzipUtil;
import java.io.IOException;
public abstract class BaseMpsTest {
@NotNull
protected static Environment getEnvironment() {
Environment env = EnvironmentContainer.get();
if (env == null) {
throw new IllegalStateException("No initialized environment is available");
}
return env;
}
protected static Project openProject(@NotNull File projectFile) {
return getEnvironment().openProject(projectFile);
}
/**
* IMPORTANT: requires model read access!
*
* @deprecated uses global repository, shall cease.
*/
@Deprecated
protected static <T extends SModule> T getModule(String moduleFqName, Class<T> cls) {
return ModuleRepositoryFacade.getInstance().getModule(moduleFqName, cls);
}
/**
*
* @deprecated use {@link jetbrains.mps.testbench.BaseMpsTest#getSolution(Project, String) } with context (project) instead
*/
@Deprecated
protected static Solution getSolution(String moduleFqName) {
return getModule(moduleFqName, Solution.class);
}
protected static Solution getSolution(Project project, String moduleFqName) {
for (SModule m : project.getProjectModules()) {
if (m instanceof Solution && moduleFqName.equals(m.getModuleName())) {
return (Solution) m;
}
}
return null;
}
/**
*
* @deprecated use {@link jetbrains.mps.testbench.BaseMpsTest#getLanguage(Project, String) } with context (project) instead
*/
@Deprecated
protected static Language getLanguage(String moduleFqName) {
return getModule(moduleFqName, Language.class);
}
protected static Language getLanguage(Project project, String moduleFqName) {
for (SModule m : project.getProjectModules()) {
if (m instanceof Language && moduleFqName.equals(m.getModuleName())) {
return (Language) m;
}
}
return null;
}
protected static Generator getGenerator(String moduleFqName) {
return getModule(moduleFqName, Generator.class);
}
protected static SModel getModel(Project project, String modelName) {
return project.getScope().resolve(PersistenceFacade.getInstance().createModelReference(modelName));
}
/**
* copies project to some [temporary] destination dir, after that opens it
*/
protected static Project openClonedProject(File source, final File destinationDir) {
if (destinationDir.exists()) {
FileUtil.delete(destinationDir);
}
if (source.isDirectory()) {
FileUtil.copyDir(source, destinationDir);
} else {
// it is allowed to have zipped directory here
try {
boolean success = destinationDir.mkdir();
if (!(success)) {
throw new IllegalStateException("Could not create dir at the provided destination");
}
UnzipUtil.unzip(source, destinationDir);
} catch (IOException e) {
throw new RuntimeException("Got error while unzipping the project sources", e);
}
}
return getEnvironment().openProject(destinationDir);
}
protected static void closeClonedProject(final Project project, final File destinationDir) {
Environment env = getEnvironment();
env.flushAllEvents();
project.dispose();
FileUtil.delete(destinationDir);
}
}