package jetbrains.mps.ide.vcs.test.merge;
/*Generated by MPS */
import jetbrains.mps.project.MPSProject;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vcs.changes.ChangeListManagerImpl;
import jetbrains.mps.vcs.changesmanager.CurrentDifference;
import com.intellij.openapi.vcs.AbstractVcs;
import jetbrains.mps.tool.environment.Environment;
import org.junit.BeforeClass;
import jetbrains.mps.tool.environment.IdeaEnvironment;
import jetbrains.mps.tool.environment.EnvironmentConfig;
import jetbrains.mps.smodel.SReference;
import com.intellij.openapi.util.registry.Registry;
import java.io.File;
import org.junit.AfterClass;
import org.junit.Before;
import jetbrains.mps.vcs.changesmanager.CurrentDifferenceRegistry;
import com.intellij.openapi.vcs.impl.projectlevelman.AllVcses;
import org.junit.Assume;
import com.intellij.openapi.vcs.VcsShowConfirmationOption;
import javax.swing.SwingUtilities;
import com.intellij.openapi.vcs.FileStatusManager;
import java.lang.reflect.InvocationTargetException;
import org.junit.After;
import jetbrains.mps.nodeEditor.InspectorTool;
import org.junit.Assert;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import com.intellij.openapi.vcs.ProjectLevelVcsManager;
import com.intellij.openapi.vcs.VcsConfiguration;
import jetbrains.mps.smodel.ModelAccess;
import jetbrains.mps.vcs.diff.ChangeSet;
import jetbrains.mps.vcs.diff.ChangeSetBuilder;
import jetbrains.mps.vcs.changesmanager.roots.NodeFileStatusMappingExt;
import org.jetbrains.mps.openapi.model.SModel;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SModelOperations;
import jetbrains.mps.internal.collections.runtime.IVisitor;
import org.jetbrains.mps.openapi.model.SNode;
import com.intellij.openapi.vcs.FileStatus;
import jetbrains.mps.internal.collections.runtime.Sequence;
import jetbrains.mps.internal.collections.runtime.IWhereFilter;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vcs.changes.Change;
import java.util.List;
import com.intellij.openapi.vcs.VcsException;
import java.util.ArrayList;
import java.util.Arrays;
import com.intellij.openapi.vcs.rollback.RollbackProgressListener;
import org.jetbrains.mps.openapi.model.EditableSModel;
import jetbrains.mps.smodel.ModuleRepositoryFacade;
import jetbrains.mps.ide.vfs.VirtualFileUtils;
import jetbrains.mps.extapi.persistence.FileDataSource;
import jetbrains.mps.vcs.diff.changes.ModelChange;
import jetbrains.mps.internal.collections.runtime.IterableUtils;
import jetbrains.mps.internal.collections.runtime.ISelector;
import jetbrains.mps.persistence.PersistenceRegistry;
public abstract class ChangesTestBase {
protected static MPSProject ourProject;
protected static boolean ourEnabled;
protected Project myIdeaProject;
protected ChangesManagerTestWaitHelper myWaitHelper;
protected ChangeListManagerImpl myChangeListManager;
protected CurrentDifference myDiff;
protected AbstractVcs myGitVcs;
protected static Environment ourEnvironment;
public ChangesTestBase() {
// todo add group changes tests
}
@BeforeClass
public static void setUp() {
ourEnvironment = IdeaEnvironment.getOrCreate(EnvironmentConfig.defaultConfig().withVcsPlugin());
SReference.disableLogging();
Registry.get("vcs.showConsole").setValue(false);
ourProject = ((MPSProject) ourEnvironment.openProject(new File(".")));
}
@AfterClass
public static void tearDown() {
ourEnabled = false;
ourEnvironment.flushAllEvents();
ourProject.dispose();
}
@Before
public void init() {
myIdeaProject = ourProject.getProject();
CurrentDifferenceRegistry.getInstance(myIdeaProject).getCommandQueue().setHadExceptions(false);
myWaitHelper = new ChangesManagerTestWaitHelper(myIdeaProject);
myWaitHelper.waitForChangesManager();
myGitVcs = AllVcses.getInstance(myIdeaProject).getByName("Git");
Assume.assumeNotNull(myGitVcs);
Assume.assumeNotNull(getTestModel());
myDiff = CurrentDifferenceRegistry.getInstance(myIdeaProject).getCurrentDifference((getTestModel()));
myChangeListManager = ChangeListManagerImpl.getInstanceImpl(myIdeaProject);
setAutoaddPolicy(VcsShowConfirmationOption.Value.DO_NOTHING_SILENTLY);
if (!(ChangesTestBase.ourEnabled)) {
myChangeListManager.ensureUpToDate(false);
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
FileStatusManager.getInstance(myIdeaProject).fileStatusesChanged();
}
});
} catch (InterruptedException e) {
throw new AssertionError(e);
} catch (InvocationTargetException e) {
throw new AssertionError(e);
}
checkAndEnable();
ChangesTestBase.ourEnabled = true;
}
}
@After
public void after() throws InvocationTargetException, InterruptedException {
revertMemChangesAndWait();
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
myIdeaProject.getComponent(InspectorTool.class).getInspector().editNode(null);
}
});
Assert.assertFalse(CurrentDifferenceRegistry.getInstance(myIdeaProject).getCommandQueue().hadExceptions());
myWaitHelper.dispose();
}
protected void checkAndEnable() {
Assert.assertNull(myDiff.getChangeSet());
myDiff.setEnabled(true);
myWaitHelper.waitForChangesManager();
Assert.assertTrue(ListSequence.fromList(myDiff.getChangeSet().getModelChanges()).isEmpty());
}
protected void setAutoaddPolicy(VcsShowConfirmationOption.Value value) {
ProjectLevelVcsManager vcsManager = ProjectLevelVcsManager.getInstance(myIdeaProject);
vcsManager.getStandardConfirmation(VcsConfiguration.StandardConfirmation.ADD, myGitVcs).setValue(value);
}
protected void testChanges(Runnable change) {
makeChangeAndWait(change);
ModelAccess.instance().runReadAction(new Runnable() {
public void run() {
ChangeSet cs = myDiff.getChangeSet();
ChangeSet rebuiltChangeSet = ChangeSetBuilder.buildChangeSet(cs.getOldModel(), cs.getNewModel());
Assert.assertEquals(getChangeSetString(rebuiltChangeSet), getChangeSetString(cs));
}
});
}
protected void makeChangeAndWait(Runnable change) {
ourProject.getModelAccess().executeCommandInEDT(change);
ourEnvironment.flushAllEvents();
myWaitHelper.waitForChangesManager();
}
protected void checkRootStatuses(final RootStatusItem... statuses) {
final NodeFileStatusMappingExt fsm = myIdeaProject.getComponent(NodeFileStatusMappingExt.class);
final SModel model = myDiff.getModelDescriptor();
// query for first time
ModelAccess.instance().runReadAction(new Runnable() {
public void run() {
ListSequence.fromList(SModelOperations.roots(model, null)).visitAll(new IVisitor<SNode>() {
public void visit(SNode r) {
fsm.getStatus(r);
}
});
}
});
// wait while statuses update
myWaitHelper.waitForChangesManager();
ModelAccess.instance().runReadAction(new Runnable() {
public void run() {
ListSequence.fromList(SModelOperations.roots(model, null)).visitAll(new IVisitor<SNode>() {
public void visit(final SNode r) {
FileStatus actual = fsm.getStatus(r);
FileStatus expected = check_l1nwgz_a0b0a0a0a0g0cb(Sequence.fromIterable(Sequence.fromArray(statuses)).findFirst(new IWhereFilter<RootStatusItem>() {
public boolean accept(RootStatusItem it) {
return it.rootName().equals(r.getName());
}
}));
Assert.assertSame(expected, actual);
}
});
}
});
}
protected void revertMemChangesAndWait() {
ModelAccess.instance().runWriteAction(new Runnable() {
public void run() {
getTestModel().reloadFromSource();
}
});
ourEnvironment.flushAllEvents();
myWaitHelper.waitForChangesManager();
Assert.assertTrue(ListSequence.fromList(check_l1nwgz_a0a3a03(myDiff.getChangeSet())).isEmpty());
}
protected void revertDiskChangesAndWait(VirtualFile modelFile) {
myChangeListManager.ensureUpToDate(false);
Change modelFileChange = myChangeListManager.getChange(modelFile);
List<VcsException> exceptions = ListSequence.fromList(new ArrayList<VcsException>());
myGitVcs.getRollbackEnvironment().rollbackChanges(Arrays.asList(modelFileChange), exceptions, RollbackProgressListener.EMPTY);
Assert.assertTrue(ListSequence.fromList(exceptions).isEmpty());
myWaitHelper.waitForFileStatusChange(modelFile, FileStatus.NOT_CHANGED);
myWaitHelper.waitForChangesManager();
Assert.assertTrue(ListSequence.fromList(check_l1nwgz_a0a8a23(myDiff.getChangeSet())).isEmpty());
}
protected EditableSModel getTestModel() {
return (EditableSModel) new ModuleRepositoryFacade(ourProject.getRepository()).getModelByName("jetbrains.mps.ide.vcs.test.testModel");
}
protected VirtualFile getTestModelFile() {
return VirtualFileUtils.getProjectVirtualFile(((FileDataSource) getTestModel().getSource()).getFile());
}
protected String getChangeSetString(ChangeSet changeSet) {
return getChangeSetString(changeSet.getModelChanges());
}
protected String getChangeSetString(List<ModelChange> modelChanges) {
return IterableUtils.join(ListSequence.fromList(modelChanges).select(new ISelector<ModelChange, String>() {
public String select(ModelChange c) {
return c.toString();
}
}).sort(new ISelector<String, String>() {
public String select(String s) {
return s;
}
}, true), "|");
}
public String getDefaultExt() {
return PersistenceRegistry.getInstance().getDefaultModelFactory().getFileExtension();
}
private static FileStatus check_l1nwgz_a0b0a0a0a0g0cb(RootStatusItem checkedDotOperand) {
if (null != checkedDotOperand) {
return checkedDotOperand.status();
}
return null;
}
private static List<ModelChange> check_l1nwgz_a0a3a03(ChangeSet checkedDotOperand) {
if (null != checkedDotOperand) {
return checkedDotOperand.getModelChanges();
}
return null;
}
private static List<ModelChange> check_l1nwgz_a0a8a23(ChangeSet checkedDotOperand) {
if (null != checkedDotOperand) {
return checkedDotOperand.getModelChanges();
}
return null;
}
}