blob: a64404cf4bf76ef0c8b49ab4092c90a5c002c404 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 SpringSource 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:
* Kris De Volder - initial API and implementation
*******************************************************************************/
package org.eclipse.ajdt.core.tests.codeselect;
import java.util.HashMap;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.ajdt.core.tests.AJDTCoreTestCase;
import org.eclipse.contribution.jdt.itdawareness.INameEnvironmentProvider;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.Signature;
import org.eclipse.jdt.core.WorkingCopyOwner;
import org.eclipse.jdt.internal.compiler.SourceElementParser;
import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
import org.eclipse.jdt.internal.compiler.env.ISourceType;
import org.eclipse.jdt.internal.core.CompilationUnit;
import org.eclipse.jdt.internal.core.JavaProject;
import org.eclipse.jdt.internal.core.SearchableEnvironment;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.Region;
/**
* An abstract superclass for Several ITDAwareCodeSelectionTests, which seem to
* share some code in common. We can pull-up some of that shared code to here as
* needed.
*
* @author kdvolder
*/
public abstract class AbstractITDAwareCodeSelectionTests extends
AJDTCoreTestCase {
public static Test suite() {
TestSuite suite = new TestSuite();
suite.addTestSuite(ITDAwareCodeSelectionTests4.class);
suite.addTestSuite(ITDAwareCodeSelectionTests.class);
suite.addTestSuite(ITDAwareCodeSelectionTests2.class);
suite.addTestSuite(ITDAwareCodeSelectionTests3.class);
suite.addTestSuite(ITITAwareCodeSelectionTests.class);
return suite;
}
protected final class MockNameEnvironmentProvider implements
INameEnvironmentProvider {
public ISourceType transformSourceTypeInfo(ISourceType info) {
// don't need
return null;
}
public boolean shouldFindProblems(CompilationUnit unitElement) {
return true;
}
public CompilationUnitDeclaration problemFind(
CompilationUnit unitElement, SourceElementParser parer,
WorkingCopyOwner workingCopyOwner, @SuppressWarnings("rawtypes") HashMap problems,
boolean creatingAST, int reconcileFlags,
IProgressMonitor monitor) throws JavaModelException {
// don't need
return null;
}
public SearchableEnvironment getNameEnvironment(JavaProject project,
ICompilationUnit[] workingCopies) {
// don't need
return null;
}
public SearchableEnvironment getNameEnvironment(JavaProject project,
WorkingCopyOwner owner) {
// don't need
return null;
}
}
protected final IRegion findRegion(ICompilationUnit unit, String string,
int occurrence) {
String contents = new String(((CompilationUnit) unit).getContents());
int start = 0;
while (occurrence-- > 0) {
start = contents.indexOf(string, start + 1);
if (start < 0)
fail("Too few occurrences of '" + string + "' where found");
}
return new Region(start, string.length());
}
protected void validateCodeSelect(ICompilationUnit unit, IRegion region,
String expected) throws Exception {
validateCodeSelect(unit, region, expected, false);
}
protected void validateCodeSelect(ICompilationUnit unit, IRegion region,
String expected, boolean expectingProblems) throws Exception {
validateCodeSelect(unit, region, expected, expectingProblems, -1);
}
protected void validateCodeSelect(ICompilationUnit unit, IRegion region,
String expected, boolean expectingProblems, int numParams) throws Exception {
if (!expectingProblems) {
this.assertNoProblems(unit.getJavaProject().getProject());
}
performDummySearch(unit.getJavaProject());
IJavaElement[] result = unit.codeSelect(region.getOffset(),
region.getLength());
assertEquals("Should have found exactly one hyperlink", 1,
result.length);
IJavaElement elt = result[0];
assertTrue("Java element " + elt.getHandleIdentifier()
+ " should exist", elt.exists());
assertEquals(expected, elt.getElementName());
if (numParams >= 0 && elt instanceof IMethod) {
assertEquals("Wrong number of parameters for " + elt, numParams, ((IMethod) elt).getNumberOfParameters());
}
}
protected void validateCodeSelect(ICompilationUnit unit,
IRegion region, String expectedSrcFile, String expectedSignature) throws Exception {
IJavaElement[] result = unit.codeSelect(region.getOffset(), region.getLength());
assertEquals("Should have found exactly one hyperlink", 1, result.length);
IJavaElement elt = result[0];
assertTrue("Java element " + elt.getHandleIdentifier() + " should exist", elt.exists());
String actualSrcFile = elt.getResource().getFullPath().toString();
assertTrue("Element found is in the wrong source file:\n" +
" expected: "+expectedSrcFile+"\n" +
" found: "+actualSrcFile,
actualSrcFile.endsWith(expectedSrcFile));
assertEquals("Element found has wrong signature",
expectedSignature, getSignature(elt));
}
/**
* Convenience method to get a String that can be used to test whether you found what you
* expected to find. It returns a method signature in following format:
*
* <DeclaringType>.<methodName>(<ParamType>, ...)
*
* For ITDs the declaring type will be the Aspect, and the method name will include the
* target type:
*
* <AspectType>.<TargetType>.<methodName>(<ParamType>, ...)
*
* Type names are "simple" (i.e. don't include package name)
* <p>
* The method name for a constructor is the name of the class, for a regular constructor.
* It is <ClassName>.<ClassName_new> for an intertype constructor..
*/
private String getSignature(IJavaElement elt) {
if (elt instanceof IMethod) {
IMethod method = (IMethod) elt;
String sig = method.getDeclaringType().getFullyQualifiedName();
sig += "." + method.getElementName() + "(";
String[] paramTypeSigs = method.getParameterTypes();
for (int i = 0; i < paramTypeSigs.length; i++) {
if (i>0) sig+= ", ";
sig += Signature.getSignatureSimpleName(paramTypeSigs[i]);
}
sig += ")";
return sig;
}
else {
throw new Error("Not implemented, if you have tests with fields... implement this :-)");
}
}
}