/*******************************************************************************
* Copyright (c) 2013, 2016 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 - refactoring
*******************************************************************************/
package org.eclipse.emf.compare.ide.ui.tests.unit;
import java.io.File;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.compare.ide.ui.internal.logical.resolver.ThreadedModelResolver;
import org.eclipse.emf.compare.ide.ui.logical.IModelResolver;
import org.eclipse.emf.compare.ide.ui.tests.CompareTestCase;
import org.eclipse.emf.compare.ide.utils.StorageTraversal;
import org.eclipse.emf.compare.internal.utils.Graph;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@SuppressWarnings("nls")
public class DependenciesTest extends CompareTestCase {
private static final String FILE1_SUFFIX = "_file1";
private static final String FILE2_SUFFIX = "_file2";
private static final String FILE3_SUFFIX = "_file3";
private IFile iFile1;
private IFile iFile2;
private IFile iFile3;
private ResourceSet resourceSet;
private Resource resource1;
private Resource resource2;
private Resource resource3;
private IModelResolver resolver;
private IProgressMonitor monitor;
@Override
@Before
public void setUp() throws Exception {
super.setUp();
resolver = new ThreadedModelResolver();
((ThreadedModelResolver)resolver).setGraph(new Graph<URI>());
resolver.initialize();
monitor = new NullProgressMonitor();
final IProject iProject = project.getProject();
resourceSet = new ResourceSetImpl();
final File file1 = project.getOrCreateFile(iProject, "file1.ecore");
final File file2 = project.getOrCreateFile(iProject, "file2.ecore");
final File file3 = project.getOrCreateFile(iProject, "file3.ecore");
iFile1 = project.getIFile(iProject, file1);
iFile2 = project.getIFile(iProject, file2);
iFile3 = project.getIFile(iProject, file3);
resource1 = connectResource(iFile1, resourceSet);
resource2 = connectResource(iFile2, resourceSet);
resource3 = connectResource(iFile3, resourceSet);
resource1.getContents().add(createBasicModel(FILE1_SUFFIX));
resource2.getContents().add(createBasicModel(FILE2_SUFFIX));
resource3.getContents().add(createBasicModel(FILE3_SUFFIX));
save(resourceSet);
}
@Override
@After
public void tearDown() throws Exception {
resolver.dispose();
super.tearDown();
}
@Test
public void testScopeNoDependencies() throws Exception {
StorageTraversal traversal = resolver.resolveLocalModel(iFile1, monitor);
assertContainsExclusively(traversal, iFile1);
traversal = resolver.resolveLocalModel(iFile2, monitor);
assertContainsExclusively(traversal, iFile2);
traversal = resolver.resolveLocalModel(iFile3, monitor);
assertContainsExclusively(traversal, iFile3);
}
@Test
public void testScopeAddedDependency() throws Exception {
makeCrossReference(resource2, resource1);
save(resourceSet);
StorageTraversal traversal = resolver.resolveLocalModel(iFile1, monitor);
assertContainsExclusively(traversal, iFile1, iFile2);
traversal = resolver.resolveLocalModel(iFile2, monitor);
assertContainsExclusively(traversal, iFile1, iFile2);
}
@Test
public void testScopeRemovedDependency() throws Exception {
makeCrossReference(resource2, resource1);
save(resourceSet);
breakCrossReferences(resource2, resource1);
save(resourceSet);
StorageTraversal traversal = resolver.resolveLocalModel(iFile1, monitor);
assertContainsExclusively(traversal, iFile1);
traversal = resolver.resolveLocalModel(iFile2, monitor);
assertContainsExclusively(traversal, iFile2);
}
@Test
public void testScopeDepth() throws Exception {
makeCrossReference(resource2, resource1);
makeCrossReference(resource3, resource2);
save(resourceSet);
StorageTraversal traversal = resolver.resolveLocalModel(iFile1, monitor);
assertContainsExclusively(traversal, iFile1, iFile2, iFile3);
traversal = resolver.resolveLocalModel(iFile2, monitor);
assertContainsExclusively(traversal, iFile1, iFile2, iFile3);
traversal = resolver.resolveLocalModel(iFile3, monitor);
assertContainsExclusively(traversal, iFile1, iFile2, iFile3);
}
@Test
public void testScopeUpdate() throws Exception {
makeCrossReference(resource2, resource1);
makeCrossReference(resource3, resource2);
save(resourceSet);
StorageTraversal traversal = resolver.resolveLocalModel(iFile1, monitor);
assertContainsExclusively(traversal, iFile1, iFile2, iFile3);
breakCrossReferences(resource2, resource1);
save(resourceSet);
traversal = resolver.resolveLocalModel(iFile1, monitor);
assertContainsExclusively(traversal, iFile1);
traversal = resolver.resolveLocalModel(iFile2, monitor);
assertContainsExclusively(traversal, iFile2, iFile3);
breakCrossReferences(resource3, resource2);
makeCrossReference(resource3, resource1);
save(resourceSet);
traversal = resolver.resolveLocalModel(iFile1, monitor);
assertContainsExclusively(traversal, iFile1, iFile3);
traversal = resolver.resolveLocalModel(iFile2, monitor);
assertContainsExclusively(traversal, iFile2);
traversal = resolver.resolveLocalModel(iFile3, monitor);
assertContainsExclusively(traversal, iFile1, iFile3);
}
}