blob: 6ada7dbe044eaedb770fb8725b48abe307232122 [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.jdt.ui.tests.core;
import java.util.ArrayList;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IImportDeclaration;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
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.JavaModelException;
import org.eclipse.jdt.testplugin.JavaProjectHelper;
import org.eclipse.jdt.internal.corext.codemanipulation.AddUnimplementedMethodsOperation;
import org.eclipse.jdt.internal.corext.codemanipulation.CodeGenerationSettings;
import org.eclipse.jdt.internal.corext.codemanipulation.StubUtility;
import org.eclipse.jdt.internal.corext.util.JdtFlags;
public class AddUnimplementedMethodsTest extends TestCase {
private static final Class THIS= AddUnimplementedMethodsTest.class;
private IJavaProject fJavaProject;
private IPackageFragment fPackage;
private IType fClassA, fInterfaceB, fClassC, fClassD, fInterfaceE;
public AddUnimplementedMethodsTest(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 AddUnimplementedMethodsTest("test1"));
return new ProjectTestSetup(suite);
}
}
/**
* Creates a new test Java project.
*/
protected void setUp() throws Exception {
fJavaProject= JavaProjectHelper.createJavaProject("DummyProject", "bin");
assertNotNull(JavaProjectHelper.addRTJar(fJavaProject));
IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(fJavaProject, "src");
fPackage= root.createPackageFragment("ibm.util", true, null);
ICompilationUnit cu= fPackage.getCompilationUnit("A.java");
fClassA= cu.createType("public abstract class A {\n}\n", null, true, null);
fClassA.createMethod("public abstract void a();\n", null, true, null);
fClassA.createMethod("public abstract void b(java.util.Vector v);\n", null, true, null);
cu= fPackage.getCompilationUnit("B.java");
fInterfaceB= cu.createType("public interface B {\n}\n", null, true, null);
fInterfaceB.createMethod("void c(java.util.Hashtable h);\n", null, true, null);
cu= fPackage.getCompilationUnit("C.java");
fClassC= cu.createType("public abstract class C {\n}\n", null, true, null);
fClassC.createMethod("public void c(java.util.Hashtable h) {\n}\n", null, true, null);
fClassC.createMethod("public abstract java.util.Enumeration d(java.util.Hashtable h) {\n}\n", null, true, null);
cu= fPackage.getCompilationUnit("D.java");
fClassD= cu.createType("public abstract class D extends C {\n}\n", null, true, null);
fClassD.createMethod("public abstract void c(java.util.Hashtable h);\n", null, true, null);
cu= fPackage.getCompilationUnit("E.java");
fInterfaceE= cu.createType("public interface E {\n}\n", null, true, null);
fInterfaceE.createMethod("void c(java.util.Hashtable h);\n", null, true, null);
fInterfaceE.createMethod("void e() throws java.util.NoSuchElementException;\n", null, true, null);
}
/**
* Removes the test java project.
*/
protected void tearDown () throws Exception {
JavaProjectHelper.delete(fJavaProject);
fJavaProject= null;
fPackage= null;
fClassA= null;
fInterfaceB= null;
fClassC= null;
fClassD= null;
fInterfaceE= null;
}
private IMethod[] getSelected(IType type) throws JavaModelException {
IMethod[] inheritedMethods= StubUtility.getOverridableMethods(type, type.newSupertypeHierarchy(null), false);
ArrayList toImplement= new ArrayList();
for (int i= 0; i < inheritedMethods.length; i++) {
IMethod curr= inheritedMethods[i];
if (JdtFlags.isAbstract(curr)) {
toImplement.add(curr);
}
}
return (IMethod[]) toImplement.toArray(new IMethod[toImplement.size()]);
}
/*
* basic test: extend an abstract class and an interface
*/
public void test1() throws Exception {
ICompilationUnit cu= fPackage.getCompilationUnit("Test1.java");
IType testClass= cu.createType("public class Test1 extends A implements B {\n}\n", null, true, null);
AddUnimplementedMethodsOperation op= new AddUnimplementedMethodsOperation(testClass, new CodeGenerationSettings(), getSelected(testClass), true, null);
op.run(new NullProgressMonitor());
IMethod[] methods= testClass.getMethods();
checkMethods(new String[] { "a", "b", "c" }, methods);
IImportDeclaration[] imports= cu.getImports();
checkImports(new String[] { "java.util.Hashtable", "java.util.Vector" }, imports);
}
/*
* method c() of interface B is already implemented by class C
*/
public void test2() throws Exception {
ICompilationUnit cu= fPackage.getCompilationUnit("Test2.java");
IType testClass= cu.createType("public class Test2 extends C implements B {\n}\n", null, true, null);
AddUnimplementedMethodsOperation op= new AddUnimplementedMethodsOperation(testClass, new CodeGenerationSettings(), getSelected(testClass), true, null);
op.run(new NullProgressMonitor());
IMethod[] methods= testClass.getMethods();
checkMethods(new String[] { "d" }, methods);
IImportDeclaration[] imports= cu.getImports();
checkImports(new String[] { "java.util.Enumeration", "java.util.Hashtable" }, imports);
}
/*
* method c() is implemented in C but made abstract again in class D
*/
public void test3() throws Exception {
ICompilationUnit cu= fPackage.getCompilationUnit("Test3.java");
IType testClass= cu.createType("public class Test3 extends D {\n}\n", null, true, null);
AddUnimplementedMethodsOperation op= new AddUnimplementedMethodsOperation(testClass, new CodeGenerationSettings(), getSelected(testClass), true, null);
op.run(new NullProgressMonitor());
IMethod[] methods= testClass.getMethods();
checkMethods(new String[] { "c", "d" }, methods);
IImportDeclaration[] imports= cu.getImports();
checkImports(new String[] { "java.util.Hashtable", "java.util.Enumeration" }, imports);
}
/*
* method c() defined in both interfaces B and E
*/
public void test4() throws Exception {
ICompilationUnit cu= fPackage.getCompilationUnit("Test4.java");
IType testClass= cu.createType("public class Test4 implements B, E {\n}\n", null, true, null);
AddUnimplementedMethodsOperation op= new AddUnimplementedMethodsOperation(testClass, new CodeGenerationSettings(), getSelected(testClass), true, null);
op.run(new NullProgressMonitor());
IMethod[] methods= testClass.getMethods();
checkMethods(new String[] { "c", "e" }, methods);
IImportDeclaration[] imports= cu.getImports();
checkImports(new String[] { "java.util.Hashtable", "java.util.NoSuchElementException" }, imports);
}
private void checkMethods(String[] expected, IMethod[] methods) {
int nMethods= methods.length;
int nExpected= expected.length;
assertTrue("" + nExpected + " methods expected, is " + nMethods, nMethods == nExpected);
for (int i= 0; i < nExpected; i++) {
String methName= expected[i];
assertTrue("method " + methName + " expected", nameContained(methName, methods));
}
}
private void checkImports(String[] expected, IImportDeclaration[] imports) {
int nImports= imports.length;
int nExpected= expected.length;
assertTrue("" + nExpected + " imports expected, is " + nImports, nImports == nExpected);
for (int i= 0; i < nExpected; i++) {
String impName= expected[i];
assertTrue("import " + impName + " expected", nameContained(impName, imports));
}
}
private boolean nameContained(String methName, IJavaElement[] methods) {
for (int i= 0; i < methods.length; i++) {
if (methods[i].getElementName().equals(methName)) {
return true;
}
}
return false;
}
}