blob: 27ce45a6462b959fafbfa16b139a0b828d8c9dd7 [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.unit;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.InputStream;
import java.util.Collections;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.mapping.ModelProvider;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.compare.ide.ui.internal.logical.EMFModelProvider;
import org.eclipse.emf.compare.ide.ui.internal.logical.resolver.RevisionedURIConverter;
import org.eclipse.emf.compare.ide.ui.logical.IStorageProviderAccessor;
import org.eclipse.emf.compare.ide.ui.logical.IStorageProviderAccessor.DiffSide;
import org.eclipse.emf.compare.ide.ui.tests.egit.CompareGitTestCase;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EGenericType;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.URIConverter;
import org.eclipse.emf.ecore.resource.impl.ExtensibleURIConverterImpl;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.jgit.api.Status;
import org.eclipse.jgit.lib.Constants;
import org.junit.After;
import org.junit.Before;
public class AbstractURITest extends CompareGitTestCase {
protected static final String MASTER = Constants.R_HEADS + Constants.MASTER;
protected static final String BRANCH = Constants.R_HEADS + "branch";
protected File file1;
protected IFile iFile1;
protected Resource resource1;
@Override
@Before
public void setUp() throws Exception {
super.setUp();
final IProject iProject = project.getProject();
final ResourceSet resourceSet = new ResourceSetImpl();
file1 = project.getOrCreateFile(iProject, "file1.ecore");
iFile1 = project.getIFile(iProject, file1);
resource1 = connectResource(iFile1, resourceSet);
}
@Override
@After
public void tearDown() throws Exception {
final EMFModelProvider emfModelProvider = (EMFModelProvider)ModelProvider
.getModelProviderDescriptor(EMFModelProvider.PROVIDER_ID).getModelProvider();
emfModelProvider.clear();
super.tearDown();
}
/**
* We'll create a repo with a single file and three commits such as there's an initial commit, one more
* commit on master, then one commit on a branch starting from the initial one.
*
* <pre>
* initial commit -> master
* \-> branch
* </pre>
*/
protected void setupStraightRepo() throws Exception {
EPackage root1 = createPackage(null, "P1");
EClass class1 = createClass(root1, "C1");
EClass class2 = createClass(root1, "C2");
resource1.getContents().add(root1);
save(resource1);
repository.addAllAndCommit("initial-commit");
// Branch, but stay on master
repository.createBranch(MASTER, BRANCH);
root1.getEClassifiers().remove(class2);
class1.setName("C1_renamed");
save(resource1);
repository.addAndCommit(project, "master-commit", file1);
repository.checkoutBranch(BRANCH);
reload(resource1);
root1 = (EPackage)findObject(resource1, "P1");
class1 = (EClass)findObject(resource1, "C1");
class2 = (EClass)findObject(resource1, "C2");
class1.getESuperTypes().add(class2);
createClass(root1, "C3");
save(resource1);
repository.addAndCommit(project, "branch-commit", file1);
repository.checkoutBranch(MASTER);
final Status status = repository.status();
assertFalse(status.hasUncommittedChanges());
}
/**
* We'll create a repo with a single file and multiple commits such as there are multiple commits
* in-between the compared one and the expected common ancestor.
*
* <pre>
* initial commit -> commit-master-1 -> commit-master-2 -> commit-master-3
* \-> commit-branch1-1 -> commit-branch1-2
* \-> commit-branch2-1
* </pre>
*/
protected void setupMultipleCommitsRepo(String branch1Name, String branch2Name) throws Exception {
EPackage root1 = createPackage(null, "P1");
EClass class1 = createClass(root1, "C1");
resource1.getContents().add(root1);
save(resource1);
repository.addAllAndCommit("initial-commit");
EClass class2 = createClass(root1, "C2");
save(resource1);
repository.addAndCommit(project, "commit-master-1", file1);
// Branch, but stay on master
repository.createBranch(MASTER, branch1Name);
root1.getEClassifiers().remove(class2);
save(resource1);
repository.addAndCommit(project, "commit-master-2", file1);
class1.setName("C1_renamed");
save(resource1);
repository.addAndCommit(project, "commit-master-3", file1);
repository.checkoutBranch(branch1Name);
reload(resource1);
class1 = (EClass)findObject(resource1, "C1");
class2 = (EClass)findObject(resource1, "C2");
class1.getESuperTypes().add(class2);
save(resource1);
repository.addAndCommit(project, "commit-branch1-1", file1);
// Create the second branch, but stay on the first for one more commit
repository.createBranch(branch1Name, branch2Name);
class2.setName("C2_renamed");
save(resource1);
repository.addAndCommit(project, "commit-branch1-2", file1);
repository.checkoutBranch(branch2Name);
reload(resource1);
root1 = (EPackage)findObject(resource1, "P1");
createClass(root1, "C3");
save(resource1);
repository.addAndCommit(project, "commit-branch2-1", file1);
repository.checkoutBranch(MASTER);
final Status status = repository.status();
assertFalse(status.hasUncommittedChanges());
}
protected void assertStateInitial(URI fileURI, IStorageProviderAccessor accessor, DiffSide side)
throws Exception {
URIConverter delegate = new ExtensibleURIConverterImpl();
RevisionedURIConverter converter = new RevisionedURIConverter(delegate, accessor, side);
InputStream stream = converter.createInputStream(fileURI, Collections.emptyMap());
ResourceSet tmpSet = new ResourceSetImpl();
Resource tmpResource = tmpSet.createResource(fileURI);
tmpResource.load(stream, Collections.emptyMap());
assertEquals(1, tmpResource.getContents().size());
assertTrue(tmpResource.getContents().get(0) instanceof EPackage);
EPackage tmpPack = (EPackage)tmpResource.getContents().get(0);
assertEquals("P1", tmpPack.getName());
assertEquals(2, tmpPack.eContents().size());
assertTrue(tmpPack.eContents().get(0) instanceof EClass);
assertTrue(tmpPack.eContents().get(1) instanceof EClass);
EClass tmpClass = (EClass)tmpPack.eContents().get(0);
assertEquals("C1", tmpClass.getName());
assertTrue(tmpClass.eContents().isEmpty());
tmpClass = (EClass)tmpPack.eContents().get(1);
assertEquals("C2", tmpClass.getName());
assertTrue(tmpClass.eContents().isEmpty());
}
protected void assertStateMaster(URI fileURI, IStorageProviderAccessor accessor, DiffSide side)
throws Exception {
URIConverter delegate = new ExtensibleURIConverterImpl();
RevisionedURIConverter converter = new RevisionedURIConverter(delegate, accessor, side);
InputStream stream = converter.createInputStream(fileURI, Collections.emptyMap());
ResourceSet tmpSet = new ResourceSetImpl();
Resource tmpResource = tmpSet.createResource(fileURI);
tmpResource.load(stream, Collections.emptyMap());
assertEquals(1, tmpResource.getContents().size());
assertTrue(tmpResource.getContents().get(0) instanceof EPackage);
EPackage tmpPack = (EPackage)tmpResource.getContents().get(0);
assertEquals("P1", tmpPack.getName());
assertEquals(1, tmpPack.eContents().size());
assertTrue(tmpPack.eContents().get(0) instanceof EClass);
EClass tmpClass = (EClass)tmpPack.eContents().get(0);
assertEquals("C1_renamed", tmpClass.getName());
assertTrue(tmpClass.eContents().isEmpty());
}
protected void assertStateBranch(URI fileURI, IStorageProviderAccessor accessor, DiffSide side)
throws Exception {
URIConverter delegate = new ExtensibleURIConverterImpl();
RevisionedURIConverter converter = new RevisionedURIConverter(delegate, accessor, side);
InputStream stream = converter.createInputStream(fileURI, Collections.emptyMap());
ResourceSet tmpSet = new ResourceSetImpl();
Resource tmpResource = tmpSet.createResource(fileURI);
tmpResource.load(stream, Collections.emptyMap());
assertEquals(1, tmpResource.getContents().size());
assertTrue(tmpResource.getContents().get(0) instanceof EPackage);
EPackage tmpPack = (EPackage)tmpResource.getContents().get(0);
assertEquals("P1", tmpPack.getName());
assertEquals(3, tmpPack.eContents().size());
assertTrue(tmpPack.eContents().get(0) instanceof EClass);
assertTrue(tmpPack.eContents().get(1) instanceof EClass);
assertTrue(tmpPack.eContents().get(2) instanceof EClass);
EClass tmpClass1 = (EClass)tmpPack.eContents().get(0);
EClass tmpClass2 = (EClass)tmpPack.eContents().get(1);
EClass tmpClass3 = (EClass)tmpPack.eContents().get(2);
assertEquals("C1", tmpClass1.getName());
assertEquals(1, tmpClass1.eContents().size());
assertTrue(tmpClass1.eContents().get(0) instanceof EGenericType);
assertTrue(tmpClass1.getESuperTypes().contains(tmpClass2));
assertEquals("C2", tmpClass2.getName());
assertTrue(tmpClass2.eContents().isEmpty());
assertEquals("C3", tmpClass3.getName());
assertTrue(tmpClass3.eContents().isEmpty());
}
}