blob: 6deea781f74591d2bf1b23b74700f3541334b977 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 EclipseSource Munich 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:
* Alexandra Buzila - initial API and implementation
*******************************************************************************/
package org.eclipse.emf.compare.ide.ui.tests.unit;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.util.Set;
import org.eclipse.emf.compare.ide.ui.internal.EMFCompareIDEUIPlugin;
import org.eclipse.emf.compare.ide.ui.internal.preferences.EMFCompareUIPreferences;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jgit.api.Status;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* Merge tests for resources from a git repository that are not necessarily part of a logical model.
*
* @author Alexandra Buzila
*/
@SuppressWarnings({"nls", "restriction", })
public class GitMergeTest extends AbstractGitLogicalModelTest {
private final IPreferenceStore store = EMFCompareIDEUIPlugin.getDefault().getPreferenceStore();
@Override
@Before
public void setUp() throws Exception {
super.setUp();
// The test need to have the pre-merge preference set to true
store.setValue(EMFCompareUIPreferences.PRE_MERGE_MODELS_WHEN_CONFLICT, true);
}
@Override
@After
public void tearDown() throws Exception {
super.tearDown();
// Reset pre-merge default value to the classic one
store.setToDefault(EMFCompareUIPreferences.PRE_MERGE_MODELS_WHEN_CONFLICT);
}
/**
* Sets up a repository with three commits on two branches:
* <ul>
* <li>initial commit: An ecore containing a package P1 and a class C1.</li>
* <li>MASTER commit: updates C1 (name changed to C1new) and adds a new class C2.</li>
* <li>BRANCH commit: deletes C1 and adds a new class C3.</li>
* </ul>
* <p>
* Checked out is MASTER and the branch BRANCH is to be merged in MASTER. The merge should not finish due
* to conflicts, but the non-conflicting differences should be successfully merged (classes C2 and C3
* should both be present in the model after the merge).
* </p>
*
* @throws Exception
* if something went wrong during the setup.
*/
private void setup001() throws Exception {
// initial commit
EPackage ePackage = createPackage(null, "P1");
EClass class1 = createClass(ePackage, "C1");
resource1.getContents().add(ePackage);
save(resource1);
repository.addAllAndCommit("initial-commit");
// create new branch, but stay on MASTER
repository.createBranch(MASTER, BRANCH);
// master commit
createClass(ePackage, "C2");
class1.setName("C1new");
save(resource1);
repository.addAllAndCommit("update-C1-add-C2");
// branch commit
repository.checkoutBranch(BRANCH);
reload(resource1);
ePackage = (EPackage)findObject(resource1, "P1");
class1 = (EClass)findObject(resource1, "C1");
ePackage.getEClassifiers().remove(class1);
createClass(ePackage, "C3");
save(resource1);
repository.addAllAndCommit("remove-C1-add-C3");
// back on master
repository.checkoutBranch(MASTER);
reload(resource1);
}
@Test
public void merge001() throws Exception {
setup001();
repository.mergeLogical(BRANCH);
reload(resource1);
Status status = repository.status();
Set<String> conflicting = status.getConflicting();
assertEquals(1, conflicting.size());
assertNotNull(findObject(resource1, "C1new"));
assertNotNull(findObject(resource1, "C2"));
assertNotNull(findObject(resource1, "C3"));
}
}