/******************************************************************************* * Copyright (c) 2008, 2013 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 * Sergey Prigogin <eclipse.sprigogin@gmail.com> - [refactoring] Provide a way to implement refactorings that depend on resources that have to be explicitly released - https://bugs.eclipse.org/347599 *******************************************************************************/ package org.eclipse.ltk.core.refactoring.tests.resource; import java.io.IOException; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.eclipse.core.filesystem.EFS; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.ltk.core.refactoring.Change; import org.eclipse.ltk.core.refactoring.CheckConditionsOperation; import org.eclipse.ltk.core.refactoring.PerformChangeOperation; import org.eclipse.ltk.core.refactoring.PerformRefactoringOperation; import org.eclipse.ltk.core.refactoring.Refactoring; import org.eclipse.ltk.core.refactoring.RefactoringContext; import org.eclipse.ltk.core.refactoring.RefactoringContribution; import org.eclipse.ltk.core.refactoring.RefactoringCore; import org.eclipse.ltk.core.refactoring.RefactoringDescriptor; import org.eclipse.ltk.core.refactoring.RefactoringStatus; import org.eclipse.ltk.core.refactoring.resource.DeleteResourcesDescriptor; import org.eclipse.ltk.core.refactoring.resource.MoveResourceChange; import org.eclipse.ltk.core.refactoring.resource.MoveResourcesDescriptor; import org.eclipse.ltk.core.refactoring.tests.util.SimpleTestProject; public class ResourceRefactoringTests extends TestCase { public static Test suite() { TestSuite suite= new TestSuite(ResourceRefactoringTests.class.getName()); suite.addTestSuite(ResourceRefactoringTests.class); suite.addTestSuite(ResourceRefactoringUndoTests.class); return suite; } private SimpleTestProject fProject; @Override protected void setUp() throws Exception { fProject= new SimpleTestProject(); } @Override protected void tearDown() throws Exception { fProject.delete(); } public void testMoveChange1() throws Exception { String content= "hello"; IFolder testFolder= fProject.createFolder("test"); IFile file= fProject.createFile(testFolder, "myFile.txt", content); IFolder destination= fProject.createFolder("dest"); Change undoChange= perform(new MoveResourceChange(file, destination)); IResource movedResource= assertMove(file, destination, content); perform(undoChange); assertMove(movedResource, file.getParent(), content); } public void testMoveChange2() throws Exception { String content= "hello"; IFolder testFolder= fProject.createFolder("test"); fProject.createFile(testFolder, "myFile.txt", content); IFolder destination= fProject.createFolder("dest"); Change undoChange= perform(new MoveResourceChange(testFolder, destination)); IFolder movedResource= (IFolder) assertMove(testFolder, destination, null); assertTrue(movedResource.getFile("myFile.txt").exists()); perform(undoChange); assertMove(movedResource, testFolder.getParent(), null); assertTrue(testFolder.getFile("myFile.txt").exists()); } public void testMoveChange3() throws Exception { // move with overwrite String content1= "hello"; String content2= "world"; IFolder testFolder= fProject.createFolder("test"); IFile file1= fProject.createFile(testFolder, "myFile.txt", content1); IFolder destination= fProject.createFolder("dest"); IFile file2= fProject.createFile(destination, "myFile.txt", content2); Change undoChange= perform(new MoveResourceChange(file1, destination)); IResource movedResource= assertMove(file1, destination, content1); perform(undoChange); assertMove(movedResource, file1.getParent(), content1); assertTrue(content2.equals(fProject.getContent(file2))); } public void testMoveRefactoring1() throws Exception { String content= "hello"; IFolder testFolder= fProject.createFolder("test"); IFile file= fProject.createFile(testFolder, "myFile.txt", content); IFolder destination= fProject.createFolder("dest"); RefactoringContribution contribution= RefactoringCore.getRefactoringContribution(MoveResourcesDescriptor.ID); MoveResourcesDescriptor descriptor= (MoveResourcesDescriptor) contribution.createDescriptor(); descriptor.setResourcesToMove(new IResource[] { file }); descriptor.setDestination(destination); Change undoChange= perform(descriptor); IResource movedResource= assertMove(file, destination, content); perform(undoChange); assertMove(movedResource, file.getParent(), content); } public void testMoveRefactoring2() throws Exception { String content= "hello"; IFolder testFolder= fProject.createFolder("test"); fProject.createFile(testFolder, "myFile.txt", content); IFolder destination= fProject.createFolder("dest"); RefactoringContribution contribution= RefactoringCore.getRefactoringContribution(MoveResourcesDescriptor.ID); MoveResourcesDescriptor descriptor= (MoveResourcesDescriptor) contribution.createDescriptor(); descriptor.setResourcesToMove(new IResource[] { testFolder }); descriptor.setDestination(destination); Change undoChange= perform(descriptor); IFolder movedResource= (IFolder) assertMove(testFolder, destination, null); assertTrue(movedResource.getFile("myFile.txt").exists()); perform(undoChange); assertMove(movedResource, testFolder.getParent(), null); assertTrue(testFolder.getFile("myFile.txt").exists()); } public void testMoveRefactoring3() throws Exception { // move with overwrite String content1= "hello"; String content2= "world"; IFolder testFolder= fProject.createFolder("test"); IFile file1= fProject.createFile(testFolder, "myFile.txt", content1); IFolder destination= fProject.createFolder("dest"); IFile file2= fProject.createFile(destination, "myFile.txt", content2); RefactoringContribution contribution= RefactoringCore.getRefactoringContribution(MoveResourcesDescriptor.ID); MoveResourcesDescriptor descriptor= (MoveResourcesDescriptor) contribution.createDescriptor(); descriptor.setResourcesToMove(new IResource[] { file1 }); descriptor.setDestination(destination); Change undoChange= perform(descriptor); IResource movedResource= assertMove(file1, destination, content1); perform(undoChange); assertMove(movedResource, file1.getParent(), content1); assertTrue(content2.equals(fProject.getContent(file2))); } public void testDeleteRefactoring1_bug343584() throws Exception { IFolder testFolder= fProject.createFolder("test"); fProject.createFile(testFolder, "myFile.txt", "hello"); IProject testProject2= ResourcesPlugin.getWorkspace().getRoot().getProject(SimpleTestProject.TEST_PROJECT_NAME + "2"); try { testProject2.create(null); testProject2.open(null); RefactoringContribution contribution= RefactoringCore.getRefactoringContribution(DeleteResourcesDescriptor.ID); DeleteResourcesDescriptor descriptor= (DeleteResourcesDescriptor)contribution.createDescriptor(); descriptor.setDeleteContents(true); descriptor.setResources(new IResource[] { fProject.getProject(), testProject2 }); perform(descriptor); assertFalse(fProject.getProject().exists()); assertFalse(testProject2.exists()); } finally { testProject2.delete(true, true, null); } } public void testDeleteRefactoring2_bug343584() throws Exception { IPath location= fProject.getProject().getLocation(); IFolder testFolder= fProject.createFolder("test"); fProject.createFile(testFolder, "myFile.txt", "hello"); IWorkspace workspace= ResourcesPlugin.getWorkspace(); String p2Name= "p2"; IProjectDescription p2Description= workspace.newProjectDescription(p2Name); p2Description.setLocation(location.append(p2Name)); IProject p2= workspace.getRoot().getProject(p2Name); p2.create(p2Description, null); p2.open(null); IPath p2Location= p2.getLocation(); RefactoringContribution contribution= RefactoringCore.getRefactoringContribution(DeleteResourcesDescriptor.ID); DeleteResourcesDescriptor descriptor= (DeleteResourcesDescriptor) contribution.createDescriptor(); descriptor.setDeleteContents(true); descriptor.setResources(new IResource[] { fProject.getProject(), p2 }); perform(descriptor); assertFalse(fProject.getProject().exists()); assertFalse(p2.exists()); assertFalse(location.toFile().exists()); assertFalse(p2Location.toFile().exists()); } public void testDeleteRefactoring3_bug343584() throws Exception { IPath location= fProject.getProject().getLocation(); IFolder testFolder= fProject.createFolder("test"); IFile file= fProject.createFile(testFolder, "myFile.txt", "hello"); IPath fileLocation= file.getLocation(); IWorkspace workspace= ResourcesPlugin.getWorkspace(); String p2Name= "p2"; IProjectDescription p2Description= workspace.newProjectDescription(p2Name); p2Description.setLocation(location.append(p2Name)); IProject p2= workspace.getRoot().getProject(p2Name); p2.create(p2Description, null); p2.open(null); IPath p2Location= p2.getLocation(); try { RefactoringContribution contribution= RefactoringCore.getRefactoringContribution(DeleteResourcesDescriptor.ID); DeleteResourcesDescriptor descriptor= (DeleteResourcesDescriptor) contribution.createDescriptor(); descriptor.setDeleteContents(false); descriptor.setResources(new IResource[] { fProject.getProject(), p2 }); perform(descriptor); assertFalse(fProject.getProject().exists()); assertFalse(p2.exists()); assertTrue(location.toFile().exists()); assertTrue(fileLocation.toFile().exists()); assertTrue(p2Location.toFile().exists()); } finally { EFS.getLocalFileSystem().getStore(location).delete(EFS.NONE, null); EFS.getLocalFileSystem().getStore(p2Location).delete(EFS.NONE, null); } } private Change perform(Change change) throws CoreException { PerformChangeOperation op= new PerformChangeOperation(change); op.run(null); assertTrue(op.changeExecuted()); return op.getUndoChange(); } private Change perform(RefactoringDescriptor descriptor) throws CoreException { RefactoringStatus status= new RefactoringStatus(); final RefactoringContext context= descriptor.createRefactoringContext(status); try { final Refactoring refactoring= context != null ? context.getRefactoring() : null; assertTrue(status.isOK()); PerformRefactoringOperation op= new PerformRefactoringOperation(refactoring, CheckConditionsOperation.ALL_CONDITIONS); op.run(null); RefactoringStatus validationStatus= op.getValidationStatus(); assertTrue(!validationStatus.hasFatalError() && !validationStatus.hasError()); return op.getUndoChange(); } finally { if (context != null) context.dispose(); } } private IResource assertMove(IResource source, IContainer destination, String content) throws CoreException, IOException { IResource res= destination.findMember(source.getName()); assertTrue(res != null); assertTrue(res.getType() == source.getType()); if (res instanceof IFile) { assertTrue(content.equals(fProject.getContent((IFile) res))); } return res; } }