/*******************************************************************************
 * 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.core.tests.model;

import org.eclipse.jdt.core.*;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.internal.core.JavaModelStatus;

import junit.framework.*;

public class ResolveTests extends AbstractJavaModelTests {

public ResolveTests(String name) {
	super(name);
}
public void setUpSuite() throws Exception {
	super.setUpSuite();
	
	setUpJavaProject("Resolve");
}
public void tearDownSuite() throws Exception {
	deleteProject("Resolve");
	
	super.tearDownSuite();
}


public static Test suite() {
	TestSuite suite = new Suite(ResolveTests.class.getName());
	
	// empty selection tests
	suite.addTest(new ResolveTests("testResolveEmptySelection"));
	suite.addTest(new ResolveTests("testResolveEmptySelection2"));
	suite.addTest(new ResolveTests("testResolveEmptySelectionOnMethod"));
	
	// selection tests
	suite.addTest(new ResolveTests("testResolveInvalidResolve"));
	suite.addTest(new ResolveTests("testResolveConstructor"));
	suite.addTest(new ResolveTests("testResolveMethod"));
	suite.addTest(new ResolveTests("testResolveField"));
	suite.addTest(new ResolveTests("testResolvePackage"));
	suite.addTest(new ResolveTests("testResolveClass1"));
	suite.addTest(new ResolveTests("testResolveClass2"));
	suite.addTest(new ResolveTests("testResolveClass3"));
	suite.addTest(new ResolveTests("testResolveClass4"));
	suite.addTest(new ResolveTests("testResolveClass5"));
	suite.addTest(new ResolveTests("testResolveClass6"));
	suite.addTest(new ResolveTests("testResolveInterface"));
	suite.addTest(new ResolveTests("testResolveInClassFileWithSource"));
	suite.addTest(new ResolveTests("testResolveInClassFileWithoutSource"));
	suite.addTest(new ResolveTests("testResolveQualifiedType"));
	suite.addTest(new ResolveTests("testResolvePartiallyQualifiedType"));
	suite.addTest(new ResolveTests("testResolveUnicode"));
	suite.addTest(new ResolveTests("testNegativeResolveUnicode"));
	suite.addTest(new ResolveTests("testResolveArrayLength"));
	suite.addTest(new ResolveTests("testResolveConstructorDeclaration"));
	suite.addTest(new ResolveTests("testResolveMethodDeclaration"));
	suite.addTest(new ResolveTests("testResolveFieldDeclaration"));
	suite.addTest(new ResolveTests("testResolveTypeDeclaration"));
	suite.addTest(new ResolveTests("testResolveMemberTypeDeclaration"));
	suite.addTest(new ResolveTests("testResolveMemberTypeDeclaration2"));
	suite.addTest(new ResolveTests("testResolveMethodWithIncorrectParameter"));
	suite.addTest(new ResolveTests("testResolveExplicitSuperConstructorCall"));
	suite.addTest(new ResolveTests("testResolveExplicitThisConstructorCall"));
	suite.addTest(new ResolveTests("testResolveMessageSendOnBaseType"));
	suite.addTest(new ResolveTests("testResolveMethodWithInnerTypeInClassFile"));
	suite.addTest(new ResolveTests("testResolveMethodWithInnerTypeInClassFile2"));
	suite.addTest(new ResolveTests("testResolveTypeInComment"));
	suite.addTest(new ResolveTests("testResolveImport"));
	suite.addTest(new ResolveTests("testResolveConstructorCallOfMemberType"));
	suite.addTest(new ResolveTests("testResolveLocalName1"));
	suite.addTest(new ResolveTests("testResolveLocalName2"));
	suite.addTest(new ResolveTests("testResolveArgumentName1"));
	suite.addTest(new ResolveTests("testResolveArgumentName2"));
	suite.addTest(new ResolveTests("testResolveCatchArgumentName1"));
	suite.addTest(new ResolveTests("testResolveCatchArgumentName2"));
	suite.addTest(new ResolveTests("testResolveAbstractMethod"));
	suite.addTest(new ResolveTests("testResolveInnerClassAsParamater"));
	suite.addTest(new ResolveTests("testResolveCatchArgumentType1"));
	suite.addTest(new ResolveTests("testResolveCatchArgumentType2"));
	suite.addTest(new ResolveTests("testResolveStaticClassConstructor"));
	return suite;
}

/**
 * Resolve empty selection
 */
public void testResolveEmptySelection() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveTypeEmptySelection.java");

	String str = cu.getSource();
	String selectAt = "ect";
	String selection = "";
	int start = str.lastIndexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one type", elements.length == 1 && 
		elements[0].getElementName().equals("Object") &&
		elements[0] instanceof IType);	
}
/**
 * Resolve empty selection
 */
public void testResolveEmptySelection2() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveTypeEmptySelection2.java");

	String str = cu.getSource();
	String selectAt = "Obj";
	String selection = "";
	int start = str.lastIndexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one type", elements.length == 1 && 
		elements[0].getElementName().equals("Object") &&
		elements[0] instanceof IType);	
}
/**
 * Resolve empty selection
 */
public void testResolveEmptySelectionOnMethod() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveEmptySelectionOnMethod.java");

	String str = cu.getSource();
	String selectAt = "oo";
	String selection = "";
	int start = str.lastIndexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one method", elements.length == 1 && 
		elements[0].getElementName().equals("foo") &&
		elements[0] instanceof IMethod);	
}
/**
 * Resolve the method
 */
public void testResolveMethodWithIncorrectParameter() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveMethodWithIncorrectParameter.java");
	
	String source = cu.getSource();
	
	int start = source.indexOf("foo(\"String");
	int length = "foo".length();
	
	IJavaElement[] elements = cu.codeSelect(start, length);
	assertTrue("should have one method of 'foo'",
		elements.length == 1 &&
		elements[0].getElementName().equals("foo") &&
		elements[0] instanceof IMethod);		
}
/**
 * Resolse explicit super constructor call
 */
public void testResolveExplicitSuperConstructorCall() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveExplicitSuperConstructorCall.java");

	String str = cu.getSource();
	String selectAt = "super(";
	String selection = "super";
	int start = str.indexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);

	assertTrue("should have one type", elements.length == 1 && 
		elements[0].getElementName().equals("SuperClass") &&
		elements[0] instanceof IMethod);	
}
/**
 * Resolse explicit this constructor call
 */
public void testResolveExplicitThisConstructorCall() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveExplicitThisConstructorCall.java");

	String str = cu.getSource();
	String selectAt = "this(";
	String selection = "this";
	int start = str.indexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);

	assertTrue("should have one type", elements.length == 1 && 
		elements[0].getElementName().equals("ResolveExplicitThisConstructorCall") &&
		elements[0] instanceof IMethod);	
}
/**
 * Try to resolve message send on base type.
 */
public void testResolveMessageSendOnBaseType() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveMessageSendOnBaseType.java");

	String str = cu.getSource();
	String selectAt = "hello";
	String selection = "hello";
	IJavaElement[] elements = cu.codeSelect(
		str.indexOf(selectAt), 
		selection.length());

	assertTrue("should have nothing", elements.length == 0);	
}
/**
 * Resolve method in inner type.
 */
public void testResolveMethodWithInnerTypeInClassFile() throws JavaModelException {
	IClassFile cu = getClassFile("Resolve", "zzz.jar", "", "MyClass$Inner.class");

	String str = cu.getSource();
	String selectAt = "test";
	String selection = "test";
	int start = str.indexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);

	assertTrue("should have one method", elements.length == 1 && 
		elements[0].getElementName().equals("test") &&
		elements[0] instanceof IMethod);	
}
/**
 * bug 33785
 */
public void testResolveMethodWithInnerTypeInClassFile2() throws JavaModelException {
	IClassFile cu = getClassFile("Resolve", "zzz.jar", "", "MyClass2$Inner.class");

	String str = cu.getSource();
	String selectAt = "method";
	String selection = "method";
	int start = str.lastIndexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);

	assertTrue("should have one method", elements.length == 1 && 
		elements[0].getElementName().equals("method") &&
		elements[0] instanceof IMethod);	
		
	IMethod method = (IMethod) elements[0];
	ISourceRange sourceRange = method.getSourceRange();
	String methodString = "void method(MyClass2.Inner[] arg){}";
	int o = str.indexOf(methodString);
	int l = methodString.length();
	assertTrue("source range should be ("+o+","+l+") and not ("+sourceRange.getOffset()+","+sourceRange.getLength()+")", sourceRange.getOffset() == o && sourceRange.getLength() == l);
}
/**
 * Resolve type in comment.
 */
public void testResolveTypeInComment() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveTypeInComment.java");

	String str = cu.getSource();
	String selectAt = "X */";
	String selection = "X";
	int start = str.indexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one type", elements.length == 1 &&
		elements[0] instanceof IType &&
		((IType)elements[0]).getFullyQualifiedName().equals("p2.X"));	
}
/**
 * Resolve in import
 */
public void testResolveImport() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveImport.java");

	String str = cu.getSource();
	String selectAt = "ImportedClass";
	String selection = "ImportedClass";
	int start = str.lastIndexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one type", elements.length == 1 && 
		elements[0].getElementName().equals("ImportedClass") &&
		elements[0] instanceof IType);	
}
/**
 * Resolve constructor call
 */
public void testResolveConstructorCallOfMemberType() throws JavaModelException {
	IClassFile cf = getClassFile("Resolve", "class-folder", "", "ResolveConstructorCallOfMemberType.class");
	
	String str = cf.getSource();
	String selectAt = "Inner";
	String selection = "Inner";
	int start = str.lastIndexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cf.codeSelect(start, length);
	
	assertTrue("should have one method", elements.length == 1 && 
		elements[0].getElementName().equals("Inner") &&
		elements[0] instanceof IMethod);	
}
/**
 * Resolve a local declaration name
 */
public void testResolveLocalName1() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveLocalName.java");

	String str = cu.getSource();
	String selectAt = "var1";
	String selection = "var1";
	int start = str.lastIndexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one type", elements.length == 1 && 
		elements[0].getElementName().equals("Object") &&
		elements[0] instanceof IType);	
}
/**
 * Resolve a local declaration name with base type
 */
public void testResolveLocalName2() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveLocalName.java");

	String str = cu.getSource();
	String selectAt = "var2";
	String selection = "var2";
	int start = str.lastIndexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have nothing", elements.length == 0);	
}
/**
 * Resolve an argument name
 */
public void testResolveArgumentName1() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveArgumentName.java");

	String str = cu.getSource();
	String selectAt = "var1";
	String selection = "var1";
	int start = str.lastIndexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one type", elements.length == 1 && 
		elements[0].getElementName().equals("Object") &&
		elements[0] instanceof IType);	
}
/**
 * Resolve an argument name with base type
 */
public void testResolveArgumentName2() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveArgumentName.java");

	String str = cu.getSource();
	String selectAt = "var2";
	String selection = "var2";
	int start = str.lastIndexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have nothing", elements.length == 0);	
}

/**
 * Resolve an argument name inside catch statement
 */
public void testResolveCatchArgumentName1() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveCatchArgumentName.java");

	String str = cu.getSource();
	String selectAt = "var1";
	String selection = "var1";
	int start = str.lastIndexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one type", elements.length == 1 && 
		elements[0].getElementName().equals("Object") &&
		elements[0] instanceof IType);	
}
/**
 * Resolve an argument name inside catch statement with base type
 */
public void testResolveCatchArgumentName2() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveCatchArgumentName.java");

	String str = cu.getSource();
	String selectAt = "var2";
	String selection = "var2";
	int start = str.lastIndexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have nothing", elements.length == 0);	
}
/**
 * Attempt to resolve outside of the range of the compilation unit.
 */
public void testResolveInvalidResolve() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "p1", "X.java");
	try {
		cu.codeSelect(-1, 10); 
	} catch (JavaModelException jme) {
		assertTrue("Incorrect status on the JavaModelException", jme.getStatus().getCode() == JavaModelStatus.INDEX_OUT_OF_BOUNDS);
		return;
	}
	assertTrue("Exception should have been thrown for out of bounds resolution", false);
}
/**
 * Resolve a constructor
 */
public void testResolveConstructor() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveConstructor.java");
	
	String str = cu.getSource();
	String selectAt = "ResolveConstructor(\"";
	String selection = "ResolveConstructor";
	int start = str.lastIndexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one method", elements.length == 1 && 
		elements[0].getElementName().equals("ResolveConstructor") &&
		elements[0] instanceof IMethod &&
		((IMethod)elements[0]).getParameterTypes()[0].equals("QString;"));	
}
/**
 * Resolve the method "foo"
 */
public void testResolveMethod() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveMethod.java");
	
	String str = cu.getSource();
	String selectAt = "foo(\"";
	String selection = "foo";
	int start = str.lastIndexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);

	assertTrue("should have one method of 'foo'",
		elements.length == 1 &&
		elements[0].getElementName().equals("foo") &&
		elements[0] instanceof IMethod &&
		((IMethod)elements[0]).getParameterTypes()[0].equals("QString;"));		
}
/**
 * Resolve the field "foo"
 */
public void testResolveField() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveField.java");
	
	String str = cu.getSource();
	String selectAt = "foo =";
	String selection = "foo";
	int start = str.lastIndexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one field of 'foo'",
			elements.length == 1 &&
			elements[0].getElementName().equals("foo") &&
			elements[0] instanceof IField);	
}
/**
 * Resolve the package "java.lang"
 */
public void testResolvePackage() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolvePackage.java");
	
	String str = cu.getSource();
	String selectAt = "lang";
	String selection = "lang";
	int start = str.lastIndexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one package of 'java.lang'",
		elements.length == 1 &&
		elements[0].getElementName().equals("java.lang") &&
		elements[0] instanceof IPackageFragment);	
}
/**
 * Resolve the class 'X' (field type).
 */
public void testResolveClass1() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveClass1.java");
	
	String str = cu.getSource();
	String selectAt = "X";
	String selection = "X";
	int start = str.lastIndexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one class", elements.length == 1 && 
		elements[0].getElementName().equals("X") &&
		elements[0] instanceof IType);
}
/**
 * Resolve the class 'X' (local variable type).
 */
public void testResolveClass2() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveClass2.java");
	
	String str = cu.getSource();
	String selectAt = "X";
	String selection = "X";
	int start = str.lastIndexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one class", elements.length == 1 && 
		elements[0].getElementName().equals("X") &&
		elements[0] instanceof IType);
}
/**
 * Resolve the class 'X'(array initializer type).
 */
public void testResolveClass3() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveClass3.java");
	
	String str = cu.getSource();
	String selectAt = "X[]{";
	String selection = "X";
	int start = str.lastIndexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one class", elements.length == 1 && 
		elements[0].getElementName().equals("X") &&
		elements[0] instanceof IType);
}
/**
 * Resolve the class 'X' (return type).
 */
public void testResolveClass4() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveClass4.java");
	
	String str = cu.getSource();
	String selectAt = "X";
	String selection = "X";
	int start = str.lastIndexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one class", elements.length == 1 && 
		elements[0].getElementName().equals("X") &&
		elements[0] instanceof IType);
}
/**
 * Resolve the class 'X' (method argument).
 */
public void testResolveClass5() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveClass5.java");
	
	String str = cu.getSource();
	String selectAt = "X";
	String selection = "X";
	int start = str.lastIndexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one class", elements.length == 1 && 
		elements[0].getElementName().equals("X") &&
		elements[0] instanceof IType);
}
/**
 * Resolve the class 'SuperClass' (super class).
 */
public void testResolveClass6() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveClass6.java");
	
	String str = cu.getSource();
	String selectAt = "X";
	String selection = "X";
	int start = str.lastIndexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one class", elements.length == 1 && 
		elements[0].getElementName().equals("X") &&
		elements[0] instanceof IType);
}
/**
 * Resolve the interface "Y"
 */
public void testResolveInterface() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveInterface.java");
	
	String str = cu.getSource();
	String selectAt = "Y";
	String selection = "Y";
	int start = str.lastIndexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one interface", elements.length == 1 && 
		elements[0].getElementName().equals("Y") &&
		elements[0] instanceof IType);	
}
/**
 * Tests code resolve on a class file with attached source.
 */
public void testResolveInClassFileWithSource() throws JavaModelException {
	IClassFile cu = getClassFile("Resolve", "p3.jar", "p3", "X.class");

	String str = cu.getSource();
	String selectAt = "Object";
	String selection = "Object";
	int start = str.indexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue(elements != null && elements.length == 1 &&
		elements[0].getElementName().equals("Object") &&
		elements[0].getElementType() == IJavaElement.TYPE);
}
/**
 * Tests code resolve on a class file without attached source.
 */
public void testResolveInClassFileWithoutSource() throws JavaModelException {
	IClassFile cu = getClassFile("Resolve", "p4.jar", "p4", "X.class");

	String selection = "Object";
	int start = 34;
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue(elements != null && elements.length == 0);
}
/**
 * Resolve the qualified type "java.lang.Object"
 */
public void testResolveQualifiedType() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveQualifiedType.java");
	
	String str = cu.getSource();
	String selectAt = "java.lang.Object";
	String selection = "java.lang.Object";
	int start = str.indexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one class", elements.length == 1);
	IJavaElement element = elements[0];
	assertTrue("Should be an IType", element instanceof IType);
	IType type = (IType)element;
	assertTrue("should be java.lang.Object",
		type.getElementName().equals("Object") &&
		type.getPackageFragment().getElementName().equals("java.lang"));	
}
/**
 * Try to resolve the qualified type "lang.Object"
 */
public void testResolvePartiallyQualifiedType() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolvePartiallyQualifiedType.java");
	
	String str = cu.getSource();
	String selectAt = "lang.Object";
	String selection = "lang.Object";
	int start = str.indexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have no result class", elements != null && elements.length == 0);
}
/**
 * Resolve the type "java.lang. \u0053ring"
 */
public void testResolveUnicode() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveUnicode.java");
	
	String str = cu.getSource();
	String selectAt = "java.lang.\\u0053tring";
	String selection = "java.lang.\\u0053tring";
	int start = str.indexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one class 'java.lang.\u0053tring'", elements.length == 1);
	IJavaElement element = elements[0];
	assertTrue("should be an IType", element instanceof IType);
	IType type = (IType)element;
	assertEquals("unexpected element name", "\u0053tring", type.getElementName());
	assertEquals("unexpected parent name", "java.lang", type.getPackageFragment().getElementName());
}
/**
 * Tries to resolve the type "lang. \u0053tring" which doesn't exist.
 */
public void testNegativeResolveUnicode() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveUnicode.java");
	
	String str = cu.getSource();
	String selectAt = "lang.\\u0053tring";
	String selection = "lang.\\u0053tring";
	int start = str.indexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have no class", elements != null && elements.length == 0);
}
/**
 * Resolve the field "length" of an array
 */
public void testResolveArrayLength() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveArrayLength.java");
	
	String str = cu.getSource();
	String selectAt = "length";
	String selection = "length";
	int start = str.indexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);

	assertTrue("should have no field 'length'", elements != null &&  elements.length == 0);	
}
/**
 * Resolve constructor declaration
 */
public void testResolveConstructorDeclaration() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveConstructorDeclaration.java");
	
	String str = cu.getSource();
	String selectAt = "ResolveConstructorDeclaration(i";
	String selection = "ResolveConstructorDeclaration";
	int start = str.indexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one method", elements.length == 1 && 
		elements[0].getElementName().equals("ResolveConstructorDeclaration") &&
		elements[0] instanceof IMethod &&
		((IMethod)elements[0]).getParameterTypes()[0].equals("I"));	
}
/**
 * Resolve method declaration
 */
public void testResolveMethodDeclaration() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveMethodDeclaration.java");
	
	String str = cu.getSource();
	String selectAt = "foo(i";
	String selection = "foo";
	int start = str.indexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one method", elements.length == 1 && 
		elements[0].getElementName().equals("foo") &&
		elements[0] instanceof IMethod &&
		((IMethod)elements[0]).getParameterTypes()[0].equals("I"));	
}
/**
 * Resolve field declaration
 */
public void testResolveFieldDeclaration() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveFieldDeclaration.java");
	
	String str = cu.getSource();
	String selectAt = "foo";
	String selection = "foo";
	int start = str.indexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one field", elements.length == 1 && 
		elements[0].getElementName().equals("foo") &&
		elements[0] instanceof IField);	
}
/**
 * Resolve type declaration
 */
public void testResolveTypeDeclaration() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveTypeDeclaration.java");
	
	String str = cu.getSource();
	String selectAt = "OtherType";
	String selection = "OtherType";
	int start = str.indexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one type", elements.length == 1 && 
		elements[0].getElementName().equals("OtherType") &&
		elements[0] instanceof IType);	
}
/**
 * Resolve member type declaration
 */
public void testResolveMemberTypeDeclaration() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveMemberTypeDeclaration1.java");
	
	String str = cu.getSource();
	String selectAt = "MemberInterface";
	String selection = "MemberInterface";
	int start = str.indexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one type", elements.length == 1 && 
		elements[0].getElementName().equals("MemberInterface") &&
		elements[0] instanceof IType);	
}
/**
 * Resolve member type declaration located in default package
 */
public void testResolveMemberTypeDeclaration2() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveMemberTypeDeclaration2.java");
	
	String str = cu.getSource();
	String selectAt = "MemberOfMember";
	String selection = "MemberOfMember";
	int start = str.indexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one type", elements.length == 1 && 
		elements[0].getElementName().equals("MemberOfMember") &&
		elements[0] instanceof IType);	
}
/**
 * Resolve default abstrart method
 * bugs http://dev.eclipse.org/bugs/show_bug.cgi?id=23594
 */
public void testResolveAbstractMethod() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveAbstractMethod.java");
	
	String str = cu.getSource();
	String selectAt = "foo";
	String selection = "foo";
	int start = str.indexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one method", elements.length == 1 && 
		elements[0].getElementName().equals("foo") &&
		elements[0] instanceof IMethod &&
		((IMethod)elements[0]).getDeclaringType().getElementName().equals("SuperInterface"));
}
/**
 * bugs http://dev.eclipse.org/bugs/show_bug.cgi?id=25687
 */
public void testResolveInnerClassAsParamater() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveInnerClassAsParamater.java");
	
	String str = cu.getSource();
	String selectAt = "foo";
	String selection = "foo";
	int start = str.lastIndexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one method", elements.length == 1 && 
		elements[0].getElementName().equals("foo") &&
		elements[0] instanceof IMethod);
}
/**
 * bugs http://dev.eclipse.org/bugs/show_bug.cgi?id=24626
 */
public void testResolveCatchArgumentType1() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveCatchArgumentType1.java");
	
	String str = cu.getSource();
	String selectAt = "Y1";
	String selection = "Y1";
	int start = str.lastIndexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one type", elements.length == 1 && 
		elements[0].getElementName().equals("Y1") &&
		elements[0] instanceof IType);
}
/**
 * bugs http://dev.eclipse.org/bugs/show_bug.cgi?id=24626
 */
public void testResolveCatchArgumentType2() throws JavaModelException {
	ICompilationUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveCatchArgumentType2.java");
	
	String str = cu.getSource();
	String selectAt = "Y1";
	String selection = "Y1";
	int start = str.lastIndexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);
	
	assertTrue("should have one type", elements.length == 1 && 
		elements[0].getElementName().equals("Y1") &&
		elements[0] instanceof IType);
}
/**
 * bugs http://dev.eclipse.org/bugs/show_bug.cgi?id=25888
 */
public void testResolveStaticClassConstructor() throws JavaModelException {
	IClassFile cu = getClassFile("Resolve", "test25888.jar", "", "ResolveStaticClassConstructor.class");

	String str = cu.getSource();
	String selectAt = "StaticInnerClass";
	String selection = "StaticInnerClass";
	int start = str.lastIndexOf(selectAt);
	int length = selection.length();
	IJavaElement[] elements = cu.codeSelect(start, length);

	assertTrue("should have one method", elements.length == 1 &&
		elements[0].getElementName().equals("StaticInnerClass") &&
		elements[0] instanceof IMethod);
}
}
