blob: ca373f8416d9cfcc33384a0090daec419c8237fa [file] [log] [blame]
/*******************************************************************************
* Copyright (C) 2015 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
*******************************************************************************/
package org.eclipse.emf.compare.ide.ui.tests.merge;
import static com.google.common.base.Predicates.and;
import static com.google.common.base.Predicates.instanceOf;
import static com.google.common.collect.Iterables.filter;
import static com.google.common.collect.Iterables.size;
import static org.eclipse.emf.compare.utils.EMFComparePredicates.ofKind;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.util.List;
import java.util.Set;
import org.eclipse.core.resources.IProject;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.compare.Comparison;
import org.eclipse.emf.compare.DifferenceKind;
import org.eclipse.emf.compare.ReferenceChange;
import org.eclipse.emf.compare.ResourceAttachmentChange;
import org.eclipse.emf.compare.ide.ui.tests.git.framework.GitTestRunner;
import org.eclipse.emf.compare.ide.ui.tests.git.framework.annotations.GitCompare;
import org.eclipse.emf.compare.ide.ui.tests.git.framework.annotations.GitInput;
import org.eclipse.emf.compare.ide.ui.tests.git.framework.annotations.GitMerge;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.jgit.api.Status;
import org.eclipse.jgit.lib.Repository;
import org.junit.runner.RunWith;
/**
* This test case specifies the expected behavior of merge when renamed controlled resources are involved.
*
* @author <a href="mailto:laurent.delaigue@obeo.fr">Laurent Delaigue</a>
*/
@SuppressWarnings({"nls", "unused" })
@RunWith(GitTestRunner.class)
public class RenamedControlledResourceTests {
@GitMerge(local = "master", remote = "branch")
@GitInput("data/renamedControlledResources/renameNoConflicts.zip")
public void testMergeNoConflictRemoteRename(Status status, Repository repository, List<IProject> projects)
throws Exception {
IProject iProject = projects.get(0);
assertTrue(status.getConflicting().isEmpty());
assertTrue(iProject.getFile("file1.ecore").exists());
assertFalse(iProject.getFile("file2.ecore").exists());
assertTrue(iProject.getFile("file2_new.ecore").exists());
// Check the contents
ResourceSet resourceSet = new ResourceSetImpl();
Resource testRoot = resourceSet
.getResource(URI.createPlatformResourceURI("/renameNoConflicts/file1.ecore", true), true);
Resource testChild = resourceSet
.getResource(URI.createPlatformResourceURI("/renameNoConflicts/file2_new.ecore", true), true);
EPackage testRootPack = (EPackage)testRoot.getContents().get(0);
assertEquals("parent", testRootPack.getName());
EPackage testChildPack = testRootPack.getESubpackages().get(0);
assertEquals("child", testChildPack.getName());
assertSame(testChild, ((InternalEObject)testChildPack).eDirectResource());
EClass nonConflictingClass = (EClass)testRootPack.getEClassifiers().get(0);
assertEquals("NonConflicting", nonConflictingClass.getName());
EClass testC1 = (EClass)testChildPack.getEClassifiers().get(0);
assertEquals("C1", testC1.getName());
}
@GitMerge(local = "branch", remote = "master")
@GitInput("data/renamedControlledResources/renameNoConflicts.zip")
public void testMergeNoConflictLocalRename(Status status, Repository repository, List<IProject> projects)
throws Exception {
IProject iProject = projects.get(0);
assertTrue(status.getConflicting().isEmpty());
assertTrue(iProject.getFile("file1.ecore").exists());
assertFalse(iProject.getFile("file2.ecore").exists());
assertTrue(iProject.getFile("file2_new.ecore").exists());
// Check the contents
ResourceSet resourceSet = new ResourceSetImpl();
Resource testRoot = resourceSet
.getResource(URI.createPlatformResourceURI("/renameNoConflicts/file1.ecore", true), true);
Resource testChild = resourceSet
.getResource(URI.createPlatformResourceURI("/renameNoConflicts/file2_new.ecore", true), true);
EPackage testRootPack = (EPackage)testRoot.getContents().get(0);
assertEquals("parent", testRootPack.getName());
EPackage testChildPack = testRootPack.getESubpackages().get(0);
assertEquals("child", testChildPack.getName());
assertSame(testChild, ((InternalEObject)testChildPack).eDirectResource());
EClass nonConflictingClass = (EClass)testRootPack.getEClassifiers().get(0);
assertEquals("NonConflicting", nonConflictingClass.getName());
EClass testC1 = (EClass)testChildPack.getEClassifiers().get(0);
assertEquals("C1", testC1.getName());
}
@GitMerge(local = "master", remote = "branch")
@GitInput("data/renamedControlledResources/renameNoConflictsLocalChanges.zip")
public void testMergeNoConflictRemoteRenameLocalChanges(Status status, Repository repository,
List<IProject> projects) throws Exception {
IProject iProject = projects.get(0);
assertTrue(status.getConflicting().isEmpty());
assertTrue(iProject.getFile("file1.ecore").exists());
assertFalse(iProject.getFile("file2.ecore").exists());
assertTrue(iProject.getFile("file2_new.ecore").exists());
// Check the contents
ResourceSet resourceSet = new ResourceSetImpl();
Resource testRoot = resourceSet.getResource(
URI.createPlatformResourceURI("/renameNoConflictsLocalChanges/file1.ecore", true), true);
Resource testChild = resourceSet.getResource(
URI.createPlatformResourceURI("/renameNoConflictsLocalChanges/file2_new.ecore", true), true);
EPackage testRootPack = (EPackage)testRoot.getContents().get(0);
assertEquals("parent", testRootPack.getName());
EPackage testChildPack = testRootPack.getESubpackages().get(0);
assertEquals("child", testChildPack.getName());
assertSame(testChild, ((InternalEObject)testChildPack).eDirectResource());
EClass nonConflictingClass = (EClass)testRootPack.getEClassifiers().get(0);
assertEquals("NonConflicting", nonConflictingClass.getName());
EClass testC1 = (EClass)testChildPack.getEClassifiers().get(0);
assertEquals("C1", testC1.getName());
EClass testNewClass = (EClass)testChildPack.getEClassifiers().get(1);
assertEquals("NewClassInRemotelyRenamedPackage", testNewClass.getName());
}
@GitCompare(local = "master", remote = "branch", file = "file1.ecore")
@GitInput("data/renamedControlledResources/renameNoConflicts.zip")
public void testComparisonNoConflictRemoteRename(Comparison comparison) throws Exception {
assertTrue(comparison.getConflicts().isEmpty());
assertEquals(0, comparison.getDiagnostic().getCode());
// 3 resource matches
assertEquals(3, comparison.getMatchedResources().size());
// 2 diffs:
// 1- added class "NotConflicting" in MASTER
// 2- renamed file2 to file2_new
assertEquals(2, comparison.getDifferences().size());
assertEquals(1, size(filter(comparison.getDifferences(), instanceOf(ReferenceChange.class))));
assertEquals(1, size(filter(comparison.getDifferences(),
and(instanceOf(ResourceAttachmentChange.class), ofKind(DifferenceKind.MOVE)))));
}
@GitCompare(local = "branch", remote = "master", file = "file1.ecore")
@GitInput("data/renamedControlledResources/renameNoConflicts.zip")
public void testComparisonNoConflictLocalRename(Comparison comparison) throws Exception {
assertTrue(comparison.getConflicts().isEmpty());
assertEquals(0, comparison.getDiagnostic().getCode());
// 3 resource matches
assertEquals(3, comparison.getMatchedResources().size());
// 2 diffs:
// 1- added class "NotConflicting" in MASTER
// 2- renamed file2 to file2_new
assertEquals(2, comparison.getDifferences().size());
assertEquals(1, size(filter(comparison.getDifferences(), instanceOf(ReferenceChange.class))));
assertEquals(1, size(filter(comparison.getDifferences(),
and(instanceOf(ResourceAttachmentChange.class), ofKind(DifferenceKind.MOVE)))));
}
@GitMerge(local = "master", remote = "branch")
@GitInput("data/renamedControlledResources/renameConflicts.zip")
public void testMergeConflict(Status status, Repository repository, List<IProject> projects)
throws Exception {
IProject iProject = projects.get(0);
Set<String> conflicting = status.getConflicting();
assertEquals(3, conflicting.size());
assertTrue(conflicting.contains("renameConflicts/file1.ecore"));
assertTrue(conflicting.contains("renameConflicts/file2_new.ecore"));
assertTrue(conflicting.contains("renameConflicts/file2_other.ecore"));
assertTrue(iProject.getFile("file1.ecore").exists());
assertFalse(iProject.getFile("file2.ecore").exists());
assertFalse(iProject.getFile("file2_new.ecore").exists());
assertTrue(iProject.getFile("file2_other.ecore").exists());
}
@GitCompare(local = "master", remote = "branch", file = "file1.ecore")
@GitInput("data/renamedControlledResources/renameConflicts.zip")
public void testComparisonConflict(Comparison comparison) throws Exception {
assertEquals(1, comparison.getConflicts().size());
assertEquals(0, comparison.getDiagnostic().getCode());
// 4 resource matches
assertEquals(4, comparison.getMatchedResources().size());
// 2 diffs:
// 2- renamed file2 to file2_new (remote) and to file_other (local)
assertEquals(2, comparison.getDifferences().size());
assertEquals(2, size(filter(comparison.getDifferences(),
and(instanceOf(ResourceAttachmentChange.class), ofKind(DifferenceKind.MOVE)))));
// 2 diffs in conflict
assertEquals(2, comparison.getConflicts().get(0).getDifferences().size());
// Both a re resource location changes
assertEquals(2, size(filter(comparison.getConflicts().get(0).getDifferences(),
and(instanceOf(ResourceAttachmentChange.class), ofKind(DifferenceKind.MOVE)))));
}
}