blob: 5d83759011f452581f0071eaf51dacb27876bb99 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 Obeo 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:
* Obeo - initial API and implementation
* Philip Langer - refactorings
*******************************************************************************/
package org.eclipse.emf.compare.ide.ui.tests.unit;
import java.io.File;
import java.net.URL;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.compare.ide.ui.internal.EMFCompareIDEUIPlugin;
import org.eclipse.emf.compare.ide.ui.logical.IModelResolver;
import org.eclipse.emf.compare.ide.ui.logical.SynchronizationModel;
import org.eclipse.emf.compare.ide.ui.tests.CompareTestCase;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.osgi.framework.Bundle;
/**
* This test is related to the bug <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=459131">459131</a>
*
* @author <a href="mailto:axel.richard@obeo.fr">Axel Richard</a>
*/
@SuppressWarnings("nls")
public class TestBug459131 extends CompareTestCase {
private IModelResolver resolver;
private NullProgressMonitor monitor;
@SuppressWarnings("restriction")
@Override
@Before
public void setUp() throws Exception {
super.setUp();
resolver = EMFCompareIDEUIPlugin.getDefault().getModelResolverRegistry().getBestResolverFor(null);
monitor = new NullProgressMonitor();
}
@Override
@After
public void tearDown() throws Exception {
super.tearDown();
}
/**
* Test models:
* <p>
* On left side: R1 -> R2 -> R3
* </p>
* <p>
* On right side: R1 -> R2 -> R3
* </p>
* <p>
* 1 change in R2 fragment and 1 change in R3 fragment. Then update R3 right model to have 1 change in R2
* fragment and no change in R3 fragment.
* </p>
*
* @throws Exception
*/
@Test
public void testUpdateResource() throws Exception {
final IProject iProject = project.getProject();
final File leftFile1 = project.getOrCreateFile(iProject, "left" + File.separator + "R1.nodes");
final File leftFile2 = project.getOrCreateFile(iProject, "left" + File.separator + "R2.nodes");
final File leftFile3 = project.getOrCreateFile(iProject, "left" + File.separator + "R3.nodes");
final File rightFile1 = project.getOrCreateFile(iProject, "right" + File.separator + "R1.nodes");
final File rightFile2 = project.getOrCreateFile(iProject, "right" + File.separator + "R2.nodes");
final File rightFile3 = project.getOrCreateFile(iProject, "right" + File.separator + "R3.nodes");
Bundle bundle = Platform.getBundle("org.eclipse.emf.compare.ide.ui.tests");
URL entryLeftFile1 = bundle
.getEntry("src/org/eclipse/emf/compare/ide/ui/tests/unit/data/_459131/left/R1.nodes");
URL entryLeftFile2 = bundle
.getEntry("src/org/eclipse/emf/compare/ide/ui/tests/unit/data/_459131/left/R2.nodes");
URL entryLeftFile3 = bundle
.getEntry("src/org/eclipse/emf/compare/ide/ui/tests/unit/data/_459131/left/R3.nodes");
URL entryRightFile1 = bundle
.getEntry("src/org/eclipse/emf/compare/ide/ui/tests/unit/data/_459131/right/R1.nodes");
URL entryRightFile2 = bundle
.getEntry("src/org/eclipse/emf/compare/ide/ui/tests/unit/data/_459131/right/R2.nodes");
URL entryRightFile3 = bundle
.getEntry("src/org/eclipse/emf/compare/ide/ui/tests/unit/data/_459131/right/R3.nodes");
URL leftFile1URL = FileLocator.toFileURL(entryLeftFile1);
URL leftFile2URL = FileLocator.toFileURL(entryLeftFile2);
URL leftFile3URL = FileLocator.toFileURL(entryLeftFile3);
URL rightFile1URL = FileLocator.toFileURL(entryRightFile1);
URL rightFile2URL = FileLocator.toFileURL(entryRightFile2);
URL rightFile3URL = FileLocator.toFileURL(entryRightFile3);
copyFile(new File(leftFile1URL.toURI()), leftFile1);
copyFile(new File(leftFile2URL.toURI()), leftFile2);
copyFile(new File(leftFile3URL.toURI()), leftFile3);
copyFile(new File(rightFile1URL.toURI()), rightFile1);
copyFile(new File(rightFile2URL.toURI()), rightFile2);
copyFile(new File(rightFile3URL.toURI()), rightFile3);
IFile iLeftFile1 = project.getIFile(iProject, leftFile1);
IFile iLeftFile2 = project.getIFile(iProject, leftFile2);
IFile iLeftFile3 = project.getIFile(iProject, leftFile3);
IFile iRightFile1 = project.getIFile(iProject, rightFile1);
IFile iRightFile2 = project.getIFile(iProject, rightFile2);
IFile iRightFile3 = project.getIFile(iProject, rightFile3);
// 1 change in R2 fragment and 1 change in R3 fragment
SynchronizationModel syncModel = resolver.resolveLocalModels(iLeftFile1, iRightFile1, null, monitor);
assertContainsExclusively(syncModel.getLeftTraversal(), iLeftFile1, iLeftFile2, iLeftFile3);
assertContainsExclusively(syncModel.getRightTraversal(), iRightFile1, iRightFile2, iRightFile3);
// Update R3 right model
// 1 change in R2 fragment and no change in R3 fragment
iRightFile3.setContents(iLeftFile3.getContents(), IResource.FORCE, monitor);
syncModel = resolver.resolveLocalModels(iLeftFile1, iRightFile1, null, monitor);
assertContainsExclusively(syncModel.getLeftTraversal(), iLeftFile1, iLeftFile2, iLeftFile3);
assertContainsExclusively(syncModel.getRightTraversal(), iRightFile1, iRightFile2, iRightFile3);
}
/**
* Test models:
* <p>
* On left side: R4 -> R5 -> R6
* </p>
* <p>
* On right side: R4 -> R5 -> R6
* </p>
* <p>
* 1 change in R5 fragment and 1 change in R6 fragment. Then brake dependency between R5 & R6 right models
* to delete R3 right model from the logical model.
* </p>
*
* @throws Exception
*/
@Test
public void testBrakeResourceDependency() throws Exception {
final IProject iProject = project.getProject();
final File leftFile4 = project.getOrCreateFile(iProject, "left" + File.separator + "R4.nodes");
final File leftFile5 = project.getOrCreateFile(iProject, "left" + File.separator + "R5.nodes");
final File leftFile6 = project.getOrCreateFile(iProject, "left" + File.separator + "R6.nodes");
final File rightFile4 = project.getOrCreateFile(iProject, "right" + File.separator + "R4.nodes");
final File rightFile5 = project.getOrCreateFile(iProject, "right" + File.separator + "R5.nodes");
final File newRightFile5 = project.getOrCreateFile(iProject,
"right" + File.separator + "R5NEW.nodes");
final File rightFile6 = project.getOrCreateFile(iProject, "right" + File.separator + "R6.nodes");
Bundle bundle = Platform.getBundle("org.eclipse.emf.compare.ide.ui.tests");
URL entryLeftFile4 = bundle
.getEntry("src/org/eclipse/emf/compare/ide/ui/tests/unit/data/_459131/left/R4.nodes");
URL entryLeftFile5 = bundle
.getEntry("src/org/eclipse/emf/compare/ide/ui/tests/unit/data/_459131/left/R5.nodes");
URL entryLeftFile6 = bundle
.getEntry("src/org/eclipse/emf/compare/ide/ui/tests/unit/data/_459131/left/R6.nodes");
URL entryRightFile4 = bundle
.getEntry("src/org/eclipse/emf/compare/ide/ui/tests/unit/data/_459131/right/R4.nodes");
URL entryRightFile5 = bundle
.getEntry("src/org/eclipse/emf/compare/ide/ui/tests/unit/data/_459131/right/R5.nodes");
URL newEntryRightFile5 = bundle
.getEntry("src/org/eclipse/emf/compare/ide/ui/tests/unit/data/_459131/right/R5NEW.nodes");
URL entryRightFile6 = bundle
.getEntry("src/org/eclipse/emf/compare/ide/ui/tests/unit/data/_459131/right/R6.nodes");
URL leftFile4URL = FileLocator.toFileURL(entryLeftFile4);
URL leftFile5URL = FileLocator.toFileURL(entryLeftFile5);
URL leftFile6URL = FileLocator.toFileURL(entryLeftFile6);
URL rightFile4URL = FileLocator.toFileURL(entryRightFile4);
URL rightFile5URL = FileLocator.toFileURL(entryRightFile5);
URL newRightFile5URL = FileLocator.toFileURL(newEntryRightFile5);
URL rightFile6URL = FileLocator.toFileURL(entryRightFile6);
copyFile(new File(leftFile4URL.toURI()), leftFile4);
copyFile(new File(leftFile5URL.toURI()), leftFile5);
copyFile(new File(leftFile6URL.toURI()), leftFile6);
copyFile(new File(rightFile4URL.toURI()), rightFile4);
copyFile(new File(rightFile5URL.toURI()), rightFile5);
copyFile(new File(newRightFile5URL.toURI()), newRightFile5);
copyFile(new File(rightFile6URL.toURI()), rightFile6);
IFile iLeftFile4 = project.getIFile(iProject, leftFile4);
IFile iLeftFile5 = project.getIFile(iProject, leftFile5);
IFile iLeftFile6 = project.getIFile(iProject, leftFile6);
IFile iRightFile4 = project.getIFile(iProject, rightFile4);
IFile iRightFile5 = project.getIFile(iProject, rightFile5);
IFile newIRightFile5 = project.getIFile(iProject, newRightFile5);
IFile iRightFile6 = project.getIFile(iProject, rightFile6);
// 1 change in R2 fragment and 1 change in R3 fragment
SynchronizationModel syncModel = resolver.resolveLocalModels(iLeftFile4, iRightFile4, null, monitor);
assertContainsExclusively(syncModel.getLeftTraversal(), iLeftFile4, iLeftFile5, iLeftFile6);
assertContainsExclusively(syncModel.getRightTraversal(), iRightFile4, iRightFile5, iRightFile6);
// Brake dependency between R5 & R6 right models.
iRightFile5.setContents(newIRightFile5.getContents(), IResource.FORCE, monitor);
syncModel = resolver.resolveLocalModels(iLeftFile4, iRightFile4, null, monitor);
assertContainsExclusively(syncModel.getLeftTraversal(), iLeftFile4, iLeftFile5, iLeftFile6);
assertContainsExclusively(syncModel.getRightTraversal(), iRightFile4, iRightFile5);
}
}