org.eclipse.ajdt.core.tests.codeselect.AbstractITDAwareCodeSelectionTests.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ajdt.core.tests.codeselect.AbstractITDAwareCodeSelectionTests.java

Source

/*******************************************************************************
 * 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 :-)");
        }
    }
}