/******************************************************************************* * Copyright (c) 2005, 2015 Zend Technologies 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: * Zend Technologies - initial API and implementation *******************************************************************************/ package org.eclipse.php.refactoring.ui.actions; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.util.ArrayList; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.dltk.core.DLTKCore; import org.eclipse.dltk.core.IField; import org.eclipse.dltk.core.IMethod; import org.eclipse.dltk.core.IModelElement; import org.eclipse.dltk.core.IModelElementVisitor; import org.eclipse.dltk.core.IScriptProject; import org.eclipse.dltk.core.ISourceModule; import org.eclipse.dltk.core.IType; import org.eclipse.dltk.core.ModelException; import org.eclipse.php.core.ast.nodes.ASTNode; import org.eclipse.php.core.ast.nodes.ClassDeclaration; import org.eclipse.php.core.ast.nodes.FunctionDeclaration; import org.eclipse.php.core.ast.nodes.MethodDeclaration; import org.eclipse.php.core.ast.nodes.Program; import org.eclipse.php.core.ast.nodes.Variable; import org.eclipse.php.core.tests.TestUtils; import org.eclipse.php.refactoring.core.utils.RefactoringUtility; import junit.framework.TestCase; public class RenamePHPElementActionDelegateTest extends TestCase { private IProject project1; @Override protected void setUp() throws Exception { project1 = TestUtils.createProject("project1"); IFolder folder = TestUtils.createFolder(project1, "src"); folder = TestUtils.createFolder(project1, "src2"); folder = TestUtils.createFolder(project1, "src/src1"); TestUtils.createFile(folder, "test1.php", "<?php class TestRenameClass{}?>"); TestUtils.waitForIndexer(); } public void testGetSourceOffsetAndGetNode() { IFile file = project1.getFile("src/src1/test1.php"); IModelElement source = null; try { source = DLTKCore.create(file); } catch (Exception e) { fail(e.getMessage()); } assertNotNull(source); final ArrayList<IType> type = new ArrayList<IType>(); try { source.accept(new IModelElementVisitor() { @Override public boolean visit(IModelElement element) { if (element.getElementType() == ISourceModule.TYPE) { type.add((IType) element); return false; } return true; } }); } catch (ModelException e) { fail(e.getMessage()); } assertTrue(type.size() > 0); RenamePHPElementActionDelegateProxy action = new RenamePHPElementActionDelegateProxy(); int offset = -1; try { offset = action.getSourceOffset(type.get(0)); } catch (ModelException e) { fail(e.getMessage()); } assertTrue(offset >= 0); Program program; try { program = RefactoringUtility.getProgramForFile(file); ASTNode node = action.getSelectedNode(program, offset, 0); assertTrue(node instanceof ClassDeclaration); } catch (Exception e) { fail(e.getMessage()); } } public void testGetSourceOffsetAndGetNode1() { IFile file = project1.getFile("test1.php"); InputStream sourceStream = new ByteArrayInputStream("<?php function foo(){};?>".getBytes()); try { if (!file.exists()) { file.create(sourceStream, true, new NullProgressMonitor()); } else { file.setContents(sourceStream, IFile.FORCE, new NullProgressMonitor()); } } catch (CoreException e) { fail(e.getMessage()); } IModelElement source = null; try { source = DLTKCore.create(file); } catch (Exception e) { fail(e.getMessage()); } assertNotNull(source); final ArrayList<IMethod> methods = new ArrayList<IMethod>(); try { source.accept(new IModelElementVisitor() { @Override public boolean visit(IModelElement element) { if (element.getElementType() == ISourceModule.METHOD) { methods.add((IMethod) element); return false; } return true; } }); } catch (ModelException e) { fail(e.getMessage()); } assertTrue(methods.size() > 0); RenamePHPElementActionDelegateProxy action = new RenamePHPElementActionDelegateProxy(); int offset = -1; try { offset = action.getSourceOffset(methods.get(0)); } catch (ModelException e) { fail(e.getMessage()); } assertTrue(offset >= 0); Program program; try { program = RefactoringUtility.getProgramForFile(file); ASTNode node = action.getSelectedNode(program, offset, 0); assertTrue(node instanceof FunctionDeclaration); } catch (Exception e) { fail(e.getMessage()); } } public void testGetSourceOffsetAndGetNode2() { IFile file = project1.getFile("test2.php"); InputStream sourceStream = new ByteArrayInputStream( "<?php class MyClass { function myfunc1(){ return(true);}}?>".getBytes()); try { if (!file.exists()) { file.create(sourceStream, true, new NullProgressMonitor()); } else { file.setContents(sourceStream, IFile.FORCE, new NullProgressMonitor()); } } catch (CoreException e) { fail(e.getMessage()); } IModelElement source = null; try { source = DLTKCore.create(file); } catch (Exception e) { fail(e.getMessage()); } assertNotNull(source); try { ((ISourceModule) source).makeConsistent(new NullProgressMonitor()); } catch (ModelException e1) { fail(e1.getMessage()); } final ArrayList<IMethod> methods = new ArrayList<IMethod>(); try { source.accept(new IModelElementVisitor() { @Override public boolean visit(IModelElement element) { if (element.getElementType() == ISourceModule.METHOD) { methods.add((IMethod) element); return false; } return true; } }); } catch (ModelException e) { fail(e.getMessage()); } assertTrue(methods.size() > 0); RenamePHPElementActionDelegateProxy action = new RenamePHPElementActionDelegateProxy(); int offset = -1; try { offset = action.getSourceOffset(methods.get(0)); } catch (ModelException e) { fail(e.getMessage()); } assertTrue(offset >= 0); Program program; try { program = RefactoringUtility.getProgramForFile(file); ASTNode node = action.getSelectedNode(program, offset, 0); assertTrue(node instanceof FunctionDeclaration); assertTrue(node.getParent() instanceof MethodDeclaration); } catch (Exception e) { fail(e.getMessage()); } } public void testGetSourceOffsetAndGetNode3() { IFile file = project1.getFile("test3.php"); InputStream sourceStream = new ByteArrayInputStream("<?php class MyClss{public $a,$b;}?>".getBytes()); try { if (!file.exists()) { file.create(sourceStream, true, new NullProgressMonitor()); } else { file.setContents(sourceStream, IFile.FORCE, new NullProgressMonitor()); } } catch (CoreException e) { fail(e.getMessage()); } IModelElement source = null; try { source = DLTKCore.create(file); } catch (Exception e) { fail(e.getMessage()); } assertNotNull(source); try { ((ISourceModule) source).makeConsistent(new NullProgressMonitor()); } catch (ModelException e1) { fail(e1.getMessage()); } final ArrayList<IField> methods = new ArrayList<IField>(); try { source.accept(new IModelElementVisitor() { @Override public boolean visit(IModelElement element) { if (element.getElementType() == ISourceModule.FIELD) { methods.add((IField) element); return false; } return true; } }); } catch (ModelException e) { fail(e.getMessage()); } assertTrue(methods.size() > 0); RenamePHPElementActionDelegateProxy action = new RenamePHPElementActionDelegateProxy(); int offset = -1; try { offset = action.getSourceOffset(methods.get(0)); } catch (ModelException e) { fail(e.getMessage()); } assertTrue(offset >= 0); Program program; try { program = RefactoringUtility.getProgramForFile(file); ASTNode node = action.getSelectedNode(program, offset, 0); assertTrue(node instanceof Variable); } catch (Exception e) { fail(e.getMessage()); } } public void testIsSourceReference() { IFile file = project1.getFile("src/src1/test1.php"); IModelElement source = null; try { source = DLTKCore.create(file); } catch (Exception e) { fail(e.getMessage()); } assertNotNull(source); RenamePHPElementActionDelegateProxy action = new RenamePHPElementActionDelegateProxy(); assertTrue(action.isModelElement(source)); assertTrue(action.isSourceReference(source)); } public void testIsScriptContainer() { RenamePHPElementActionDelegateProxy action = new RenamePHPElementActionDelegateProxy(); // script project case final IScriptProject scriptProject = DLTKCore.create(project1.getProject()); assertTrue(action.isScriptContainer(scriptProject)); // script fragment case IPath fPath = new Path("/project1/src"); IFolder folder = project1.getFolder(fPath); IModelElement element = scriptProject.getProjectFragment(folder); assertTrue(action.isScriptContainer(element)); // script folder case fPath = new Path("/project1/src/src1"); folder = project1.getFolder(fPath); element = DLTKCore.create(folder); assertTrue(action.isScriptContainer(element)); // resource folder case folder = project1.getFolder("src2"); assertFalse(action.isScriptContainer(folder)); // resource file case IFile file = project1.getFile("src/src1/test1.php"); assertFalse(action.isScriptContainer(folder)); // IModelElement case Program program = null; try { program = RefactoringUtility.getProgramForFile(file); } catch (Exception e) { fail(e.getMessage()); } assertFalse(action.isScriptContainer(program)); } @Override protected void tearDown() throws Exception { project1.delete(IResource.FORCE, new NullProgressMonitor()); } }