package jetbrains.mps.testbench.suite.pluginSolution.plugin; /*Generated by MPS */ import jetbrains.mps.workbench.action.BaseAction; import javax.swing.Icon; import com.intellij.openapi.actionSystem.AnActionEvent; import java.util.Map; import org.jetbrains.mps.openapi.language.SLanguage; import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory; import jetbrains.mps.InternalFlag; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.internal.collections.runtime.MapSequence; import jetbrains.mps.smodel.SModelInternal; import org.jetbrains.annotations.NotNull; import com.intellij.openapi.project.Project; import com.intellij.openapi.actionSystem.CommonDataKeys; import jetbrains.mps.project.MPSProject; import jetbrains.mps.ide.actions.MPSCommonDataKeys; import jetbrains.mps.baseLanguage.closures.runtime.Wrappers; import com.intellij.ide.IdeEventQueue; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.ProgressIndicator; import java.util.List; import org.jetbrains.mps.openapi.module.SModuleReference; import org.jetbrains.mps.openapi.module.SModule; import jetbrains.mps.smodel.ModuleRepositoryFacade; import org.jetbrains.mps.openapi.model.SNode; import java.util.ArrayList; import jetbrains.mps.ide.ThreadUtils; import jetbrains.mps.internal.collections.runtime.ListSequence; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SModelOperations; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import jetbrains.mps.testbench.suite.behavior.IModuleRef__BehaviorDescriptor; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations; import jetbrains.mps.testbench.suite.behavior.ITestRef__BehaviorDescriptor; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import jetbrains.mps.project.AbstractModule; import jetbrains.mps.smodel.SModelStereotype; import org.jetbrains.mps.openapi.model.EditableSModel; import jetbrains.mps.project.Solution; import jetbrains.mps.internal.collections.runtime.Sequence; import jetbrains.mps.internal.collections.runtime.ISelector; import com.intellij.openapi.wm.IdeFrame; import com.intellij.openapi.wm.WindowManager; public class CollectTests_Action extends BaseAction { private static final Icon ICON = null; public CollectTests_Action() { super("Collect Tests", "", ICON); this.setIsAlwaysVisible(false); this.setExecuteOutsideCommand(true); } @Override public boolean isDumbAware() { return true; } @Override public boolean isApplicable(AnActionEvent event, final Map<String, Object> _params) { final SLanguage lang = MetaAdapterFactory.getLanguage(0xd3c5a46fb8c247dbL, 0xad0a30b8f19c2055L, "jetbrains.mps.testbench.suite"); return InternalFlag.isInternalMode() && CollectTests_Action.this.isUserEditableModel(((SModel) MapSequence.fromMap(_params).get("modelDesc")), _params) && ((SModelInternal) ((SModel) MapSequence.fromMap(_params).get("modelDesc"))).importedLanguageIds().contains(lang); } @Override public void doUpdate(@NotNull AnActionEvent event, final Map<String, Object> _params) { this.setEnabledState(event.getPresentation(), this.isApplicable(event, _params)); } @Override protected boolean collectActionData(AnActionEvent event, final Map<String, Object> _params) { if (!(super.collectActionData(event, _params))) { return false; } { Project p = event.getData(CommonDataKeys.PROJECT); MapSequence.fromMap(_params).put("project", p); if (p == null) { return false; } } { MPSProject p = event.getData(MPSCommonDataKeys.MPS_PROJECT); MapSequence.fromMap(_params).put("mpsProject", p); if (p == null) { return false; } } { SModel p = event.getData(MPSCommonDataKeys.MODEL); MapSequence.fromMap(_params).put("modelDesc", p); if (p == null) { return false; } } return true; } @Override public void doExecute(@NotNull final AnActionEvent event, final Map<String, Object> _params) { final Wrappers._boolean done = new Wrappers._boolean(false); IdeEventQueue.getInstance().flushQueue(); ProgressManager.getInstance().runProcessWithProgressSynchronously(new Runnable() { public void run() { ProgressIndicator proInd = ProgressManager.getInstance().getProgressIndicator(); proInd.pushState(); try { done.value = CollectTests_Action.this.doExecute(proInd, _params); } finally { proInd.popState(); } } }, "Collecting Tests", true, ((Project) MapSequence.fromMap(_params).get("project"))); if (!(done.value)) { CollectTests_Action.this.displayInfo("Collect Tests action cancelled", _params); } } private boolean doExecute(ProgressIndicator proInd, final Map<String, Object> _params) { final SModel model = ((SModel) MapSequence.fromMap(_params).get("modelDesc")); final Wrappers._T<List<SModuleReference>> solutions = new Wrappers._T<List<SModuleReference>>(); ((MPSProject) MapSequence.fromMap(_params).get("mpsProject")).getRepository().getModelAccess().runReadAction(new Runnable() { public void run() { solutions.value = CollectTests_Action.this.allSolutions(_params); } }); int done = 0; for (SModuleReference mref : solutions.value) { if (proInd.isCanceled()) { return false; } proInd.setText("Processing " + mref.getModuleName()); final SModule module = ModuleRepositoryFacade.getInstance().getModule(mref); if (module != null) { for (final SModel smodel : module.getModels()) { if (!(CollectTests_Action.this.isUserEditableGeneratableModel(smodel, _params))) { continue; } final List<SNode> tests = new ArrayList<SNode>(); final Wrappers._boolean collected = new Wrappers._boolean(); ((MPSProject) MapSequence.fromMap(_params).get("mpsProject")).getRepository().getModelAccess().runReadAction(new Runnable() { public void run() { collected.value = new TestCollector().collectTests(smodel, tests); } }); if (collected.value) { ThreadUtils.runInUIThreadAndWait(new Runnable() { public void run() { ((MPSProject) MapSequence.fromMap(_params).get("mpsProject")).getRepository().getModelAccess().executeCommand(new Runnable() { public void run() { final Wrappers._T<SNode> suite = new Wrappers._T<SNode>(null); ((MPSProject) MapSequence.fromMap(_params).get("mpsProject")).getRepository().getModelAccess().runReadAction(new Runnable() { public void run() { suite.value = ListSequence.fromList(SModelOperations.roots(model, MetaAdapterFactory.getConcept(0xd3c5a46fb8c247dbL, 0xad0a30b8f19c2055L, 0x3e81ed1e2be77cb5L, "jetbrains.mps.testbench.suite.structure.ModuleSuite"))).findFirst(new IWhereFilter<SNode>() { public boolean accept(SNode it) { return IModuleRef__BehaviorDescriptor.moduleReference_id173Z5qAOun8.invoke(SLinkOperations.getTarget(it, MetaAdapterFactory.getContainmentLink(0xd3c5a46fb8c247dbL, 0xad0a30b8f19c2055L, 0x3e81ed1e2be77cb5L, 0x11c3fc56a6d1cc88L, "moduleRef"))).equals(module.getModuleReference()); } }); } }); if (suite.value == null) { suite.value = SModelOperations.createNewRootNode(model, MetaAdapterFactory.getConcept(0xd3c5a46fb8c247dbL, 0xad0a30b8f19c2055L, 0x3e81ed1e2be77cb5L, "jetbrains.mps.testbench.suite.structure.ModuleSuite")); SNode sref = SLinkOperations.setNewChild(suite.value, MetaAdapterFactory.getContainmentLink(0xd3c5a46fb8c247dbL, 0xad0a30b8f19c2055L, 0x3e81ed1e2be77cb5L, 0x11c3fc56a6d1cc88L, "moduleRef"), MetaAdapterFactory.getConcept(0xd3c5a46fb8c247dbL, 0xad0a30b8f19c2055L, 0x11c3fc56a6d1cbdcL, "jetbrains.mps.testbench.suite.structure.SolutionRef")); SModuleReference mref = module.getModuleReference(); SPropertyOperations.set(sref, MetaAdapterFactory.getProperty(0xd3c5a46fb8c247dbL, 0xad0a30b8f19c2055L, 0x11c3fc56a6d1cbdcL, 0x11c3fc56a6d1cbddL, "moduleFQName"), mref.getModuleName()); SPropertyOperations.set(sref, MetaAdapterFactory.getProperty(0xd3c5a46fb8c247dbL, 0xad0a30b8f19c2055L, 0x11c3fc56a6d1cbdcL, 0x11c3fc56a6d1cbdeL, "moduleID"), mref.getModuleId().toString()); } for (final SNode tref : tests) { if (!(ListSequence.fromList(SLinkOperations.getChildren(suite.value, MetaAdapterFactory.getContainmentLink(0xd3c5a46fb8c247dbL, 0xad0a30b8f19c2055L, 0x3e81ed1e2be77cb5L, 0x3e81ed1e2be77cbeL, "testRef"))).any(new IWhereFilter<SNode>() { public boolean accept(SNode it) { return (boolean) ITestRef__BehaviorDescriptor.isSame_id1ouvi_ymQH.invoke(it, tref); } }))) { ListSequence.fromList(SLinkOperations.getChildren(suite.value, MetaAdapterFactory.getContainmentLink(0xd3c5a46fb8c247dbL, 0xad0a30b8f19c2055L, 0x3e81ed1e2be77cb5L, 0x3e81ed1e2be77cbeL, "testRef"))).addElement(SNodeOperations.cast(tref, MetaAdapterFactory.getInterfaceConcept(0xd3c5a46fb8c247dbL, 0xad0a30b8f19c2055L, 0x3e81ed1e2be77cbaL, "jetbrains.mps.testbench.suite.structure.ITestRef"))); ((SModelInternal) model).addModelImport(smodel.getReference(), false); ((AbstractModule) ((SModel) MapSequence.fromMap(_params).get("modelDesc")).getModule()).addDependency(module.getModuleReference(), false); } } } }); } }); } } } proInd.setFraction(((double) ++done) / ListSequence.fromList(solutions.value).count()); } return true; } private boolean isUserEditableModel(SModel md, final Map<String, Object> _params) { if (!(SModelStereotype.isUserModel(md))) { return false; } return md instanceof EditableSModel && !(md.isReadOnly()); } private boolean isUserEditableGeneratableModel(SModel md, final Map<String, Object> _params) { return CollectTests_Action.this.isUserEditableModel(md, _params) && jetbrains.mps.util.SNodeOperations.isGeneratable(md); } private List<SModuleReference> allSolutions(final Map<String, Object> _params) { Iterable<Solution> allSolutions = ModuleRepositoryFacade.getInstance().getAllModules(Solution.class); return Sequence.fromIterable(allSolutions).select(new ISelector<Solution, SModuleReference>() { public SModuleReference select(Solution s) { return s.getModuleReference(); } }).toListSequence(); } private void displayInfo(String info, final Map<String, Object> _params) { IdeFrame frame = WindowManager.getInstance().getIdeFrame(((Project) MapSequence.fromMap(_params).get("project"))); if (frame != null) { frame.getStatusBar().setInfo(info); } } }