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);
}
}
}