blob: b21b745d05b7d6774210320fd781cad60915173c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.team.tests.ccvs.ui;
import java.util.*;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.team.core.TeamException;
import org.eclipse.team.internal.ccvs.core.*;
import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot;
import org.eclipse.team.internal.ccvs.core.resources.RemoteFolder;
import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo;
import org.eclipse.team.internal.ccvs.ui.operations.RemoteCompareOperation;
import org.eclipse.team.tests.ccvs.core.CVSTestSetup;
import org.eclipse.ui.IWorkbenchPart;
public class CompareOperationTests extends CVSOperationTest {
public class TestRemoteCompareOperation extends RemoteCompareOperation {
private ICVSRemoteFolder leftTree, rightTree;
public TestRemoteCompareOperation(IWorkbenchPart part, ICVSRemoteResource resource, CVSTag tag) {
super(part, resource, tag);
}
/*
* Override to prevent compare editor from opening and to capture the results
*/
protected void openCompareEditor(ICVSRemoteFolder leftTree, ICVSRemoteFolder rightTree) {
this.leftTree = leftTree;
this.rightTree = rightTree;
}
public ICVSRemoteFolder getLeftTree() {
return leftTree;
}
public ICVSRemoteFolder getRightTree() {
return rightTree;
}
}
public CompareOperationTests() {
super();
}
public CompareOperationTests(String name) {
super(name);
}
public static Test suite() {
String testName = System.getProperty("eclipse.cvs.testName");
if (testName == null) {
TestSuite suite = new TestSuite(CompareOperationTests.class);
return new CVSTestSetup(suite);
} else {
return new CVSTestSetup(new CompareOperationTests(testName));
}
}
/**
* Assert that the revisions of any files in the remote tree match the revisions in the local tree
*/
private void assertRevisionsMatch(ICVSRemoteFolder folder, IProject project, String[] filePathsWithRevisions, String[] filePathsWithoutRevisions) throws CoreException {
if (filePathsWithRevisions == null) filePathsWithRevisions = new String[0];
if (filePathsWithoutRevisions == null) filePathsWithoutRevisions = new String[0];
IResource[] filesWithRevisions = getResources(project, filePathsWithRevisions);
IResource[] filesWithoutRevisions = getResources(project, filePathsWithoutRevisions);
ICVSRemoteFile[] files= getAllFiles(folder);
assertTrue("The number of remote files with differences does not match the expected number", files.length == (filePathsWithoutRevisions.length + filePathsWithRevisions.length));
for (int i = 0; i < files.length; i++) {
ICVSRemoteFile remoteFile = files[i];
for (int j = 0; j < filesWithRevisions.length; j++) {
IResource local = filesWithRevisions[j];
ICVSFile cvsFile = CVSWorkspaceRoot.getCVSFileFor((IFile)local);
if (cvsFile.getRepositoryRelativePath().equals(remoteFile.getRepositoryRelativePath())) {
ResourceSyncInfo info = cvsFile.getSyncInfo();
assertNotNull(info);
String localRevision = info.getRevision();
assertNotNull(localRevision);
String remoteRevision = files[i].getRevision();
assertNotNull(remoteRevision);
assertEquals("Revisions do not match for " + local.getProjectRelativePath(), localRevision, remoteRevision);
}
}
for (int j = 0; j < filesWithoutRevisions.length; j++) {
IResource local = filesWithoutRevisions[j];
ICVSFile cvsFile = CVSWorkspaceRoot.getCVSFileFor((IFile)local);
if (cvsFile.getRepositoryRelativePath().equals(remoteFile.getRepositoryRelativePath())) {
ResourceSyncInfo info = cvsFile.getSyncInfo();
assertNotNull(info);
String localRevision = info.getRevision();
assertNotNull(localRevision);
// Cannot assert anything about the remote revision
}
}
}
}
private ICVSRemoteFile[] getAllFiles(ICVSRemoteFolder folder) {
List result = new ArrayList();
ICVSRemoteResource[] children = ((RemoteFolder)folder).getChildren();
if (children != null) {
for (int i = 0; i < children.length; i++) {
ICVSRemoteResource resource = children[i];
if (resource.isContainer()) {
result.addAll(Arrays.asList(getAllFiles((ICVSRemoteFolder)resource)));
} else {
result.add(resource);
}
}
}
return (ICVSRemoteFile[]) result.toArray(new ICVSRemoteFile[result.size()]);
}
public void testCompareWithLatest() throws TeamException, CoreException {
// Create a test project
IProject project = createProject(new String[] { "file1.txt", "folder1/", "folder1/a.txt", "folder1/b.txt"});
CVSTag v1 = new CVSTag("v1", CVSTag.VERSION);
tagProject(project, v1, false);
// Checkout and modify a copy (and commit the changes)
IProject copy = checkoutCopy(project, "-copy");
setContentsAndEnsureModified(copy.getFile("folder1/a.txt"));
addResources(copy, new String[] { "folder1/newFile", "folder2/folder3/add.txt" }, false);
deleteResources(copy, new String[] {"folder1/b.txt"}, false);
commitResources(new IResource[] {copy}, IResource.DEPTH_INFINITE);
// Run the compare operation of the project folder
ICVSRemoteResource remoteResource = CVSWorkspaceRoot.getRemoteResourceFor(project);
TestRemoteCompareOperation op = new TestRemoteCompareOperation(null, remoteResource, v1);
run(op);
assertRevisionsMatch(op.getRightTree(), project, new String[] {"folder1/a.txt", "folder1/b.txt"}, null);
assertRevisionsMatch(op.getLeftTree(), copy, new String[] {"folder1/a.txt" }, new String[] {"folder1/newFile", "folder2/folder3/add.txt" } /* files with no revision */);
// Run the compare operation of the project folder the other way
remoteResource = CVSWorkspaceRoot.getRemoteResourceFor(project);
remoteResource = ((ICVSRemoteFolder)remoteResource).forTag(v1);
op = new TestRemoteCompareOperation(null, remoteResource, CVSTag.DEFAULT);
run(op);
assertRevisionsMatch(op.getLeftTree(), project, new String[] {"folder1/a.txt"}, new String[] {"folder1/b.txt"});
assertRevisionsMatch(op.getRightTree(), copy, new String[] {"folder1/a.txt", "folder1/newFile", "folder2/folder3/add.txt" }, null /* files with no revision */);
// Run the compare operation of a subfolder
remoteResource = CVSWorkspaceRoot.getRemoteResourceFor(project.getFolder("folder1"));
op = new TestRemoteCompareOperation(null, remoteResource, v1);
run(op);
assertRevisionsMatch(op.getRightTree(), project, new String[] {"folder1/a.txt", "folder1/b.txt"}, null);
assertRevisionsMatch(op.getLeftTree(), copy, new String[] {"folder1/a.txt"}, new String[] {"folder1/newFile" } /* files with no revision */);
// Run the operation on a single file
remoteResource = CVSWorkspaceRoot.getRemoteResourceFor(copy.getFile("folder1/a.txt"));
op = new TestRemoteCompareOperation(null, remoteResource, v1);
run(op);
assertRevisionsMatch(op.getRightTree(), project, new String[] {"folder1/a.txt"}, null);
assertRevisionsMatch(op.getLeftTree(), copy, new String[] {"folder1/a.txt" }, null /* files with no revision */);
// Run the operation on a single file using RemoteCompareOperation.getTag
// to determine the tag
remoteResource = CVSWorkspaceRoot.getRemoteResourceFor(copy.getFile("folder1/a.txt"));
op = new TestRemoteCompareOperation(null, remoteResource, RemoteCompareOperation.getTag(CVSWorkspaceRoot.getRemoteResourceFor(project.getFile("folder1/a.txt"))));
run(op);
assertRevisionsMatch(op.getRightTree(), project, new String[] {"folder1/a.txt"}, null);
assertRevisionsMatch(op.getLeftTree(), copy, new String[] {"folder1/a.txt" }, null /* files with no revision */);
}
}