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

import junit.framework.Test;

public class StaticImportTest extends AbstractComparableTest {

	// Static initializer to specify tests subset using TESTS_* static variables
	// All specified tests which do not belong to the class are skipped...
	static {
//		TESTS_NAMES = new String[] { "test036" };
//		TESTS_NUMBERS = new int[] { 46 };
//		TESTS_RANGE = new int[] { 169, 180 };
	}
	
	public StaticImportTest(String name) {
		super(name);
	}

	public static Test suite() {
		return buildComparableTestSuite(testClass());
	}
	
	public static Class testClass() {
		return StaticImportTest.class;
	}


	public void test001() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import static java.lang.Math.*;\n" +
				"import static java.lang.Math.PI;\n" +
				"public class X { double pi = abs(PI); }\n",
			},
			"");
	}

	public void test002() {
		this.runConformTest(
			new String[] {
				"p/X.java",
				"package p;\n" +
				"import static p2.Y.*;\n" +
				"import static p2.Z.Zint;\n" +
				"import static p2.Z.ZMember;\n" +
				"public class X {\n" +
				"	int x = y(1);\n" +
				"	int y = Yint;\n" +
				"	int z = Zint;\n" +
				"	void m1(YMember m) {}\n" +
				"	void m2(ZMember m) {}\n" +
				"}\n",
				"p2/Y.java",
				"package p2;\n" +
				"public class Y {\n" +
				"	public static int Yint = 1;\n" +
				"	public static int y(int y) { return y; }\n" +
				"	public static class YMember {}\n" +
				"}\n",
				"p2/Z.java",
				"package p2;\n" +
				"public class Z {\n" +
				"	public static int Zint = 1;\n" +
				"	public static class ZMember {}\n" +
				"}\n",
			},
			"");
	}

	public void test003() { // test inheritance
		this.runConformTest(
			new String[] {
				"p/X.java",
				"package p;\n" +
				"import static p2.Y.*;\n" +
				"import static p2.Z.Zint;\n" +
				"import static p2.Z.ZMember;\n" +
				"public class X {\n" +
				"	int x = y(1);\n" +
				"	int y = Yint;\n" +
				"	int z = Zint;\n" +
				"	void m1(YMember m) {}\n" +
				"	void m2(ZMember m) {}\n" +
				"}\n",
				"p2/YY.java",
				"package p2;\n" +
				"public class YY {\n" +
				"	public static int Yint = 1;\n" +
				"	public static int y(int y) { return y; }\n" +
				"	public static class YMember {}\n" +
				"}\n",
				"p2/Y.java",
				"package p2;\n" +
				"public class Y extends YY {}\n",
				"p2/ZZ.java",
				"package p2;\n" +
				"public class ZZ {\n" +
				"	public static int Zint = 1;\n" +
				"	public static class ZMember {}\n" +
				"}\n",
				"p2/Z.java",
				"package p2;\n" +
				"public class Z extends ZZ {}\n",
			},
			"");
		this.runConformTest(
			new String[] {
				"X.java",
				"import static p.A.C;\n" + 
				"public class X { int i = C; }\n",
				"p/A.java",
				"package p;\n" + 
				"public class A extends B implements I {}\n" +
				"class B implements I {}\n",
				"p/I.java",
				"package p;\n" + 
				"public interface I { public static int C = 1; }\n"
			},
			""
		);
		this.runConformTest(
			new String[] {
				"X.java",
				"import static p.A.C;\n" + 
				"public class X { \n" +
				"	int i = C; \n" +
				"	int j = p.A.C; \n" +
				"}\n",
				"p/A.java",
				"package p;\n" + 
				"public class A implements I {}\n" +
				"interface I { public static int C = 1; }\n"
			},
			"");
	}

	public void test004() { // test static vs. instance
		this.runNegativeTest(
			new String[] {
				"p/X.java",
				"package p;\n" +
				"import static p2.Y.*;\n" +
				"import static p2.Z.Zint;\n" +
				"import static p2.Z.ZMember;\n" +
				"public class X {\n" +
				"	int x = y(1);\n" +
				"	int y = Yint;\n" +
				"	int z = Zint;\n" +
				"	void m1(YMember m) {}\n" +
				"	void m2(ZMember m) {}\n" +
				"}\n",
				"p2/Y.java",
				"package p2;\n" +
				"public class Y {\n" +
				"	public int Yint = 1;\n" +
				"	public int y(int y) { return y; }\n" +
				"	public class YMember {}\n" +
				"}\n",
				"p2/Z.java",
				"package p2;\n" +
				"public class Z {\n" +
				"	public int Zint = 1;\n" +
				"	public class ZMember {}\n" +
				"}\n",
			},
			"----------\n" + 
			"1. ERROR in p\\X.java (at line 3)\n" + 
			"	import static p2.Z.Zint;\n" + 
			"	              ^^^^^^^^^\n" + 
			"The import p2.Z.Zint cannot be resolved\n" + 
			"----------\n" + 
			"2. ERROR in p\\X.java (at line 4)\n" + 
			"	import static p2.Z.ZMember;\n" + 
			"	              ^^^^^^^^^^^^\n" + 
			"The import p2.Z.ZMember cannot be resolved\n" + 
			"----------\n" + 
			"3. ERROR in p\\X.java (at line 6)\n" + 
			"	int x = y(1);\n" + 
			"	        ^\n" + 
			"The method y(int) is undefined for the type X\n" + 
			"----------\n" + 
			"4. ERROR in p\\X.java (at line 7)\n" + 
			"	int y = Yint;\n" + 
			"	        ^^^^\n" + 
			"Yint cannot be resolved\n" + 
			"----------\n" + 
			"5. ERROR in p\\X.java (at line 8)\n" + 
			"	int z = Zint;\n" + 
			"	        ^^^^\n" + 
			"Zint cannot be resolved\n" + 
			"----------\n" + 
			"6. ERROR in p\\X.java (at line 9)\n" + 
			"	void m1(YMember m) {}\n" + 
			"	        ^^^^^^^\n" + 
			"YMember cannot be resolved to a type\n" + 
			"----------\n" + 
			"7. ERROR in p\\X.java (at line 10)\n" + 
			"	void m2(ZMember m) {}\n" + 
			"	        ^^^^^^^\n" + 
			"ZMember cannot be resolved to a type\n" + 
			"----------\n");
	}

	public void test005() { // test visibility
		this.runNegativeTest(
			new String[] {
				"p/X.java",
				"package p;\n" +
				"import static p2.Y.*;\n" +
				"import static p2.Z.Zint;\n" +
				"import static p2.Z.ZMember;\n" +
				"public class X {\n" +
				"	int x = y(1);\n" +
				"	int y = Yint;\n" +
				"	int z = Zint;\n" +
				"	void m1(YMember m) {}\n" +
				"	void m2(ZMember m) {}\n" +
				"}\n",
				"p2/Y.java",
				"package p2;\n" +
				"public class Y {\n" +
				"	static int Yint = 1;\n" +
				"	static int y(int y) { return y; }\n" +
				"	static class YMember {}\n" +
				"}\n",
				"p2/Z.java",
				"package p2;\n" +
				"public class Z {\n" +
				"	static int Zint = 1;\n" +
				"	static class ZMember {}\n" +
				"}\n",
			},
		"----------\n" + 
		"1. ERROR in p\\X.java (at line 3)\n" + 
		"	import static p2.Z.Zint;\n" + 
		"	              ^^^^^^^^^\n" + 
		"The field Z.p2.Z.Zint is not visible\n" + 
		"----------\n" + 
		"2. ERROR in p\\X.java (at line 4)\n" + 
		"	import static p2.Z.ZMember;\n" + 
		"	              ^^^^^^^^^^^^\n" + 
		"The type p2.Z.ZMember is not visible\n" + 
		"----------\n" + 
		"3. ERROR in p\\X.java (at line 6)\n" + 
		"	int x = y(1);\n" + 
		"	        ^\n" + 
		"The method y(int) from the type Y is not visible\n" + 
		"----------\n" + 
		"4. ERROR in p\\X.java (at line 7)\n" + 
		"	int y = Yint;\n" + 
		"	        ^^^^\n" + 
		"The field Y.Yint is not visible\n" + 
		"----------\n" + 
		"5. ERROR in p\\X.java (at line 8)\n" + 
		"	int z = Zint;\n" + 
		"	        ^^^^\n" + 
		"Zint cannot be resolved\n" + 
		"----------\n" + 
		"6. ERROR in p\\X.java (at line 9)\n" + 
		"	void m1(YMember m) {}\n" + 
		"	        ^^^^^^^\n" + 
		"The type YMember is not visible\n" + 
		"----------\n" + 
		"7. ERROR in p\\X.java (at line 10)\n" + 
		"	void m2(ZMember m) {}\n" + 
		"	        ^^^^^^^\n" + 
		"ZMember cannot be resolved to a type\n" + 
		"----------\n");
	}

	public void test006() { // test non static member types
		this.runNegativeTest(
			new String[] {
				"p/X.java",
				"package p;\n" +
				"import static p2.Z.ZStatic;\n" +
				"import static p2.Z.ZNonStatic;\n" +
				"import p2.Z.ZNonStatic;\n" +
				"public class X {\n" +
				"	void m2(ZStatic m) {}\n" +
				"	void m3(ZNonStatic m) {}\n" +
				"}\n",
				"p2/Z.java",
				"package p2;\n" +
				"public class Z {\n" +
				"	public static class ZStatic {}\n" +
				"	public class ZNonStatic {}\n" +
				"}\n",
			},
			"----------\n" + 
			"1. ERROR in p\\X.java (at line 3)\n" + 
			"	import static p2.Z.ZNonStatic;\n" + 
			"	              ^^^^^^^^^^^^^^^\n" + 
			"The import p2.Z.ZNonStatic cannot be resolved\n" + 
			"----------\n");
	}

	public void test007() { // test non static member types vs. static field
		this.runConformTest(
			new String[] {
				"p/X.java",
				"package p;\n" +
				"import static p2.Z.ZFieldOverMember;\n" +
				"public class X {\n" +
				"	int z = ZFieldOverMember;\n" +
				"}\n",
				"p2/Z.java",
				"package p2;\n" +
				"public class Z {\n" +
				"	public static int ZFieldOverMember = 1;\n" +
				"	public class ZFieldOverMember {}\n" +
				"}\n",
			},
			"");
	}

	public void test008() { // test static top level types
		this.runNegativeTest(
			new String[] {
				"p/X.java",
				"package p;\n" +
				"import static java.lang.System;\n" +
				"public class X {}\n",
			},
			"----------\n" + 
			"1. ERROR in p\\X.java (at line 2)\n" + 
			"	import static java.lang.System;\n" + 
			"	              ^^^^^^^^^^^^^^^^\n" + 
			"The static import java.lang.System must be a field or member type\n" + 
			"----------\n");
	}

	public void test009() { // test static top level types
		this.runNegativeTest(
			new String[] {
				"p/X.java",
				"package p;\n" +
				"import static java.lang.reflect.Method.*;\n" +
				"public class X {Method m;}\n",
			},
			"----------\n" + 
			"1. ERROR in p\\X.java (at line 3)\n" + 
			"	public class X {Method m;}\n" + 
			"	                ^^^^^^\n" + 
			"Method cannot be resolved to a type\n" + 
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=76174
	public void test010() { 
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import static java.lang.System.*;\n" +
				"public class X {\n" +
				"	void foo() { arraycopy(); }\n" +
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 3)\n" + 
			"	void foo() { arraycopy(); }\n" + 
			"	             ^^^^^^^^^\n" + 
			"The method arraycopy(Object, int, Object, int, int) in the type System is not applicable for the arguments ()\n" + 
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=76360
	public void test011() { 
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import static p.Y.*;\n" +
				"public class X extends p.Z {}\n" +
				"class XX extends M.N {}\n" +
				"class XXX extends M.Missing {}\n",
				"p/YY.java",
				"package p;\n" +
				"public class YY {\n" +
				"	public static class M {\n" +
				"		public static class N {}\n" +
				"	}\n" +
				"}\n",
				"p/Y.java",
				"package p;\n" +
				"public class Y extends YY {}\n",
				"p/Z.java",
				"package p;\n" +
				"public class Z {}\n"
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 4)\n" + 
			"	class XXX extends M.Missing {}\n" + 
			"	                  ^^^^^^^^^\n" + 
			"M.Missing cannot be resolved to a type\n" + 
			"----------\n");
	}

	public void test012() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import static java.lang.Math.*;\n" +
				"public class X {\n" +
				"	public static void main(String[] s) {\n" +
				"		System.out.println(max(1, 2));\n" +
				"	}\n" +
				"}\n",
			},
			"2");
		this.runConformTest(
			new String[] {
				"X.java",
				"import static java.lang.Math.max;\n" +
				"public class X {\n" +
				"	public static void main(String[] s) {\n" +
				"		System.out.println(max(1, 3));\n" +
				"	}\n" +
				"}\n",
			},
			"3");
		this.runConformTest(
			new String[] {
				"X.java",
				"import static p1.C.F;\n" +
				"import p2.*;\n" +
				"public class X implements F {" +
				"	int i = F();" +
				"}\n",
				"p1/C.java",
				"package p1;\n" +
				"public class C {\n" +
				"	public static int F() { return 0; }\n" +
				"}\n",
				"p2/F.java",
				"package p2;\n" +
				"public interface F {}\n"
			},
			""
		);
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=77955
	public void test013() { 
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import static p.Y.ZZ;\n" + // found if ZZ is static
				"import static p.Z.ZZ.WW;\n" + // found if WW is static
				"import static p.Z.Zz.WW;\n" + // found if WW is static
				"import static p.Z.Zz.*;\n" + // legal
				"import static p.Z.Zz.Zzz;\n" + // legal

				"import static p.Y.Zz;\n" + // Zz is not static
				"import static p.Z.Zz.WW.*;\n" + // import requires canonical name for p.W.WW

				"import p.Y.ZZ;\n" + // import requires canonical name for p.Z.ZZ
				"import static p.Y.ZZ.*;\n" + // import requires canonical name for p.Z.ZZ
				"import static p.Y.ZZ.WW;\n" + // import requires canonical name for p.Z.ZZ
				"import static p.Y.ZZ.WW.*;\n" + // import requires canonical name for p.W.WW
				"import static p.Y.ZZ.ZZZ;\n" + // import requires canonical name for p.Z.ZZ
				"import static p.Y.ZZ.WW.WWW;\n" + // import requires canonical name for p.W.WW
				"public class X {\n" +
				"	int i = Zzz + Zzzz;\n" +
				"	ZZ z;\n" +
				"	WW w;\n" +
				"}\n",
				"p/Y.java",
				"package p;\n" +
				"public class Y extends Z {}\n",
				"p/Z.java",
				"package p;\n" +
				"public class Z {\n" +
				"	public class Zz extends W { public static final int Zzz = 0; public static final int Zzzz = 1; }\n" +
				"	public static class ZZ extends W { public static final int ZZZ = 0; }\n" +
				"}\n",
				"p/W.java",
				"package p;\n" +
				"public class W {\n" +
				"	public static class WW { public static final int WWW = 0; }\n" +
				"}\n",
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 6)\r\n" + 
			"	import static p.Y.Zz;\r\n" + 
			"	              ^^^^^^\n" + 
			"The import p.Y.Zz cannot be resolved\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 7)\r\n" + 
			"	import static p.Z.Zz.WW.*;\r\n" + 
			"	              ^^^^^^^^^\n" + 
			"The import p.Z.Zz.WW cannot be resolved\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 8)\r\n" + 
			"	import p.Y.ZZ;\r\n" + 
			"	       ^^^^^^\n" + 
			"The import p.Y.ZZ cannot be resolved\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 9)\r\n" + 
			"	import static p.Y.ZZ.*;\r\n" + 
			"	              ^^^^^^\n" + 
			"The import p.Y.ZZ cannot be resolved\n" + 
			"----------\n" + 
			"5. ERROR in X.java (at line 10)\r\n" + 
			"	import static p.Y.ZZ.WW;\r\n" + 
			"	              ^^^^^^\n" + 
			"The import p.Y.ZZ cannot be resolved\n" + 
			"----------\n" + 
			"6. ERROR in X.java (at line 11)\r\n" + 
			"	import static p.Y.ZZ.WW.*;\r\n" + 
			"	              ^^^^^^\n" + 
			"The import p.Y.ZZ cannot be resolved\n" + 
			"----------\n" + 
			"7. ERROR in X.java (at line 12)\r\n" + 
			"	import static p.Y.ZZ.ZZZ;\r\n" + 
			"	              ^^^^^^\n" + 
			"The import p.Y.ZZ cannot be resolved\n" + 
			"----------\n" + 
			"8. ERROR in X.java (at line 13)\r\n" + 
			"	import static p.Y.ZZ.WW.WWW;\r\n" + 
			"	              ^^^^^^\n" + 
			"The import p.Y.ZZ cannot be resolved\n" + 
			"----------\n"
		);
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=78056
	public void test014() { 
		this.runConformTest(
			new String[] {
				"X.java",
				"import static p.Z.ZZ.ZZZ;\n" +
				"public class X {}\n",
				"p/Z.java",
				"package p;\n" +
				"public class Z {\n" +
				"	public class ZZ { public static final  int ZZZ = 0; }\n" +
				"}\n",
			},
			""
		);
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=78075
	public void test015() { 
		this.runConformTest(
			new String[] {
				"X.java",
				"import p.Z.*;\n" +
				"import static p.Z.*;\n" +
				"public class X { int i = COUNT; }\n",
				"p/Z.java",
				"package p;\n" +
				"public class Z {\n" +
				"	public static final  int COUNT = 0;\n" +
				"}\n",
			},
			""
		);
		this.runConformTest(
			new String[] {
				"X.java",
				"import static p.Z.*;\n" +
				"import p.Z.*;\n" +
				"public class X { int i = COUNT; }\n",
				"p/Z.java",
				"package p;\n" +
				"public class Z {\n" +
				"	public static final  int COUNT = 0;\n" +
				"}\n",
			},
			""
		);
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=77630
	public void test016() { 
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import static java.lang.*;\n" +
				"public class X {}\n"
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 1)\r\n" + 
			"	import static java.lang.*;\r\n" + 
			"	              ^^^^^^^^^\n" + 
			"Only a type can be imported. java.lang resolves to a package\n" + 
			"----------\n"
		);
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=81724
	public void test017() {
		this.runConformTest(
			new String[] {
				"bug/A.java",
				"package bug;\n" +
				"import static bug.C.*;\n" +
				"public class A {\n" +
				"   private B b;\n" +
				"}\n",
				"bug/B.java",
				"package bug;\n" +
				"import static bug.C.*;\n" +
				"public class B {\n" +
				"}\n",
				"bug/C.java",
				"package bug;\n" +
				"public class C {\n" +
				"   private B b;\n" +
				"}\n",
			},
			""
		);
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=81724 - variation
	public void test018() {
		this.runNegativeTest(
			new String[] {
				"bug/A.java",
				"package bug;\n" +
				"import static bug.C.*;\n" +
				"public class A {\n" +
				"   private B b2 = b;\n" +
				"}\n",
				"bug/B.java",
				"package bug;\n" +
				"import static bug.C.*;\n" +
				"public class B {\n" +
				"}\n",
				"bug/C.java",
				"package bug;\n" +
				"public class C {\n" +
				"   private static B b;\n" +
				"}\n",
			},
			"----------\n" + 
			"1. ERROR in bug\\A.java (at line 4)\n" + 
			"	private B b2 = b;\n" + 
			"	               ^\n" + 
			"The field C.b is not visible\n" + 
			"----------\n" + 
			"----------\n" + 
			"1. WARNING in bug\\B.java (at line 2)\n" + 
			"	import static bug.C.*;\n" + 
			"	              ^^^^^\n" + 
			"The import bug.C is never used\n" + 
			"----------\n" + 
			"----------\n" + 
			"1. WARNING in bug\\C.java (at line 3)\n" + 
			"	private static B b;\n" + 
			"	                 ^\n" + 
			"The field C.b is never read locally\n" + 
			"----------\n");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=81718
	public void test019() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import static java.lang.Math.PI;\n" + 
				"\n" + 
				"public class X {\n" + 
				"  boolean PI;\n" + 
				"  Zork z;\n" +
				"}\n",
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 5)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=82754
	public void test020() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import static java.lang.Math.round;\n" + 
				"public class X {\n" + 
				"  void foo() { cos(0); }\n" +
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 3)\n" + 
			"	void foo() { cos(0); }\n" + 
			"	             ^^^\n" + 
			"The method cos(int) is undefined for the type X\n" + 
			"----------\n"	);
	}

	public void test021() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import static p.B.foo;\n" + 
				"public class X {\n" + 
				"  void test() { foo(); }\n" +
				"}\n",
				"p/A.java",
				"package p;\n" + 
				"public class A { public static void foo() {} }\n",
				"p/B.java",
				"package p;\n" + 
				"public class B extends A { }\n"
			},
			""
		);
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import static p.B.foo;\n" + 
				"public class X {\n" + 
				"  void test() { foo(); }\n" +
				"}\n",
				"p/A.java",
				"package p;\n" + 
				"public class A { public void foo() {} }\n",
				"p/B.java",
				"package p;\n" + 
				"public class B extends A { static void foo(int i) {} }\n"
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 1)\n" + 
			"	import static p.B.foo;\n" + 
			"	              ^^^^^^^\n" + 
			"The import p.B.foo cannot be resolved\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 3)\n" + 
			"	void test() { foo(); }\n" + 
			"	              ^^^\n" + 
			"The method foo() is undefined for the type X\n" + 
			"----------\n"
		);
	}

	public void test022() { // test field/method collisions
		this.runConformTest(
			new String[] {
				"X.java",
				"import static p.A.F;\n" + 
				"import static p.B.F;\n" + 
				"public class X {\n" + 
				"	int i = F;\n" +
				"}\n",
				"p/A.java",
				"package p;\n" + 
				"public class A { public static class F {} }\n",
				"p/B.java",
				"package p;\n" + 
				"public class B { public static int F = 2; }\n",
			},
			""
			// no collision between field and member type
		);
		this.runConformTest(
			new String[] {
				"X.java",
				"import static p.A.F;\n" + 
				"import static p.B.F;\n" + 
				"public class X {\n" + 
				"	int i = F + F();\n" +
				"}\n",
				"p/A.java",
				"package p;\n" + 
				"public class A { public static int F() { return 1; } }\n",
				"p/B.java",
				"package p;\n" + 
				"public class B { public static int F = 2; }\n",
			},
			""
			// no collision between field and method
		);
		this.runConformTest(
			new String[] {
				"X.java",
				"import static p.A.F;\n" + 
				"import static p.B.F;\n" + 
				"public class X {\n" + 
				"	int i = F;\n" +
				"}\n",
				"p/A.java",
				"package p;\n" + 
				"public class A { public static int F = 1; }\n",
				"p/B.java",
				"package p;\n" + 
				"public class B extends A {}\n",
			},
			""
			// no collision between 2 fields that are the same
		);
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import static p.A.F;\n" + 
				"import static p.B.F;\n" + 
				"public class X {\n" + 
				"	int i = F;\n" +
				"}\n",
				"p/A.java",
				"package p;\n" + 
				"public class A { public static int F = 1; }\n",
				"p/B.java",
				"package p;\n" + 
				"public class B { public static int F = 2; }\n",
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 2)\n" + 
			"	import static p.B.F;\n" + 
			"	              ^^^^^\n" + 
			"The import p.B.F collides with another import statement\n" + 
			"----------\n"
			// F is already defined in a single-type import
		);
	}

	public void test023() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import static p.A.C;\n" + 
				"public class X {\n" + 
				"	public static void main(String[] args) {\n" +
				"		System.out.print(C);\n" +
				"		System.out.print(C());\n" +
				"	}\n" +
				"}\n",
				"p/A.java",
				"package p;\n" + 
				"public class A {\n" +
				"	public static int C = 1;\n" +
				"	public static int C() { return C + 3; }\n" +
				"}\n"
			},
			"14"
		);
		this.runConformTest( // extra inheritance hiccup for method lookup
			new String[] {
				"X.java",
				"import static p.A.C;\n" + 
				"public class X {\n" + 
				"	public static void main(String[] args) {\n" +
				"		System.out.print(C);\n" +
				"		System.out.print(C());\n" +
				"	}\n" +
				"}\n",
				"p/A.java",
				"package p;\n" + 
				"public class A extends B {\n" +
				"	public static int C() { return C + 3; }\n" +
				"}\n",
				"p/B.java",
				"package p;\n" + 
				"public class B {\n" +
				"	public static int C = 1;\n" +
				"}\n"
			},
			"14"
		);
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=83376
	public void test024() {
		this.runNegativeTest(
			new String[] {
				"p/B.java",
				"package p;\n" + 
				"import static p.A.m;\n" + 
				"import static p2.C.m;\n" + 
				"class A { static void m() {} }\n" + 
				"public class B { public static void main(String[] args) { m(); } }\n",
				"p2/C.java",
				"package p2;\n" + 
				"public class C { public static void m() {} }\n"
			},
			"----------\n" + 
			"1. ERROR in p\\B.java (at line 5)\r\n" + 
			"	public class B { public static void main(String[] args) { m(); } }\r\n" + 
			"	                                                          ^\n" + 
			"The method m() is ambiguous for the type B\n" + 
			"----------\n"
		);
		this.runConformTest(
			new String[] {
				"p/X.java",
				"package p;\n" + 
				"import static p.A.m;\n" + 
				"import static p.B.m;\n" + 
				"public class X { void test() { m(); } }\n" + 
				"class B extends A {}\n",
				"p/A.java",
				"package p;\n" + 
				"public class A { public static int m() { return 0; } }\n"
			},
			""
		);
	}

	public void test025() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import static java.lang.Math.*;\n" + 
				"public class X {\n" + 
				"	public static void main(String[] s) {\n" + 
				"		System.out.print(max(PI, 4));\n" + 
				"		new Runnable() {\n" + 
				"			public void run() {\n" + 
				"				System.out.println(max(PI, 5));\n" + 
				"			}\n" + 
				"		}.run();\n" + 
				"	}\n" + 
				"}\n"
			},
			"4.05.0"
		);
	}

	public void test026() { // ensure inherited problem fields do not stop package resolution
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X extends Y { static void test() { java.lang.String.valueOf(0); } }\n" + 
				"class Y { private String java; }\n"
			},
			""
		);
	}
	
	public void test027() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import static p.ST.foo;\n" + 
				"public class X {\n" + 
				"	\n" + 
				"	foo bar;\n" + 
				"}\n", 
				"p/ST.java",
				"package p; \n" + 
				"public class ST {\n" + 
				"	public static int foo;\n" + 
				"}\n"	,			
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 4)\n" + 
			"	foo bar;\n" + 
			"	^^^\n" + 
			"foo cannot be resolved to a type\n" + 
			"----------\n");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=87490
	public void test028() {
		this.runConformTest(
			new String[] {
				"p1/Z.java",//====================
				"package p1;\n" + 
				"public class Z {\n" + 
				"	public interface I {\n" + 
				"	}\n" + 
				"}\n",
				"q/Y.java",//====================
				"package q;\n" + 
				"import static p.X.I;\n" + 
				"import static p1.Z.I;\n" + 
				"public class Y implements I {\n" + 
				"}\n",
				"p/X.java",//====================
				"package p;\n" + 
				"public enum X {\n" + 
				"	I, J, K\n" + 
				"}\n"	,			
			},
			"");
		// recompile Y against binaries
		this.runConformTest(
			new String[] {
				"q/Y.java",//====================
				"package q;\n" + 
				"import static p.X.I;\n" + 
				"import static p1.Z.I;\n" + 
				"public class Y implements I {\n" + 
				"}\n",
			},
			"",
			null,
			false,
			null);
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=93913
	public void test029() {
		this.runNegativeTest(
			new String[] {
				"p1/A.java",
				"package p1;\n" + 
				"import static p2.C.B;\n" + 
				"public class A extends B {\n" + 
				"	void test() {" +
				"		int i = B();\n" +
				"		B b = null;\n" +
				"		b.fooB();\n" +
				"		b.fooC();\n" +
				"		fooC();\n" +
				"	}\n" + 
				"}\n",
				"p1/B.java",
				"package p1;\n" + 
				"public class B {\n" + 
				"	public void fooB() {}\n" + 
				"}\n",
				"p2/C.java",
				"package p2;\n" + 
				"public class C {\n" + 
				"	public static class B { public void fooC() {} }\n" + 
				"	public static int B() { return 0; }\n" + 
				"}\n",
			},
			"----------\n" + 
			"1. ERROR in p1\\A.java (at line 6)\n" + 
			"	b.fooB();\n" + 
			"	  ^^^^\n" + 
			"The method fooB() is undefined for the type C.B\n" + 
			"----------\n"
		);
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=94262
	public void test030() {
		this.runNegativeTest(
			new String[] {
				"p2/Test.java",
				"package p2;\n" + 
				"import static p1.A.*;\n" + 
				"public class Test {\n" + 
				"	Inner1 i; // not found\n" + 
				"	Inner2 j;\n" + 
				"}\n",
				"p1/A.java",
				"package p1;\n" + 
				"public class A {\n" + 
				"	public class Inner1 {}\n" +
				"	public static class Inner2 {}\n" + 
				"}\n",
			},
			"----------\n" + 
			"1. ERROR in p2\\Test.java (at line 4)\n" + 
			"	Inner1 i; // not found\n" + 
			"	^^^^^^\n" + 
			"Inner1 cannot be resolved to a type\n" + 
			"----------\n"
		);
		this.runConformTest(
			new String[] {
				"p2/Test.java",
				"package p2;\n" + 
				"import p1.A.*;\n" + 
				"import static p1.A.*;\n" + 
				"import static p1.A.*;\n" + 
				"public class Test {\n" + 
				"	Inner1 i;\n" + 
				"	Inner2 j;\n" + 
				"}\n",
				"p1/A.java",
				"package p1;\n" + 
				"public class A {\n" + 
				"	public class Inner1 {}\n" +
				"	public static class Inner2 {}\n" + 
				"}\n",
			},
			""
		);
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=95909
	public void test031() {
		this.runNegativeTest(
			new String[] {
				"PointRadius.java",
				"import static java.lang.Math.sqrt;\n" + 
				"\n" + 
				"public class PointRadius {\n" + 
				"\n" + 
				"	public static void main(String[] args) {\n" + 
				"		double radius = 0;\n" + 
				"		radius = sqrt(pondArea / Math.PI);\n" + 
				"\n" + 
				"	}\n" + 
				"}\n",
			},
			"----------\n" + 
			"1. ERROR in PointRadius.java (at line 7)\n" + 
			"	radius = sqrt(pondArea / Math.PI);\n" + 
			"	              ^^^^^^^^\n" + 
			"pondArea cannot be resolved\n" + 
			"----------\n");
	}

	//http://bugs.eclipse.org/bugs/show_bug.cgi?id=97809
	public void test032() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import static p.A.*;\n" + 
				"import static p.B.*;\n" + 
				"public class X {\n" + 
				"	public static void main(String[] args) {foo();}\n" + 
				"}\n",
				"p/A.java",
				"package p;" +
				"public class A {\n" + 
				"	public static void foo() {System.out.print(false);}\n" + 
				"}\n",
				"p/B.java",
				"package p;" +
				"public class B extends A {\n" + 
				"	public static void foo() {System.out.print(true);}\n" + 
				"}\n"
			},
			"true");
	}

	//http://bugs.eclipse.org/bugs/show_bug.cgi?id=97809
	public void test032b() {
		this.runNegativeTest(
			new String[] {
				"X2.java",
				"import static p2.A.*;\n" + 
				"import static p2.B.*;\n" + 
				"public class X2 { void test() {foo();} }\n",
				"p2/A.java",
				"package p2;" +
				"public class A {\n" + 
				"	public static void foo() {}\n" + 
				"}\n",
				"p2/B.java",
				"package p2;" +
				"public class B {\n" + 
				"	public static void foo() {}\n" + 
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in X2.java (at line 3)\r\n" + 
			"	public class X2 { void test() {foo();} }\r\n" + 
			"	                               ^^^\n" + 
			"The method foo() is ambiguous for the type X2\n" + 
			"----------\n"
			// reference to foo is ambiguous, both method foo() in p.B and method foo() in p.A match
		);
	}

	//http://bugs.eclipse.org/bugs/show_bug.cgi?id=97809
	public void test032c() {
		this.runConformTest(
			new String[] {
				"X3.java",
				"import static p3.A.*;\n" + 
				"import static p3.B.foo;\n" + 
				"public class X3 {\n" + 
				"	public static void main(String[] args) {foo();}\n" + 
				"}\n",
				"p3/A.java",
				"package p3;" +
				"public class A {\n" + 
				"	public static void foo() {System.out.print(false);}\n" + 
				"}\n",
				"p3/B.java",
				"package p3;" +
				"public class B {\n" + 
				"	public static void foo() {System.out.print(true);}\n" + 
				"}\n"
			},
			"true");
	}

	//http://bugs.eclipse.org/bugs/show_bug.cgi?id=97809
	public void test032d() {
		this.runConformTest(
			new String[] {
				"X4.java",
				"import static p4.A.foo;\n" + 
				"import static p4.B.*;\n" + 
				"public class X4 {\n" + 
				"	public static void main(String[] args) {foo();}\n" + 
				"}\n",
				"p4/A.java",
				"package p4;" +
				"public class A {\n" + 
				"	public static void foo() {System.out.print(true);}\n" + 
				"}\n",
				"p4/B.java",
				"package p4;" +
				"public class B extends A {\n" + 
				"	public static void foo() {System.out.print(false);}\n" + 
				"}\n"
			},
			"true");
	}

	public void test033() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import static p.A.*;\n" + 
				"import static p.B.*;\n" + 
				"public class X {\n" + 
				"	public static void main(String[] args) {foo(\"aa\");}\n" + 
				"}\n",
				"p/A.java",
				"package p;" +
				"public class A {\n" + 
				"	public static <U> void foo(U u) {System.out.print(false);}\n" + 
				"}\n",
				"p/B.java",
				"package p;" +
				"public class B extends A {\n" + 
				"	public static <V> void foo(String s) {System.out.print(true);}\n" + 
				"}\n"
			},
			"true");
	}

	public void test033b() {
		this.runConformTest(
			new String[] {
				"X2.java",
				"import static p2.A.*;\n" + 
				"import static p2.B.*;\n" + 
				"public class X2 {\n" + 
				"	public static void main(String[] args) {foo(\"aa\");}\n" + 
				"}\n",
				"p2/A.java",
				"package p2;" +
				"public class A {\n" + 
				"	public static <U> void foo(String s) {System.out.print(true);}\n" + 
				"}\n",
				"p2/B.java",
				"package p2;" +
				"public class B extends A {\n" + 
				"	public static <V> void foo(V v) {System.out.print(false);}\n" + 
				"}\n"
			},
			"true");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=104198
	public void test034() {
		this.runConformTest(
			new String[] {
				"test/AbstractTest.java",
				"package test;\n" +
				"public abstract class AbstractTest<Z> {\n" + 
				"  \n" + 
				"  public abstract MyEnum m(Z z);\n" + 
				"  \n" + 
				"  public enum MyEnum {\n" + 
				"    A,B\n" + 
				"  }\n" + 
				"}\n",
				"test/X.java",
				"package test;\n" +
				"import static test.AbstractTest.MyEnum.*;\n" +
				"public class X extends AbstractTest<String> {\n" + 
				"  @Override public MyEnum m(String s) {\n" + 
				"    return A;\n" + 
				"  }\n" + 
				"}\n"
			},
			"");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=117861
	public void test035() {
		this.runConformTest(
			new String[] {
				"Bug.java",
				"import static java.lang.String.format;\n" +
				"public class Bug extends p.TestCase {\n" + 
				"	public static void main(String[] args) {\n" + 
				"		String msg = \"test\";\n" + 
				"		System.out.print(format(msg));\n" + 
				"		System.out.print(format(msg, 1, 2));\n" +
				"	}\n" + 
				"}\n",
				"p/TestCase.java",
				"package p;\n" + 
				"public class TestCase {\n" + 
				"	static String format(String message, Object expected, Object actual) {return null;}\n" + 
				"}\n"
			},
			"testtest");
		this.runNegativeTest(
			new String[] {
				"C.java",
				"class A {\n" + 
				"	static class B { void foo(Object o, String s) {} }\n" + 
				"	void foo(int i) {}\n" + 
				"}\n" +
				"class C extends A.B {\n" +
				"	void test() { foo(1); }\n" +
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in C.java (at line 6)\r\n" + 
			"	void test() { foo(1); }\r\n" + 
			"	              ^^^\n" + 
			"The method foo(Object, String) in the type A.B is not applicable for the arguments (int)\n" + 
			"----------\n");
		this.runNegativeTest(
			new String[] {
				"A.java",
				"public class A {\n" + 
				"  void foo(int i, long j) {}\n" + 
				"  class B {\n" + 
				"    void foo() { foo(1, 1); }\n" + 
				"  }\n" + 
				"}",
			}, 
			"----------\n" + 
			"1. ERROR in A.java (at line 4)\n" + 
			"	void foo() { foo(1, 1); }\n" + 
			"	             ^^^\n" + 
			"The method foo() in the type A.B is not applicable for the arguments (int, int)\n" + 
			"----------\n"
		);
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=126564
	public void test036() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import static p.A.CONSTANT_I;\n" + 
				"import static p.A.CONSTANT_B;\n" + 
				"public class X {\n" + 
				"  static int i = p.A.CONSTANT_I;\n" + 
				"  static int j = p.A.CONSTANT_B;\n" + 
				"  static int m = CONSTANT_I;\n" + 
				"  static int n = CONSTANT_B;\n" + 
				"}",
				"p/A.java",
				"package p;\n" + 
				"public class A extends B implements I {}\n" + 
				"interface I { int CONSTANT_I = 1; }\n" + 
				"class B { int CONSTANT_B = 1; }",
			}, 
			"----------\n" + 
			"1. ERROR in X.java (at line 2)\n" + 
			"	import static p.A.CONSTANT_B;\n" + 
			"	              ^^^^^^^^^^^^^^\n" + 
			"The field B.p.A.CONSTANT_B is not visible\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 5)\n" + 
			"	static int j = p.A.CONSTANT_B;\n" + 
			"	                   ^^^^^^^^^^\n" + 
			"The field B.CONSTANT_B is not visible\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 7)\n" + 
			"	static int n = CONSTANT_B;\n" + 
			"	               ^^^^^^^^^^\n" + 
			"CONSTANT_B cannot be resolved\n" + 
			"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=126564 - variation
	public void test037() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import static p.A.CONSTANT_I;\n" + 
				"import static p.A.CONSTANT_B;\n" + 
				"public class X {\n" + 
				"  static int i = p.A.CONSTANT_I;\n" + 
				"  static int j = p.A.CONSTANT_B;\n" + 
				"  static int m = CONSTANT_I;\n" + 
				"  static int n = CONSTANT_B;\n" + 
				"}",
				"p/A.java",
				"package p;\n" + 
				"public class A extends B implements I {}\n" + 
				"interface I { int CONSTANT_I = 1; }\n" + 
				"class B { public static int CONSTANT_B = 1; }",
			}, 
			"");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=126564 - variation
	public void test038() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import static p.A.foo_I;\n" + 
				"import static p.A.foo_B;\n" + 
				"public class X {\n" + 
				"  static int i = p.A.foo_I();\n" + 
				"  static int j = p.A.foo_B();\n" + 
				"  static int m = foo_I();\n" + 
				"  static int n = foo_B();\n" + 
				"}",
				"p/A.java",
				"package p;\n" + 
				"public abstract class A extends B implements I {}\n" + 
				"interface I { int foo_I(); }\n" + 
				"class B { int foo_B() { return 2;} }",
			}, 
			"----------\n" + 
			"1. ERROR in X.java (at line 1)\n" + 
			"	import static p.A.foo_I;\n" + 
			"	              ^^^^^^^^^\n" + 
			"The import p.A.foo_I cannot be resolved\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 2)\n" + 
			"	import static p.A.foo_B;\n" + 
			"	              ^^^^^^^^^\n" + 
			"The import p.A.foo_B cannot be resolved\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 4)\n" + 
			"	static int i = p.A.foo_I();\n" + 
			"	               ^^^^^^^^^^^\n" + 
			"Cannot make a static reference to the non-static method foo_I() from the type I\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 5)\n" + 
			"	static int j = p.A.foo_B();\n" + 
			"	                   ^^^^^\n" + 
			"The method foo_B() from the type B is not visible\n" + 
			"----------\n" + 
			"5. ERROR in X.java (at line 6)\n" + 
			"	static int m = foo_I();\n" + 
			"	               ^^^^^\n" + 
			"The method foo_I() is undefined for the type X\n" + 
			"----------\n" + 
			"6. ERROR in X.java (at line 7)\n" + 
			"	static int n = foo_B();\n" + 
			"	               ^^^^^\n" + 
			"The method foo_B() is undefined for the type X\n" + 
			"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=126564 - variation
	public void test039() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import static p.A.foo_I;\n" + 
				"import static p.A.foo_B;\n" + 
				"public class X {\n" + 
				"  static int i = p.A.foo_I();\n" + 
				"  static int j = p.A.foo_B();\n" + 
				"  static int m = foo_I();\n" + 
				"  static int n = foo_B();\n" + 
				"}",
				"p/A.java",
				"package p;\n" + 
				"public abstract class A extends B implements I {}\n" + 
				"interface I { int foo_I(); }\n" + 
				"class B { public static int foo_B() { return 2;} }",
			}, 
			"----------\n" + 
			"1. ERROR in X.java (at line 1)\r\n" + 
			"	import static p.A.foo_I;\r\n" + 
			"	              ^^^^^^^^^\n" + 
			"The import p.A.foo_I cannot be resolved\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 4)\r\n" + 
			"	static int i = p.A.foo_I();\r\n" + 
			"	               ^^^^^^^^^^^\n" + 
			"Cannot make a static reference to the non-static method foo_I() from the type I\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 6)\r\n" + 
			"	static int m = foo_I();\r\n" + 
			"	               ^^^^^\n" + 
			"The method foo_I() is undefined for the type X\n" + 
			"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=87490 - variation
	public void test040() {
		this.runConformTest(
			new String[] {
				"p1/Z.java",//====================
				"package p1;\n" + 
				"public class Z {\n" + 
				"	public interface I {\n" + 
				"	}\n" + 
				"}\n",
				"q/Y.java",//====================
				"package q;\n" + 
				"import static p.X.foo;\n" + 
				"import static p1.Z.I;\n" + 
				"public class Y implements I {\n" + 
				"}\n",
				"p/X.java",//====================
				"package p;\n" + 
				"public class X {\n" + 
				"	public static void foo() {}\n" + 
				"}\n"	,			
			},
			"");
		// recompile Y against binaries
		this.runConformTest(
			new String[] {
				"q/Y.java",//====================
				"package q;\n" + 
				"import static p.X.foo;\n" + 
				"import static p1.Z.I;\n" + 
				"public class Y implements I {\n" + 
				"}\n",
			},
			"",
			null,
			false,
			null);
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=134118
	public void test041() {
		this.runNegativeTest(
			new String[] {
				"Test.java",
				"import static p.I.*;\n" + 
				"import static p.J.*;\n" + 
				"public class Test {\n" + 
				"	int i = Constant;\n" + 
				"}\n",
				"p/I.java",
				"package p;\n" + 
				"public interface I { static int Constant = 1; }\n",
				"p/J.java",
				"package p;\n" + 
				"public interface J extends I {}\n"	,			
			},
			"----------\n" + 
			"1. WARNING in Test.java (at line 2)\n" + 
			"	import static p.J.*;\n" + 
			"	              ^^^\n" + 
			"The import p.J is never used\n" + 
			"----------\n"
		);
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=133737
	public void test042() {
		this.runNegativeTest(
			new String[] {
				"ImportTest.java",
				"import static p.ArrayTest.toString2;\n" + 
				"public class ImportTest extends SuperTest {\n" + 
				"	public static void main(String[] args) { printArgs(1, 2, 3, 4, 5); }\n" +
				"	static void printArgs(Object... args) { toString2(args); }\n" + 
				"}\n" +
				"class SuperTest {\n" + 
				"	static void toString2() {}\n" +
				"}\n",
				"p/ArrayTest.java",
				"package p;\n" + 
				"public class ArrayTest {\n" + 
				"	public static void toString2(String[] args) {}\n" +
				"}\n",
			},
			"----------\n" + 
			"1. ERROR in ImportTest.java (at line 4)\r\n" + 
			"	static void printArgs(Object... args) { toString2(args); }\r\n" + 
			"	                                        ^^^^^^^^^\n" + 
			"The method toString2() in the type SuperTest is not applicable for the arguments (Object[])\n" + 
			"----------\n"
			// toString2() in SuperTest cannot be applied to (java.lang.Object[])
		);
		this.runNegativeTest(
			new String[] {
				"ImportTest.java",
				"import static java.util.Arrays.toString;\n" + 
				"public class ImportTest {\n" + 
				"	public static void main(String[] args) { printArgs(1, 2, 3, 4, 5); }\n" +
				"	static void printArgs(Object... args) { toString(args); }\n" + 
				"}\n"	
			},
			"----------\n" + 
			"1. ERROR in ImportTest.java (at line 4)\n" + 
			"	static void printArgs(Object... args) { toString(args); }\n" + 
			"	                                        ^^^^^^^^\n" + 
			"The method toString() in the type Object is not applicable for the arguments (Object[])\n" + 
			"----------\n"
			// toString() in java.lang.Object cannot be applied to (java.lang.Object[])
		);
	}
	public void test042b() {
		this.runConformTest(
			new String[] {
				"ImportTest.java",
				"import static p.DefinesFoo.foo;\n" + 
				"public class ImportTest extends SuperImportTest {\n" + 
				"	void test() { foo(\"fails?\"); }\n" + 
				"}\n" +
				"class SuperImportTest {\n" + 
				"	private void foo() {}\n" +
				"}\n",
				"p/DefinesFoo.java",
				"package p;\n" + 
				"public class DefinesFoo {\n" + 
				"	public static void foo(String s) {}\n" +
				"}\n",
			},
			""
		);
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=129388
	public void test043() {
		this.runConformTest(
			new String[] {
				"B.java",
				"import static java.lang.String.format;\n" + 
				"public class B extends p.A {\n" + 
				"	void test() { format(\"fails?\"); }\n" + 
				"	void test2() { format(\"fails?\", null); }\n" + 
				"	void test3() { format(\"fails?\", null, null); }\n" + 
				"	void test4() { format(\"fails?\", null, null, null); }\n" + 
				"}\n",
				"p/A.java",
				"package p;\n" + 
				"public class A {\n" + 
				"	static String format(String message, Object expected, Object actual) { return null; }\n" +
				"}\n",
			},
			""
		);
	}
	// names potential confusion
	public void test044() {
		this.runConformTest(
			new String[] {
				"p/X.java",
				"package p;\n" + 
				"import static p.X.B.E;\n" + 
				"import static p.X.B.*;\n" + 
				"\n" + 
				"public class X {\n" + 
				"  public static class Y {\n" + 
				"    public enum E { FOO; }\n" + 
				"    public static Object E() { return null; }\n" + 
				"    public enum F { FOO; }\n" + 
				"    public static Object F() { return null; }\n" + 
				"  }\n" + 
				"  public static class B extends Y {}\n" + 
				"  Object f1 = E.FOO;\n" + 
				"  Object f2 = E();\n" + 
				"  Object f3 = F.FOO;\n" + 
				"  Object f4 = F();\n" + 
				"}\n",
			},
			""
		);
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=142772
	public void test045() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import static test.Y.arrayList;\n" +
				"public class X { static void arrayList(int x) { arrayList(); } }\n",
				"test/Y.java",
				"package test;\n" +
				"public class Y { public static void arrayList() {} }\n",
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 2)\n" + 
			"	public class X { static void arrayList(int x) { arrayList(); } }\n" + 
			"	                                                ^^^^^^^^^\n" + 
			"The method arrayList(int) in the type X is not applicable for the arguments ()\n" + 
			"----------\n"
			// arrayList(int) in X cannot be applied to ()
		);
	}
	public void test045b() {
		this.runNegativeTest(
			new String[] {
				"test/One.java",
				"package test;\n" +
				"public class One { public static void arrayList(String s) {} }\n",
				"test/Two.java",
				"package test;\n" +
				"public class Two { public void arrayList(int i) {} }\n",
				"test/Three.java",
				"package test;\n" +
				"import static test.One.arrayList;\n" +
				"public class Three extends Two { public static void test(String s) { arrayList(s); } }\n",
			},
			"----------\n" + 
			"1. ERROR in test\\Three.java (at line 3)\n" + 
			"	public class Three extends Two { public static void test(String s) { arrayList(s); } }\n" + 
			"	                                                                     ^^^^^^^^^\n" + 
			"The method arrayList(int) in the type Two is not applicable for the arguments (String)\n" + 
			"----------\n"
			// arrayList(int) in test.Two cannot be applied to (java.lang.String)
		);
		this.runNegativeTest(
			new String[] {
				"test/One.java",
				"package test;\n" +
				"public class One { public static void arrayList(String s) {} }\n",
				"test/Two.java",
				"package test;\n" +
				"public class Two { public static void arrayList(int i) {} }\n",
				"test/Three.java",
				"package test;\n" +
				"import static test.One.arrayList;\n" +
				"public class Three extends Two { public static void test(String s) { arrayList(s); } }\n",
			},
			"----------\n" + 
			"1. ERROR in test\\Three.java (at line 3)\r\n" + 
			"	public class Three extends Two { public static void test(String s) { arrayList(s); } }\r\n" + 
			"	                                                                     ^^^^^^^^^\n" + 
			"The method arrayList(int) in the type Two is not applicable for the arguments (String)\n" + 
			"----------\n"
			// arrayList(int) in test.Two cannot be applied to (java.lang.String)
		);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=133737
	public void test046() {
		this.runNegativeTest(
			new String[] {
				"error/Exporter.java",
				"package error;\n" + 
				"public class Exporter {\n" + 
				"  public static String getName(Class<?> c) {\n" + 
				"    return null;\n" + 
				"  }\n" + 
				"}",
				"error/Importer.java",
				"package error;\n" + 
				"import static error.Exporter.getName;\n" + 
				"public class Importer extends Base {\n" + 
				"  public void testSomething() {\n" + 
				"    getName();\n" + 
				"    getName(Importer.class);\n" + 
				"  }\n" + 
				"}",
				"error/Base.java",
				"package error;\n" + 
				"public class Base {\n" + 
				"  public String getName() {\n" + 
				"    return \"name\";\n" + 
				"  }\n" + 
				"}"
			},
			"----------\n" + 
			"1. ERROR in error\\Importer.java (at line 6)\n" + 
			"	getName(Importer.class);\n" + 
			"	^^^^^^^\n" + 
			"The method getName() in the type Base is not applicable for the arguments (Class<Importer>)\n" + 
			"----------\n"
		);		
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=165069
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=165081
	public void test047() {
		this.runNegativeTest(
			new String[] {
				"sample/X.java",
				"package sample;\n" + 
				"import static sample.X.TestEnum.V1;\n" + 
				"import static sample.X.TestEnum.V2;\n" + 
				"\n" + 
				"public class X<T> {\n" + 
				"        public static enum TestEnum {\n" + 
				"                V1,\n" + 
				"                V2\n" + 
				"        }\n" + 
				"\n" + 
				"        public void test(final TestEnum value) {\n" + 
				"                switch (value) {\n" + 
				"                        case V1:\n" + 
				"                        case V2:\n" + 
				"                }\n" + 
				"        }\n" + 
				"\n" + 
				"        public void ref() {\n" + 
				"               final TestEnum v1 = TestEnum.V1;\n" + 
				"               final TestEnum v2 = TestEnum.V2;\n" + 
				"				int i;\n" +
				"				i++;\n" +
				"        }\n" + 
				"}", // =================
			},
			"----------\n" + 
			"1. WARNING in sample\\X.java (at line 2)\n" + 
			"	import static sample.X.TestEnum.V1;\n" + 
			"	              ^^^^^^^^^^^^^^^^^^^^\n" + 
			"The import sample.X.TestEnum.V1 is never used\n" + 
			"----------\n" + 
			"2. WARNING in sample\\X.java (at line 3)\n" + 
			"	import static sample.X.TestEnum.V2;\n" + 
			"	              ^^^^^^^^^^^^^^^^^^^^\n" + 
			"The import sample.X.TestEnum.V2 is never used\n" + 
			"----------\n" + 
			"3. ERROR in sample\\X.java (at line 22)\n" + 
			"	i++;\n" + 
			"	^\n" + 
			"The local variable i may not have been initialized\n" + 
			"----------\n");		
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=165069 - variation
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=165081 - variation
	public void test048() {
		this.runNegativeTest(
			new String[] {
				"sample/X.java",
				"package sample;\n" + 
				"import static sample.X.TestEnum.*;\n" + 
				"\n" + 
				"public class X<T> {\n" + 
				"        public static enum TestEnum {\n" + 
				"                V1,\n" + 
				"                V2\n" + 
				"        }\n" + 
				"\n" + 
				"        public void test(final TestEnum value) {\n" + 
				"                switch (value) {\n" + 
				"                        case V1:\n" + 
				"                        case V2:\n" + 
				"                }\n" + 
				"        }\n" + 
				"\n" + 
				"        public void ref() {\n" + 
				"               final TestEnum v1 = TestEnum.V1;\n" + 
				"               final TestEnum v2 = TestEnum.V2;\n" + 
				"				int i;\n" +
				"				i++;\n" +
				"        }\n" + 
				"}", // =================
			},
			"----------\n" + 
			"1. WARNING in sample\\X.java (at line 2)\n" + 
			"	import static sample.X.TestEnum.*;\n" + 
			"	              ^^^^^^^^^^^^^^^^^\n" + 
			"The import sample.X.TestEnum is never used\n" + 
			"----------\n" + 
			"2. ERROR in sample\\X.java (at line 21)\n" + 
			"	i++;\n" + 
			"	^\n" + 
			"The local variable i may not have been initialized\n" + 
			"----------\n");		
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=165081 - variation
	public void test049() {
		this.runNegativeTest(
			new String[] {
				"sample/X.java",
				"package sample;\n" + 
				"import static sample.X.*;\n" + 
				"public class X {\n" + 
				"	public class Member {}\n" + 
				"	public void ref() {\n" + 
				"		int i;\n" +
				"		i++;\n" +
				"	}\n" + 
				"}", // =================
			},
			"----------\n" + 
			"1. WARNING in sample\\X.java (at line 2)\n" + 
			"	import static sample.X.*;\n" + 
			"	              ^^^^^^^^\n" + 
			"The import sample.X is never used\n" + 
			"----------\n" + 
			"2. ERROR in sample\\X.java (at line 7)\n" + 
			"	i++;\n" + 
			"	^\n" + 
			"The local variable i may not have been initialized\n" + 
			"----------\n");		
	}
}
