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