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