/*******************************************************************************
* 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
*******************************************************************************/
package org.eclipse.emf.compare.ide.ui.tests.merge;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.compare.egit.internal.merge.DirCacheResourceVariantTreeProvider;
import org.eclipse.emf.compare.ide.ui.tests.git.framework.GitTestRunner;
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.compare.ide.ui.tests.git.framework.annotations.GitTest;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.Status;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.NoFilepatternException;
import org.eclipse.jgit.lib.Repository;
import org.junit.runner.RunWith;
@RunWith(GitTestRunner.class)
@SuppressWarnings("unused")
public class DirCacheResourceVariantTreeProviderTest {
@GitTest
@GitInput("data/dirCacheResourceVariantTreeProvider/dirCacheAddToIndex.zip")
public void testDirCacheAddToIndex(Status status, Repository repository, List<IProject> projects)
throws Exception {
IProject project = projects.get(0);
IFile iFile1 = project.getFile("file1"); //$NON-NLS-1$
// untracked file : not part of the index
DirCacheResourceVariantTreeProvider treeProvider = new DirCacheResourceVariantTreeProvider(repository,
true);
assertTrue(treeProvider.getKnownResources().isEmpty());
assertFalse(treeProvider.getBaseTree().hasResourceVariant(iFile1));
assertFalse(treeProvider.getSourceTree().hasResourceVariant(iFile1));
assertFalse(treeProvider.getRemoteTree().hasResourceVariant(iFile1));
iFile1.toString();
addToIndex(repository, iFile1);
// We now have a stage 0, present in each tree
treeProvider = new DirCacheResourceVariantTreeProvider(repository, true);
assertEquals(1, treeProvider.getKnownResources().size());
assertTrue(treeProvider.getBaseTree().hasResourceVariant(iFile1));
assertTrue(treeProvider.getSourceTree().hasResourceVariant(iFile1));
assertTrue(treeProvider.getRemoteTree().hasResourceVariant(iFile1));
}
@GitMerge(local = "master", remote = "branch")
@GitInput("data/dirCacheResourceVariantTreeProvider/dirCacheTreesNoConflict.zip")
public void testDirCacheTreesNoConflict(Status status, Repository repository, List<IProject> projects)
throws Exception {
IProject iProject = projects.get(0);
IFile iFile1 = iProject.getFile("file1"); //$NON-NLS-1$
IFile iFile2 = iProject.getFile("file2"); //$NON-NLS-1$
// no conflict on either file : present in the trees anyway
DirCacheResourceVariantTreeProvider treeProvider = new DirCacheResourceVariantTreeProvider(repository,
true);
assertEquals(3, treeProvider.getKnownResources().size());
assertTrue(treeProvider.getBaseTree().hasResourceVariant(iFile1));
assertTrue(treeProvider.getBaseTree().hasResourceVariant(iFile2));
assertTrue(treeProvider.getSourceTree().hasResourceVariant(iFile1));
assertTrue(treeProvider.getSourceTree().hasResourceVariant(iFile2));
assertTrue(treeProvider.getRemoteTree().hasResourceVariant(iFile1));
assertTrue(treeProvider.getRemoteTree().hasResourceVariant(iFile2));
}
@GitMerge(local = "master", remote = "branch")
@GitInput("data/dirCacheResourceVariantTreeProvider/dirCacheTreesConflictOnOne.zip")
public void testDirCacheTreesConflictOnOne(Status status, Repository repository, List<IProject> projects)
throws Exception {
IProject iProject = projects.get(0);
IFile iFile1 = iProject.getFile("file1"); //$NON-NLS-1$
IFile iFile2 = iProject.getFile("file2"); //$NON-NLS-1$
// conflict on file 1 : present in all three trees
// no conflict on file 2 : present anyway
DirCacheResourceVariantTreeProvider treeProvider = new DirCacheResourceVariantTreeProvider(repository,
true);
assertTrue(treeProvider.getKnownResources().contains(iFile1));
assertTrue(treeProvider.getKnownResources().contains(iFile2));
assertTrue(treeProvider.getBaseTree().hasResourceVariant(iFile1));
assertTrue(treeProvider.getBaseTree().hasResourceVariant(iFile2));
assertTrue(treeProvider.getSourceTree().hasResourceVariant(iFile1));
assertTrue(treeProvider.getSourceTree().hasResourceVariant(iFile2));
assertTrue(treeProvider.getRemoteTree().hasResourceVariant(iFile1));
assertTrue(treeProvider.getRemoteTree().hasResourceVariant(iFile2));
}
@GitMerge(local = "master", remote = "branch")
@GitInput("data/dirCacheResourceVariantTreeProvider/dirCacheTreesConflict.zip")
public void testDirCacheTreesConflict(Status status, Repository repository, List<IProject> projects)
throws Exception {
IProject iProject = projects.get(0);
IFile iFile1 = iProject.getFile("file1"); //$NON-NLS-1$
IFile iFile2 = iProject.getFile("file2"); //$NON-NLS-1$
// conflict on file 1 : file 1 has three stages.
// conflict on file 2, but was not in the base : only stage 2 and 3
DirCacheResourceVariantTreeProvider treeProvider = new DirCacheResourceVariantTreeProvider(repository,
true);
assertTrue(treeProvider.getKnownResources().contains(iFile1));
assertTrue(treeProvider.getKnownResources().contains(iFile2));
assertTrue(treeProvider.getBaseTree().hasResourceVariant(iFile1));
assertFalse(treeProvider.getBaseTree().hasResourceVariant(iFile2));
assertTrue(treeProvider.getSourceTree().hasResourceVariant(iFile1));
assertTrue(treeProvider.getSourceTree().hasResourceVariant(iFile2));
assertTrue(treeProvider.getRemoteTree().hasResourceVariant(iFile1));
assertTrue(treeProvider.getRemoteTree().hasResourceVariant(iFile2));
}
private void addToIndex(Repository repository, IFile file)
throws CoreException, IOException, NoFilepatternException, GitAPIException {
String filePath = file.getProject().getName() + "/" + file.getProjectRelativePath(); //$NON-NLS-1$
Git git = new Git(repository);
try {
git.add().addFilepattern(filePath).call();
} finally {
git.close();
}
}
private String getRepoRelativePath(String repoPath, String path) {
final int pfxLen = repoPath.length();
final int pLen = path.length();
if (pLen > pfxLen) {
return path.substring(pfxLen);
} else if (path.length() == pfxLen - 1) {
return ""; //$NON-NLS-1$
}
return null;
}
}