blob: 953cc124ffc9656ac8050b59532f4cc62c5d6bea [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014 Obeo.
* 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:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.emf.compare.ide.ui.tests.structuremergeviewer.actions;
import static org.eclipse.emf.compare.DifferenceState.DISCARDED;
import static org.eclipse.emf.compare.DifferenceState.MERGED;
import static org.eclipse.emf.compare.DifferenceState.UNRESOLVED;
import static org.eclipse.emf.compare.internal.merge.MergeMode.ACCEPT;
import static org.eclipse.emf.compare.internal.merge.MergeMode.REJECT;
import static org.eclipse.emf.compare.internal.merge.MergeMode.getMergeMode;
import static org.junit.Assert.assertEquals;
import com.google.common.collect.Lists;
import java.io.IOException;
import java.util.ArrayList;
import org.eclipse.emf.compare.Comparison;
import org.eclipse.emf.compare.Diff;
import org.eclipse.emf.compare.EMFCompare;
import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions.MergeRunnableImpl;
import org.eclipse.emf.compare.internal.merge.MergeDataImpl;
import org.eclipse.emf.compare.merge.IMerger;
import org.eclipse.emf.compare.rcp.EMFCompareRCPPlugin;
import org.eclipse.emf.compare.scope.DefaultComparisonScope;
import org.eclipse.emf.compare.tests.framework.AbstractInputData;
import org.eclipse.emf.ecore.resource.Resource;
import org.junit.Before;
import org.junit.Test;
/**
* This test is related to the bug <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=434822">434822</a>
*
* @author <a href="mailto:arthur.daussy@obeo.fr">Arthur Daussy</a>
*/
@SuppressWarnings("restriction")
public class TestBug434822 {
private IMerger.Registry mergerRegistry;
private Diff rightDelete;
private Diff leftMove;
/**
* Set up the three test models.
* <p>
* <ul>
* <li>Origin.nodes: In this model we have a three nodes structured like this:
*
* <pre>
* Root - DeletedNode
* \ - MovingNode
* </pre>
*
* </li>
* <li>Left.node: In this model "MovingNode" has been moved under "DeletedNode"</li>
* <li>Right.nodes: In this model "DeletedNode" has been deleted.</li>
* </ul>
* </p>
* <p>
* A 3-way comparison between left.nodes (left input), right.node (right input) and origin.nodes (common
* ancestor) gives the resulting comparison model (two conflicting differences):
* <ul>
* <li>A difference for the deletion of "DeletedNode".</li>
* <li>A difference for moving "MovingNode"</li>
* <ul>
* </p>
*
* @throws IOException
*/
@Before
public void setUp() throws IOException {
Bug434822InputData inputData = new Bug434822InputData();
Resource left = inputData.getResource("left.nodes"); //$NON-NLS-1$
Resource right = inputData.getResource("right.nodes"); //$NON-NLS-1$
Resource origin = inputData.getResource("origin.nodes"); //$NON-NLS-1$
DefaultComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
// Add a IMergeData to handle status decorations on Diffs
comparison.eAdapters().add(new MergeDataImpl(true, false));
mergerRegistry = EMFCompareRCPPlugin.getDefault().getMergerRegistry();
// Keeps track of the 2 differences
for (Diff diff : comparison.getDifferences()) {
switch (diff.getKind()) {
case MOVE:
leftMove = diff;
break;
case DELETE:
rightDelete = diff;
break;
default:
}
}
}
/**
* Checks that accepting the deletion works properly (no crash and correct merge data).
*/
@Test
public void testMergeDataAfterAcceptingDeletion() {
ArrayList<Diff> uiDiff = Lists.newArrayList(rightDelete);
MergeRunnableImpl mergeRunnable = new MergeRunnableImpl(true, false, ACCEPT);
mergeRunnable.merge(uiDiff, false, mergerRegistry);
// Assert merge data and diff states
assertEquals(MERGED, rightDelete.getState());
assertEquals(ACCEPT, getMergeMode(rightDelete, true, false));
assertEquals(DISCARDED, leftMove.getState());
assertEquals(REJECT, getMergeMode(leftMove, true, false));
}
/**
* Checks that accepting the deletion works properly (no crash and correct merge data).
*/
@Test
public void testMergeDataAfterAcceptingDeletionSeveral() {
// Mocks the UI behavior of UI if the deleting diff is selected for merging (with cascading diff
// filter activated).
ArrayList<Diff> uiDiff = Lists.newArrayList(rightDelete, leftMove);
MergeRunnableImpl mergeRunnable = new MergeRunnableImpl(true, false, ACCEPT);
mergeRunnable.merge(uiDiff, false, mergerRegistry);
// Assert merge data and diff states
assertEquals(MERGED, rightDelete.getState());
assertEquals(ACCEPT, getMergeMode(rightDelete, true, false));
assertEquals(DISCARDED, leftMove.getState());
assertEquals(REJECT, getMergeMode(leftMove, true, false));
}
/**
* Checks that rejecting the deletion works properly (no crash and correct merge data).
*/
@Test
public void testMergeDataAfterRejectingDeletion() {
/*
* Mocks the UI behavior of UI if the deleting diff is selected for merging (with cascading diff
* filter activated).
*/
ArrayList<Diff> uiDiff = Lists.newArrayList(rightDelete);
MergeRunnableImpl mergeRunnable = new MergeRunnableImpl(true, false, REJECT);
mergeRunnable.merge(uiDiff, false, mergerRegistry);
// Assert merge data and diff states
assertEquals(DISCARDED, rightDelete.getState());
assertEquals(REJECT, getMergeMode(rightDelete, true, false));
assertEquals(UNRESOLVED, leftMove.getState());
}
/**
* Checks that accepting the movement works properly (no crash and correct merge data).
*/
@Test
public void testMergeDataAfterAcceptingMovement() {
// Mocks the UI behavior of UI if the movement diff is selected for merging.
ArrayList<Diff> uiDiff = Lists.newArrayList(leftMove);
MergeRunnableImpl mergeRunnable = new MergeRunnableImpl(true, false, ACCEPT);
mergeRunnable.merge(uiDiff, false, mergerRegistry);
// Assert merge data
assertEquals(MERGED, leftMove.getState());
assertEquals(ACCEPT, getMergeMode(leftMove, true, false));
assertEquals(DISCARDED, rightDelete.getState());
assertEquals(REJECT, getMergeMode(rightDelete, true, false));
}
/**
* Checks that rejecting the movement works properly (no crash and correct merge data).
*/
@Test
public void testMergeDataAfterRejectingMovement() {
// Mocks the UI behavior of UI if the movement diff is selected for merging.
ArrayList<Diff> uiDiff = Lists.newArrayList(leftMove);
MergeRunnableImpl mergeRunnable = new MergeRunnableImpl(true, false, REJECT);
mergeRunnable.merge(uiDiff, false, mergerRegistry);
// Assert merge data
assertEquals(DISCARDED, leftMove.getState());
assertEquals(REJECT, getMergeMode(leftMove, true, false));
assertEquals(UNRESOLVED, rightDelete.getState());
}
/**
* Input data for this bug.
*
* @author <a href="mailto:arthur.daussy@obeo.fr">Arthur Daussy</a>
*/
public class Bug434822InputData extends AbstractInputData {
private static final String PATH_PREFIX = "data/_434822/"; //$NON-NLS-1$
public Resource getResource(String resourceName) throws IOException {
StringBuilder resourceURL = new StringBuilder(PATH_PREFIX);
resourceURL.append(resourceName);
return loadFromClassLoader(resourceURL.toString());
}
}
}