| /******************************************************************************* |
| * Copyright (C) 2016 Ericsson and others. |
| * |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Simon Delisle - initial API and implementation |
| * Philip Langer - refactoring of test cases |
| *******************************************************************************/ |
| package org.eclipse.papyrus.compare.diagram.tests.resourceattachmentchange.move; |
| |
| import static com.google.common.collect.Iterables.find; |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertFalse; |
| import static org.junit.Assert.assertNotNull; |
| import static org.junit.Assert.assertTrue; |
| |
| import java.io.File; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.emf.common.util.BasicMonitor; |
| import org.eclipse.emf.common.util.EList; |
| import org.eclipse.emf.common.util.URI; |
| import org.eclipse.emf.compare.Comparison; |
| import org.eclipse.emf.compare.Diff; |
| import org.eclipse.emf.compare.DifferenceKind; |
| import org.eclipse.emf.compare.MatchResource; |
| import org.eclipse.emf.compare.ResourceAttachmentChange; |
| import org.eclipse.emf.compare.diagram.internal.merge.CompareDiagramMerger; |
| import org.eclipse.emf.compare.ide.ui.tests.workspace.TestProject; |
| import org.eclipse.emf.compare.merge.IMerger; |
| import org.eclipse.emf.compare.uml2.internal.merge.UMLMerger; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.resource.Resource; |
| import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; |
| import org.eclipse.gmf.runtime.notation.Diagram; |
| import org.eclipse.papyrus.compare.diagram.tests.AbstractGitTestCase; |
| import org.junit.Test; |
| |
| import com.google.common.base.Predicate; |
| |
| @SuppressWarnings("restriction") |
| public class ResourceAttachmentChangeMoveOrderTests extends AbstractGitTestCase { |
| |
| /** Path to the test data. */ |
| private static final String TEST_DATA_PATH = "src/org/eclipse/papyrus/compare/diagram/tests/resourceattachmentchange/move/data/"; |
| |
| /** Path of model files within the test data. */ |
| private static final String TEST_MODEL_PATH = "caseBug488089/"; |
| |
| /** Path of ancestor model files within the test data. */ |
| private static final String ANCESTOR_PATH = TEST_MODEL_PATH + "ancestor/"; |
| |
| /** Path of left model files within the test data. */ |
| private static final String LEFT_PATH = TEST_MODEL_PATH + "left/"; |
| |
| /** Path of right model files within the test data. */ |
| private static final String RIGHT_PATH = TEST_MODEL_PATH + "right/"; |
| |
| /** Name of component diagram 2. */ |
| private static final String COMPONENT_DIAGRAM_MODEL2 = "ComponentDiagramModel2"; |
| |
| /** Name of component diagram 2. */ |
| private static final String COMPONENT_DIAGRAM_MODEL3 = "ComponentDiagramModel3"; |
| |
| private ResourceSetImpl resourceSet; |
| |
| private IProject iProject; |
| |
| private TestProject testProject; |
| |
| private IFile modelDi; |
| |
| private IFile modelNotation; |
| |
| private IFile modelUml; |
| |
| private IFile model2Di; |
| |
| private IFile model2Notation; |
| |
| private IFile model2Uml; |
| |
| private IFile model3Di; |
| |
| private IFile model3Notation; |
| |
| private IFile model3Uml; |
| |
| /** |
| * Checkout BRANCH_2 and compare with BRANCH_1 (contain the move). 2 {@link ResourceAttachmentChange |
| * resource attachment changes} of kind MOVE. Merge ComponentDiagramModel3 diff then |
| * ComponentDiagramModel2 diff. In the resulting model, the order should be preserved |
| * (ComponentDiagramModel2 before ComponentDiagramModel3). |
| */ |
| @Test |
| public void testOrderAfterManuallyApplyingDiffs() throws Exception { |
| setUpRepositoryCaseBug488089(); |
| repository.checkoutBranch(BRANCH_2); |
| Comparison comparison = compare(BRANCH_2, BRANCH_1, modelNotation); |
| |
| EList<Diff> diffs = comparison.getDifferences(); |
| Diff diffComponentDiagramModel2 = find(diffs, resourceAttachmentMoveDiff(COMPONENT_DIAGRAM_MODEL2)); |
| Diff diffComponentDiagramModel3 = find(diffs, resourceAttachmentMoveDiff(COMPONENT_DIAGRAM_MODEL3)); |
| |
| IMerger.Registry mergerRegistry; |
| mergerRegistry = IMerger.RegistryImpl.createStandaloneInstance(); |
| final IMerger umlMerger = new UMLMerger(); |
| umlMerger.setRanking(11); |
| final IMerger diagramMerger = new CompareDiagramMerger(); |
| diagramMerger.setRanking(11); |
| mergerRegistry.add(umlMerger); |
| mergerRegistry.add(diagramMerger); |
| |
| mergerRegistry.getHighestRankingMerger(diffComponentDiagramModel3) |
| .copyRightToLeft(diffComponentDiagramModel3, new BasicMonitor()); |
| mergerRegistry.getHighestRankingMerger(diffComponentDiagramModel2) |
| .copyRightToLeft(diffComponentDiagramModel2, new BasicMonitor()); |
| |
| checkOrderInLeftResource(comparison.getMatchedResources()); |
| testProject.dispose(); |
| } |
| |
| private void setUpRepositoryCaseBug488089() throws Exception { |
| resourceSet = new ResourceSetImpl(); |
| File workingDirectory = repository.getRepository().getWorkTree(); |
| testProject = new TestProject("Project", workingDirectory.getAbsolutePath()); |
| iProject = testProject.getProject(); |
| repository.connect(iProject); |
| |
| modelDi = addToProject(TEST_DATA_PATH, testProject, iProject, ANCESTOR_PATH + "model.di", ""); |
| modelNotation = addToProject(TEST_DATA_PATH, testProject, iProject, ANCESTOR_PATH + "model.notation", |
| ""); |
| modelUml = addToProject(TEST_DATA_PATH, testProject, iProject, ANCESTOR_PATH + "model.uml", ""); |
| |
| model2Di = addToProject(TEST_DATA_PATH, testProject, iProject, ANCESTOR_PATH + "model2.di", ""); |
| model2Notation = addToProject(TEST_DATA_PATH, testProject, iProject, |
| ANCESTOR_PATH + "model2.notation", ""); |
| model2Uml = addToProject(TEST_DATA_PATH, testProject, iProject, ANCESTOR_PATH + "model2.uml", ""); |
| |
| model3Di = addToProject(TEST_DATA_PATH, testProject, iProject, ANCESTOR_PATH + "model3.di", ""); |
| model3Notation = addToProject(TEST_DATA_PATH, testProject, iProject, |
| ANCESTOR_PATH + "model3.notation", ""); |
| model3Uml = addToProject(TEST_DATA_PATH, testProject, iProject, ANCESTOR_PATH + "model3.uml", ""); |
| |
| repository.addAllAndCommit("1st-commit", true); |
| |
| repository.createBranch(MASTER, BRANCH_1); |
| repository.createBranch(MASTER, BRANCH_2); |
| |
| repository.checkoutBranch(BRANCH_2); |
| |
| modelDi = addToProject(TEST_DATA_PATH, testProject, iProject, LEFT_PATH + "model.di", ""); |
| modelNotation = addToProject(TEST_DATA_PATH, testProject, iProject, LEFT_PATH + "model.notation", ""); |
| modelUml = addToProject(TEST_DATA_PATH, testProject, iProject, LEFT_PATH + "model.uml", ""); |
| |
| model2Di = addToProject(TEST_DATA_PATH, testProject, iProject, LEFT_PATH + "model2.di", ""); |
| model2Notation = addToProject(TEST_DATA_PATH, testProject, iProject, LEFT_PATH + "model2.notation", |
| ""); |
| model2Uml = addToProject(TEST_DATA_PATH, testProject, iProject, LEFT_PATH + "model2.uml", ""); |
| |
| model3Di = addToProject(TEST_DATA_PATH, testProject, iProject, LEFT_PATH + "model3.di", ""); |
| model3Notation = addToProject(TEST_DATA_PATH, testProject, iProject, LEFT_PATH + "model3.notation", |
| ""); |
| model3Uml = addToProject(TEST_DATA_PATH, testProject, iProject, LEFT_PATH + "model3.uml", ""); |
| |
| repository.addAllAndCommit("2nd-commit-branch2", true); |
| |
| repository.checkoutBranch(BRANCH_1); |
| |
| modelDi = addToProject(TEST_DATA_PATH, testProject, iProject, RIGHT_PATH + "model.di", ""); |
| modelNotation = addToProject(TEST_DATA_PATH, testProject, iProject, RIGHT_PATH + "model.notation", |
| ""); |
| modelUml = addToProject(TEST_DATA_PATH, testProject, iProject, RIGHT_PATH + "model.uml", ""); |
| |
| removeFromProject(iProject, model2Di.getName()); |
| removeFromProject(iProject, model2Notation.getName()); |
| removeFromProject(iProject, model2Uml.getName()); |
| removeFromProject(iProject, model3Di.getName()); |
| removeFromProject(iProject, model3Notation.getName()); |
| removeFromProject(iProject, model3Uml.getName()); |
| |
| repository.addAllAndCommit("2nd-commit-branch1", true); |
| } |
| |
| private Predicate<Diff> resourceAttachmentMoveDiff(final String name) { |
| return new Predicate<Diff>() { |
| @Override |
| public boolean apply(Diff input) { |
| if (input instanceof ResourceAttachmentChange |
| && DifferenceKind.MOVE.equals(input.getKind())) { |
| final ResourceAttachmentChange change = (ResourceAttachmentChange)input; |
| final EObject left = change.getMatch().getLeft(); |
| if (left instanceof Diagram) { |
| return name.equals(((Diagram)left).getName()); |
| } |
| } |
| return false; |
| } |
| }; |
| } |
| |
| private void checkOrderInLeftResource(EList<MatchResource> comparisonResourceList) { |
| Resource leftResource = null; |
| for (MatchResource matchResource : comparisonResourceList) { |
| if (matchResource.getLeftURI().contains("model.notation")) { |
| leftResource = matchResource.getLeft(); |
| break; |
| } |
| } |
| |
| assertNotNull(leftResource); |
| Diagram diagramModel2 = (Diagram)leftResource.getContents().get(1); |
| Diagram diagramModel3 = (Diagram)leftResource.getContents().get(2); |
| assertEquals(COMPONENT_DIAGRAM_MODEL2, diagramModel2.getName()); |
| assertEquals(COMPONENT_DIAGRAM_MODEL3, diagramModel3.getName()); |
| } |
| |
| /** |
| * Checkout BRANCH_2 and merge with BRANCH_1 (contain the move). In the resulting file, the order of the |
| * elements (diagrams) should be the same as BRANCH_1 (componentDiagramModel2 before |
| * componentDiagramModel3). |
| */ |
| @Test |
| public void testOrderAfterLogicalMerge() throws Exception { |
| setUpRepositoryCaseBug488089(); |
| repository.checkoutBranch(BRANCH_2); |
| repository.mergeLogicalWithNewCommit(BRANCH_1); |
| checkContentsCaseBug488089(); |
| testProject.dispose(); |
| } |
| |
| private void checkContentsCaseBug488089() throws Exception { |
| assertTrue(repository.status().getConflicting().isEmpty()); |
| assertTrue(iProject.isAccessible()); |
| |
| assertTrue(modelDi.exists()); |
| assertTrue(modelNotation.exists()); |
| assertTrue(modelUml.exists()); |
| |
| URI modelNotationUri = URI.createPlatformResourceURI(modelNotation.getFullPath().toString(), true); |
| Resource resourceModelNotation = resourceSet.getResource(modelNotationUri, true); |
| |
| assertEquals(3, resourceModelNotation.getContents().size()); |
| Diagram diagramModel2 = (Diagram)resourceModelNotation.getContents().get(1); |
| Diagram diagramModel3 = (Diagram)resourceModelNotation.getContents().get(2); |
| |
| assertEquals(COMPONENT_DIAGRAM_MODEL2, diagramModel2.getName()); |
| assertEquals(COMPONENT_DIAGRAM_MODEL3, diagramModel3.getName()); |
| |
| assertFalse(model2Di.exists()); |
| assertFalse(model2Notation.exists()); |
| assertFalse(model2Uml.exists()); |
| assertFalse(model3Di.exists()); |
| assertFalse(model3Notation.exists()); |
| assertFalse(model3Uml.exists()); |
| } |
| } |