blob: 16b5f1ad883370fed8757a6051fc995c7fc97944 [file] [log] [blame]
/*******************************************************************************
* 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());
}
}