package jetbrains.mps.baseLanguage.unitTest.execution.settings;
/*Generated by MPS */
import java.util.List;
import jetbrains.mps.baseLanguage.unitTest.execution.client.ITestNodeWrapper;
import jetbrains.mps.project.MPSProject;
import org.jetbrains.mps.openapi.util.ProgressMonitor;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import org.jetbrains.mps.openapi.module.SModule;
import java.util.ArrayList;
import jetbrains.mps.project.SModuleOperations;
import org.jetbrains.mps.openapi.model.SModel;
import org.jetbrains.mps.openapi.model.SNodeReference;
import jetbrains.mps.execution.lib.PointerUtils;
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SModelOperations;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import jetbrains.mps.baseLanguage.unitTest.execution.client.TestNodeWrapperFactory;
import jetbrains.mps.progress.EmptyProgressMonitor;
import jetbrains.mps.baseLanguage.closures.runtime.Wrappers;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.progress.Task;
import org.jetbrains.annotations.NotNull;
import com.intellij.openapi.progress.ProgressIndicator;
import jetbrains.mps.progress.ProgressMonitorAdapter;
import org.jetbrains.annotations.Nullable;
import jetbrains.mps.project.Project;
import org.jetbrains.annotations.Nls;
import jetbrains.mps.smodel.ModuleRepositoryFacade;
import jetbrains.mps.internal.collections.runtime.Sequence;
public enum JUnitRunTypes {
PROJECT() {
@Override
protected List<ITestNodeWrapper> doCollect(JUnitSettings_Configuration configuration, MPSProject project, ProgressMonitor monitor) {
return new ProjectTestCollector(project, monitor, false).collect();
}
@Override
public String check(JUnitSettings_Configuration configuration, MPSProject project) {
// #check is used nowhere
// TODO: use it
if (!(this.hasTests(configuration, project))) {
return "Project does not contain tests.";
}
return null;
}
public boolean hasTests(JUnitSettings_Configuration configuration, MPSProject project) {
return ListSequence.fromList(new ProjectTestCollector(project, null, true).collect()).isNotEmpty();
}
},
MODULE() {
@Override
protected List<ITestNodeWrapper> doCollect(JUnitSettings_Configuration configuration, MPSProject project, ProgressMonitor monitor) {
SModule module = getModule(project, configuration.getModule());
if (module == null) {
return ListSequence.fromList(new ArrayList<ITestNodeWrapper>());
}
return new ModuleTestCollector(module, monitor, false).collect();
}
public String check(JUnitSettings_Configuration configuration, MPSProject project) {
if (isEmptyString(configuration.getModule())) {
return "Module is not selected.";
}
SModule module = getModule(project, configuration.getModule());
if (module == null) {
return "The module " + configuration.getModule() + " does not exist in the project " + project;
}
if (!(SModuleOperations.isCompileInMps(module))) {
return "The module's " + module + " compile output is not managed by MPS.";
}
if (!(this.hasTests(configuration, project))) {
return "No tests found in module " + configuration.getModule() + "";
}
return null;
}
public boolean hasTests(JUnitSettings_Configuration configuration, MPSProject project) {
SModule module = getModule(project, configuration.getModule());
if (module == null) {
return false;
}
return ListSequence.fromList(new ModuleTestCollector(module, null, true).collect()).isNotEmpty();
}
},
MODEL() {
@Override
protected List<ITestNodeWrapper> doCollect(JUnitSettings_Configuration configuration, MPSProject project, ProgressMonitor monitor) {
SModel model = getModel(project, configuration.getModel(), configuration.getModule());
if (model == null) {
return ListSequence.fromList(new ArrayList<ITestNodeWrapper>());
}
return new ModelTestCollector(model, monitor, false).collect();
}
public String check(JUnitSettings_Configuration configuration, MPSProject project) {
if (configuration.getModel() == null) {
return "Model is not selected.";
}
SModel model = getModel(project, configuration.getModel(), configuration.getModule());
if (model == null) {
return "Could not find model " + configuration.getModel();
}
SModule module = model.getModule();
if (!(SModuleOperations.isCompileInMps(module))) {
return "The module's " + module + " (which is hosting the model " + model.getName().getSimpleName() + ") compile output is not managed by MPS.";
}
if (!(this.hasTests(configuration, project))) {
return "No tests found in model " + configuration.getModel() + ".";
}
return null;
}
public boolean hasTests(JUnitSettings_Configuration configuration, MPSProject project) {
SModel model = getModel(project, configuration.getModel(), configuration.getModule());
if (model == null) {
return false;
}
return ListSequence.fromList(new ModelTestCollector(model, null, true).collect()).isNotEmpty();
}
},
NODE() {
@Override
protected List<ITestNodeWrapper> doCollect(JUnitSettings_Configuration configuration, MPSProject project, ProgressMonitor monitor) {
return TestUtils.wrapPointerStrings(project, configuration.getTestCases());
}
public String check(JUnitSettings_Configuration configuration, MPSProject project) {
if ((configuration.getTestCases() == null || configuration.getTestCases().isEmpty())) {
return "Classes list is empty.";
}
if (configuration.getTestCases() != null) {
for (String testCase : configuration.getTestCases()) {
SNodeReference pointer = PointerUtils.stringToPointer(testCase);
if (pointer == null) {
SNode testNode = pointer.resolve(project.getRepository());
if (testNode != null) {
SModel model = testNode.getModel();
SNode module = SModelOperations.getModuleStub(model);
if (!(SPropertyOperations.getBoolean(module, MetaAdapterFactory.getProperty(0x86ef829012bb4ca7L, 0x947f093788f263a9L, 0x5869770da61dfe1eL, 0x5869770da61dfe24L, "compileInMPS")))) {
return "The module's " + module + " compile output is not managed by MPS.";
}
}
if (testNode == null || TestNodeWrapperFactory.tryToWrap(testNode) == null) {
return "Could not find test case for id " + testCase + ".";
}
}
}
}
return null;
}
public boolean hasTests(JUnitSettings_Configuration configuration, MPSProject project) {
return ListSequence.fromList(this.doCollect(configuration, project, new EmptyProgressMonitor())).isNotEmpty();
}
},
METHOD() {
@Override
protected List<ITestNodeWrapper> doCollect(JUnitSettings_Configuration configuration, MPSProject project, ProgressMonitor monitor) {
return TestUtils.wrapPointerStrings(project, configuration.getTestMethods());
}
@Override
public String check(JUnitSettings_Configuration configuration, MPSProject project) {
if ((configuration.getTestMethods() == null || configuration.getTestMethods().isEmpty())) {
return "Methods list is empty.";
}
if (configuration.getTestMethods() != null) {
for (String method : configuration.getTestMethods()) {
SNodeReference pointer = PointerUtils.stringToPointer(method);
if (pointer == null) {
SNode testMethpdNode = pointer.resolve(project.getRepository());
if (testMethpdNode != null) {
SModel model = testMethpdNode.getModel();
SNode module = SModelOperations.getModuleStub(model);
if (!(SPropertyOperations.getBoolean(module, MetaAdapterFactory.getProperty(0x86ef829012bb4ca7L, 0x947f093788f263a9L, 0x5869770da61dfe1eL, 0x5869770da61dfe24L, "compileInMPS")))) {
return "The module's " + module + " compile output is not managed by MPS.";
}
}
if (testMethpdNode == null || TestNodeWrapperFactory.tryToWrap(testMethpdNode) == null) {
return "Could not find test method for id " + method + ".";
}
}
}
}
return null;
}
@Override
public boolean hasTests(JUnitSettings_Configuration configuration, MPSProject project) {
return ListSequence.fromList(this.doCollect(configuration, project, new EmptyProgressMonitor())).isNotEmpty();
}
};
private JUnitRunTypes() {
}
public final List<ITestNodeWrapper> collect(final JUnitSettings_Configuration configuration, final MPSProject project) {
final Wrappers._T<List<ITestNodeWrapper>> result = new Wrappers._T<List<ITestNodeWrapper>>();
ProgressManager.getInstance().run(new Task.Modal(project.getProject(), "Collecting Tests to Run", true) {
@Override
public void run(@NotNull ProgressIndicator indicator) {
final ProgressMonitor monitor = new ProgressMonitorAdapter(indicator);
project.getModelAccess().runReadAction(new Runnable() {
public void run() {
result.value = ListSequence.fromList(doCollect(configuration, project, monitor)).toListSequence();
}
});
}
});
return result.value;
}
@Nullable
private static SModel getModel(Project mpsProject, @Nls String modelName, String moduleName) {
if ((modelName == null || modelName.length() == 0)) {
return null;
}
if ((moduleName == null || moduleName.length() == 0)) {
return new ModuleRepositoryFacade(mpsProject).getModelByName(modelName);
}
SModule module = getModule(mpsProject, moduleName);
if (module == null) {
return null;
}
for (SModel model : Sequence.fromIterable(module.getModels())) {
if (model.getName().getValue().equals(modelName)) {
return model;
}
}
return null;
}
@Nullable
private static SModule getModule(Project mpsProject, @Nls String moduleName) {
if ((moduleName == null || moduleName.length() == 0)) {
return null;
}
return new ModuleRepositoryFacade(mpsProject).getModuleByName(moduleName);
}
protected abstract List<ITestNodeWrapper> doCollect(JUnitSettings_Configuration configuration, @NotNull MPSProject project, ProgressMonitor monitor);
public abstract boolean hasTests(JUnitSettings_Configuration configuration, @NotNull MPSProject project);
public abstract String check(JUnitSettings_Configuration configuration, @NotNull MPSProject project);
private static boolean isEmptyString(String str) {
return str == null || str.length() == 0;
}
}