/*******************************************************************************
 * Copyright (c) 2010, 2017 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.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.util.Map;

import junit.framework.Test;

import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;

public class InnerClass15Test extends AbstractRegressionTest {
public InnerClass15Test(String name) {
	super(name);
}
static {
//	TESTS_NUMBERS = new int[] { 2 };
	//TESTS_NAMES = new String[] {"testBug520874"};
}
public static Test suite() {
	return buildMinimalComplianceTestSuite(testClass(), F_1_5);
}
protected Map<String, String> getCompilerOptions() {
	Map<String, String> options = super.getCompilerOptions();
	options.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.IGNORE);
	return options;
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=312989
public void test001() {
	this.runNegativeTest(new String[] {
		"X.java",
		"class X {\n" + 
		"	<X> void foo() {\n" + 
		"		class X {}\n" + 
		"	}\n" + 
		"}",
	},
	"----------\n" + 
	"1. WARNING in X.java (at line 2)\n" + 
	"	<X> void foo() {\n" + 
	"	 ^\n" + 
	"The type parameter X is hiding the type X\n" + 
	"----------\n" + 
	"2. WARNING in X.java (at line 3)\n" + 
	"	class X {}\n" + 
	"	      ^\n" + 
	"The nested type X is hiding the type parameter X of the generic method foo() of type X\n" + 
	"----------\n" + 
	"3. ERROR in X.java (at line 3)\n" + 
	"	class X {}\n" + 
	"	      ^\n" + 
	"The nested type X cannot hide an enclosing type\n" + 
	"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=312989
public void test002() {
	this.runNegativeTest(new String[] {
		"X.java",
		"class X<X> {\n" + 
		"	void foo() {\n" + 
		"		class X {}\n" + 
		"	}\n" + 
		"}",
	},
	"----------\n" + 
	"1. WARNING in X.java (at line 1)\n" + 
	"	class X<X> {\n" + 
	"	        ^\n" + 
	"The type parameter X is hiding the type X<X>\n" + 
	"----------\n" + 
	"2. WARNING in X.java (at line 3)\n" + 
	"	class X {}\n" + 
	"	      ^\n" + 
	"The nested type X is hiding the type parameter X of type X<X>\n" + 
	"----------\n" + 
	"3. ERROR in X.java (at line 3)\n" + 
	"	class X {}\n" + 
	"	      ^\n" + 
	"The nested type X cannot hide an enclosing type\n" + 
	"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=312989
// note javac reports an error for this test, but that is
// incorrect, compare and contrast javac behavior with
// test004.
public void test003() {
	this.runNegativeTest(new String[] {
		"Y.java",
		"class Y {\n" +
		"class X {}\n" + 
		"	<X> void foo() {\n" + 
		"		class X {}\n" + 
		"	}\n" + 
		"}",
	},
	"----------\n" + 
	"1. WARNING in Y.java (at line 3)\n" + 
	"	<X> void foo() {\n" + 
	"	 ^\n" + 
	"The type parameter X is hiding the type Y.X\n" + 
	"----------\n" + 
	"2. WARNING in Y.java (at line 4)\n" + 
	"	class X {}\n" + 
	"	      ^\n" + 
	"The nested type X is hiding the type parameter X of the generic method foo() of type Y\n" + 
	"----------\n" + 
	"3. WARNING in Y.java (at line 4)\n" + 
	"	class X {}\n" + 
	"	      ^\n" + 
	"The type X is never used locally\n" + 
	"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=312989
public void test004() {
	this.runNegativeTest(new String[] {
		"Y.java",
		"class Y {\n" +
		"class X {}\n" + 
		"   void foo() {\n" + 
		"		class X {}\n" + 
		"	}\n" + 
		"}",
	},
	"----------\n" + 
	"1. WARNING in Y.java (at line 4)\n" + 
	"	class X {}\n" + 
	"	      ^\n" + 
	"The type X is hiding the type Y.X\n" + 
	"----------\n" + 
	"2. WARNING in Y.java (at line 4)\n" + 
	"	class X {}\n" + 
	"	      ^\n" + 
	"The type X is never used locally\n" + 
	"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=319885
public void test005() {
	this.runNegativeTest(new String[] {
		"p1/GreenBox.java",
		"package p1;\n" +
		"import static p1.BrownBox.*;\n" +
		"public interface GreenBox {\n" +
		"    public static class Cat extends Object {}\n" +
		"}\n",
		"p1/BrownBox.java",
		"package p1;\n" +
		"import static p1.GreenBox.*;\n" +
		"public interface BrownBox {\n" +
		"    public static class BlackCat extends Cat {}\n" +
		"}\n",
	},
	"----------\n" + 
	"1. WARNING in p1\\GreenBox.java (at line 2)\n" + 
	"	import static p1.BrownBox.*;\n" + 
	"	              ^^^^^^^^^^^\n" + 
	"The import p1.BrownBox is never used\n" + 
	"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=319885
public void test006() {
	this.runNegativeTest(new String[] {
		"p1/BrownBox.java",
		"package p1;\n" +
		"import static p1.GreenBox.*;\n" +
		"public interface BrownBox {\n" +
		"    public static class BlackCat extends Cat {}\n" +
		"}\n",
		"p1/GreenBox.java",
		"package p1;\n" +
		"import static p1.BrownBox.*;\n" +
		"public interface GreenBox {\n" +
		"    public static class Cat extends Object {}\n" +
		"}\n",
	},
	"----------\n" + 
	"1. WARNING in p1\\GreenBox.java (at line 2)\n" + 
	"	import static p1.BrownBox.*;\n" + 
	"	              ^^^^^^^^^^^\n" + 
	"The import p1.BrownBox is never used\n" + 
	"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=319885
public void test007() {
	this.runNegativeTest(new String[] {
		"p1/BrownBox.java",
		"package p1;\n" +
		"import static p1.GreenBox.*;\n" +
		"public interface BrownBox {\n" +
		"    public static class BlackCat extends Cat {}\n" +
		"}\n",
		"p1/GreenBox.java",
		"package p1;\n" +
		"import static p1.BrownBox.*;\n" +
		"public interface GreenBox {\n" +
		"    public static class Cat extends java.lang.Object {}\n" +
		"}\n",
	},
	"----------\n" + 
	"1. WARNING in p1\\GreenBox.java (at line 2)\n" + 
	"	import static p1.BrownBox.*;\n" + 
	"	              ^^^^^^^^^^^\n" + 
	"The import p1.BrownBox is never used\n" + 
	"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=319885
public void test008() {
	this.runNegativeTest(new String[] {
		"p1/BrownBox.java",
		"package p1;\n" +
		"import static p1.GreenBox.*;\n" +
		"public interface BrownBox {\n" +
		"    public static class BlackCat extends Cat {}\n" +
		"}\n",
		"p1/GreenBox.java",
		"package p1;\n" +
		"import static p1.BrownBox.*;\n" +
		"public interface GreenBox {\n" +
		"    public static class Cat extends BlackCat {}\n" +
		"}\n",
	},
	"----------\n" + 
	"1. ERROR in p1\\BrownBox.java (at line 4)\n" + 
	"	public static class BlackCat extends Cat {}\n" + 
	"	                    ^^^^^^^^\n" + 
	"The hierarchy of the type BlackCat is inconsistent\n" + 
	"----------\n" + 
	"----------\n" + 
	"1. ERROR in p1\\GreenBox.java (at line 4)\n" + 
	"	public static class Cat extends BlackCat {}\n" + 
	"	                                ^^^^^^^^\n" + 
	"Cycle detected: a cycle exists in the type hierarchy between GreenBox.Cat and BrownBox.BlackCat\n" + 
	"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=319885
public void test009() {
	this.runNegativeTest(new String[] {
		"p1/GreenBox.java",
		"package p1;\n" +
		"import static p1.BrownBox.*;\n" +
		"public interface GreenBox {\n" +
		"    public static class Cat extends BlackCat {}\n" +
		"}\n",
		"p1/BrownBox.java",
		"package p1;\n" +
		"import static p1.GreenBox.*;\n" +
		"public interface BrownBox {\n" +
		"    public static class BlackCat extends Cat {}\n" +
		"}\n",
	},
	"----------\n" + 
	"1. ERROR in p1\\GreenBox.java (at line 4)\n" + 
	"	public static class Cat extends BlackCat {}\n" + 
	"	                    ^^^\n" + 
	"The hierarchy of the type Cat is inconsistent\n" + 
	"----------\n" + 
	"----------\n" + 
	"1. ERROR in p1\\BrownBox.java (at line 4)\n" + 
	"	public static class BlackCat extends Cat {}\n" + 
	"	                                     ^^^\n" + 
	"Cycle detected: a cycle exists in the type hierarchy between BrownBox.BlackCat and GreenBox.Cat\n" + 
	"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=319885
public void test0010() {
	this.runNegativeTest(new String[] {
		"p1/GreenBox.java",
		"package p1;\n" +
		"import static p1.BrownBox.*;\n" +
		"interface SuperInterface {\n" +
		"   public static class Cat extends BlackCat {}\n" +
		"}\n" +
		"public interface GreenBox {\n" +
		"}\n",
		"p1/BrownBox.java",
		"package p1;\n" +
		"import static p1.GreenBox.*;\n" +
		"public interface BrownBox {\n" +
		"    public static class BlackCat extends Cat {}\n" +
		"}\n",
	},
	"----------\n" + 
	"1. ERROR in p1\\GreenBox.java (at line 4)\n" + 
	"	public static class Cat extends BlackCat {}\n" + 
	"	                    ^^^\n" + 
	"The hierarchy of the type Cat is inconsistent\n" + 
	"----------\n" + 
	"----------\n" + 
	"1. ERROR in p1\\BrownBox.java (at line 4)\n" + 
	"	public static class BlackCat extends Cat {}\n" + 
	"	                                     ^^^\n" + 
	"Cat cannot be resolved to a type\n" + 
	"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=319885
public void test0011() {
	this.runNegativeTest(new String[] {
		"p1/GreenBox.java",
		"package p1;\n" +
		"import static p1.BrownBox.*;\n" +
		"interface SuperInterface {\n" +
		"   public static class Cat extends BlackCat {}\n" +
		"}\n" +
		"public interface GreenBox extends SuperInterface {\n" +
		"}\n",
		"p1/BrownBox.java",
		"package p1;\n" +
		"import static p1.GreenBox.*;\n" +
		"public interface BrownBox {\n" +
		"    public static class BlackCat extends Cat {}\n" +
		"}\n",
	},
	"----------\n" + 
	"1. ERROR in p1\\GreenBox.java (at line 4)\n" + 
	"	public static class Cat extends BlackCat {}\n" + 
	"	                    ^^^\n" + 
	"The hierarchy of the type Cat is inconsistent\n" + 
	"----------\n" + 
	"----------\n" + 
	"1. ERROR in p1\\BrownBox.java (at line 4)\n" + 
	"	public static class BlackCat extends Cat {}\n" + 
	"	                                     ^^^\n" + 
	"Cycle detected: a cycle exists in the type hierarchy between BrownBox.BlackCat and SuperInterface.Cat\n" + 
	"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=319885
public void test0012() {
	this.runNegativeTest(new String[] {
		"p1/GreenBox.java",
		"package p1;\n" +
		"import static p1.BrownBox.*;\n" +
		"interface SuperInterface {\n" +
		"   public static class Cat extends BlackCat {}\n" +
		"}\n" +
		"public interface GreenBox extends SuperInterface {\n" +
		"}\n",
		"p1/BrownBox.java",
		"package p1;\n" +
		"import static p1.GreenBox.*;\n" +
		"public interface BrownBox {\n" +
		"    public static class BlackCat extends GreenBox.Cat {}\n" +
		"}\n",
	},
	"----------\n" + 
	"1. ERROR in p1\\GreenBox.java (at line 4)\n" + 
	"	public static class Cat extends BlackCat {}\n" + 
	"	                    ^^^\n" + 
	"The hierarchy of the type Cat is inconsistent\n" + 
	"----------\n" + 
	"----------\n" + 
	"1. ERROR in p1\\BrownBox.java (at line 4)\n" + 
	"	public static class BlackCat extends GreenBox.Cat {}\n" + 
	"	                                     ^^^^^^^^^^^^\n" + 
	"Cycle detected: a cycle exists in the type hierarchy between BrownBox.BlackCat and SuperInterface.Cat\n" + 
	"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=319885
public void test0013() {
	this.runNegativeTest(new String[] {
		"cycle/X.java",
		"package cycle;\n" +
		"class X extends Y {}\n" +
		"class Y extends X {}\n",
	},
	"----------\n" + 
	"1. ERROR in cycle\\X.java (at line 2)\n" + 
	"	class X extends Y {}\n" + 
	"	      ^\n" + 
	"The hierarchy of the type X is inconsistent\n" + 
	"----------\n" + 
	"2. ERROR in cycle\\X.java (at line 3)\n" + 
	"	class Y extends X {}\n" + 
	"	                ^\n" + 
	"Cycle detected: a cycle exists in the type hierarchy between Y and X\n" + 
	"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=319885
public void test0014() {
	this.runNegativeTest(new String[] {
		"cycle/X.java",
		"package cycle;\n" +
		"class X extends Y {}\n" +
		"class Y extends Z {}\n" +
		"class Z extends A {}\n" +
		"class A extends B {}\n" +
		"class B extends C {}\n" +
		"class C extends X {}\n"
	},
	"----------\n" + 
	"1. ERROR in cycle\\X.java (at line 2)\n" + 
	"	class X extends Y {}\n" + 
	"	      ^\n" + 
	"The hierarchy of the type X is inconsistent\n" + 
	"----------\n" + 
	"2. ERROR in cycle\\X.java (at line 3)\n" + 
	"	class Y extends Z {}\n" + 
	"	      ^\n" + 
	"The hierarchy of the type Y is inconsistent\n" + 
	"----------\n" + 
	"3. ERROR in cycle\\X.java (at line 4)\n" + 
	"	class Z extends A {}\n" + 
	"	      ^\n" + 
	"The hierarchy of the type Z is inconsistent\n" + 
	"----------\n" + 
	"4. ERROR in cycle\\X.java (at line 5)\n" + 
	"	class A extends B {}\n" + 
	"	      ^\n" + 
	"The hierarchy of the type A is inconsistent\n" + 
	"----------\n" + 
	"5. ERROR in cycle\\X.java (at line 6)\n" + 
	"	class B extends C {}\n" + 
	"	      ^\n" + 
	"The hierarchy of the type B is inconsistent\n" + 
	"----------\n" + 
	"6. ERROR in cycle\\X.java (at line 7)\n" + 
	"	class C extends X {}\n" + 
	"	                ^\n" + 
	"Cycle detected: a cycle exists in the type hierarchy between C and X\n" + 
	"----------\n");
}
public void testBug520874a() {
	if (this.complianceLevel < ClassFileConstants.JDK9)
		return; // Limit the new tests to newer levels
	this.runNegativeTest(new String[] {
			"cycle/A.java",
			"package p;\n" +
			"class A extends C {\n" +
			"    static class B {}\n" +
			"}\n",
			"cycle/X.java",
			"package p;\n" +
			"import p.A.B;\n" +
			"class C extends B {}\n" +
			"public class X {\n" +
			"    public static void main(String argv[]) {\n" +
			"      new C();\n" +
			"    }\n" +
			"}\n",
		},
			"----------\n" + 
			"1. ERROR in cycle\\A.java (at line 2)\n" + 
			"	class A extends C {\n" + 
			"	      ^\n" + 
			"The hierarchy of the type A is inconsistent\n" + 
			"----------\n" + 
			"----------\n" + 
			"1. ERROR in cycle\\X.java (at line 3)\n" + 
			"	class C extends B {}\n" + 
			"	                ^\n" + 
			"Cycle detected: a cycle exists in the type hierarchy between C and A\n" + 
			"----------\n");
}
public void testBug520874b() {
	if (this.complianceLevel < ClassFileConstants.JDK9)
		return; // Limit the new tests to newer levels
	this.runNegativeTest(new String[] {
			"cycle/X.java",
			"package p;\n" +
			"import p.A.*;\n" +
			"class C extends B {}\n" +
			"public class X {\n" +
			"    public static void main(String argv[]) {\n" +
			"      new C();\n" +
			"    }\n" +
			"}\n",
			"cycle/A.java",
			"package p;\n" +
			"class A extends C {\n" +
			"    static class B {}\n" +
			"}\n"
		},
			"----------\n" + 
			"1. ERROR in cycle\\X.java (at line 3)\n" + 
			"	class C extends B {}\n" + 
			"	      ^\n" + 
			"The hierarchy of the type C is inconsistent\n" + 
			"----------\n" + 
			"----------\n" + 
			"1. ERROR in cycle\\A.java (at line 2)\n" + 
			"	class A extends C {\n" + 
			"	                ^\n" + 
			"Cycle detected: a cycle exists in the type hierarchy between A and C\n" + 
			"----------\n");
}
public void testBug520874c() {
	if (this.complianceLevel < ClassFileConstants.JDK1_8)
		return; // Limit the new tests to newer levels
	this.runNegativeTest(new String[] {
			"cycle/X.java",
			"package cycle;\n" +
			"import cycle.A.B;\n" +
			"class C implements B {}\n" +
			"public class X {\n" +
			"    public static void main(String argv[]) {\n" +
			"      new C();\n" +
			"    }\n" +
			"}\n",
			"cycle/A.java",
			"package cycle;\n" +
			"class A extends C {\n" +
			"    static interface B {}\n" +
			"}\n"
		},
			"----------\n" + 
			"1. ERROR in cycle\\X.java (at line 3)\n" + 
			"	class C implements B {}\n" + 
			"	      ^\n" + 
			"The hierarchy of the type C is inconsistent\n" + 
			"----------\n" + 
			"----------\n" + 
			"1. ERROR in cycle\\A.java (at line 2)\n" + 
			"	class A extends C {\n" + 
			"	                ^\n" + 
			"Cycle detected: a cycle exists in the type hierarchy between A and C\n" + 
			"----------\n");
}
public void testBug520874d() {
	if (this.complianceLevel < ClassFileConstants.JDK1_8)
		return; // Limit the new tests to newer levels
	this.runNegativeTest(new String[] {
			"cycle/X.java",
			"package cycle;\n" +
			"import cycle.A.*;\n" +
			"class C implements B {}\n" +
			"public class X {\n" +
			"    public static void main(String argv[]) {\n" +
			"      new C();\n" +
			"    }\n" +
			"}\n",
			"cycle/A.java",
			"package cycle;\n" +
			"class A extends C {\n" +
			"    static interface B {}\n" +
			"}\n"
		},
			"----------\n" + 
			"1. ERROR in cycle\\X.java (at line 3)\n" + 
			"	class C implements B {}\n" + 
			"	      ^\n" + 
			"The hierarchy of the type C is inconsistent\n" + 
			"----------\n" + 
			"----------\n" + 
			"1. ERROR in cycle\\A.java (at line 2)\n" + 
			"	class A extends C {\n" + 
			"	                ^\n" + 
			"Cycle detected: a cycle exists in the type hierarchy between A and C\n" + 
			"----------\n");
}
public void testBug520874e() {
	if (this.complianceLevel < ClassFileConstants.JDK1_8)
		return; // Limit the new tests to newer levels
	this.runNegativeTest(new String[] {
			"cycle/X.java",
			"package cycle;\n" +
			"import cycle.A.B;\n" +
			"interface C extends B {}\n" +
			"public class X {\n" +
			"    public static void main(String argv[]) {\n" +
			"    }\n" +
			"}\n",
			"cycle/A.java",
			"package cycle;\n" +
			"class A extends C {\n" +
			"    static interface B {}\n" +
			"}\n"
		},
			"----------\n" + 
			"1. ERROR in cycle\\X.java (at line 3)\n" + 
			"	interface C extends B {}\n" + 
			"	          ^\n" + 
			"The hierarchy of the type C is inconsistent\n" + 
			"----------\n" + 
			"----------\n" + 
			"1. ERROR in cycle\\A.java (at line 2)\n" + 
			"	class A extends C {\n" + 
			"	                ^\n" + 
			"Cycle detected: a cycle exists in the type hierarchy between A and C\n" + 
			"----------\n");
}
public void testBug520874f() {
	if (this.complianceLevel < ClassFileConstants.JDK1_8)
		return; // Limit the new tests to newer levels
	this.runNegativeTest(new String[] {
			"cycle/X.java",
			"package cycle;\n" +
			"import cycle.A.*;\n" +
			"interface C extends B {}\n" +
			"public class X {\n" +
			"    public static void main(String argv[]) {\n" +
			"    }\n" +
			"}\n",
			"cycle/A.java",
			"package cycle;\n" +
			"class A extends C {\n" +
			"    static interface B {}\n" +
			"}\n"
		},
			"----------\n" + 
			"1. ERROR in cycle\\X.java (at line 3)\n" + 
			"	interface C extends B {}\n" + 
			"	          ^\n" + 
			"The hierarchy of the type C is inconsistent\n" + 
			"----------\n" + 
			"----------\n" + 
			"1. ERROR in cycle\\A.java (at line 2)\n" + 
			"	class A extends C {\n" + 
			"	                ^\n" + 
			"Cycle detected: a cycle exists in the type hierarchy between A and C\n" + 
			"----------\n");
}
public void testBug520874g() {
	if (this.complianceLevel < ClassFileConstants.JDK1_8)
		return; // Limit the new tests to newer levels
	this.runNegativeTest(new String[] {
			"cycle/X.java",
			"package cycle;\n" +
			"import cycle.A.B;\n" +
			"interface C extends B {}\n" +
			"public class X {\n" +
			"    public static void main(String argv[]) {\n" +
			"    }\n" +
			"}\n",
			"cycle/A.java",
			"package cycle;\n" +
			"interface A extends C {\n" +
			"    static interface B {}\n" +
			"}\n"
		},
			"----------\n" + 
			"1. ERROR in cycle\\X.java (at line 3)\n" + 
			"	interface C extends B {}\n" + 
			"	          ^\n" + 
			"The hierarchy of the type C is inconsistent\n" + 
			"----------\n" + 
			"----------\n" + 
			"1. ERROR in cycle\\A.java (at line 2)\n" + 
			"	interface A extends C {\n" + 
			"	                    ^\n" + 
			"Cycle detected: a cycle exists in the type hierarchy between A and C\n" + 
			"----------\n");
}
public void testBug520874h() {
	if (this.complianceLevel < ClassFileConstants.JDK1_8)
		return; // Limit the new tests to newer levels
	this.runNegativeTest(new String[] {
			"cycle/X.java",
			"package cycle;\n" +
			"import cycle.A.*;\n" +
			"interface C extends B {}\n" +
			"public class X {\n" +
			"    public static void main(String argv[]) {\n" +
			"    }\n" +
			"}\n",
			"cycle/A.java",
			"package cycle;\n" +
			"interface A extends C {\n" +
			"    static interface B {}\n" +
			"}\n"
		},
			"----------\n" + 
			"1. ERROR in cycle\\X.java (at line 3)\n" + 
			"	interface C extends B {}\n" + 
			"	          ^\n" + 
			"The hierarchy of the type C is inconsistent\n" + 
			"----------\n" + 
			"----------\n" + 
			"1. ERROR in cycle\\A.java (at line 2)\n" + 
			"	interface A extends C {\n" + 
			"	                    ^\n" + 
			"Cycle detected: a cycle exists in the type hierarchy between A and C\n" + 
			"----------\n");
}
public void testBug520874i() {
	if (this.complianceLevel < ClassFileConstants.JDK1_8)
		return; // Limit the new tests to newer levels
	this.runNegativeTest(new String[] {
			"cycle/X.java",
			"package cycle;\n" +
			"import cycle.A.*;\n" +
			"interface C extends A {}\n" +
			"public class X {\n" +
			"    public static void main(String argv[]) {\n" +
			"    }\n" +
			"}\n",
			"cycle/A.java",
			"package cycle;\n" +
			"interface A extends C {\n" +
			"    static interface B {}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in cycle\\X.java (at line 3)\n" + 
		"	interface C extends A {}\n" + 
		"	          ^\n" + 
		"The hierarchy of the type C is inconsistent\n" + 
		"----------\n" + 
		"----------\n" + 
		"1. ERROR in cycle\\A.java (at line 2)\n" + 
		"	interface A extends C {\n" + 
		"	                    ^\n" + 
		"Cycle detected: a cycle exists in the type hierarchy between A and C\n" + 
		"----------\n");
}
public void testBug526681() {
	runNegativeTest(
		new String[] {
			"p/A.java",
			"package p;\n" +
			"import p.B;\n" +
			"public class A extends B {\n" +
			"	public static abstract class C {}\n" +
			"}\n",
			"p/B.java",
			"package p;\n" +
			"import p.A.C;\n" +
			"public abstract class B extends C {}"
		},
		"----------\n" + 
		"1. ERROR in p\\A.java (at line 3)\n" + 
		"	public class A extends B {\n" + 
		"	             ^\n" + 
		"The hierarchy of the type A is inconsistent\n" + 
		"----------\n" + 
		"----------\n" + 
		"1. ERROR in p\\B.java (at line 3)\n" + 
		"	public abstract class B extends C {}\n" + 
		"	                                ^\n" + 
		"Cycle detected: a cycle exists in the type hierarchy between B and A\n" + 
		"----------\n");
}
public void testBug527731() {
	if (this.complianceLevel < ClassFileConstants.JDK1_8) return; // uses diamond, 1.7-inference fails, only 1.8 is good
	runConformTest(
		new String[] {
			"OuterClass.java",
			"import java.util.ArrayList;\n" + 
			"\n" + 
			"public class OuterClass<T> extends ArrayList<OuterClass.InnerTypedClass<T>> {\n" + 
			"	\n" + 
			"	public static interface InnerInterface {}\n" + 
			"	\n" + 
			"	public static class InnerTypedClass<T> implements InnerInterface {}\n" + 
			"	\n" + 
			"	public static void main(String[] args) {\n" + 
			"		OuterClass<String> outerClass = new OuterClass<>();\n" + 
			"		outerClass.add(new InnerTypedClass<>());\n" + 
			"		System.out.println(outerClass);\n" + 
			"	}\n" + 
			"}\n"
		});
}
public static Class<InnerClass15Test> testClass() {
	return InnerClass15Test.class;
}
}
