| /******************************************************************************* |
| * Copyright (c) 2000, 2004 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.jdt.ui.tests.core; |
| |
| |
| import java.io.File; |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| |
| import junit.framework.Test; |
| import junit.framework.TestCase; |
| import junit.framework.TestSuite; |
| |
| import org.eclipse.jdt.testplugin.JavaProjectHelper; |
| import org.eclipse.jdt.testplugin.JavaTestPlugin; |
| |
| import org.eclipse.core.resources.IWorkspace; |
| import org.eclipse.core.resources.IWorkspaceDescription; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.Path; |
| |
| import org.eclipse.jdt.core.IClasspathEntry; |
| import org.eclipse.jdt.core.ICompilationUnit; |
| import org.eclipse.jdt.core.IJavaElement; |
| import org.eclipse.jdt.core.IJavaProject; |
| import org.eclipse.jdt.core.IMember; |
| import org.eclipse.jdt.core.IMethod; |
| import org.eclipse.jdt.core.IPackageFragment; |
| import org.eclipse.jdt.core.IPackageFragmentRoot; |
| import org.eclipse.jdt.core.IType; |
| import org.eclipse.jdt.core.ITypeHierarchy; |
| import org.eclipse.jdt.core.Signature; |
| |
| import org.eclipse.jdt.internal.corext.util.JavaModelUtil; |
| |
| public class JavaModelUtilTest extends TestCase { |
| |
| private static final Class THIS= JavaModelUtilTest.class; |
| |
| private IJavaProject fJProject1; |
| private IJavaProject fJProject2; |
| |
| private boolean fEnableAutoBuildAfterTesting; |
| |
| private static final IPath LIB= new Path("testresources/mylib.jar"); |
| |
| public JavaModelUtilTest(String name) { |
| super(name); |
| } |
| |
| public static Test allTests() { |
| return new ProjectTestSetup(new TestSuite(THIS)); |
| } |
| |
| public static Test suite() { |
| if (true) { |
| return allTests(); |
| } else { |
| TestSuite suite= new TestSuite(); |
| suite.addTest(new JavaModelUtilTest("testFindType")); |
| return new ProjectTestSetup(suite); |
| } |
| } |
| |
| |
| protected void setUp() throws Exception { |
| IWorkspace workspace= JavaTestPlugin.getWorkspace(); |
| assertNotNull(workspace); |
| |
| // disable auto-build |
| IWorkspaceDescription workspaceDesc= workspace.getDescription(); |
| if (workspaceDesc.isAutoBuilding()) { |
| fEnableAutoBuildAfterTesting= true; |
| JavaProjectHelper.setAutoBuilding(false); |
| } |
| |
| fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin"); |
| fJProject2= JavaProjectHelper.createJavaProject("TestProject2", "bin"); |
| |
| IPackageFragmentRoot jdk= JavaProjectHelper.addVariableRTJar(fJProject1, "JRE_LIB_TEST", null, null); |
| assertTrue("jdk not found", jdk != null); |
| |
| File junitSrcArchive= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.JUNIT_SRC); |
| assertTrue("junit src not found", junitSrcArchive != null && junitSrcArchive.exists()); |
| |
| JavaProjectHelper.addSourceContainerWithImport(fJProject1, "src", junitSrcArchive); |
| |
| File mylibJar= JavaTestPlugin.getDefault().getFileInPlugin(LIB); |
| assertTrue("lib not found", junitSrcArchive != null && junitSrcArchive.exists()); |
| |
| JavaProjectHelper.addLibraryWithImport(fJProject1, new Path(mylibJar.getPath()), null, null); |
| |
| JavaProjectHelper.addVariableEntry(fJProject2, new Path("JRE_LIB_TEST"), null, null); |
| |
| IPackageFragmentRoot root1= JavaProjectHelper.addSourceContainer(fJProject2, "src"); |
| IPackageFragment pack1= root1.createPackageFragment("pack1", true, null); |
| |
| ICompilationUnit cu1= pack1.getCompilationUnit("ReqProjType.java"); |
| cu1.createType("public class ReqProjType { static class Inner { static class InnerInner {} }\n}\n", null, true, null); |
| |
| JavaProjectHelper.addRequiredProject(fJProject1, fJProject2); |
| } |
| |
| |
| protected void tearDown() throws Exception { |
| JavaProjectHelper.delete(fJProject1); |
| JavaProjectHelper.delete(fJProject2); |
| |
| if (fEnableAutoBuildAfterTesting) |
| JavaProjectHelper.setAutoBuilding(true); |
| } |
| |
| |
| private void assertElementName(String name, IJavaElement elem, int type) { |
| assertNotNull(name, elem); |
| assertEquals(name + "-name", name, elem.getElementName()); |
| assertTrue(name + "-type", type == elem.getElementType()); |
| } |
| |
| public void testFindType() throws Exception { |
| IType type= JavaModelUtil.findType(fJProject1, "junit.extensions.ExceptionTestCase"); |
| assertElementName("ExceptionTestCase", type, IJavaElement.TYPE); |
| |
| type= JavaModelUtil.findType(fJProject1, "junit.samples.money.IMoney"); |
| assertElementName("IMoney", type, IJavaElement.TYPE); |
| |
| type= JavaModelUtil.findType(fJProject1, "junit.tests.TestCaseTest.TornDown"); |
| assertElementName("TornDown", type, IJavaElement.TYPE); |
| |
| type= JavaModelUtil.findType(fJProject1, "mylib.Foo"); |
| assertElementName("Foo", type, IJavaElement.TYPE); |
| |
| type= JavaModelUtil.findType(fJProject1, "mylib.Foo.FooInner"); |
| assertElementName("FooInner", type, IJavaElement.TYPE); |
| |
| type= JavaModelUtil.findType(fJProject1, "mylib.Foo.FooInner.FooInnerInner"); |
| assertElementName("FooInnerInner", type, IJavaElement.TYPE); |
| |
| type= JavaModelUtil.findType(fJProject1, "pack1.ReqProjType"); |
| assertElementName("ReqProjType", type, IJavaElement.TYPE); |
| |
| type= JavaModelUtil.findType(fJProject1, "pack1.ReqProjType.Inner"); |
| assertElementName("Inner", type, IJavaElement.TYPE); |
| |
| type= JavaModelUtil.findType(fJProject1, "pack1.ReqProjType.Inner.InnerInner"); |
| assertElementName("InnerInner", type, IJavaElement.TYPE); |
| } |
| |
| /** |
| * @deprecated Tests a deprecated method |
| */ |
| public void testFindType2() throws Exception { |
| IType type= JavaModelUtil.findType(fJProject1, "junit.extensions", "ExceptionTestCase"); |
| assertElementName("ExceptionTestCase", type, IJavaElement.TYPE); |
| |
| type= JavaModelUtil.findType(fJProject1, "junit.samples.money" , "IMoney"); |
| assertElementName("IMoney", type, IJavaElement.TYPE); |
| |
| type= JavaModelUtil.findType(fJProject1, "junit.tests", "TestCaseTest.TornDown"); |
| assertElementName("TornDown", type, IJavaElement.TYPE); |
| |
| type= JavaModelUtil.findType(fJProject1, "mylib" , "Foo"); |
| assertElementName("Foo", type, IJavaElement.TYPE); |
| |
| type= JavaModelUtil.findType(fJProject1, "mylib", "Foo.FooInner"); |
| assertElementName("FooInner", type, IJavaElement.TYPE); |
| |
| type= JavaModelUtil.findType(fJProject1, "mylib", "Foo.FooInner.FooInnerInner"); |
| assertElementName("FooInnerInner", type, IJavaElement.TYPE); |
| |
| type= JavaModelUtil.findType(fJProject1, "pack1", "ReqProjType"); |
| assertElementName("ReqProjType", type, IJavaElement.TYPE); |
| |
| type= JavaModelUtil.findType(fJProject1, "pack1", "ReqProjType.Inner"); |
| assertElementName("Inner", type, IJavaElement.TYPE); |
| |
| type= JavaModelUtil.findType(fJProject1, "pack1", "ReqProjType.Inner.InnerInner"); |
| assertElementName("InnerInner", type, IJavaElement.TYPE); |
| } |
| |
| public void testFindTypeContainer() throws Exception { |
| IJavaElement elem= JavaModelUtil.findTypeContainer(fJProject1, "junit.extensions"); |
| assertElementName("junit.extensions", elem, IJavaElement.PACKAGE_FRAGMENT); |
| |
| elem= JavaModelUtil.findTypeContainer(fJProject1, "junit.tests.TestCaseTest"); |
| assertElementName("TestCaseTest", elem, IJavaElement.TYPE); |
| |
| elem= JavaModelUtil.findTypeContainer(fJProject1, "mylib" ); |
| assertElementName("mylib", elem, IJavaElement.PACKAGE_FRAGMENT); |
| |
| elem= JavaModelUtil.findTypeContainer(fJProject1, "mylib.Foo"); |
| assertElementName("Foo", elem, IJavaElement.TYPE); |
| |
| elem= JavaModelUtil.findTypeContainer(fJProject1, "mylib.Foo.FooInner"); |
| assertElementName("FooInner", elem, IJavaElement.TYPE); |
| |
| elem= JavaModelUtil.findTypeContainer(fJProject1, "pack1"); |
| assertElementName("pack1", elem, IJavaElement.PACKAGE_FRAGMENT); |
| |
| elem= JavaModelUtil.findTypeContainer(fJProject1, "pack1.ReqProjType"); |
| assertElementName("ReqProjType", elem, IJavaElement.TYPE); |
| |
| elem= JavaModelUtil.findTypeContainer(fJProject1, "pack1.ReqProjType.Inner"); |
| assertElementName("Inner", elem, IJavaElement.TYPE); |
| } |
| |
| public void testFindTypeInCompilationUnit() throws Exception { |
| ICompilationUnit cu= (ICompilationUnit) fJProject1.findElement(new Path("junit/tests/TestCaseTest.java")); |
| assertElementName("TestCaseTest.java", cu, IJavaElement.COMPILATION_UNIT); |
| |
| IType type= JavaModelUtil.findTypeInCompilationUnit(cu, "TestCaseTest"); |
| assertElementName("TestCaseTest", type, IJavaElement.TYPE); |
| |
| type= JavaModelUtil.findTypeInCompilationUnit(cu, "TestCaseTest.TornDown"); |
| assertElementName("TornDown", type, IJavaElement.TYPE); |
| |
| cu= (ICompilationUnit) fJProject1.findElement(new Path("pack1/ReqProjType.java")); |
| assertElementName("ReqProjType.java", cu, IJavaElement.COMPILATION_UNIT); |
| |
| type= JavaModelUtil.findTypeInCompilationUnit(cu, "ReqProjType"); |
| assertElementName("ReqProjType", type, IJavaElement.TYPE); |
| |
| type= JavaModelUtil.findTypeInCompilationUnit(cu, "ReqProjType.Inner"); |
| assertElementName("Inner", type, IJavaElement.TYPE); |
| |
| type= JavaModelUtil.findTypeInCompilationUnit(cu, "ReqProjType.Inner.InnerInner"); |
| assertElementName("InnerInner", type, IJavaElement.TYPE); |
| } |
| |
| public void testFindMemberInCompilationUnit() throws Exception { |
| ICompilationUnit cu= (ICompilationUnit) fJProject1.findElement(new Path("junit/tests/TestCaseTest.java")); |
| assertElementName("TestCaseTest.java", cu, IJavaElement.COMPILATION_UNIT); |
| ArrayList children= new ArrayList(); |
| |
| IType type= JavaModelUtil.findTypeInCompilationUnit(cu, "TestCaseTest"); |
| assertElementName("TestCaseTest", type, IJavaElement.TYPE); |
| |
| children.addAll(Arrays.asList(type.getChildren())); |
| |
| type= JavaModelUtil.findTypeInCompilationUnit(cu, "TestCaseTest.TornDown"); |
| assertElementName("TornDown", type, IJavaElement.TYPE); |
| |
| children.addAll(Arrays.asList(type.getChildren())); |
| |
| assertTrue("a", children.size() == 19); |
| |
| for (int i= 0; i < children.size(); i++) { |
| Object curr= children.get(i); |
| assertTrue("b", curr instanceof IMember); |
| IMember member= JavaModelUtil.findMemberInCompilationUnit(cu, (IMember) curr); |
| assertEquals("b-" + i, curr, member); |
| } |
| } |
| |
| private void assertClasspathEntry(String name, IJavaElement elem, IPath path, int type) throws Exception { |
| IPackageFragmentRoot root= JavaModelUtil.getPackageFragmentRoot(elem); |
| assertNotNull(name + "-noroot", root); |
| IClasspathEntry entry= root.getRawClasspathEntry(); |
| assertNotNull(name + "-nocp", entry); |
| assertEquals(name + "-wrongpath", entry.getPath(), path); |
| assertTrue(name + "-wrongtype", type == entry.getEntryKind()); |
| } |
| |
| public void testGetRawClasspathEntry() throws Exception { |
| IType type= JavaModelUtil.findType(fJProject1, "junit.extensions.ExceptionTestCase"); |
| assertElementName("ExceptionTestCase", type, IJavaElement.TYPE); |
| IPath path= fJProject1.getProject().getFullPath().append("src"); |
| assertClasspathEntry("ExceptionTestCase", type, path, IClasspathEntry.CPE_SOURCE); |
| |
| type= JavaModelUtil.findType(fJProject1, "mylib.Foo"); |
| assertElementName("Foo", type, IJavaElement.TYPE); |
| path= fJProject1.getProject().getFullPath().append(LIB.lastSegment()); |
| assertClasspathEntry("Foo", type, path, IClasspathEntry.CPE_LIBRARY); |
| |
| type= JavaModelUtil.findType(fJProject1, "java.lang.Object"); |
| assertElementName("Object", type, IJavaElement.TYPE); |
| path= new Path("JRE_LIB_TEST"); |
| assertClasspathEntry("Object", type, path, IClasspathEntry.CPE_VARIABLE); |
| |
| type= JavaModelUtil.findType(fJProject1, "pack1.ReqProjType"); |
| assertElementName("ReqProjType", type, IJavaElement.TYPE); |
| path= fJProject2.getProject().getFullPath().append("src"); |
| assertClasspathEntry("ReqProjType", type, path, IClasspathEntry.CPE_SOURCE); |
| } |
| |
| /** |
| * @deprecated Tests a deprecated method |
| */ |
| public void testIsOnBuildPath() throws Exception { |
| IType type= JavaModelUtil.findType(fJProject1, "junit.extensions.ExceptionTestCase"); |
| assertElementName("ExceptionTestCase", type, IJavaElement.TYPE); |
| assertTrue("ExceptionTestCase-bp1", JavaModelUtil.isOnBuildPath(fJProject1, type)); |
| assertTrue("ExceptionTestCase-bp2", !JavaModelUtil.isOnBuildPath(fJProject2, type)); |
| |
| type= JavaModelUtil.findType(fJProject1, "java.lang.Object"); |
| assertElementName("Object", type, IJavaElement.TYPE); |
| assertTrue("Object-bp1", JavaModelUtil.isOnBuildPath(fJProject1, type)); |
| // relies on shared objects for library entries |
| assertTrue("Object-bp2", JavaModelUtil.isOnBuildPath(fJProject2, type)); |
| |
| type= JavaModelUtil.findType(fJProject1, "pack1.ReqProjType"); |
| assertElementName("ReqProjType", type, IJavaElement.TYPE); |
| assertTrue("ReqProjType-bp1", JavaModelUtil.isOnBuildPath(fJProject1, type)); |
| // relies on shared objects for project entries |
| assertTrue("ReqProjType-bp2", JavaModelUtil.isOnBuildPath(fJProject2, type)); |
| } |
| |
| private void assertFindMethod(String methName, String[] paramTypeNames, boolean isConstructor, IType type) throws Exception { |
| String[] sig= new String[paramTypeNames.length]; |
| for (int i= 0; i < paramTypeNames.length; i++) { |
| // create as unresolved |
| String name= Signature.getSimpleName(paramTypeNames[i]); |
| sig[i]= Signature.createTypeSignature(name, false); |
| assertNotNull(methName + "-ts1" + i, sig[i]); |
| } |
| IMethod meth= JavaModelUtil.findMethod(methName, sig, isConstructor, type); |
| assertElementName(methName, meth, IJavaElement.METHOD); |
| assertTrue("methName-nparam1", meth.getParameterTypes().length == paramTypeNames.length); |
| |
| for (int i= 0; i < paramTypeNames.length; i++) { |
| // create as resolved |
| sig[i]= Signature.createTypeSignature(paramTypeNames[i], true); |
| assertNotNull(methName + "-ts2" + i, sig[i]); |
| } |
| meth= JavaModelUtil.findMethod(methName, sig, isConstructor, type); |
| assertElementName(methName, meth, IJavaElement.METHOD); |
| assertTrue("methName-nparam2", meth.getParameterTypes().length == paramTypeNames.length); |
| } |
| |
| public void testFindMethod() throws Exception { |
| IType type= JavaModelUtil.findType(fJProject1, "junit.framework.Assert"); |
| assertElementName("Assert", type, IJavaElement.TYPE); |
| |
| assertFindMethod("assertNotNull", new String[] { "java.lang.Object" }, false, type); |
| assertFindMethod("assertNotNull", new String[] { "java.lang.String", "java.lang.Object" }, false, type); |
| assertFindMethod("assertEquals", new String[] { "java.lang.String", "double", "double", "double" }, false, type); |
| assertFindMethod("assertEquals", new String[] { "java.lang.String", "long", "long" }, false, type); |
| assertFindMethod("Assert", new String[0], true, type); |
| |
| type= JavaModelUtil.findType(fJProject1, "junit.samples.money.MoneyTest"); |
| assertElementName("MoneyTest", type, IJavaElement.TYPE); |
| |
| assertFindMethod("main", new String[] { "java.lang.String[]" }, false, type); |
| assertFindMethod("setUp", new String[0] , false, type); |
| assertFindMethod("MoneyTest", new String[] { "java.lang.String" } , true, type); |
| } |
| |
| private void assertFindMethodInHierarchy(String methName, String[] paramTypeNames, boolean isConstructor, IType type, String declaringTypeName) throws Exception { |
| ITypeHierarchy hierarchy= type.newSupertypeHierarchy(null); |
| |
| String[] sig= new String[paramTypeNames.length]; |
| for (int i= 0; i < paramTypeNames.length; i++) { |
| // create as unresolved |
| String name= Signature.getSimpleName(paramTypeNames[i]); |
| sig[i]= Signature.createTypeSignature(name, false); |
| assertNotNull(methName + "-ts1" + i, sig[i]); |
| } |
| IMethod meth= JavaModelUtil.findMethodDeclarationInHierarchy(hierarchy, type, methName, sig, isConstructor); |
| assertElementName(methName, meth, IJavaElement.METHOD); |
| assertTrue("methName-nparam1", meth.getParameterTypes().length == paramTypeNames.length); |
| assertEquals("methName-decltype", declaringTypeName, JavaModelUtil.getFullyQualifiedName(meth.getDeclaringType())); |
| |
| for (int i= 0; i < paramTypeNames.length; i++) { |
| // create as resolved |
| sig[i]= Signature.createTypeSignature(paramTypeNames[i], true); |
| assertNotNull(methName + "-ts2" + i, sig[i]); |
| } |
| meth= JavaModelUtil.findMethodDeclarationInHierarchy(hierarchy, type, methName, sig, isConstructor); |
| assertElementName(methName, meth, IJavaElement.METHOD); |
| assertTrue("methName-nparam2", meth.getParameterTypes().length == paramTypeNames.length); |
| assertEquals("methName-decltype", declaringTypeName, JavaModelUtil.getFullyQualifiedName(meth.getDeclaringType())); |
| } |
| |
| public void testFindMethodInHierarchy() throws Exception { |
| IType type= JavaModelUtil.findType(fJProject1, "junit.extensions.TestSetup"); |
| assertElementName("TestSetup", type, IJavaElement.TYPE); |
| |
| assertFindMethodInHierarchy("run", new String[] { "junit.framework.TestResult" }, false, type, "junit.framework.Test"); |
| assertFindMethodInHierarchy("toString", new String[] {} , false, type, "java.lang.Object"); |
| } |
| |
| public void testHasMainMethod() throws Exception { |
| IType type= JavaModelUtil.findType(fJProject1, "junit.samples.money.MoneyTest"); |
| assertElementName("MoneyTest", type, IJavaElement.TYPE); |
| |
| assertTrue("MoneyTest-nomain", JavaModelUtil.hasMainMethod(type)); |
| |
| type= JavaModelUtil.findType(fJProject1, "junit.framework.TestResult"); |
| assertElementName("TestResult", type, IJavaElement.TYPE); |
| |
| assertTrue("TestResult-hasmain", !JavaModelUtil.hasMainMethod(type)); |
| |
| type= JavaModelUtil.findType(fJProject1, "junit.samples.VectorTest"); |
| assertElementName("VectorTest", type, IJavaElement.TYPE); |
| |
| assertTrue("VectorTest-nomain", JavaModelUtil.hasMainMethod(type)); |
| } |
| |
| } |