blob: 1a2548ee54db48f2529a96d1c77f23bdac5a7607 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2015 IBM Corporation 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:
* IBM Corporation - initial API and implementation
* Alexander Kurtakov <akurtako@redhat.com> - Bug 459343
*******************************************************************************/
package org.eclipse.core.tests.internal.mapping;
import java.util.ArrayList;
import java.util.List;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.resources.*;
import org.eclipse.core.resources.mapping.*;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.tests.resources.ResourceTest;
/**
* Tests for change validation
*/
public class ChangeValidationTest extends ResourceTest {
private IResourceChangeDescriptionFactory factory;
private IProject project;
public static Test suite() {
return new TestSuite(ChangeValidationTest.class);
}
private void assertStatusEqual(IStatus status, String[] expectedMessages) {
List<String> actualMessages = new ArrayList<>();
if (status.isMultiStatus()) {
IStatus[] children = status.getChildren();
for (IStatus element : children) {
String message = getModelMessage(element);
if (message != null) {
actualMessages.add(message);
}
}
} else {
String message = getModelMessage(status);
if (message != null) {
actualMessages.add(message);
}
}
if (expectedMessages.length < actualMessages.size()) {
for (String actual : actualMessages) {
boolean found = false;
for (String expected : expectedMessages) {
if (actual.equals(expected)) {
found = true;
break;
}
}
if (!found) {
fail("Unexpected message returned: " + actual);
}
}
} else {
for (String expectedMessage : expectedMessages) {
if (!actualMessages.contains(expectedMessage)) {
fail("Expect message missing: " + expectedMessage);
}
}
}
}
private IResourceChangeDescriptionFactory createEmptyChangeDescription() {
return ResourceChangeValidator.getValidator().createDeltaFactory();
}
/*
* Only return the message of the status if it
* came from our test model provider
*/
private String getModelMessage(IStatus status) {
if (status instanceof ModelStatus) {
ModelStatus ms = (ModelStatus) status;
String id = ms.getModelProviderId();
if (id.equals(TestModelProvider.ID)) {
return status.getMessage();
}
}
return null;
}
@Override
protected void setUp() throws Exception {
TestModelProvider.enabled = true;
super.setUp();
project = getWorkspace().getRoot().getProject("Project");
IResource[] before = buildResources(project, new String[] {"c/", "c/b/", "c/a/", "c/x", "c/b/y", "c/b/z"});
ensureExistsInWorkspace(before, true);
assertExistsInWorkspace(before);
factory = createEmptyChangeDescription();
}
@Override
protected void tearDown() throws Exception {
TestModelProvider.enabled = false;
super.tearDown();
}
public void testCopyReplaceDeletedFolder() {
// Copy folder to replace a deleted folder
final IResource folder = project.findMember("c/b/");
IFolder destination = project.getFolder("/c/a/");
factory.delete(destination);
factory.copy(folder, destination.getFullPath());
IStatus status = validateChange(factory);
assertStatusEqual(status, new String[] {ChangeDescription.getMessageFor(ChangeDescription.COPIED, folder),});
}
public void testFileChanges() {
factory.change((IFile) project.findMember("c/x"));
factory.change((IFile) project.findMember("c/b/y"));
IStatus status = validateChange(factory);
assertStatusEqual(status, new String[] {ChangeDescription.getMessageFor(ChangeDescription.CHANGED, project.findMember("c/x")), ChangeDescription.getMessageFor(ChangeDescription.CHANGED, project.findMember("c/b/y"))});
}
public void testFileCopy() {
factory.copy(project.findMember("c/x"), new Path("c/x2"));
factory.copy(project.findMember("c/b/y"), new Path("c/y"));
IStatus status = validateChange(factory);
assertStatusEqual(status, new String[] {ChangeDescription.getMessageFor(ChangeDescription.COPIED, project.findMember("c/x")), ChangeDescription.getMessageFor(ChangeDescription.COPIED, project.findMember("c/b/y"))});
}
public void testFileCreate() {
IFile file = project.getFile("file");
factory.create(file);
IStatus status = validateChange(factory);
assertStatusEqual(status, new String[] {ChangeDescription.getMessageFor(ChangeDescription.ADDED, file)});
}
public void testFileInFolderCreate() {
IFolder folder = project.getFolder("folder");
IFile file = folder.getFile("file");
factory.create(folder);
factory.create(file);
IStatus status = validateChange(factory);
//this isn't very accurate, but ChangeDescription doesn't currently record recursive creates
assertStatusEqual(status, new String[] {ChangeDescription.getMessageFor(ChangeDescription.ADDED, folder)});
}
public void testFileDeletion() {
factory.delete(project.findMember("c/x"));
factory.delete(project.findMember("c/b/y"));
IStatus status = validateChange(factory);
assertStatusEqual(status, new String[] {ChangeDescription.getMessageFor(ChangeDescription.REMOVED, project.findMember("c/x")), ChangeDescription.getMessageFor(ChangeDescription.REMOVED, project.findMember("c/b/y"))});
}
public void testFileMoves() {
factory.move(project.findMember("c/x"), new Path("c/x2"));
factory.move(project.findMember("c/b/y"), new Path("c/y"));
IStatus status = validateChange(factory);
assertStatusEqual(status, new String[] {ChangeDescription.getMessageFor(ChangeDescription.MOVED, project.findMember("c/x")), ChangeDescription.getMessageFor(ChangeDescription.MOVED, project.findMember("c/b/y"))});
}
public void testFolderCopy() {
final IResource folder = project.findMember("c/b/");
factory.copy(folder, new Path("c/d"));
IStatus status = validateChange(factory);
assertStatusEqual(status, new String[] {ChangeDescription.getMessageFor(ChangeDescription.COPIED, folder),});
}
public void testFolderDeletion() {
final IResource folder = project.findMember("c/b/");
factory.delete(folder);
IStatus status = validateChange(factory);
assertStatusEqual(status, new String[] {ChangeDescription.getMessageFor(ChangeDescription.REMOVED, project.findMember("c/b")),});
}
public void testFolderMove() {
final IResource folder = project.findMember("c/b/");
factory.move(folder, new Path("c/d"));
IStatus status = validateChange(factory);
assertStatusEqual(status, new String[] {ChangeDescription.getMessageFor(ChangeDescription.MOVED, folder),});
}
public void testMoveReplaceDeletedFolder() {
// Move to replace a deleted folder
final IResource folder = project.findMember("c/b/");
IFolder destination = project.getFolder("/c/a/");
factory.delete(destination);
factory.move(folder, destination.getFullPath());
IStatus status = validateChange(factory);
assertStatusEqual(status, new String[] {ChangeDescription.getMessageFor(ChangeDescription.MOVED, folder),});
}
public void testProjectClose() {
factory.close(project);
IStatus status = validateChange(factory);
assertStatusEqual(status, new String[] {ChangeDescription.getMessageFor(ChangeDescription.CLOSED, project)});
}
public void testProjectCopy() {
// A project copy
factory.copy(project, new Path("MovedProject"));
IStatus status = validateChange(factory);
assertStatusEqual(status, new String[] {ChangeDescription.getMessageFor(ChangeDescription.COPIED, project)});
}
public void testProjectDeletion() {
// A project deletion
factory.delete(project);
IStatus status = validateChange(factory);
assertStatusEqual(status, new String[] {ChangeDescription.getMessageFor(ChangeDescription.REMOVED, project)});
}
public void testProjectMove() {
factory.move(project, new Path("MovedProject"));
IStatus status = validateChange(factory);
assertStatusEqual(status, new String[] {ChangeDescription.getMessageFor(ChangeDescription.MOVED, project)});
}
private IStatus validateChange(IResourceChangeDescriptionFactory factory) {
return ResourceChangeValidator.getValidator().validateChange(factory.getDelta(), getMonitor());
}
}