package jetbrains.mps.ide.vcs.test.merge;
/*Generated by MPS */
import org.junit.BeforeClass;
import jetbrains.mps.RuntimeFlags;
import org.junit.AfterClass;
import org.junit.Test;
import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes;
import org.jetbrains.mps.openapi.model.SModel;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SModelOperations;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.smodel.CopyUtil;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations;
import org.jetbrains.mps.openapi.model.SNodeId;
import jetbrains.mps.persistence.PersistenceUtil;
import jetbrains.mps.baseLanguage.closures.runtime.Wrappers;
import jetbrains.mps.smodel.ModelAccess;
import jetbrains.mps.vcs.diff.merge.MergeSession;
import org.junit.Assert;
import jetbrains.mps.internal.collections.runtime.Sequence;
import jetbrains.mps.internal.collections.runtime.IWhereFilter;
import jetbrains.mps.vcs.diff.changes.ModelChange;
import jetbrains.mps.vcs.diff.ModelChangeSet;
import jetbrains.mps.vcs.diff.ChangeSetBuilder;
import jetbrains.mps.vcs.diff.ChangeSet;
import jetbrains.mps.internal.collections.runtime.ISelector;
import org.jetbrains.mps.openapi.persistence.PersistenceFacade;
import jetbrains.mps.smodel.SModelUtil_new;
/**
* Tests merge algorithm
*/
public class MergeTest extends ChangesTestBase {
private static boolean ourMergeDriverModeWas;
public MergeTest() {
}
@BeforeClass
public static void setUpClass() {
MergeTest.ourMergeDriverModeWas = RuntimeFlags.isMergeDriverMode();
RuntimeFlags.setMergeDriverMode(true);
}
@AfterClass
public static void tearDownClass() {
RuntimeFlags.setMergeDriverMode(MergeTest.ourMergeDriverModeWas);
}
@Test
public void testOnlyMineChanges() {
testMerge(new _FunctionTypes._return_P2_E0<SModel, SModel, SModel>() {
public SModel invoke(SModel mine, SModel theirs) {
SPropertyOperations.set(ListSequence.fromList(SModelOperations.roots(mine, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca66L, "jetbrains.mps.baseLanguage.structure.ClassConcept"))).first(), MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name"), "ChangedName");
return mine;
}
});
}
@Test
public void testOnlyTheirsChanges() {
testMerge(new _FunctionTypes._return_P2_E0<SModel, SModel, SModel>() {
public SModel invoke(SModel mine, SModel theirs) {
SPropertyOperations.set(ListSequence.fromList(SModelOperations.roots(theirs, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca66L, "jetbrains.mps.baseLanguage.structure.ClassConcept"))).first(), MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name"), "ChangedName");
return theirs;
}
});
}
@Test
public void testSymmetricChanges_AddRoot() {
testMerge(new _FunctionTypes._return_P2_E0<SModel, SModel, SModel>() {
public SModel invoke(SModel mine, SModel theirs) {
SNode newRoot = createClassConcept_u0wfvp_a0a0a0a0m();
SModelOperations.addRootNode(theirs, newRoot);
SModelOperations.addRootNode(mine, CopyUtil.copyAndPreserveId(newRoot));
return mine;
}
});
}
@Test
public void testSymmetricChanges_DeleteRoot() {
testMerge(new _FunctionTypes._return_P2_E0<SModel, SModel, SModel>() {
public SModel invoke(SModel mine, SModel theirs) {
SNodeOperations.deleteNode(ListSequence.fromList(SModelOperations.roots(mine, null)).first());
SNodeOperations.deleteNode(ListSequence.fromList(SModelOperations.roots(theirs, null)).first());
return mine;
}
});
}
@Test
public void testSymmetricChanges_AddChild() {
testMerge(new _FunctionTypes._return_P2_E0<SModel, SModel, SModel>() {
public SModel invoke(SModel mine, SModel theirs) {
SNode newChild = createInstanceMethodDeclaration_u0wfvp_a0a0a0a0q();
ListSequence.fromList(SLinkOperations.getChildren(ListSequence.fromList(SModelOperations.roots(theirs, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca66L, "jetbrains.mps.baseLanguage.structure.ClassConcept"))).first(), MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101d9d3ca30L, 0x4a9a46de59132803L, "member"))).addElement(newChild);
ListSequence.fromList(SLinkOperations.getChildren(ListSequence.fromList(SModelOperations.roots(mine, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca66L, "jetbrains.mps.baseLanguage.structure.ClassConcept"))).first(), MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101d9d3ca30L, 0x4a9a46de59132803L, "member"))).addElement(((SNode) CopyUtil.copyAndPreserveId(newChild)));
return mine;
}
});
}
@Test
public void testSymmetricChanges_Property() {
testMerge(new _FunctionTypes._return_P2_E0<SModel, SModel, SModel>() {
public SModel invoke(SModel mine, SModel theirs) {
SPropertyOperations.set(ListSequence.fromList(SModelOperations.roots(theirs, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca66L, "jetbrains.mps.baseLanguage.structure.ClassConcept"))).first(), MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name"), "ChangedName");
SPropertyOperations.set(ListSequence.fromList(SModelOperations.roots(mine, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca66L, "jetbrains.mps.baseLanguage.structure.ClassConcept"))).first(), MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name"), "ChangedName");
return mine;
}
});
}
@Test
public void testSymmetricChanges_Link() {
testMerge(new _FunctionTypes._return_P2_E0<SModel, SModel, SModel>() {
public SModel invoke(SModel mine, SModel theirs) {
SNodeId returnTypeId = SLinkOperations.getTarget(SNodeOperations.getNode("r:296ba97d-4b26-4d06-be61-297d86180cce(jetbrains.mps.ide.vcs.test.testModel)", "8885850892994216610"), MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b1fcL, 0xf8cc56b1fdL, "returnType")).getNodeId();
SLinkOperations.setTarget(((SNode) theirs.getNode(returnTypeId)), MetaAdapterFactory.getReferenceLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101de48bf9eL, 0x101de490babL, "classifier"), SNodeOperations.getNode("r:296ba97d-4b26-4d06-be61-297d86180cce(jetbrains.mps.ide.vcs.test.testModel)", "5876208808348821705"));
SLinkOperations.setTarget(((SNode) mine.getNode(returnTypeId)), MetaAdapterFactory.getReferenceLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101de48bf9eL, 0x101de490babL, "classifier"), SNodeOperations.getNode("r:296ba97d-4b26-4d06-be61-297d86180cce(jetbrains.mps.ide.vcs.test.testModel)", "5876208808348821705"));
return mine;
}
});
}
@Test
public void testTwoSideMerge() {
testMerge(new _FunctionTypes._return_P2_E0<SModel, SModel, SModel>() {
public SModel invoke(SModel mine, SModel theirs) {
SNode newChild = createInstanceMethodDeclaration_u0wfvp_a0a0a0a0w();
ListSequence.fromList(SLinkOperations.getChildren(ListSequence.fromList(SModelOperations.roots(theirs, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca66L, "jetbrains.mps.baseLanguage.structure.ClassConcept"))).first(), MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101d9d3ca30L, 0x4a9a46de59132803L, "member"))).addElement(newChild);
SPropertyOperations.set(ListSequence.fromList(SModelOperations.roots(mine, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca66L, "jetbrains.mps.baseLanguage.structure.ClassConcept"))).first(), MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name"), "ChangedName");
String baseString = PersistenceUtil.saveModel(getTestModel(), getDefaultExt());
SModel result = PersistenceUtil.loadModel(baseString);
ListSequence.fromList(SLinkOperations.getChildren(ListSequence.fromList(SModelOperations.roots(result, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca66L, "jetbrains.mps.baseLanguage.structure.ClassConcept"))).first(), MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101d9d3ca30L, 0x4a9a46de59132803L, "member"))).addElement(((SNode) CopyUtil.copyAndPreserveId(newChild)));
SPropertyOperations.set(ListSequence.fromList(SModelOperations.roots(result, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca66L, "jetbrains.mps.baseLanguage.structure.ClassConcept"))).first(), MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name"), "ChangedName");
return result;
}
});
}
private void testMerge(final _FunctionTypes._return_P2_E0<? extends SModel, ? super SModel, ? super SModel> changer) {
final Wrappers._T<SModel> mine = new Wrappers._T<SModel>();
final Wrappers._T<SModel> theirs = new Wrappers._T<SModel>();
ModelAccess.instance().runReadAction(new Runnable() {
public void run() {
String baseString = PersistenceUtil.saveModel(getTestModel(), getDefaultExt());
mine.value = PersistenceUtil.loadModel(baseString);
theirs.value = PersistenceUtil.loadModel(baseString);
SModel result = changer.invoke(mine.value, theirs.value);
final MergeSession session = MergeSession.createMergeSession(getTestModel(), mine.value, theirs.value);
Assert.assertTrue(Sequence.fromIterable(session.getAllChanges()).all(new IWhereFilter<ModelChange>() {
public boolean accept(ModelChange c) {
return Sequence.fromIterable(session.getConflictedWith(c)).isEmpty();
}
}));
session.applyChanges(Sequence.fromIterable(session.getAllChanges()).toListSequence());
ModelChangeSet changes = ChangeSetBuilder.buildChangeSet(result, session.getResultModel());
Assert.assertTrue(dumpChangeSet(changes, session), ListSequence.fromList(changes.getModelChanges()).isEmpty());
}
});
}
private static String dumpChangeSet(ChangeSet changeSet, MergeSession session) {
StringBuffer buf = new StringBuffer();
for (ModelChange change : ListSequence.fromList(changeSet.getModelChanges()).sort(new ISelector<ModelChange, String>() {
public String select(ModelChange c) {
return c.toString();
}
}, true)) {
buf.append(change).append("\n");
for (ModelChange conflicting : Sequence.fromIterable(session.getConflictedWith(change)).sort(new ISelector<ModelChange, String>() {
public String select(ModelChange c) {
return c.toString();
}
}, true)) {
buf.append(" ").append(conflicting).append("\n");
}
}
return buf.toString();
}
private static SNode createClassConcept_u0wfvp_a0a0a0a0m() {
PersistenceFacade facade = PersistenceFacade.getInstance();
SNode n1 = SModelUtil_new.instantiateConceptDeclaration(MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca66L, "jetbrains.mps.baseLanguage.structure.ClassConcept"), null, null, false);
return n1;
}
private static SNode createInstanceMethodDeclaration_u0wfvp_a0a0a0a0q() {
PersistenceFacade facade = PersistenceFacade.getInstance();
SNode n1 = SModelUtil_new.instantiateConceptDeclaration(MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b21dL, "jetbrains.mps.baseLanguage.structure.InstanceMethodDeclaration"), null, null, false);
{
n1.setProperty(MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name"), "newMethod");
SNode n2 = SModelUtil_new.instantiateConceptDeclaration(MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b200L, "jetbrains.mps.baseLanguage.structure.StatementList"), null, null, false);
n1.addChild(MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b1fcL, 0xf8cc56b1ffL, "body"), n2);
SNode n3 = SModelUtil_new.instantiateConceptDeclaration(MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc6bf96dL, "jetbrains.mps.baseLanguage.structure.VoidType"), null, null, false);
n1.addChild(MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b1fcL, 0xf8cc56b1fdL, "returnType"), n3);
}
return n1;
}
private static SNode createInstanceMethodDeclaration_u0wfvp_a0a0a0a0w() {
PersistenceFacade facade = PersistenceFacade.getInstance();
SNode n1 = SModelUtil_new.instantiateConceptDeclaration(MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b21dL, "jetbrains.mps.baseLanguage.structure.InstanceMethodDeclaration"), null, null, false);
{
n1.setProperty(MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name"), "newMethod");
SNode n2 = SModelUtil_new.instantiateConceptDeclaration(MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b200L, "jetbrains.mps.baseLanguage.structure.StatementList"), null, null, false);
n1.addChild(MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b1fcL, 0xf8cc56b1ffL, "body"), n2);
SNode n3 = SModelUtil_new.instantiateConceptDeclaration(MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc6bf96dL, "jetbrains.mps.baseLanguage.structure.VoidType"), null, null, false);
n1.addChild(MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b1fcL, 0xf8cc56b1fdL, "returnType"), n3);
}
return n1;
}
}