/*******************************************************************************
 * Copyright (c) 2020 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
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.core.tests.compiler.regression;

import java.io.File;
import java.io.IOException;
import java.util.Map;

import org.eclipse.jdt.core.ToolFactory;
import org.eclipse.jdt.core.tests.util.Util;
import org.eclipse.jdt.core.util.ClassFileBytesDisassembler;
import org.eclipse.jdt.core.util.ClassFormatException;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;

import junit.framework.Test;

public class LocalStaticsTest_15 extends AbstractRegressionTest {

	static {
//		TESTS_NUMBERS = new int [] { 40 };
//		TESTS_RANGE = new int[] { 1, -1 };
//		TESTS_NAMES = new String[] { "testBug566715_003"};
	}

	public static Class<?> testClass() {
		return LocalStaticsTest_15.class;
	}
	public static Test suite() {
		return buildMinimalComplianceTestSuite(testClass(), F_15);
	}
	public LocalStaticsTest_15(String testName){
		super(testName);
	}

	// Enables the tests to run individually
	protected Map<String, String> getCompilerOptions() {
		Map<String, String> defaultOptions = super.getCompilerOptions();
		defaultOptions.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_15); // FIXME
		defaultOptions.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_15);
		defaultOptions.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_15);
		defaultOptions.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
		defaultOptions.put(CompilerOptions.OPTION_ReportPreviewFeatures, CompilerOptions.IGNORE);
		defaultOptions.put(CompilerOptions.OPTION_Store_Annotations, CompilerOptions.ENABLED);
		return defaultOptions;
	}

	@Override
	protected void runConformTest(String[] testFiles, String expectedOutput) {
		runConformTest(testFiles, expectedOutput, getCompilerOptions());
	}

	@Override
	protected void runConformTest(String[] testFiles, String expectedOutput, Map<String, String> customOptions) {
		Runner runner = new Runner();
		runner.testFiles = testFiles;
		runner.expectedOutputString = expectedOutput;
		runner.vmArguments = new String[] {"--enable-preview"};
		runner.customOptions = customOptions;
		runner.javacTestOptions = JavacTestOptions.forReleaseWithPreview("15");
		runner.runConformTest();
	}
	@Override
	protected void runNegativeTest(String[] testFiles, String expectedCompilerLog) {
		runNegativeTest(testFiles, expectedCompilerLog, JavacTestOptions.forReleaseWithPreview("15"));
	}
	protected void runWarningTest(String[] testFiles, String expectedCompilerLog) {
		runWarningTest(testFiles, expectedCompilerLog, null);
	}
	protected void runWarningTest(String[] testFiles, String expectedCompilerLog, Map<String, String> customOptions) {
		runWarningTest(testFiles, expectedCompilerLog, customOptions, null);
	}
	protected void runWarningTest(String[] testFiles, String expectedCompilerLog,
			Map<String, String> customOptions, String javacAdditionalTestOptions) {

		Runner runner = new Runner();
		runner.testFiles = testFiles;
		runner.expectedCompilerLog = expectedCompilerLog;
		runner.customOptions = customOptions;
		runner.vmArguments = new String[] {"--enable-preview"};
		runner.javacTestOptions = javacAdditionalTestOptions == null ? JavacTestOptions.forReleaseWithPreview("15") :
			JavacTestOptions.forReleaseWithPreview("15", javacAdditionalTestOptions);
		runner.runWarningTest();
	}

	@SuppressWarnings("unused")
	private static void verifyClassFile(String expectedOutput, String classFileName, int mode)
			throws IOException, ClassFormatException {
		File f = new File(OUTPUT_DIR + File.separator + classFileName);
		byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
		ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
		String result = disassembler.disassemble(classFileBytes, "\n", mode);
		int index = result.indexOf(expectedOutput);
		if (index == -1 || expectedOutput.length() == 0) {
			System.out.println(Util.displayString(result, 3));
			System.out.println("...");
		}
		if (index == -1) {
			assertEquals("Wrong contents", expectedOutput, result);
		}
	}

	public void testBug566284_001() {
		runConformTest(
			new String[] {
				"X.java",
				"public class X {\n"+
				" static void foo() {\n"+
				"   interface F {\n"+
				"     static int create(int lo) {\n"+
				"       I myI = s -> lo;\n"+
				"       return myI.bar(0);\n"+
				"     }\n"+
				"   }\n"+
				"   System.out.println(F.create(0));\n"+
				"     }\n"+
				" public static void main(String[] args) {\n"+
				"   X.foo();\n"+
				" }\n"+
				"}\n"+
				"\n"+
				"interface I {\n"+
				" int bar(int l);\n"+
				"}"
			},
			"0");
	}


	public void testBug566284_002() {
		runConformTest(
			new String[] {
				"X.java",
				"public class X {\n"+
				" static void foo() {\n"+
				"   record R() {\n"+
				"     static int create(int lo) {\n"+
				"       I myI = s -> lo;\n"+
				"       return myI.bar(0);\n"+
				"     }\n"+
				"   }\n"+
				"   System.out.println(R.create(0));\n"+
				"     }\n"+
				" public static void main(String[] args) {\n"+
				"   X.foo();\n"+
				" }\n"+
				"}\n"+
				"\n"+
				"interface I {\n"+
				" int bar(int l);\n"+
				"}"
			},
			"0");
	}
	public void testBug566284_003() {
		runNegativeTest(
			new String[] {
				"X.java",
				"class X {\n"+
				" static int si;\n"+
				" int nsi;\n"+
				"\n"+
				" void m() {\n"+
				"   int li;\n"+
				"\n"+
				"   interface F {\n"+
				"     static int fi = 0;\n"+
				"\n"+
				"     default void foo(int i) {\n"+
				"       System.out.println(li); // error, local variable of method of outer enclosing class\n"+
				"       System.out.println(nsi); // error, non-static member\n"+
				"       System.out.println(fi); // ok, static member of current class\n"+
				"       System.out.println(si); // ok, static member of enclosing class\n"+
				"       System.out.println(i); // ok, local variable of current method\n"+
				"     }\n"+
				"\n"+
				"     static void bar(int lo) {\n"+
				"       int k = lo; // ok\n"+
				"       int j = fi; // ok\n"+
				"       I myI = s -> lo; // ok, local var of method\n"+
				"     }\n"+
				"\n"+
				"     static void bar2(int lo) {\n"+
				"       I myI = s -> li; // error - local var of outer class\n"+
				"     }\n"+
				"   }\n"+
				" }\n"+
				"}\n"+
				"\n"+
				"interface I {\n"+
				" int bar(int l);\n"+
				"}"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 12)\n" +
			"	System.out.println(li); // error, local variable of method of outer enclosing class\n" +
			"	                   ^^\n" +
			"Cannot make a static reference to the non-static variable li\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 13)\n" +
			"	System.out.println(nsi); // error, non-static member\n" +
			"	                   ^^^\n" +
			"Cannot make a static reference to the non-static field nsi\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 26)\n" +
			"	I myI = s -> li; // error - local var of outer class\n" +
			"	             ^^\n" +
			"Cannot make a static reference to the non-static variable li\n" +
			"----------\n"
			);
	}

	public void testBug566518_001() {
		runConformTest(
			new String[] {
				"X.java",
				"public class X {\n"+
				" static void foo() {\n"+
				"   int f = switch (5) {\n"+
				"			case 5: {\n"+
				"				interface I{\n"+
				"					\n"+
				"				}\n"+
				"				class C implements I{\n"+
				"					public int j = 5;\n"+
				"				}\n"+
				"				\n"+
				"				yield new C().j;\n"+
				"			}\n"+
				"			default:\n"+
				"				throw new IllegalArgumentException(\"Unexpected value: \" );\n"+
				"			};\n"+
				"	System.out.println(f);\n"+
				" }\n"+
				" public static void main(String[] args) {\n"+
				"   X.foo();\n"+
				" }\n"+
				"}"
			},
			"5");
	}

	public void testBug566518_002() {
		runConformTest(
			new String[] {
				"X.java",
				"public class X {\n"+
				" static void foo() {\n"+
				"   class F {\n"+
				"     int create(int lo) {\n"+
				"       I myI = s -> lo;\n"+
				"       return myI.bar(0);\n"+
				"     }\n"+
				"   }\n"+
				"   System.out.println(new F().create(0));\n"+
				"     }\n"+
				" public static void main(String[] args) {\n"+
				"   X.foo();\n"+
				" }\n"+
				"}\n"+
				"\n"+
				"interface I {\n"+
				" int bar(int l);\n"+
				"}"
			},
			"0");
	}

	public void testBug566518_003() {
		runConformTest(
			new String[] {
				"X.java",
				"public interface X {\n"+
				" static void foo() {\n"+
				"   class F {\n"+
				"     int create(int lo) {\n"+
				"       I myI = s -> lo;\n"+
				"       return myI.bar(0);\n"+
				"     }\n"+
				"   }\n"+
				"   System.out.println(new F().create(0));\n"+
				"     }\n"+
				" public static void main(String[] args) {\n"+
				"   X.foo();\n"+
				" }\n"+
				"}\n"+
				"\n"+
				"interface I {\n"+
				" int bar(int l);\n"+
				"}"
			},
			"0");
	}

	public void testBug566518_004() {
		runConformTest(
			new String[] {
				"X.java",
				"public interface X {\n"+
				" static void foo() {\n"+
				"   interface F {\n"+
				"     static int create(int lo) {\n"+
				"       I myI = s -> lo;\n"+
				"       return myI.bar(0);\n"+
				"     }\n"+
				"   }\n"+
				"   System.out.println(F.create(0));\n"+
				"     }\n"+
				" public static void main(String[] args) {\n"+
				"   X.foo();\n"+
				" }\n"+
				"}\n"+
				"\n"+
				"interface I {\n"+
				" int bar(int l);\n"+
				"}"
			},
			"0");
	}

	public void testBug566518_005() {
		runNegativeTest(
			new String[] {
					"X.java",
					"public class X {\n"+
					" static void foo() {\n"+
					"   int f = switch (5) {\n"+
					"			case 5: {\n"+
					"				interface I{\n"+
					"					\n"+
					"				}\n"+
					"				class C implements I{\n"+
					"					public int j = 5;\n"+
					"				}\n"+
					"				\n"+
					"				yield new C().j;\n"+
					"			}\n"+
					"			default:\n"+
					"				throw new IllegalArgumentException(\"Unexpected value: \" );\n"+
					"			};\n"+
					"	System.out.println(f);\n"+
					"	class C1 implements I{\n"+
					"		public int j = 5;\n"+
					"	}\n"+
					" }\n"+
					" public static void main(String[] args) {\n"+
					"   X.foo();\n"+
					" }\n"+
					"}\n"
			},
			"----------\n"+
			"1. ERROR in X.java (at line 18)\n"+
			"	class C1 implements I{\n"+
			"	                    ^\n" +
		    "I cannot be resolved to a type\n"+
		 	"----------\n"
			);
	}

	public void testBug566518_006() {
		runConformTest(
			new String[] {
				"X.java",
				"public enum X {\n"+
				" A, B, C;\n"+
				" public void foo() {\n"+
				"   int f = switch (5) {\n"+
				"			case 5: {\n"+
				"				interface I{\n"+
				"					\n"+
				"				}\n"+
				"				class C implements I{\n"+
				"					public int j = 5;\n"+
				"				}\n"+
				"				\n"+
				"				yield new C().j;\n"+
				"			}\n"+
				"			default:\n"+
				"				throw new IllegalArgumentException(\"Unexpected value: \" );\n"+
				"			};\n"+
				" }\n"+
				" public static void main(String[] args) {\n"+
				"   X x = X.A;\n"+
				"	System.out.println();\n"+
				" }\n"+
				"}"
			},
			"");
	}
	// 6.5.5.1
	public void testBug566715_001() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T> {\n"+
				" static void foo() {\n"+
				"	interface I {\n"+
				"		X<T> supply();\n"+
				"	}\n"+
				" }\n"+
				"}\n"
			},
			"----------\n"+
			"1. WARNING in X.java (at line 3)\n" +
			"	interface I {\n" +
			"	          ^\n" +
			"The type I is never used locally\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 4)\n" +
			"	X<T> supply();\n" +
			"	  ^\n" +
			"Cannot make a static reference to the non-static type T\n" +
		 	"----------\n"
			);
	}
	// 6.5.5.1
	public void testBug566715_002() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T> {\n"+
				"  void foo() {\n"+
				"	interface I {\n"+
				"		X<T> supply();\n"+
				"	}\n"+
				" }\n"+
				"}\n"
			},
			"----------\n"+
			"1. WARNING in X.java (at line 3)\n" +
			"	interface I {\n" +
			"	          ^\n" +
			"The type I is never used locally\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 4)\n" +
			"	X<T> supply();\n" +
			"	  ^\n" +
			"Cannot make a static reference to the non-static type T\n" +
		 	"----------\n"
			);
	}
	// 6.5.5.1
	public void testBug566715_003() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T> {\n"+
				"  void foo() {\n"+
				"	record R(X<T> x) {}\n"+
				" }\n"+
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	record R(X<T> x) {}\n" +
			"	           ^\n" +
			"Cannot make a static reference to the non-static type T\n" +
		 	"----------\n"
			);
	}
	// 9.1.1/14.3
	public void testBug566720_001() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T> {\n"+
				"  void foo() {\n"+
				"	public interface I {}\n"+
				" }\n"+
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	public interface I {}\n" +
			"	                 ^\n" +
			"Illegal modifier for the local interface I; abstract and strictfp are the only modifiers allowed explicitly \n" +
		 	"----------\n"
			);
	}
	// 9.1.1/14.3
	public void testBug566720_002() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T> {\n"+
				"  void foo() {\n"+
				"	private interface I {}\n"+
				" }\n"+
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	private interface I {}\n" +
			"	                  ^\n" +
			"Illegal modifier for the local interface I; abstract and strictfp are the only modifiers allowed explicitly \n" +
		 	"----------\n"
			);
	}
	// 9.1.1
	public void testBug566720_003() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T> {\n"+
				"  void foo() {\n"+
				"	protected interface I {}\n"+
				" }\n"+
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	protected interface I {}\n" +
			"	                    ^\n" +
			"Illegal modifier for the local interface I; abstract and strictfp are the only modifiers allowed explicitly \n" +
		 	"----------\n"
			);
	}
	// 9.1.1
	public void testBug566720_004() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T> {\n"+
				"  void foo() {\n"+
				"	final interface I {}\n"+
				" }\n"+
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	final interface I {}\n" +
			"	                ^\n" +
			"Illegal modifier for the local interface I; abstract and strictfp are the only modifiers allowed explicitly \n" +
		 	"----------\n"
			);
	}
	// 9.1.1
	public void testBug566720_005() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T> {\n"+
				"  void foo() {\n"+
				"	static interface I {}\n"+
				" }\n"+
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	static interface I {}\n" +
			"	                 ^\n" +
			"Illegal modifier for the local interface I; abstract and strictfp are the only modifiers allowed explicitly \n" +
		 	"----------\n"
			);
	}
	public void testBug566748_001() {
		runNegativeTest(
			new String[] {
				"X.java",
				"class X<T> {\n"+
				"        int count;\n"+
				"        void doNothing() {}\n"+
				"     void foo1(String s) {\n"+
				"        int i;\n"+
				"       interface I {\n"+
				"               default X<T> bar() {\n"+
				"                       if (count > 0 || i > 0 || s == null)\n"+
				"                               return null;\n"+
				"                       doNothing();\n"+
				"                               return null;\n"+
				"               }\n"+
				"       } \n"+
				"    }\n"+
				"     void foo2(String s) {\n"+
				"       try {\n"+
				"               throw new Exception();\n"+
				"       } catch (Exception e) {\n"+
				"               interface I {\n"+
				"                       default int bar() {\n"+
				"                         return e != null ? 0 : 1;\n"+
				"                       }\n"+
				"               } \n"+
				"               \n"+
				"       }\n"+
				"    }\n"+
				"}"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 6)\n" +
			"	interface I {\n" +
			"	          ^\n" +
			"The type I is never used locally\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 7)\n" +
			"	default X<T> bar() {\n" +
			"	          ^\n" +
			"Cannot make a static reference to the non-static type T\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 8)\n" +
			"	if (count > 0 || i > 0 || s == null)\n" +
			"	    ^^^^^\n" +
			"Cannot make a static reference to the non-static field count\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 8)\n" +
			"	if (count > 0 || i > 0 || s == null)\n" +
			"	                 ^\n" +
			"Cannot make a static reference to the non-static variable i\n" +
			"----------\n" +
			"5. ERROR in X.java (at line 8)\n" +
			"	if (count > 0 || i > 0 || s == null)\n" +
			"	                          ^\n" +
			"Cannot make a static reference to the non-static variable s\n" +
			"----------\n" +
			"6. ERROR in X.java (at line 10)\n" +
			"	doNothing();\n" +
			"	^^^^^^^^^\n" +
			"Cannot make a static reference to the non-static method doNothing() from the type X<T>\n" +
			"----------\n" +
			"7. WARNING in X.java (at line 19)\n" +
			"	interface I {\n" +
			"	          ^\n" +
			"The type I is never used locally\n" +
			"----------\n" +
			"8. ERROR in X.java (at line 21)\n" +
			"	return e != null ? 0 : 1;\n" +
			"	       ^\n" +
			"Cannot make a static reference to the non-static variable e\n" +
		 	"----------\n"
			);
	}
	public void testBug566748_002() {
		runNegativeTest(
			new String[] {
				"X.java",
				"interface X<T> {\n"+
				" int count = 0;\n"+
				"\n"+
				" default void doNothing() {}\n"+
				"\n"+
				" default void foo1(String s) {\n"+
				"   int i;\n"+
				"   interface I {\n"+
				"     default X<T> bar() {\n"+
				"       if (count > 0 || i > 0 || s == null)\n"+
				"         return null;\n"+
				"       doNothing();\n"+
				"       return null;\n"+
				"     }\n"+
				"   }\n"+
				" }\n"+
				"\n"+
				" default void foo2(String s) {\n"+
				"       try {\n"+
				"               throw new Exception();\n"+
				"       } catch (Exception e) {\n"+
				"               interface I { \n"+
				"                       default int bar() {\n"+
				"                         return e != null ? 0 : 1;\n"+
				"                       }   \n"+
				"               }   \n"+
				"                   \n"+
				"       }   \n"+
				"    }\n"+
				"}"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 8)\n" +
			"	interface I {\n" +
			"	          ^\n" +
			"The type I is never used locally\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 9)\n" +
			"	default X<T> bar() {\n" +
			"	          ^\n" +
			"Cannot make a static reference to the non-static type T\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 10)\n" +
			"	if (count > 0 || i > 0 || s == null)\n" +
			"	                 ^\n" +
			"Cannot make a static reference to the non-static variable i\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 10)\n" +
			"	if (count > 0 || i > 0 || s == null)\n" +
			"	                          ^\n" +
			"Cannot make a static reference to the non-static variable s\n" +
			"----------\n" +
			"5. ERROR in X.java (at line 12)\n" +
			"	doNothing();\n" +
			"	^^^^^^^^^\n" +
			"Cannot make a static reference to the non-static method doNothing() from the type X<T>\n" +
			"----------\n" +
			"6. WARNING in X.java (at line 22)\n" +
			"	interface I { \n" +
			"	          ^\n" +
			"The type I is never used locally\n" +
			"----------\n" +
			"7. ERROR in X.java (at line 24)\n" +
			"	return e != null ? 0 : 1;\n" +
			"	       ^\n" +
			"Cannot make a static reference to the non-static variable e\n" +
		 	"----------\n"
			);
	}
	// 9.6
	public void testBug564557AnnotInterface_001() {
		runNegativeTest(
			new String[] {
				"X.java",
				"class X {\n"+
				" void foo() {\n"+
				"   class I {\n"+
				"     @interface Annot {\n"+
				"     }\n"+
				"   }\n"+
				" }\n"+
				"}"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	@interface Annot {\n" +
			"	           ^^^^^\n" +
			"The member annotation Annot can only be defined inside a top-level class or interface or in a static context\n" +
		 	"----------\n"
			);
	}
	// 9.6
	public void testBug564557AnnotInterface_002() {
		runNegativeTest(
			new String[] {
				"X.java",
				"class X {\n"+
				" void foo() {\n"+
				"   interface I {\n"+
				"     @interface Annot {\n"+
				"     }\n"+
				"   }\n"+
				" }\n"+
				"}"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	@interface Annot {\n" +
			"	           ^^^^^\n" +
			"The member annotation Annot can only be defined inside a top-level class or interface or in a static context\n" +
		 	"----------\n"
			);
	}
	// 9.4 && 15.12.3
	public void testBug564557MethodInvocation_003() {
		runNegativeTest(
			new String[] {
				"X.java",
				"class X {\n"+
				" void foo() {\n"+
				"   Zork();\n"+
				"   interface I {\n"+
				"     default void bar() {}\n"+
				"     default void b1() {\n"+
				"       class J {\n"+
				"          void jb2() {\n"+
				"           bar();\n"+
				"         }\n"+
				"       }\n"+
				"     }\n"+
				"   }\n"+
				" }\n"+
				"}"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	Zork();\n" +
			"	^^^^\n" +
			"The method Zork() is undefined for the type X\n" +
		 	"----------\n"
			);
	}
	// 9.4 && 15.12.3
	public void testBug564557MethodInvocation_004() {
		runNegativeTest(
			new String[] {
				"X.java",
				"class X {\n"+
				" void foo() {\n"+
				"   interface I {\n"+
				"     default void bar() {}\n"+
				"     default void b1() {\n"+
				"       interface J {\n"+
				"          default void jb2() {\n"+
				"           bar();\n"+
				"         }\n"+
				"       }\n"+
				"     }\n"+
				"   }\n"+
				" }\n"+
				"}"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	interface I {\n" +
			"	          ^\n" +
			"The type I is never used locally\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 5)\n" +
			"	default void b1() {\n" +
			"	             ^^^^\n" +
			"The method b1() from the type I is never used locally\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 6)\n" +
			"	interface J {\n" +
			"	          ^\n" +
			"The type J is never used locally\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 8)\n" +
			"	bar();\n" +
			"	^^^\n" +
			"Cannot make a static reference to the non-static method bar() from the type I\n" +
		 	"----------\n"
			);
	}
	// 13.1
	public void testBug564557BinaryForm_005() throws Exception {
		runConformTest(
			new String[] {
					"X.java",
					"class X {\n"+
					" public static void main(String[] args) {\n"+
					"   System.out.println(\"\");\n"+
					" }\n"+
					" void foo() {\n"+
					"   interface I {\n"+
					"   }\n"+
					" }\n"+
					"}"
			},
			"");
		String expectedOutput = "abstract static interface X$1I {\n";
		LocalStaticsTest_15.verifyClassFile(expectedOutput, "X$1I.class", ClassFileBytesDisassembler.SYSTEM);
	}
	// 14.3 for enum
	public void testBug564557BinaryForm_006() throws Exception {
		runConformTest(
			new String[] {
					"X.java",
					"class X {\n"+
					" public static void main(String[] args) {\n"+
					"   System.out.println(\"\");\n"+
					" }\n"+
					" void foo() {\n"+
					"   enum I {\n"+
					"   }\n"+
					" }\n"+
					"}"
			},
			"");
		String expectedOutput = "static final enum X$1I {\n";
		LocalStaticsTest_15.verifyClassFile(expectedOutput, "X$1I.class", ClassFileBytesDisassembler.SYSTEM);
	}
	// 15.8.3
	public void testBug564557thisInStatic_007() {
		runNegativeTest(
			new String[] {
				"X.java",
				"class X {\n"+
				" void foo() {\n"+
				"   interface I {\n"+
				"     int count = 0;\n"+
				"     static void bar() {\n"+
				"       int i = this.count;\n"+
				"     }\n"+
				"   }\n"+
				" }\n"+
				"}"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	interface I {\n" +
			"	          ^\n" +
			"The type I is never used locally\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 4)\n" +
			"	int count = 0;\n" +
			"	    ^^^^^\n" +
			"The value of the field I.count is not used\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 6)\n" +
			"	int i = this.count;\n" +
			"	        ^^^^\n" +
			"Cannot use this in a static context\n" +
		 	"----------\n"
			);
	}
	// 15.8.3
	public void testBug564557thisInStatic_008() {
		runNegativeTest(
			new String[] {
				"X.java",
				"class X {\n"+
				" int count = 0;\n"+
				" void foo() {\n"+
				"   interface I {\n"+
				"     static void bar() {\n"+
				"       int i = X.this.count;\n"+
				"     }\n"+
				"   }\n"+
				" }\n"+
				"}"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 4)\n" +
			"	interface I {\n" +
			"	          ^\n" +
			"The type I is never used locally\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 6)\n" +
			"	int i = X.this.count;\n" +
			"	        ^^^^^^\n" +
			"No enclosing instance of the type X is accessible in scope\n" +
		 	"----------\n"
			);
	}
}