/*******************************************************************************
 * Copyright (c) 2000, 2009 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.jsdt.core.tests.model;

import junit.framework.Test;

import org.eclipse.wst.jsdt.core.IJavaScriptElement;
import org.eclipse.wst.jsdt.core.IJavaScriptUnit;
import org.eclipse.wst.jsdt.core.ILocalVariable;
import org.eclipse.wst.jsdt.core.JavaScriptModelException;
import org.eclipse.wst.jsdt.core.WorkingCopyOwner;

public class ResolveTests extends AbstractJavaModelTests {
	IJavaScriptUnit wc = null;
	WorkingCopyOwner owner = null; 

static {
//	TESTS_NAMES = new String[] { "testSecondaryTypes" };
}
public static Test suite() {
	return buildModelTestSuite(ResolveTests.class);
}

public ResolveTests(String name) {
	super(name);
}
public IJavaScriptUnit getWorkingCopy(String path, String source) throws JavaScriptModelException {
	return super.getWorkingCopy(path, source, this.owner, null);
}
private IJavaScriptElement[] select(String path, String source, String selection) throws JavaScriptModelException {
	this.wc = getWorkingCopy(path, source);
	String str = wc.getSource();
	int start = str.lastIndexOf(selection);
	int length = selection.length();
	return wc.codeSelect(start, length, this.owner);
}
public void setUpSuite() throws Exception {
	super.setUpSuite();
	
	setUpJavaProject("Resolve");
}
protected void setUp() throws Exception {
	super.setUp();
	
	this.owner = new WorkingCopyOwner(){};
}

public void tearDownSuite() throws Exception {
	deleteProject("Resolve");
	
	super.tearDownSuite();
}
protected void tearDown() throws Exception {
	if(this.wc != null) {
		this.wc.discardWorkingCopy();
	}
	super.tearDown();
}
/**
 * Resolve default abstract method
 * bugs http://dev.eclipse.org/bugs/show_bug.cgi?id=23594
 */
//public void testAbstractMethod() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveAbstractMethod.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "foo", "foo");
//	assertElementsEqual(
//		"Unexpected elements",
//		"foo() [in SuperInterface [in SuperInterface.js [in <default> [in src [in Resolve]]]]]",
//		elements
//	);
//}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=165900
public void testAmbiguousMethod1() throws JavaScriptModelException {
	this.workingCopies = new IJavaScriptUnit[1];
	this.workingCopies[0] = getWorkingCopy(
		"/Resolve/src/test/Test.java",
		"package test;\n"+
		"public class Test {\n" + 
		"  void foo(Test1 t) {}\n" + 
		"  void foo(Test2 t) {}\n" + 
		"  void bar(Object o) {\n" + 
		"    foo(o);\n" + 
		"  }\n" + 
		"}\n" + 
		"class Test1 {\n" + 
		"}\n" + 
		"class Test2 {\n" + 
		"}");

	String str = this.workingCopies[0].getSource();
	int start = str.lastIndexOf("foo(o)");
	int length = "foo".length();
	IJavaScriptElement[] elements =  this.workingCopies[0].codeSelect(start, length, this.wcOwner);
	
	assertElementsEqual(
			"Unexpected elements",
			"foo(Test1) [in Test [in [Working copy] Test.java [in test [in src [in Resolve]]]]]",
			elements
		);
}

/**
 * Resolve an argument name
 */
public void testArgumentName1() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveArgumentName.js");
	IJavaScriptElement[] elements = codeSelect(cu, "var1", "var1");
	assertElementsEqual(
		"Unexpected elements",
		"var1 [in foo(p0, p1) [in ResolveArgumentName.js [in <default> [in src [in Resolve]]]]]",
		elements
	);
}
/**
 * Resolve an argument name with base type
 */
public void testArgumentName2() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveArgumentName.js");
	IJavaScriptElement[] elements = codeSelect(cu, "var2", "var2");
	assertElementsEqual(
		"Unexpected elements",
		"var2 [in foo(p0, p1) [in ResolveArgumentName.js [in <default> [in src [in Resolve]]]]]",
		elements
	);
}
/**
 * Resolve the field "length" of an array
 */
public void testArrayLength() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveArrayLength.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "length", "length");
//	assertElementsEqual(
//		"Unexpected elements",
//		"",
//		elements
//	);
	assertTrue("implement?",false);
}

/**
 * Resolve an argument name inside catch statement
 */
public void testCatchArgumentName1() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveCatchArgumentName.js");
	IJavaScriptElement[] elements = codeSelect(cu, "var1", "var1");
	assertElementsEqual(
		"Unexpected elements",
		"var1 [in foo() [in ResolveCatchArgumentName.js [in <default> [in src [in Resolve]]]]]",
		elements
	);
}
/**
 * Resolve an argument name inside catch statement with base type
 */
public void testCatchArgumentName2() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveCatchArgumentName.js");
	IJavaScriptElement[] elements = codeSelect(cu, "var2", "var2");
	assertElementsEqual(
		"Unexpected elements",
		"var2 [in foo() [in ResolveCatchArgumentName.js [in <default> [in src [in Resolve]]]]]",
		elements
	);
}
///**
// * bugs http://dev.eclipse.org/bugs/show_bug.cgi?id=24626
// */
//public void testCatchArgumentType1() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveCatchArgumentType1.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "Y1", "Y1");
//	assertElementsEqual(
//		"Unexpected elements",
//		"Y1 [in X1 [in X1.js [in <default> [in src [in Resolve]]]]]",
//		elements
//	);
//}
///**
// * bugs http://dev.eclipse.org/bugs/show_bug.cgi?id=24626
// */
//public void testCatchArgumentType2() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveCatchArgumentType2.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "Y1", "Y1");
//	assertElementsEqual(
//		"Unexpected elements",
//		"Y1 [in X1 [in X1.js [in <default> [in src [in Resolve]]]]]",
//		elements
//	);
//}
/**
 * Resolve the class 'X' (field type).
 */
public void testClass1() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveClass1.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "X", "X");
//	assertElementsEqual(
//		"Unexpected elements",
//		"X [in X.js [in p1 [in src [in Resolve]]]]",
//		elements
//	);
	assertTrue("implement?",false);
}
/**
 * Resolve the class 'X' (local variable type).
 */
public void testClass2() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveClass2.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "X", "X");
//	assertElementsEqual(
//		"Unexpected elements",
//		"X [in X.js [in p1 [in src [in Resolve]]]]",
//		elements
//	);
	assertTrue("implement?",false);
}
/**
 * Resolve the class 'X'(array initializer type).
 */
public void testClass3() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveClass3.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "X[]{", "X");
//	assertElementsEqual(
//		"Unexpected elements",
//		"X [in X.js [in p1 [in src [in Resolve]]]]",
//		elements
//	);
	assertTrue("implement?",false);
}
/**
 * Resolve the class 'X' (return type).
 */
public void testClass4() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveClass4.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "X", "X");
//	assertElementsEqual(
//		"Unexpected elements",
//		"X [in X.js [in p1 [in src [in Resolve]]]]",
//		elements
//	);
	assertTrue("implement?",false);
}
/**
 * Resolve the class 'X' (method argument).
 */
public void testClass5() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveClass5.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "X", "X");
//	assertElementsEqual(
//		"Unexpected elements",
//		"X [in X.js [in p1 [in src [in Resolve]]]]",
//		elements
//	);
	assertTrue("implement?",false);
}
///**
// * Resolve the class 'SuperClass' (super class).
// */
//public void testClass6() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveClass6.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "X", "X");
//	assertElementsEqual(
//		"Unexpected elements",
//		"X [in X.js [in p1 [in src [in Resolve]]]]",
//		elements
//	);
//}
/**
 * Resolve a constructor
 */
public void testConstructor() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveConstructor.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "ResolveConstructor(\"", "ResolveConstructor");
//	assertElementsEqual(
//		"Unexpected elements",
//		"ResolveConstructor(String) [in ResolveConstructor [in ResolveConstructor.js [in <default> [in src [in Resolve]]]]]",
//		elements
//	);
	assertTrue("implement?",false);
}
///**
// * Resolve a constructor call
// */
//public void testConstructor2() throws JavaScriptModelException {
//	IClassFile cf = getClassFile("Resolve", "class-folder", "", "ResolveConstructorCall.class");
//	IJavaScriptElement[] elements = codeSelect(cf, "ResolveConstructorCall();", "ResolveConstructorCall");
//	assertElementsEqual(
//		"Unexpected elements",
//		"ResolveConstructorCall() [in ResolveConstructorCall [in ResolveConstructorCall.class [in <default> [in class-folder [in Resolve]]]]]",
//		elements
//	);
//}
///**
// * Resolve constructor call
// */
//public void testConstructorCallOfMemberType() throws JavaScriptModelException {
//	IClassFile cf = getClassFile("Resolve", "class-folder", "", "ResolveConstructorCallOfMemberType.class");
//	IJavaScriptElement[] elements = codeSelect(cf, "Inner()", "Inner");
//	assertElementsEqual(
//		"Unexpected elements",
//		"Inner [in ResolveConstructorCallOfMemberType$Inner.class [in <default> [in class-folder [in Resolve]]]]",
//		elements
//	);
//}
///**
// * Resolve constructor call
// */
////TODO(david) enable this test when https://bugs.eclipse.org/bugs/show_bug.cgi?id=108784 will be fixed.
//public void _testConstructorCallOfMemberType2() throws JavaScriptModelException {
//	IClassFile cf = getClassFile("Resolve", "class-folder", "", "ResolveConstructorCallOfMemberType2.class");
//	IJavaScriptElement[] elements = codeSelect(cf, "Inner();", "Inner");
//	assertElementsEqual(
//		"Unexpected elements",
//		"Inner(ResolveConstructorCallOfMemberType2) [in Inner [in ResolveConstructorCallOfMemberType2$Inner.class [in <default> [in class-folder [in Resolve]]]]]",
//		elements
//	);
//}
/**
 * Resolve constructor declaration
 */
public void testConstructorDeclaration() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveConstructorDeclaration.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "ResolveConstructorDeclaration(i", "ResolveConstructorDeclaration");
//	assertElementsEqual(
//		"Unexpected elements",
//		"ResolveConstructorDeclaration(int) [in ResolveConstructorDeclaration [in ResolveConstructorDeclaration.js [in <default> [in src [in Resolve]]]]]",
//		elements
//	);
	assertTrue("implement?",false);
}
///**
// * Resolve empty selection
// */
//public void testEmptySelection() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveTypeEmptySelection.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "ject", "");
//	assertElementsEqual(
//		"Unexpected elements",
//		"Object [in Object.class [in java.lang [in "+ getExternalJCLPathString() + " [in Resolve]]]]",
//		elements
//	);
//}
///**
// * Resolve empty selection
// */
//public void testEmptySelection2() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveTypeEmptySelection2.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "Obj", "");
//	assertElementsEqual(
//		"Unexpected elements",
//		"Object [in Object.class [in java.lang [in "+ getExternalJCLPathString() + " [in Resolve]]]]",
//		elements
//	);
//}
/**
 * Resolve empty selection
 */
public void testEmptySelectionOnMethod() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveEmptySelectionOnMethod.js");
	IJavaScriptElement[] elements = codeSelect(cu, "oo();", "");
	assertElementsEqual(
		"Unexpected elements",
		"foo() [in ResolveEmptySelectionOnMethod.js [in <default> [in src [in Resolve]]]]",
		elements
	);
}
///**
// * Resolse explicit super constructor call
// */
//public void testExplicitSuperConstructorCall() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveExplicitSuperConstructorCall.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "super(", "super");
//	assertElementsEqual(
//		"Unexpected elements",
//		"SuperClass(int) [in SuperClass [in SuperClass.js [in <default> [in src [in Resolve]]]]]",
//		elements
//	);
//}
///**
// * Resolse explicit this constructor call
// */
//public void testExplicitThisConstructorCall() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveExplicitThisConstructorCall.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "this(", "this");
//	assertElementsEqual(
//		"Unexpected elements",
//		"ResolveExplicitThisConstructorCall() [in ResolveExplicitThisConstructorCall [in ResolveExplicitThisConstructorCall.js [in <default> [in src [in Resolve]]]]]",
//		elements
//	);
//}
/**
 * Resolve the field "foo"
 */
public void testField() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveField.js");
	IJavaScriptElement[] elements = codeSelect(cu, "foo =", "foo");
	assertElementsEqual(
		"Unexpected elements",
		"foo [in ResolveField.js [in <default> [in src [in Resolve]]]]",
		elements
	);
}
/**
 * Resolve the field "foo"
 */
public void testField0() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveField0.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "foo =", "foo");
//	assertElementsEqual(
//		"Unexpected elements",
//		"foo [in ResolveField [in ResolveField.js [in <default> [in src [in Resolve]]]]]",
//		elements
//	);
	assertTrue("implement",false);
}
/**
 * Resolve field declaration
 */
public void testFieldDeclaration() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveFieldDeclaration.js");
	IJavaScriptElement[] elements = codeSelect(cu, "foo", "foo");
	assertElementsEqual(
		"Unexpected elements",
		"foo [in ResolveFieldDeclaration.js [in <default> [in src [in Resolve]]]]",
		elements
	);
}
///**
// * Resolve in import
// */
//public void testImport() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveImport.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "ImportedClass", "ImportedClass");
//	assertElementsEqual(
//		"Unexpected elements",
//		"ImportedClass [in ImportedClass.js [in a.b [in src [in Resolve]]]]",
//		elements
//	);
//}
///**
// * Tests code resolve on a class file without attached source.
// */
//public void testInClassFileWithoutSource() throws JavaScriptModelException {
//	IClassFile cu = getClassFile("Resolve", "p4.jar", "p4", "X.class");
//	String selection = "Object";
//	int start = 34;
//	int length = selection.length();
//	IJavaScriptElement[] elements = cu.codeSelect(start, length);
//	assertElementsEqual(
//		"Unexpected elements",
//		"",
//		elements
//	);
//}
///**
// * Tests code resolve on a class file with attached source.
// */
//public void testInClassFileWithSource() throws JavaScriptModelException {
//	IClassFile cf = getClassFile("Resolve", "p3.jar", "p3", "X.class");
//	IJavaScriptElement[] elements = codeSelect(cf, "Object", "Object");
//	assertElementsEqual(
//		"Unexpected elements",
//		"Object [in Object.class [in java.lang [in "+ getExternalJCLPathString() + " [in Resolve]]]]",
//		elements
//	);
//}
///**
// * bugs http://dev.eclipse.org/bugs/show_bug.cgi?id=25687
// */
//public void testInnerClassAsParamater() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveInnerClassAsParamater.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "foo(i)", "foo");
//	assertElementsEqual(
//		"Unexpected elements",
//		"foo(Inner) [in ResolveInnerClassAsParamater [in ResolveInnerClassAsParamater.js [in <default> [in src [in Resolve]]]]]",
//		elements
//	);
//}
///**
// * Resolve the interface "Y"
// */
//public void testInterface() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveInterface.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "Y", "Y");
//	assertElementsEqual(
//		"Unexpected elements",
//		"Y [in Y.js [in p1 [in src [in Resolve]]]]",
//		elements
//	);
//}
/**
 * Attempt to resolve outside of the range of the compilation unit.
 */
public void testInvalidResolve() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "p1", "X.js");
	try {
		cu.codeSelect(-1, 10); 
	} catch (JavaScriptModelException e) {
		return;
	}
	assertTrue("Exception should have been thrown for out of bounds resolution", false);
}
///**
// * Resolve the local class 'Y' (field type).
// */
//public void testLocalClass1() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveLocalClass1.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "Y[]", "Y");
//	assertElementsEqual(
//		"Unexpected elements",
//		"Y [in foo() [in ResolveLocalClass1 [in ResolveLocalClass1.js [in <default> [in src [in Resolve]]]]]]",
//		elements
//	);
//}
///**
// * Resolve the local class 'Y' (local variable type).
// */
//public void testLocalClass2() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveLocalClass2.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "Y y", "Y");
//	assertElementsEqual(
//		"Unexpected elements",
//		"Y [in foo() [in ResolveLocalClass2 [in ResolveLocalClass2.js [in <default> [in src [in Resolve]]]]]]",
//		elements
//	);
//}
///**
// * Resolve the local class 'Y'(array initializer type).
// */
//public void testLocalClass3() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveLocalClass3.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "Y[]{", "Y");
//	assertElementsEqual(
//		"Unexpected elements",
//		"Y [in foo() [in ResolveLocalClass3 [in ResolveLocalClass3.js [in <default> [in src [in Resolve]]]]]]",
//		elements
//	);
//}
/////**
//// * Resolve the local class 'Y' (return type).
//// */
////public void testLocalClass4() throws JavaScriptModelException {
////	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveLocalClass4.js");
////	IJavaScriptElement[] elements = codeSelect(cu, "Y bar()", "Y");
////	assertElementsEqual(
////		"Unexpected elements",
////		"Y [in foo() [in ResolveLocalClass4 [in ResolveLocalClass4.js [in <default> [in src [in Resolve]]]]]]",
////		elements
////	);
////}
/////**
//// * Resolve the local class 'Y' (method argument).
//// */
////public void testLocalClass5() throws JavaScriptModelException {
////	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveLocalClass5.js");
////	IJavaScriptElement[] elements = codeSelect(cu, "Y y", "Y");
////	assertElementsEqual(
////		"Unexpected elements",
////		"Y [in foo() [in ResolveLocalClass5 [in ResolveLocalClass5.js [in <default> [in src [in Resolve]]]]]]",
////		elements
////	);
////}
///**
// * Resolve the local class 'SuperClass' (super class).
// */
//public void testLocalClass6() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveLocalClass6.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "Y { // superclass", "Y");
//	assertElementsEqual(
//		"Unexpected elements",
//		"Y [in foo() [in ResolveLocalClass6 [in ResolveLocalClass6.js [in <default> [in src [in Resolve]]]]]]",
//		elements
//	);
//}
///*
// * https://bugs.eclipse.org/bugs/show_bug.cgi?id=68710
// */
//public void testLocalClass7() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveLocalClass7.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "X var", "X");
//	assertElementsEqual(
//		"Unexpected elements",
//		"X [in <anonymous #2> [in foo2() [in ResolveLocalClass7 [in ResolveLocalClass7.js [in <default> [in src [in Resolve]]]]]]]",
//		elements
//	);
//}
///*
// * https://bugs.eclipse.org/bugs/show_bug.cgi?id=126227
// */
//public void testLocalClass8() throws JavaScriptModelException {
//	// select the default constructor of a local class
//	IJavaScriptElement[] elements = select(
//			"/Resolve/src/test/Test.js",
//			"package test;\n" +
//			"public class Test\n" +
//			"  void foo() {\n" +
//			"    class LocalClass {}\n" +
//			"    Object o = new LocalClass();\n" +
//			"  }\n" +
//			"}\n",
//			"LocalClass");
//	
//	assertElementsEqual(
//		"Unexpected elements",
//		"LocalClass [in foo() [in Test [in [Working copy] Test.js [in test [in src [in Resolve]]]]]]",
//		elements
//	);
//}
///*
// * Resolve the local class in a class file and ensure it is a binary type.
// * (regression test for bug 131459 Java model returns stale resolved source type for binary type
// */
//public void testLocalClass9() throws CoreException, IOException {
//	try {
//		IJavaScriptProject project = createJavaProject("P");
//		addLibrary(
//			project, 
//			"lib.jar", 
//			"libsrc.zip", 
//			new String[] {
//				"X.js",
//				"public class X {\n" +
//				"  void foo() {\n" +
//				"    class Y {\n" +
//				"    }\n" +
//				"  }\n" +
//				"}"
//			}, 
//			"1.4");
//		IClassFile classFile = getClassFile("P", "/P/lib.jar", "", "X.class");
//		IJavaScriptElement[] elements = codeSelect(classFile, "Y", "Y");
//		assertTrue("Should be a binary type", ((IType) elements[0]).isBinary());
//	} finally {
//		deleteProject("P");
//	}
//}
/////**
//// * Resolve a local constructor
//// */
////public void testLocalConstructor() throws JavaScriptModelException {
////	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveLocalConstructor.js");
////	IJavaScriptElement[] elements = codeSelect(cu, "Y(\"", "Y");
////	assertElementsEqual(
////		"Unexpected elements",
////		"Y(String) [in Y [in foo() [in ResolveLocalConstructor [in ResolveLocalConstructor.js [in <default> [in src [in Resolve]]]]]]]",
////		elements
////	);
////}
/////**
//// * Resolve local constructor declaration
//// */
////public void testLocalConstructorDeclaration() throws JavaScriptModelException {
////	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveLocalConstructorDeclaration.js");
////	IJavaScriptElement[] elements = codeSelect(cu, "Y(i", "Y");
////	assertElementsEqual(
////		"Unexpected elements",
////		"Y(int) [in Y [in foo() [in ResolveLocalConstructorDeclaration [in ResolveLocalConstructorDeclaration.js [in <default> [in src [in Resolve]]]]]]]",
////		elements
////	);
////}
///**
// * Resolve the local field "fred"
// */
//public void testLocalField() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveLocalField.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "fred =", "fred");
//	assertElementsEqual(
//		"Unexpected elements",
//		"fred [in Y [in foo() [in ResolveLocalField [in ResolveLocalField.js [in <default> [in src [in Resolve]]]]]]]",
//		elements
//	);
//}
///*
// * https://bugs.eclipse.org/bugs/show_bug.cgi?id=68710
// */
//public void testLocalField2() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveLocalField2.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "var =", "var");
//	assertElementsEqual(
//		"Unexpected elements",
//		"var [in <anonymous #2> [in foo2() [in ResolveLocalField2 [in ResolveLocalField2.js [in <default> [in src [in Resolve]]]]]]]",
//		elements
//	);
//}
///**
// * Resolve local field declaration
// */
//public void testLocalFieldDeclaration() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveLocalFieldDeclaration.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "fred", "fred");
//	assertElementsEqual(
//		"Unexpected elements",
//		"fred [in Y [in foo() [in ResolveLocalFieldDeclaration [in ResolveLocalFieldDeclaration.js [in <default> [in src [in Resolve]]]]]]]",
//		elements
//	);
//}
///**
// * Resolve local member type declaration
// */
//public void testLocalMemberTypeDeclaration() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveLocalMemberTypeDeclaration1.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "Member {", "Member");
//	assertElementsEqual(
//		"Unexpected elements",
//		"Member [in Y [in foo() [in ResolveLocalMemberTypeDeclaration1 [in ResolveLocalMemberTypeDeclaration1.js [in <default> [in src [in Resolve]]]]]]]",
//		elements
//	);
//}
///**
// * Resolve member type declaration
// */
//public void testLocalMemberTypeDeclaration2() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveLocalMemberTypeDeclaration2.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "MemberOfMember", "MemberOfMember");
//	assertElementsEqual(
//		"Unexpected elements",
//		"MemberOfMember [in Member [in Y [in foo() [in ResolveLocalMemberTypeDeclaration2 [in ResolveLocalMemberTypeDeclaration2.js [in <default> [in src [in Resolve]]]]]]]]",
//		elements
//	);
//}
///**
// * Resolve the method "foo"
// */
//public void testLocalMethod() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveLocalMethod.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "foo(\"", "foo");
//	assertElementsEqual(
//		"Unexpected elements",
//		"foo(String) [in Y [in bar() [in ResolveLocalMethod [in ResolveLocalMethod.js [in <default> [in src [in Resolve]]]]]]]",
//		elements
//	);
//}
///*
// * https://bugs.eclipse.org/bugs/show_bug.cgi?id=68710
// */
//public void testLocalMethod2() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveLocalMethod2.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "bar();", "bar");
//	assertElementsEqual(
//		"Unexpected elements",
//		"bar() [in <anonymous #2> [in foo2() [in ResolveLocalMethod2 [in ResolveLocalMethod2.js [in <default> [in src [in Resolve]]]]]]]",
//		elements
//	);
//}
///**
// * Resolve method declaration
// */
//public void testLocalMethodDeclaration() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveLocalMethodDeclaration.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "foo(i", "foo");
//	assertElementsEqual(
//		"Unexpected elements",
//		"foo(int) [in Y [in bar() [in ResolveLocalMethodDeclaration [in ResolveLocalMethodDeclaration.js [in <default> [in src [in Resolve]]]]]]]",
//		elements
//	);
//}
/**
 * Resolve a local declaration name
 */
public void testLocalName1() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveLocalName.js");
	IJavaScriptElement[] elements = codeSelect(cu, "var1 = new Object();", "var1");
	assertElementsEqual(
		"Unexpected elements",
		"var1 [in foo() [in ResolveLocalName.js [in <default> [in src [in Resolve]]]]]",
		elements
	);
}
/**
 * Resolve a local declaration name with base type
 */
public void testLocalName2() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveLocalName.js");
	IJavaScriptElement[] elements = codeSelect(cu, "var2 = 1;", "var2");
	assertElementsEqual(
		"Unexpected elements",
		"var2 [in foo() [in ResolveLocalName.js [in <default> [in src [in Resolve]]]]]",
		elements
	);
}
/**
 * Resolve a local variable reference
 */
public void testLocalName3() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveLocalName.js");
	IJavaScriptElement[] elements = codeSelect(cu, "var1.toString();", "var1");
	assertElementsEqual(
		"Unexpected elements",
		"var1 [in foo() [in ResolveLocalName.js [in <default> [in src [in Resolve]]]]]",
		elements
	);
}
/**
 * Resolve a local variable reference
 */
public void testLocalName4() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveLocalName.js");
	IJavaScriptElement[] elements = codeSelect(cu, "var2++;", "var2");
	assertElementsEqual(
		"Unexpected elements",
		"var2 [in foo() [in ResolveLocalName.js [in <default> [in src [in Resolve]]]]]",
		elements
	);
}
/**
 * Resolve a local variable reference
 */
public void testLocalName5() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveLocalName.js");
	IJavaScriptElement[] elements = codeSelect(cu, "var3.hashCode();", "var3");
	assertElementsEqual(
		"Unexpected elements",
		"var3 [in foo() [in ResolveLocalName.js [in <default> [in src [in Resolve]]]]]",
		elements
	);
}
/**
 * Resolve a local variable reference
 */
public void testLocalName6() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveLocalName.js");
	IJavaScriptElement[] elements = codeSelect(cu, "var3.toString();", "var3");
	assertElementsEqual(
		"Unexpected elements",
		"var3 [in foo() [in ResolveLocalName.js [in <default> [in src [in Resolve]]]]]",
		elements
	);
}
/**
 * Resolve a local variable reference
 */
public void testLocalName7() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveLocalName.js");
	IJavaScriptElement[] elements = codeSelect(cu, "var4;", "var4");
	assertElementsEqual(
		"Unexpected elements",
		"var4 [in foo() [in ResolveLocalName.js [in <default> [in src [in Resolve]]]]]",
		elements
	);
}
/*
 * Resolve a local reference and ensure it returns true when asked isStructureKnown().
 * (regression test for bug 48422 Calling isStructureKnown() on ILocalVaraible throws JavaModelExceptions)
 */
public void testLocalVarIsStructureKnown() throws JavaScriptModelException {
	ILocalVariable localVar = getLocalVariable("/Resolve/src/ResolveLocalName.js", "var1 = new Object();", "var1");
	assertTrue(localVar.isStructureKnown());
}
/*
 * Resolve a local reference and ensure its type signature is correct.
 */
public void testLocalVarTypeSignature1() throws JavaScriptModelException {
	ILocalVariable localVar = getLocalVariable("/Resolve/src/ResolveLocalName.js", "var1 = new Object();", "var1");
	assertEquals(
		"Unexpected type signature",
		"QObject;",
		localVar.getTypeSignature());
}
/*
 * Resolve a local reference and ensure its type signature is correct.
 */
public void testLocalVarTypeSignature2() throws JavaScriptModelException {
	ILocalVariable localVar = getLocalVariable("/Resolve/src/ResolveLocalName.js", "var2 = 1;", "var2");
	assertEquals(
		"Unexpected type signature",
		"I",
		localVar.getTypeSignature());
}
///**
// * Resolve member type declaration
// */
//public void testMemberTypeDeclaration() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveMemberTypeDeclaration1.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "MemberInterface", "MemberInterface");
//	assertElementsEqual(
//		"Unexpected elements",
//		"MemberInterface [in ResolveMemberTypeDeclaration1 [in ResolveMemberTypeDeclaration1.js [in <default> [in src [in Resolve]]]]]",
//		elements
//	);
//}
///**
// * Resolve member type declaration located in default package
// */
//public void testMemberTypeDeclaration2() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveMemberTypeDeclaration2.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "MemberOfMember", "MemberOfMember");
//	assertElementsEqual(
//		"Unexpected elements",
//		"MemberOfMember [in Member [in ResolveMemberTypeDeclaration2 [in ResolveMemberTypeDeclaration2.js [in <default> [in src [in Resolve]]]]]]",
//		elements
//	);
//}
/**
 * Try to resolve message send on base type.
 */
public void testMessageSendOnBaseType() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveMessageSendOnBaseType.js");
	IJavaScriptElement[] elements = codeSelect(cu, "hello", "hello");
	assertElementsEqual(
		"Unexpected elements",
		"",
		elements
	);
}
/**
 * Resolve the method "foo"
 */
public void testMethod() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveMethod.js");
	IJavaScriptElement[] elements = codeSelect(cu, "foo(\"", "foo");
	assertElementsEqual(
		"Unexpected elements",
		"foo(p0) [in ResolveMethod.js [in <default> [in src [in Resolve]]]]",
		elements
	);
}
/**
 * Resolve method declaration
 */
public void testMethodDeclaration() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveMethodDeclaration.js");
	IJavaScriptElement[] elements = codeSelect(cu, "foo(i", "foo");
	assertElementsEqual(
		"Unexpected elements",
		"foo(p0) [in ResolveMethodDeclaration.js [in <default> [in src [in Resolve]]]]",
		elements
	);
}
///**
// * Resolve method declaration in anonymous
// * (regression test for bug 45655 exception while editing java file)
// */
//public void testMethodDeclarationInAnonymous() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveMethodDeclarationInAnonymous.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "bar()", "bar");
//	assertElementsEqual(
//		"Unexpected elements",
//		"bar() [in <anonymous #1> [in foo() [in ResolveMethodDeclarationInAnonymous [in ResolveMethodDeclarationInAnonymous.js [in <default> [in src [in Resolve]]]]]]]",
//		elements
//	);
//}
///**
// * Resolve method declaration in anonymous
// * (regression test for bug 45786 No selection on method declaration in field initializer)
// */
//public void testMethodDeclarationInAnonymous2() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveMethodDeclarationInAnonymous2.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "foo()", "foo");
//	assertElementsEqual(
//		"Unexpected elements",
//		"foo() [in <anonymous #1> [in field [in ResolveMethodDeclarationInAnonymous2 [in ResolveMethodDeclarationInAnonymous2.js [in <default> [in src [in Resolve]]]]]]]",
//		elements
//	);
//}
///**
// * Resolve method declaration in anonymous
// * (regression test for bug 47795 NPE selecting method in anonymous 2 level deep)
// */
//public void testMethodDeclarationInAnonymous3() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveMethodDeclarationInAnonymous3.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "selectMe(", "selectMe");
//	assertElementsEqual(
//		"Unexpected elements",
//		"selectMe() [in <anonymous #1> [in bar() [in <anonymous #1> [in foo() [in ResolveMethodDeclarationInAnonymous3 [in ResolveMethodDeclarationInAnonymous3.js [in <default> [in src [in Resolve]]]]]]]]]",
//		elements
//	);
//}
///**
// * Resolve method declaration in anonymous
// * (regression test for bug 47214 Cannot open declaration on a selected method of an anonymous class)
// */
//public void testMethodDeclarationInAnonymous4() throws JavaScriptModelException {
//	IClassFile classFile = getClassFile("Resolve", "test47214.jar", "p", "X.class");
//	IJavaScriptElement[] elements = codeSelect(classFile, "bar(", "bar");
//	assertElementsEqual(
//		"Unexpected elements",
//		"bar() [in <anonymous> [in X$1.class [in p [in test47214.jar [in Resolve]]]]]",
//		elements
//	);
//}
/**
 * Resolve the method
 */
public void testMethodWithIncorrectParameter() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveMethodWithIncorrectParameter.js");
	IJavaScriptElement[] elements = codeSelect(cu, "foo(\"String", "foo");
	assertElementsEqual(
		"Unexpected elements",
			"foo(p0) [in ResolveMethodWithIncorrectParameter.js [in <default> [in src [in Resolve]]]]",
		elements
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=126160
public void testMethodWithIncorrectParameter2() throws JavaScriptModelException {
//	IJavaScriptElement[] elements = select(
//			"/Resolve/src/test/Test.js",
//			"package test;\n" +
//			"public class Test\n" +
//			"  void called(String arg) {\n" +
//			"  }\n" +
//			"  void foo() {\n" +
//			"    new Object() {\n" +
//			"      void bar() {\n" +
//			"        called(zzz);\n" +
//			"      }\n" +
//			"    };\n" +
//			"  }\n" +
//			"}\n",
//			"called");
//	
//	assertElementsEqual(
//		"Unexpected elements",
//		"called(String) [in Test [in [Working copy] Test.js [in test [in src [in Resolve]]]]]",
//		elements
//	);

	assertTrue("implement",false);
}
///**
// * Resolve method in inner type.
// */
//public void testMethodWithInnerTypeInClassFile() throws JavaScriptModelException {
//	IClassFile cf = getClassFile("Resolve", "zzz.jar", "", "MyClass$Inner.class");
//	IJavaScriptElement[] elements = codeSelect(cf, "test", "test");
//	assertElementsEqual(
//		"Unexpected elements",
//		"test() [in MyClass [in MyClass.class [in <default> [in zzz.jar [in Resolve]]]]]",
//		elements
//	);
//}
///**
// * bug 33785
// */
//public void testMethodWithInnerTypeInClassFile2() throws JavaScriptModelException {
//	IClassFile cf = getClassFile("Resolve", "zzz.jar", "", "MyClass2$Inner.class");
//	IJavaScriptElement[] elements = codeSelect(cf, "method", "method");
//	assertElementsEqual(
//		"Unexpected elements",
//		"method(MyClass2.Inner[]) [in MyClass2 [in MyClass2.class [in <default> [in zzz.jar [in Resolve]]]]]",
//		elements
//	);
//		
//	IFunction method = (IFunction) elements[0];
//	ISourceRange sourceRange = method.getSourceRange();
//	String methodString = "void method(MyClass2.Inner[] arg){}";
//	int o = cf.getSource().indexOf(methodString);
//	int l = methodString.length();
//	assertEquals("Unexpected offset", o, sourceRange.getOffset());
//	assertEquals("Unexpected length", l, sourceRange.getLength());
//}
/**
 * Tries to resolve the type "lang. \u0053tring" which doesn't exist.
 */
public void testNegativeResolveUnicode() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveUnicode.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "lang.\\u0053tring", "lang.\\u0053tring");
//	assertElementsEqual(
//		"Unexpected elements",
//		"String [in String.class [in java.lang [in "+ getExternalJCLPathString() + " [in Resolve]]]]",
//		elements
//	);
	assertTrue("implement",false);
}
///**
// * Resolve the package "java.lang"
// */
//public void testPackage() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolvePackage.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "lang", "lang");
//	assertElementsEqual(
//		"Unexpected elements",
//		"java.lang [in " + getExternalJCLPathString() + " [in Resolve]]",
//		elements
//	);
//}
/**
 * Try to resolve the qualified type "lang.Object"
 */
public void testPartiallyQualifiedType() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolvePartiallyQualifiedType.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "lang.Object", "lang.Object");
//	assertElementsEqual(
//		"Unexpected elements",
//		"Object [in Object.class [in java.lang [in "+ getExternalJCLPathString() + " [in Resolve]]]]",
//		elements
//	);
	assertTrue("implement",false);
}
///**
// * Resolve the qualified type "java.lang.Object"
// */
//public void testQualifiedType() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveQualifiedType.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "java.lang.Object", "java.lang.Object");
//	assertElementsEqual(
//		"Unexpected elements",
//		"Object [in Object.class [in java.lang [in "+ getExternalJCLPathString() + " [in Resolve]]]]",
//		elements
//	);
//}
///**
// * bugs http://dev.eclipse.org/bugs/show_bug.cgi?id=25888
// */
//public void testStaticClassConstructor() throws JavaScriptModelException {
//	IClassFile cu = getClassFile("Resolve", "test25888.jar", "", "ResolveStaticClassConstructor.class");
//	IJavaScriptElement[] elements = codeSelect(cu, "StaticInnerClass();", "StaticInnerClass");
//	assertElementsEqual(
//		"Unexpected elements",
//		"StaticInnerClass() [in StaticInnerClass [in ResolveStaticClassConstructor$StaticInnerClass.class [in <default> [in test25888.jar [in Resolve]]]]]",
//		elements
//	);
//}
/**
 * Resolve type declaration
 */
public void testTypeDeclaration() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveTypeDeclaration.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "OtherType", "OtherType");
//	assertElementsEqual(
//		"Unexpected elements",
//		"OtherType [in ResolveTypeDeclaration.js [in <default> [in src [in Resolve]]]]",
//		elements
//	);
//	
	assertTrue("implement",false);
}
/**
 * Resolve type in comment.
 */
public void testTypeInComment() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveTypeInComment.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "X */", "X");
//	assertElementsEqual(
//		"Unexpected elements",
//		"X [in X.js [in p2 [in src [in Resolve]]]]",
//		elements
//	);
	assertTrue("implement",false);
}
/**
 * Resolve the type "java.lang. \u0053ring"
 */
public void testUnicode() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveUnicode.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "java.lang.\\u0053tring", "java.lang.\\u0053tring");
//	assertElementsEqual(
//		"Unexpected elements",
//		"String [in String.class [in java.lang [in "+ getExternalJCLPathString() + " [in Resolve]]]]",
//		elements
//	);
//	
	assertTrue("implement",false);
}
///**
// * https://bugs.eclipse.org/bugs/show_bug.cgi?id=47177
// */
//public void testLocalNameForClassFile() throws JavaScriptModelException {
//	IClassFile cu = getClassFile("Resolve", "test47177.jar", "", "ResolveLocalName.class");
//
//	//Resolve a local declaration name
//	IJavaScriptElement[] elements = codeSelect(cu, "var1 = new Object();", "var1");
//	assertElementsEqual(
//			"Unexpected elements",
//			"var1 [in foo() [in ResolveLocalName [in ResolveLocalName.class [in <default> [in test47177.jar [in Resolve]]]]]]",
//			elements
//	);
//
//	// Resolve a local declaration name with base type
//	elements = codeSelect(cu, "var2 = 1;", "var2");
//	assertElementsEqual(
//			"Unexpected elements",
//			"var2 [in foo() [in ResolveLocalName [in ResolveLocalName.class [in <default> [in test47177.jar [in Resolve]]]]]]",
//			elements
//	);
//
//	// Resolve a local variable reference
//	elements = codeSelect(cu, "var1.toString();", "var1");
//	assertElementsEqual(
//			"Unexpected elements",
//			"var1 [in foo() [in ResolveLocalName [in ResolveLocalName.class [in <default> [in test47177.jar [in Resolve]]]]]]",
//			elements
//	);
//
//	// Resolve a local variable reference
//	elements = codeSelect(cu, "var2++;", "var2");
//	assertElementsEqual(
//			"Unexpected elements",
//			"var2 [in foo() [in ResolveLocalName [in ResolveLocalName.class [in <default> [in test47177.jar [in Resolve]]]]]]",
//			elements
//	);
//
//	// Resolve a local variable reference
//	elements = codeSelect(cu, "var3.hashCode();", "var3");
//	assertElementsEqual(
//			"Unexpected elements",
//			"var3 [in foo() [in ResolveLocalName [in ResolveLocalName.class [in <default> [in test47177.jar [in Resolve]]]]]]",
//			elements
//	);
//
//	// Resolve a local variable reference
//	elements = codeSelect(cu, "var3.toString();", "var3");
//	assertElementsEqual(
//			"Unexpected elements",
//			"var3 [in foo() [in ResolveLocalName [in ResolveLocalName.class [in <default> [in test47177.jar [in Resolve]]]]]]",
//			elements
//	);
//	
//	// Resolve a local variable reference
//	elements = codeSelect(cu, "var4;", "var4");
//	assertElementsEqual(
//			"Unexpected elements",
//			"var4 [in foo() [in ResolveLocalName [in ResolveLocalName.class [in <default> [in test47177.jar [in Resolve]]]]]]",
//			elements
//	);
//}
///**
// * https://bugs.eclipse.org/bugs/show_bug.cgi?id=42365
// */
//public void testMethodDeclarationInInterface() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveMethodDeclarationInInterface.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "foo", "foo");
//	assertElementsEqual(
//			"Unexpected elements",
//			"foo() [in QI [in QI.class [in <default> [in jj.jar [in Resolve]]]]]",
//			elements
//	);
//}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=142303
//public void testMethodInAnonymous1() throws JavaScriptModelException {
//	this.workingCopies = new IJavaScriptUnit[2];
//	this.workingCopies[0] = getWorkingCopy(
//			"/Resolve/src/Test2.java",
//			"public class Test2 {\n" +
//			"\n" +
//			"    private void foo(boolean v) {\n" +
//			"    }\n" +
//			"\n" +
//			"    void function(boolean v) {\n" +
//			"        new Object() {\n" +
//			"            public void run() {\n" +
//			"                if (false) {\n" +
//			"                } else {\n" +
//			"                    foo(false); // <-- right-click, open declaration fails\n" +
//			"                }\n" +
//			"            }\n" +
//			"        };\n" +
//			"        new Object() {  public void run() {   } };\n" +
//			"        if (v) {}\n" +
//			"    }\n" +
//			"}");
//	
//	String str = this.workingCopies[0].getSource();
//	String selectAt = "foo(false)";
//	String selection = "foo";
//	int start = str.indexOf(selectAt);
//	int length = selection.length();
//	IJavaScriptElement[] elements = this.workingCopies[0].codeSelect(start, length, this.wcOwner);
//	
//	assertElementsEqual(
//			"Unexpected elements",
//			"foo(boolean) [in Test2 [in [Working copy] Test2.java [in <default> [in src [in Resolve]]]]]",
//			elements);
//}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=144858
public void testDuplicateLocals1() throws JavaScriptModelException {
	this.workingCopies = new IJavaScriptUnit[2];
	this.workingCopies[0] = getWorkingCopy(
		"/Resolve/src/test/Test.java",
		"package test;"+
		"public class Test {\n" + 
		"	void foo() {\n" + 
		"		int x = 0;\n" + 
		"		TestString x = null;\n" + 
		"		x.bar;\n" + 
		"	}\n" + 
		"}");
	
	this.workingCopies[1] = getWorkingCopy(
		"/Resolve/src/test/TestString.java",
		"package test;"+
		"public class TestString {\n" + 
		"	public void bar() {\n" + 
		"	}\n" + 
		"}");

	String str = this.workingCopies[0].getSource();
	int start = str.lastIndexOf("x");
	int length = "x".length();
	IJavaScriptElement[] elements =  this.workingCopies[0].codeSelect(start, length, this.wcOwner);
	
	assertElementsEqual(
			"Unexpected elements",
			"x [in foo() [in Test [in [Working copy] Test.java [in test [in src [in Resolve]]]]]]",
			elements
		);
	
	assertEquals(
			"Unexpected type",
			"QTestString;",
			((ILocalVariable)elements[0]).getTypeSignature());
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=144858
public void testDuplicateLocals2() throws JavaScriptModelException {
	this.workingCopies = new IJavaScriptUnit[2];
	this.workingCopies[0] = getWorkingCopy(
		"/Resolve/src/test/Test.java",
		"package test;"+
		"public class Test {\n" + 
		"        public static void main(String[] args) {\n" + 
		"                int x = 2;\n" + 
		"                try {\n" + 
		"                \n" + 
		"                } catch(TestException x) {\n" + 
		"                        x.bar();\n" + 
		"                } catch(Exception e) {\n" + 
		"                }\n" + 
		"        }\n" + 
		"}");
	
	this.workingCopies[1] = getWorkingCopy(
		"/Resolve/src/test/TestException.java",
		"package test;"+
		"public class TestException extends Exception {\n" + 
		"	public void bar() {\n" + 
		"	}\n" + 
		"}");

	String str = this.workingCopies[0].getSource();
	int start = str.lastIndexOf("x.");
	int length = "x".length();
	IJavaScriptElement[] elements =  this.workingCopies[0].codeSelect(start, length, this.wcOwner);
	
	assertElementsEqual(
			"Unexpected elements",
			"x [in main(String[]) [in Test [in [Working copy] Test.java [in test [in src [in Resolve]]]]]]",
			elements
		);
	
	assertEquals(
			"Unexpected type",
			"QTestException;",
			((ILocalVariable)elements[0]).getTypeSignature());
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=144858
public void testDuplicateLocals3() throws JavaScriptModelException {
	this.workingCopies = new IJavaScriptUnit[2];
	this.workingCopies[0] = getWorkingCopy(
		"/Resolve/src/test/Test.java",
		"package test;"+
		"public class Test {\n" + 
		"        public static void main(String[] args) {\n" + 
		"                int x = x = 0;\n" + 
		"                if (true) {\n" + 
		"                        TestString x = x = null;\n" + 
		"                }\n" + 
		"        }\n" + 
		"}");
	
	this.workingCopies[1] = getWorkingCopy(
		"/Resolve/src/test/TestString.java",
		"package test;"+
		"public class TestString {\n" + 
		"	public void bar() {\n" + 
		"	}\n" + 
		"}");

	String str = this.workingCopies[0].getSource();
	int start = str.lastIndexOf("x");
	int length = "x".length();
	IJavaScriptElement[] elements =  this.workingCopies[0].codeSelect(start, length, this.wcOwner);
	
	assertElementsEqual(
			"Unexpected elements",
			"x [in main(String[]) [in Test [in [Working copy] Test.java [in test [in src [in Resolve]]]]]]",
			elements
		);
	
	assertEquals(
			"Unexpected type",
			"QTestString;",
			((ILocalVariable)elements[0]).getTypeSignature());
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=144858
public void testDuplicateLocals4() throws JavaScriptModelException {
	this.workingCopies = new IJavaScriptUnit[2];
	this.workingCopies[0] = getWorkingCopy(
		"/Resolve/src/test/Test.java",
		"package test;"+
		"public class Test {\n" + 
		"        public static void main(String[] args) {\n" + 
		"                for (int x = 0; x < 10; x++) {\n" + 
		"                        for (TestString x = null; x.bar() < 5;)  {\n" + 
		"                                // do something\n" + 
		"                        }\n" + 
		"                }\n" + 
		"        }\n" + 
		"}");
	
	this.workingCopies[1] = getWorkingCopy(
		"/Resolve/src/test/TestString.java",
		"package test;"+
		"public class TestString {\n" + 
		"	public int bar() {\n" + 
		"		return 0;\n" + 
		"	}\n" + 
		"}");

	String str = this.workingCopies[0].getSource();
	int start = str.lastIndexOf("x");
	int length = "x".length();
	IJavaScriptElement[] elements =  this.workingCopies[0].codeSelect(start, length, this.wcOwner);
	
	assertElementsEqual(
			"Unexpected elements",
			"x [in main(String[]) [in Test [in [Working copy] Test.java [in test [in src [in Resolve]]]]]]",
			elements
		);
	
	assertEquals(
			"Unexpected type",
			"QTestString;",
			((ILocalVariable)elements[0]).getTypeSignature());
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=144858
public void testDuplicateLocals5() throws JavaScriptModelException {
	this.workingCopies = new IJavaScriptUnit[2];
	this.workingCopies[0] = getWorkingCopy(
		"/Resolve/src/test/Test.java",
		"package test;"+
		"public class Test {\n" + 
		"        public static void main(String[] args) {\n" + 
		"                for (int x = 0; x < 10; x++) {\n" + 
		"                        for (TestString x = null; x.bar() < 5;)  {\n" + 
		"                                x.bar(); // do something\n" + 
		"                        }\n" + 
		"                }\n" + 
		"        }\n" + 
		"}");
	
	this.workingCopies[1] = getWorkingCopy(
		"/Resolve/src/test/TestString.java",
		"package test;"+
		"public class TestString {\n" + 
		"	public int bar() {\n" + 
		"		return 0;\n" + 
		"	}\n" + 
		"}");

	String str = this.workingCopies[0].getSource();
	int start = str.lastIndexOf("x");
	int length = "x".length();
	IJavaScriptElement[] elements =  this.workingCopies[0].codeSelect(start, length, this.wcOwner);
	
	assertElementsEqual(
			"Unexpected elements",
			"x [in main(String[]) [in Test [in [Working copy] Test.java [in test [in src [in Resolve]]]]]]",
			elements
		);
	
	assertEquals(
			"Unexpected type",
			"QTestString;",
			((ILocalVariable)elements[0]).getTypeSignature());
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=165662
public void testDuplicateLocalsType1() throws JavaScriptModelException {
	this.workingCopies = new IJavaScriptUnit[2];
	this.workingCopies[0] = getWorkingCopy(
		"/Resolve/src/test/Test.java",
		"package test;"+
		"public class Test {\n" + 
		"  void foo() {\n" + 
		"     class Local {\n" + 
		"        public void foo() {}\n" + 
		"     }\n" + 
		"     {\n" + 
		"        class Local {\n" + 
		"                Local(int i) {\n" + 
		"                        this.init(i);\n" + 
		"                }\n" + 
		"				 void init(int i) {}\n" +
		"                public void bar() {}\n" +
		"        }\n" + 
		"        Local l = new Local(0);\n" + 
		"        l.bar();\n" + 
		"     }\n" + 
		"  }\n" + 
		"}");
	
	this.workingCopies[1] = getWorkingCopy(
		"/Resolve/src/test/TestString.java",
		"package test;"+
		"public class TestString {\n" + 
		"	public int bar() {\n" + 
		"		return 0;\n" + 
		"	}\n" + 
		"}");

	String str = this.workingCopies[0].getSource();
	int start = str.lastIndexOf("bar");
	int length = "bar".length();
	IJavaScriptElement[] elements =  this.workingCopies[0].codeSelect(start, length, this.wcOwner);
	
	assertElementsEqual(
			"Unexpected elements",
			"bar() [in Local#2 [in foo() [in Test [in [Working copy] Test.java [in test [in src [in Resolve]]]]]]]",
			elements
		);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=165662
public void testDuplicateLocalsType2() throws JavaScriptModelException {
	this.workingCopies = new IJavaScriptUnit[2];
	this.workingCopies[0] = getWorkingCopy(
		"/Resolve/src/test/Test.java",
		"package test;"+
		"public class Test {\n" + 
		"        void foo() {\n" + 
		"                class Local {\n" + 
		"                        void foo() {\n" + 
		"                        }\n" + 
		"                }\n" + 
		"                {\n" + 
		"                        class Local {\n" + 
		"                               Local(int i) {\n" + 
		"                                       this.init(i);\n" + 
		"                                       this.bar();\n" + 
		"                               }\n" + 
		"				 				void init(int i) {}\n" +
		"                        		void bar() {\n" + 
		"                        		}\n" + 
		"                        }\n" + 
		"                        Local l = new Local(0);\n" + 
		"                }\n" + 
		"                Local l = new Local();\n" + 
		"                l.foo();\n" + 
		"        }\n" + 
		"}");
	
	this.workingCopies[1] = getWorkingCopy(
		"/Resolve/src/test/TestString.java",
		"package test;"+
		"public class TestString {\n" + 
		"	public int bar() {\n" + 
		"		return 0;\n" + 
		"	}\n" + 
		"}");

	String str = this.workingCopies[0].getSource();
	int start = str.lastIndexOf("foo");
	int length = "foo".length();
	IJavaScriptElement[] elements =  this.workingCopies[0].codeSelect(start, length, this.wcOwner);
	
	assertElementsEqual(
			"Unexpected elements",
			"foo() [in Local [in foo() [in Test [in [Working copy] Test.java [in test [in src [in Resolve]]]]]]]",
			elements
		);
}

/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=57414
 */
public void testEndOfFile() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveEndOfFile.js");
	IJavaScriptElement[] elements = codeSelectAt(cu, "zzz");
	assertElementsEqual(
			"Unexpected elements",
			"",
			elements
	);
}


/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=65259
 */
public void testDuplicateMethodDeclaration() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveDuplicateMethodDeclaration.js");
	
	String str = cu.getSource();
	int start = str.indexOf("foo");
	int length = "foo".length();
	IJavaScriptElement[] elements =  cu.codeSelect(start, length);
	
	assertElementsEqual(
			"Unexpected elements",
			"foo() [in ResolveDuplicateMethodDeclaration.js [in <default> [in src [in Resolve]]]]",
			elements
	);
}
/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=65259
 */
public void testDuplicateMethodDeclaration2() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveDuplicateMethodDeclaration.js");
	
	String str = cu.getSource();
	int start = str.lastIndexOf("foo");
	int length = "foo".length();
	IJavaScriptElement[] elements =  cu.codeSelect(start, length);
	
	assertElementsEqual(
			"Unexpected elements",
			"foo()#2 [in ResolveDuplicateMethodDeclaration.js [in <default> [in src [in Resolve]]]]",
			elements
	);
}
public void testDuplicateMethodDeclaration3() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveDuplicateMethodDeclaration3.js");
	
	String str = cu.getSource();
	int start = str.indexOf("foo");
	int length = "foo".length();
	IJavaScriptElement[] elements =  cu.codeSelect(start, length);
	
	assertElementsEqual(
			"Unexpected elements",
			"foo(p0) [in ResolveDuplicateMethodDeclaration3.js [in <default> [in src [in Resolve]]]]",
			elements
	);
}
public void testDuplicateMethodDeclaration4() throws JavaScriptModelException {
	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveDuplicateMethodDeclaration3.js");
	
	String str = cu.getSource();
	int start = str.lastIndexOf("foo");
	int length = "foo".length();
	IJavaScriptElement[] elements =  cu.codeSelect(start, length);
	
	assertElementsEqual(
			"Unexpected elements",
			"foo(p0)#2 [in ResolveDuplicateMethodDeclaration3.js [in <default> [in src [in Resolve]]]]",
			elements
	);
}
//public void testDuplicateMethodDeclaration5() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveDuplicateMethodDeclaration5.js");
//	
//	String str = cu.getSource();
//	int start = str.indexOf("foo");
//	int length = "foo".length();
//	IJavaScriptElement[] elements =  cu.codeSelect(start, length);
//	
//	assertElementsEqual(
//			"Unexpected elements",
//			"foo(Zork) [in ResolveDuplicateMethodDeclaration5 [in ResolveDuplicateMethodDeclaration5.js [in <default> [in src [in Resolve]]]]]",
//			elements
//	);
//}
//public void testDuplicateMethodDeclaration6() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveDuplicateMethodDeclaration5.js");
//	
//	String str = cu.getSource();
//	int start = str.lastIndexOf("foo");
//	int length = "foo".length();
//	IJavaScriptElement[] elements =  cu.codeSelect(start, length);
//	
//	assertElementsEqual(
//			"Unexpected elements",
//			"foo(Zork)#2 [in ResolveDuplicateMethodDeclaration5 [in ResolveDuplicateMethodDeclaration5.js [in <default> [in src [in Resolve]]]]]",
//			elements
//	);
//}
//public void testDuplicateMethodDeclaration7() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveDuplicateMethodDeclaration7.js");
//	
//	String str = cu.getSource();
//	int start = str.indexOf("foo");
//	int length = "foo".length();
//	IJavaScriptElement[] elements =  cu.codeSelect(start, length);
//	
//	assertElementsEqual(
//			"Unexpected elements",
//			"foo(Zork) [in Inner [in ResolveDuplicateMethodDeclaration7 [in ResolveDuplicateMethodDeclaration7.js [in <default> [in src [in Resolve]]]]]]",
//			elements
//	);
//}
//public void testDuplicateMethodDeclaration8() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveDuplicateMethodDeclaration7.js");
//	
//	String str = cu.getSource();
//	int start = str.lastIndexOf("foo");
//	int length = "foo".length();
//	IJavaScriptElement[] elements =  cu.codeSelect(start, length);
//	
//	assertElementsEqual(
//			"Unexpected elements",
//			"foo(Zork)#2 [in Inner [in ResolveDuplicateMethodDeclaration7 [in ResolveDuplicateMethodDeclaration7.js [in <default> [in src [in Resolve]]]]]]",
//			elements
//	);
//}
//public void testDuplicateMethodDeclaration9() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveDuplicateMethodDeclaration9.js");
//	
//	String str = cu.getSource();
//	int start = str.indexOf("foo(/*1*/");
//	int length = "foo".length();
//	IJavaScriptElement[] elements =  cu.codeSelect(start, length);
//	
//	assertElementsEqual(
//			"Unexpected elements",
//			"foo(Zork) [in Inner [in ResolveDuplicateMethodDeclaration9 [in ResolveDuplicateMethodDeclaration9.js [in <default> [in src [in Resolve]]]]]]",
//			elements
//	);
//}
//public void testDuplicateMethodDeclaration10() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveDuplicateMethodDeclaration9.js");
//	
//	String str = cu.getSource();
//	int start = str.lastIndexOf("foo(/*1*/");
//	int length = "foo".length();
//	IJavaScriptElement[] elements =  cu.codeSelect(start, length);
//	
//	assertElementsEqual(
//			"Unexpected elements",
//			"foo(Zork)#2 [in Inner [in ResolveDuplicateMethodDeclaration9 [in ResolveDuplicateMethodDeclaration9.js [in <default> [in src [in Resolve]]]]]]",
//			elements
//	);
//}
//public void testDuplicateMethodDeclaration11() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveDuplicateMethodDeclaration11.js");
//	
//	String str = cu.getSource();
//	int start = str.indexOf("foo(/*2*/");
//	int length = "foo".length();
//	IJavaScriptElement[] elements =  cu.codeSelect(start, length);
//	
//	assertElementsEqual(
//			"Unexpected elements",
//			"foo(Zork) [in Inner#2 [in ResolveDuplicateMethodDeclaration11 [in ResolveDuplicateMethodDeclaration11.js [in <default> [in src [in Resolve]]]]]]",
//			elements
//	);
//}
//public void testDuplicateMethodDeclaration12() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveDuplicateMethodDeclaration11.js");
//	
//	String str = cu.getSource();
//	int start = str.lastIndexOf("foo(/*2*/");
//	int length = "foo".length();
//	IJavaScriptElement[] elements =  cu.codeSelect(start, length);
//	
//	assertElementsEqual(
//			"Unexpected elements",
//			"foo(Zork)#2 [in Inner#2 [in ResolveDuplicateMethodDeclaration11 [in ResolveDuplicateMethodDeclaration11.js [in <default> [in src [in Resolve]]]]]]",
//			elements
//	);
//}
public void testDuplicateFieldDeclaration() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveDuplicateFieldDeclaration.js");
//	
//	String str = cu.getSource();
//	int start = str.indexOf("var;/*1*/");
//	int length = "var".length();
//	IJavaScriptElement[] elements =  cu.codeSelect(start, length);
//	
//	assertElementsEqual(
//			"Unexpected elements",
//			"var [in Inner [in ResolveDuplicateFieldDeclaration [in ResolveDuplicateFieldDeclaration.js [in <default> [in src [in Resolve]]]]]]",
//			elements
//	);
	assertTrue("implement",false);
}
public void testDuplicateFieldDeclaration2() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveDuplicateFieldDeclaration.js");
//	
//	String str = cu.getSource();
//	int start = str.lastIndexOf("var;/*1*/");
//	int length = "var".length();
//	IJavaScriptElement[] elements =  cu.codeSelect(start, length);
//	
//	assertElementsEqual(
//			"Unexpected elements",
//			"var#2 [in Inner [in ResolveDuplicateFieldDeclaration [in ResolveDuplicateFieldDeclaration.js [in <default> [in src [in Resolve]]]]]]",
//			elements
//	);
	assertTrue("implement",false);
}
//public void testDuplicateFieldDeclaration3() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveDuplicateFieldDeclaration3.js");
//	
//	String str = cu.getSource();
//	int start = str.indexOf("var;/*2*/");
//	int length = "var".length();
//	IJavaScriptElement[] elements =  cu.codeSelect(start, length);
//	
//	assertElementsEqual(
//			"Unexpected elements",
//			"var [in Inner#2 [in ResolveDuplicateFieldDeclaration3 [in ResolveDuplicateFieldDeclaration3.js [in <default> [in src [in Resolve]]]]]]",
//			elements
//	);
//}
//public void testDuplicateFieldDeclaration4() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveDuplicateFieldDeclaration3.js");
//	
//	String str = cu.getSource();
//	int start = str.lastIndexOf("var;/*2*/");
//	int length = "var".length();
//	IJavaScriptElement[] elements =  cu.codeSelect(start, length);
//	
//	assertElementsEqual(
//			"Unexpected elements",
//			"var#2 [in Inner#2 [in ResolveDuplicateFieldDeclaration3 [in ResolveDuplicateFieldDeclaration3.js [in <default> [in src [in Resolve]]]]]]",
//			elements
//	);
//}
//public void testDuplicateTypeDeclaration() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveDuplicateTypeDeclaration.js");
//	
//	String str = cu.getSource();
//	int start = str.indexOf("Inner");
//	int length = "Inner".length();
//	IJavaScriptElement[] elements =  cu.codeSelect(start, length);
//	
//	assertElementsEqual(
//			"Unexpected elements",
//			"Inner [in ResolveDuplicateTypeDeclaration [in ResolveDuplicateTypeDeclaration.js [in <default> [in src [in Resolve]]]]]",
//			elements
//	);
//}
//public void testDuplicateTypeDeclaration2() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveDuplicateTypeDeclaration.js");
//	
//	String str = cu.getSource();
//	int start = str.lastIndexOf("Inner");
//	int length = "Inner".length();
//	IJavaScriptElement[] elements =  cu.codeSelect(start, length);
//	
//	assertElementsEqual(
//			"Unexpected elements",
//			"Inner#2 [in ResolveDuplicateTypeDeclaration [in ResolveDuplicateTypeDeclaration.js [in <default> [in src [in Resolve]]]]]",
//			elements
//	);
//}
//public void testDuplicateTypeDeclaration3() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveDuplicateTypeDeclaration3.js");
//	
//	String str = cu.getSource();
//	int start = str.indexOf("Inner2/*1*/");
//	int length = "Inner2".length();
//	IJavaScriptElement[] elements =  cu.codeSelect(start, length);
//	
//	assertElementsEqual(
//			"Unexpected elements",
//			"Inner2 [in Inner [in ResolveDuplicateTypeDeclaration3 [in ResolveDuplicateTypeDeclaration3.js [in <default> [in src [in Resolve]]]]]]",
//			elements
//	);
//}
//public void testDuplicateTypeDeclaration4() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveDuplicateTypeDeclaration3.js");
//	
//	String str = cu.getSource();
//	int start = str.lastIndexOf("Inner2/*1*/");
//	int length = "Inner2".length();
//	IJavaScriptElement[] elements =  cu.codeSelect(start, length);
//	
//	assertElementsEqual(
//			"Unexpected elements",
//			"Inner2#2 [in Inner [in ResolveDuplicateTypeDeclaration3 [in ResolveDuplicateTypeDeclaration3.js [in <default> [in src [in Resolve]]]]]]",
//			elements
//	);
//}
//public void testDuplicateTypeDeclaration5() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveDuplicateTypeDeclaration5.js");
//	
//	String str = cu.getSource();
//	int start = str.indexOf("Inner2/*2*/");
//	int length = "Inner2".length();
//	IJavaScriptElement[] elements =  cu.codeSelect(start, length);
//	
//	assertElementsEqual(
//			"Unexpected elements",
//			"Inner2 [in Inner#2 [in ResolveDuplicateTypeDeclaration5 [in ResolveDuplicateTypeDeclaration5.js [in <default> [in src [in Resolve]]]]]]",
//			elements
//	);
//}
//public void testDuplicateTypeDeclaration6() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveDuplicateTypeDeclaration5.js");
//	
//	String str = cu.getSource();
//	int start = str.lastIndexOf("Inner2/*2*/");
//	int length = "Inner2".length();
//	IJavaScriptElement[] elements =  cu.codeSelect(start, length);
//	
//	assertElementsEqual(
//			"Unexpected elements",
//			"Inner2#2 [in Inner#2 [in ResolveDuplicateTypeDeclaration5 [in ResolveDuplicateTypeDeclaration5.js [in <default> [in src [in Resolve]]]]]]",
//			elements
//	);
//}
//public void testArrayParameterInsideParent1() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveArrayParameterInsideParent1.js");
//	
//	String str = cu.getSource();
//	int start = str.lastIndexOf("var");
//	int length = "var".length();
//	IJavaScriptElement[] elements =  cu.codeSelect(start, length);
//	
//	assertElementsEqual(
//			"Unexpected elements",
//			"var [in test(int[]) [in ResolveArrayParameterInsideParent1 [in ResolveArrayParameterInsideParent1.js [in <default> [in src [in Resolve]]]]]]",
//			elements
//	);
//}
//public void testDeepLocalVariable() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveDeepLocalVariable.js");
//	
//	String str = cu.getSource();
//	int start = str.lastIndexOf("foo");
//	int length = "foo".length();
//	IJavaScriptElement[] elements =  cu.codeSelect(start, length);
//	
//	assertElementsEqual(
//			"Unexpected elements",
//			"foo [in D9() [in D9 [in D8 [in D7 [in D6 [in D5 [in D4 [in D3 [in D2 [in D1 [in ResolveDeepLocalVariable [in ResolveDeepLocalVariable.js [in <default> [in src [in Resolve]]]]]]]]]]]]]]]",
//			elements
//	);
//}
/*
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=68710
 */
public void testLocalVariable() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveLocalVariable.js");
//	IJavaScriptElement[] elements = codeSelect(cu, "var =", "var");
//	assertElementsEqual(
//		"Unexpected elements",
//		"var [in toto() [in <anonymous #2> [in foo2() [in ResolveLocalVariable [in ResolveLocalVariable.js [in <default> [in src [in Resolve]]]]]]]]",
//		elements
//	);
	assertTrue("implement",false);

}
///*
// * https://bugs.eclipse.org/bugs/show_bug.cgi?id=78931
// */
//public void testQualifiedName1() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveQualifiedName1.js");
//	
//	IJavaScriptElement[] elements = codeSelect(cu, "pp.qq.XX.YY.ZZ", "pp.qq.XX.YY.ZZ");
//	
//	assertElementsEqual(
//		"Unexpected elements",
//		"ZZ [in YY [in XX [in XX.js [in pp.qq [in src [in Resolve]]]]]]",
//		elements
//	);
//}
///*
// * https://bugs.eclipse.org/bugs/show_bug.cgi?id=78931
// */
//public void testQualifiedName2() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveQualifiedName2.js");
//	
//	IJavaScriptElement[] elements = codeSelect(cu, "qq.XX.YY.ZZ", "qq.XX.YY.ZZ");
//	
//	assertElementsEqual(
//		"Unexpected elements",
//		"ZZ [in YY [in XX [in XX.js [in pp.qq [in src [in Resolve]]]]]]",
//		elements
//	);
//}
///*
// * https://bugs.eclipse.org/bugs/show_bug.cgi?id=78931
// */
//public void testQualifiedName3() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveQualifiedName3.js");
//	
//	IJavaScriptElement[] elements = codeSelect(cu, "XX.YY.ZZ", "XX.YY.ZZ");
//	
//	assertElementsEqual(
//		"Unexpected elements",
//		"ZZ [in YY [in XX [in XX.js [in pp.qq [in src [in Resolve]]]]]]",
//		elements
//	);
//}
///*
// * https://bugs.eclipse.org/bugs/show_bug.cgi?id=78931
// */
//public void testQualifiedName4() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveQualifiedName4.js");
//	
//	IJavaScriptElement[] elements = codeSelect(cu, "YY.ZZ", "YY.ZZ");
//	
//	assertElementsEqual(
//		"Unexpected elements",
//		"ZZ [in YY [in XX [in XX.js [in pp.qq [in src [in Resolve]]]]]]",
//		elements
//	);
//}
///*
// * https://bugs.eclipse.org/bugs/show_bug.cgi?id=78931
// */
//public void testQualifiedName5() throws JavaScriptModelException {
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "", "ResolveQualifiedName5.js");
//	
//	IJavaScriptElement[] elements = codeSelect(cu, "YY.ZZ", "YY.ZZ");
//	
//	assertElementsEqual(
//		"Unexpected elements",
//		"ZZ [in YY [in XX [in ResolveQualifiedName5 [in ResolveQualifiedName5.js [in <default> [in src [in Resolve]]]]]]]",
//		elements
//	);
//}
////https://bugs.eclipse.org/bugs/show_bug.cgi?id=84001
//public void testTypeInsideConstructor() throws JavaScriptModelException {
//	IJavaScriptUnit imported = null;
//	try {
//		imported = getWorkingCopy(
//				"/Resolve/src/test/AType.js",
//				"public class AType {\n" +
//				"	public class Sub {\n" +
//				"	}\n" +
//				"}\n");
//
//		IJavaScriptElement[] elements = select(
//				"/Resolve/src/test/Test.js",
//				"public class Test<\n" +
//				"	void foo() {\n" +
//				"	  new Test.Sub();\n" +
//				"	}\n" +
//				"}\n",
//				"Test");
//		
//		assertElementsEqual(
//			"Unexpected elements",
//			"Test [in [Working copy] Test.js [in test [in src [in Resolve]]]]",
//			elements
//		);
//	} finally {
//		if(imported != null) {
//			imported.discardWorkingCopy();
//		}
//	}
//}
////https://bugs.eclipse.org/bugs/show_bug.cgi?id=79309
//public void testMemberTypeInImport() throws JavaScriptModelException {
//	IJavaScriptUnit imported = null;
//	try {
//		imported = getWorkingCopy(
//				"/Resolve/src/test/AType.js",
//				"public class AType {\n" +
//				"	public class Sub {\n" +
//				"	}\n" +
//				"}\n");
//
//		IJavaScriptElement[] elements = select(
//				"/Resolve/src/test/Test.js",
//				"import test.AType.Sub;\n" +
//				"public class Test\n" +
//				"}\n",
//				"Sub");
//		
//		assertElementsEqual(
//			"Unexpected elements",
//			"Sub [in AType [in [Working copy] AType.js [in test [in src [in Resolve]]]]]",
//			elements
//		);
//	} finally {
//		if(imported != null) {
//			imported.discardWorkingCopy();
//		}
//	}
//}
////https://bugs.eclipse.org/bugs/show_bug.cgi?id=99901
//public void testSingleNameInImport() throws JavaScriptModelException {
//	IJavaScriptUnit aType = null;
//	try {
//		aType = getWorkingCopy(
//				"/Resolve/src/zzz/AType.js",
//				"package zzz;\n" +
//				"public class AType {\n" +
//				"}\n");
//
//		IJavaScriptElement[] elements = select(
//				"/Resolve/src/test/Test.js",
//				"package test;\n" +
//				"import zzz.*;\n" +
//				"public class Test\n" +
//				"}\n",
//				"zzz");
//		
//		assertElementsEqual(
//			"Unexpected elements",
//			"zzz [in src [in Resolve]]",
//			elements
//		);
//	} finally {
//		if(aType != null) {
//			aType.discardWorkingCopy();
//		}
//	}
//}
///**
// * Bug 120350: [model] Secondary type not found by code resolve
// * @throws JavaScriptModelException
// */
//public void testSecondaryTypes() throws JavaScriptModelException {
//	waitUntilIndexesReady();
//	IJavaScriptUnit cu = getCompilationUnit("Resolve", "src", "b120350", "X.js");
//	String str = cu.getSource();
//	int start = str.indexOf("Secondary");
//	int length = "Secondary".length();
//	IJavaScriptElement[] elements = cu.codeSelect(start, length);
//	assertElementsEqual(
//		"Unexpected elements",
//		"Secondary [in Test.js [in b120350 [in src [in Resolve]]]]",
//		elements
//	);
//}
}
