| /******************************************************************************* |
| * Copyright (c) 2006, 2014 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 org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; |
| import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; |
| |
| import java.util.Map; |
| |
| import junit.framework.Test; |
| |
| @SuppressWarnings({ "unchecked", "rawtypes" }) |
| public class SuperTypeTest extends AbstractRegressionTest { |
| |
| public SuperTypeTest(String name) { |
| super(name); |
| } |
| // Static initializer to specify tests subset using TESTS_* static variables |
| // All specified tests which does not belong to the class are skipped... |
| static { |
| // TESTS_NAMES = new String[] { "test000" }; |
| // TESTS_NUMBERS = new int[] { 42, 43, 44 }; |
| // TESTS_RANGE = new int[] { 11, -1 }; |
| } |
| |
| public static Test suite() { |
| return buildAllCompliancesTestSuite(testClass()); |
| } |
| |
| public static Class testClass() { |
| return SuperTypeTest.class; |
| } |
| |
| /** |
| * http://bugs.eclipse.org/bugs/show_bug.cgi?id=136106 |
| */ |
| public void test001() { |
| this.runConformTest( |
| new String[] { |
| /* org.eclipse.curiosity.A */ |
| "org/eclipse/curiosity/A.java", |
| "package org.eclipse.curiosity;\n" + |
| "public abstract class A implements InterfaceA {\n" + |
| " private void e() {\n" + |
| " }\n" + |
| " public void f() {\n" + |
| " this.e();\n" + |
| " }\n" + |
| "}", |
| /* org.eclipse.curiosity.InterfaceA */ |
| "org/eclipse/curiosity/InterfaceA.java", |
| "package org.eclipse.curiosity;\n" + |
| "public interface InterfaceA extends InterfaceBase {}\n", |
| "org/eclipse/curiosity/InterfaceBase.java", |
| /* org.eclipse.curiosity.InterfaceBase */ |
| "package org.eclipse.curiosity;\n" + |
| "public interface InterfaceBase {\n" + |
| " public void a();\n" + |
| " public void b();\n" + |
| " public void c();\n" + |
| " public void d();\n" + |
| "}" |
| } |
| ); |
| } |
| // was Compliance_1_x#test001 |
| public void test002() { |
| String[] sources = new String[] { |
| "p1/Test.java", |
| "package p1; \n"+ |
| "public class Test { \n"+ |
| " public static void main(String[] arguments) { \n"+ |
| " new Test().foo(); \n"+ |
| " } \n"+ |
| " class M { \n"+ |
| " } \n"+ |
| " void foo(){ \n"+ |
| " class Y extends Secondary { \n"+ |
| " M m; \n"+ |
| " }; \n"+ |
| " System.out.println(\"SUCCESS\"); \n" + |
| " } \n"+ |
| "} \n" + |
| "class Secondary { \n" + |
| " class M {} \n" + |
| "} \n" |
| }; |
| if (this.complianceLevel == ClassFileConstants.JDK1_3) { |
| runNegativeTest( |
| sources, |
| "----------\n" + |
| "1. ERROR in p1\\Test.java (at line 10)\n" + |
| " M m; \n" + |
| " ^\n" + |
| "The type M is defined in an inherited type and an enclosing scope\n" + |
| "----------\n"); |
| } else { |
| runConformTest( |
| sources, |
| "SUCCESS"); |
| } |
| } |
| |
| // was Compliance_1_x#test002 |
| public void test003() { |
| String[] sources = new String[] { |
| "p1/Test.java", |
| "package p1; \n"+ |
| "public class Test { \n"+ |
| " public static void main(String[] arguments) { \n"+ |
| " new Test().foo(); \n"+ |
| " } \n"+ |
| " String bar() { \n"+ |
| " return \"FAILED\"; \n" + |
| " } \n"+ |
| " void foo(){ \n"+ |
| " class Y extends Secondary { \n"+ |
| " String z = bar(); \n" + |
| " }; \n"+ |
| " System.out.println(new Y().z); \n" + |
| " } \n"+ |
| "} \n" + |
| "class Secondary { \n" + |
| " String bar(){ return \"SUCCESS\"; } \n" + |
| "} \n" |
| }; |
| if (this.complianceLevel == ClassFileConstants.JDK1_3) { |
| runNegativeTest( |
| sources, |
| "----------\n" + |
| "1. ERROR in p1\\Test.java (at line 11)\n" + |
| " String z = bar(); \n" + |
| " ^^^\n" + |
| "The method bar is defined in an inherited type and an enclosing scope\n" + |
| "----------\n"); |
| } else { |
| runConformTest( |
| sources, |
| "SUCCESS"); |
| } |
| } |
| |
| // was Compliance_1_x#test003 |
| public void test004() { |
| String[] sources = new String[] { |
| "p1/Test.java", |
| "package p1; \n"+ |
| "public class Test { \n"+ |
| " public static void main(String[] arguments) { \n"+ |
| " new Test().foo(); \n"+ |
| " } \n"+ |
| " String bar = \"FAILED\";"+ |
| " void foo(){ \n"+ |
| " class Y extends Secondary { \n"+ |
| " String z = bar; \n"+ |
| " }; \n"+ |
| " System.out.println(new Y().z); \n" + |
| " } \n"+ |
| "} \n" + |
| "class Secondary { \n" + |
| " String bar = \"SUCCESS\"; \n" + |
| "} \n" |
| }; |
| if (this.complianceLevel == ClassFileConstants.JDK1_3) { |
| runNegativeTest( |
| sources, |
| "----------\n" + |
| "1. ERROR in p1\\Test.java (at line 8)\n" + |
| " String z = bar; \n" + |
| " ^^^\n" + |
| "The field bar is defined in an inherited type and an enclosing scope \n" + |
| "----------\n"); |
| } else { |
| runConformTest( |
| sources, |
| "SUCCESS"); |
| } |
| } |
| |
| // was Compliance_1_x#test004 |
| public void test005() { |
| this.runConformTest( |
| new String[] { |
| "p1/Test.java", |
| "package p1; \n"+ |
| "public class Test { \n"+ |
| " public static void main(String[] arguments) { \n"+ |
| " new Test().foo(); \n"+ |
| " } \n"+ |
| " String bar() { \n"+ |
| " return \"SUCCESS\"; \n" + |
| " } \n"+ |
| " void foo(){ \n"+ |
| " class Y extends Secondary { \n"+ |
| " String z = bar(); \n" + |
| " }; \n"+ |
| " System.out.println(new Y().z); \n" + |
| " } \n"+ |
| "} \n" + |
| "class Secondary { \n" + |
| " private String bar(){ return \"FAILED\"; } \n" + |
| "} \n" |
| }, |
| "SUCCESS"); |
| } |
| |
| // was Compliance_1_x#test005 |
| public void test006() { |
| this.runConformTest( |
| new String[] { |
| "p1/Test.java", |
| "package p1; \n"+ |
| "public class Test { \n"+ |
| " public static void main(String[] arguments) { \n"+ |
| " new Test().foo(); \n"+ |
| " } \n"+ |
| " String bar = \"SUCCESS\";"+ |
| " void foo(){ \n"+ |
| " class Y extends Secondary { \n"+ |
| " String z = bar; \n"+ |
| " }; \n"+ |
| " System.out.println(new Y().z); \n" + |
| " } \n"+ |
| "} \n" + |
| "class Secondary { \n" + |
| " private String bar = \"FAILED\"; \n" + |
| "} \n" |
| }, |
| "SUCCESS"); |
| } |
| |
| // was Compliance_1_x#test006 |
| public void test007() { |
| this.runNegativeTest( |
| new String[] { |
| "p1/Test.java", |
| "package p1; \n"+ |
| "public class Test { \n"+ |
| " public static void main(String[] arguments) { \n"+ |
| " new Test().foo(); \n"+ |
| " } \n"+ |
| " String bar() { \n"+ |
| " return \"FAILED\"; \n" + |
| " } \n"+ |
| " void foo(){ \n"+ |
| " class Y extends Secondary { \n"+ |
| " String z = bar(); \n" + |
| " }; \n"+ |
| " System.out.println(new Y().z); \n" + |
| " } \n"+ |
| "} \n" + |
| "class Secondary { \n" + |
| " String bar(int i){ return \"SUCCESS\"; } \n" + |
| "} \n" |
| }, |
| "----------\n" + |
| "1. ERROR in p1\\Test.java (at line 11)\n" + |
| " String z = bar(); \n" + |
| " ^^^\n" + |
| "The method bar(int) in the type Secondary is not applicable for the arguments ()\n" + |
| "----------\n" |
| ); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=77918 |
| // default is silent |
| public void test008() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X implements I {}\n" + |
| "class Y extends X implements I, J {}" + |
| "interface I {}\n" + |
| "interface J {}\n" |
| }, |
| "" |
| ); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=77918 |
| // raising an error |
| public void test009() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportRedundantSuperinterface, CompilerOptions.ERROR); |
| runNegativeTest( |
| // test directory preparation |
| true /* flush output directory */, |
| new String[] { /* test files */ |
| "X.java", |
| "public class X implements I {}\n" + |
| "class Y extends X implements I, J {}\n" + |
| "interface I {}\n" + |
| "interface J {}\n" |
| }, |
| // compiler options |
| null /* no class libraries */, |
| customOptions /* custom options */, |
| // compiler results |
| "----------\n" + /* expected compiler log */ |
| "1. ERROR in X.java (at line 2)\n" + |
| " class Y extends X implements I, J {}\n" + |
| " ^\n" + |
| "Redundant superinterface I for the type Y, already defined by X\n" + |
| "----------\n", |
| // javac options |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError /* javac test options */); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=77918 |
| // raising an error - deeper hierarchy |
| public void test010() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportRedundantSuperinterface, CompilerOptions.ERROR); |
| runNegativeTest( |
| // test directory preparation |
| true /* flush output directory */, |
| new String[] { /* test files */ |
| "X.java", |
| "public class X implements I {}\n" + |
| "class Y extends X {}\n" + |
| "class Z extends Y implements J, I {}\n" + |
| "interface I {}\n" + |
| "interface J {}\n" |
| }, |
| // compiler options |
| null /* no class libraries */, |
| customOptions /* custom options */, |
| // compiler results |
| "----------\n" + /* expected compiler log */ |
| "1. ERROR in X.java (at line 3)\n" + |
| " class Z extends Y implements J, I {}\n" + |
| " ^\n" + |
| "Redundant superinterface I for the type Z, already defined by X\n" + |
| "----------\n", |
| // javac options |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError /* javac test options */); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=77918 |
| // no error - deeper hierarchy |
| public void test011() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportRedundantSuperinterface, CompilerOptions.ERROR); |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X implements I {}\n" + |
| "class Y extends X {}\n" + |
| "class Z extends Y implements J {}" + |
| "interface I {}\n" + |
| "interface J {}\n" |
| }, |
| "", |
| null /* no extra class libraries */, |
| true /* flush output directory */, |
| null /* no vm arguments */, |
| customOptions, |
| null /* no custom requestor*/); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=77918 |
| // error - extending interfaces |
| public void test012() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportRedundantSuperinterface, CompilerOptions.ERROR); |
| runNegativeTest( |
| // test directory preparation |
| true /* flush output directory */, |
| new String[] { /* test files */ |
| "X.java", |
| "public class X implements J {}\n" + |
| "class Y extends X implements I {}\n" + |
| "interface I {}\n" + |
| "interface J extends I {}\n" |
| }, |
| // compiler options |
| null /* no class libraries */, |
| customOptions /* custom options */, |
| // compiler results |
| "----------\n" + /* expected compiler log */ |
| "1. ERROR in X.java (at line 2)\n" + |
| " class Y extends X implements I {}\n" + |
| " ^\n" + |
| "Redundant superinterface I for the type Y, already defined by J\n" + |
| "----------\n", |
| // javac options |
| JavacTestOptions.Excuse.EclipseWarningConfiguredAsError /* javac test options */); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=288749 |
| public void test013() { |
| if (this.complianceLevel < ClassFileConstants.JDK1_5) return; |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportRedundantSuperinterface, CompilerOptions.ERROR); |
| runNegativeTest( |
| // test directory preparation |
| true /* flush output directory */, |
| new String[] { /* test files */ |
| "X.java", |
| "import java.util.*;\n" + |
| "interface X<E> extends List<E>, Collection<E>, Iterable<E> {}\n" + |
| "interface Y<E> extends Collection<E>, List<E> {}\n" + |
| "interface XXX<E> extends Iterable<E>, List<E>, Collection<E> {}\n" + |
| "abstract class Z implements List<Object>, Collection<Object> {}\n" + |
| "abstract class ZZ implements Collection<Object>, List<Object> {}" |
| }, |
| // compiler options |
| null /* no class libraries */, |
| customOptions /* custom options */, |
| // compiler results |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " interface X<E> extends List<E>, Collection<E>, Iterable<E> {}\n" + |
| " ^^^^^^^^^^\n" + |
| "Redundant superinterface Collection<E> for the type X<E>, already defined by List<E>\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 2)\n" + |
| " interface X<E> extends List<E>, Collection<E>, Iterable<E> {}\n" + |
| " ^^^^^^^^\n" + |
| "Redundant superinterface Iterable<E> for the type X<E>, already defined by List<E>\n" + |
| "----------\n" + |
| "3. ERROR in X.java (at line 3)\n" + |
| " interface Y<E> extends Collection<E>, List<E> {}\n" + |
| " ^^^^^^^^^^\n" + |
| "Redundant superinterface Collection<E> for the type Y<E>, already defined by List<E>\n" + |
| "----------\n" + |
| "4. ERROR in X.java (at line 4)\n" + |
| " interface XXX<E> extends Iterable<E>, List<E>, Collection<E> {}\n" + |
| " ^^^^^^^^\n" + |
| "Redundant superinterface Iterable<E> for the type XXX<E>, already defined by List<E>\n" + |
| "----------\n" + |
| "5. ERROR in X.java (at line 4)\n" + |
| " interface XXX<E> extends Iterable<E>, List<E>, Collection<E> {}\n" + |
| " ^^^^^^^^^^\n" + |
| "Redundant superinterface Collection<E> for the type XXX<E>, already defined by List<E>\n" + |
| "----------\n" + |
| "6. ERROR in X.java (at line 5)\n" + |
| " abstract class Z implements List<Object>, Collection<Object> {}\n" + |
| " ^^^^^^^^^^\n" + |
| "Redundant superinterface Collection<Object> for the type Z, already defined by List<Object>\n" + |
| "----------\n" + |
| "7. ERROR in X.java (at line 6)\n" + |
| " abstract class ZZ implements Collection<Object>, List<Object> {}\n" + |
| " ^^^^^^^^^^\n" + |
| "Redundant superinterface Collection<Object> for the type ZZ, already defined by List<Object>\n" + |
| "----------\n", |
| JavacTestOptions.SKIP); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=288749 |
| public void test014() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportRedundantSuperinterface, CompilerOptions.ERROR); |
| runNegativeTest( |
| // test directory preparation |
| true /* flush output directory */, |
| new String[] { /* test files */ |
| "X.java", |
| "public class X implements I, J {}", |
| "I.java", |
| "public interface I {}", |
| "J.java", |
| "public interface J extends I {}" |
| }, |
| // compiler options |
| null /* no class libraries */, |
| customOptions /* custom options */, |
| // compiler results |
| "----------\n" + |
| "1. ERROR in X.java (at line 1)\n" + |
| " public class X implements I, J {}\n" + |
| " ^\n" + |
| "Redundant superinterface I for the type X, already defined by J\n" + |
| "----------\n", |
| JavacTestOptions.SKIP); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=320911 (as is) |
| public void test015() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportRedundantSuperinterface, CompilerOptions.ERROR); |
| runNegativeTest( |
| // test directory preparation |
| true /* flush output directory */, |
| new String[] { /* test files */ |
| "X.java", |
| "interface IVerticalRulerColumn {}\n" + |
| "interface IVerticalRulerInfo {}\n" + |
| "interface IVerticalRulerInfoExtension {}\n" + |
| "interface IChangeRulerColumn extends IVerticalRulerColumn, IVerticalRulerInfoExtension {}\n" + |
| "interface IRevisionRulerColumn extends IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + |
| "public final class X implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension, IChangeRulerColumn, IRevisionRulerColumn {}\n" |
| }, |
| // compiler options |
| null /* no class libraries */, |
| customOptions /* custom options */, |
| // compiler results |
| "----------\n" + |
| "1. ERROR in X.java (at line 6)\n" + |
| " public final class X implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension, IChangeRulerColumn, IRevisionRulerColumn {}\n" + |
| " ^^^^^^^^^^^^^^^^^^^^\n" + |
| "Redundant superinterface IVerticalRulerColumn for the type X, already defined by IChangeRulerColumn\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 6)\n" + |
| " public final class X implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension, IChangeRulerColumn, IRevisionRulerColumn {}\n" + |
| " ^^^^^^^^^^^^^^^^^^\n" + |
| "Redundant superinterface IVerticalRulerInfo for the type X, already defined by IRevisionRulerColumn\n" + |
| "----------\n" + |
| "3. ERROR in X.java (at line 6)\n" + |
| " public final class X implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension, IChangeRulerColumn, IRevisionRulerColumn {}\n" + |
| " ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + |
| "Redundant superinterface IVerticalRulerInfoExtension for the type X, already defined by IChangeRulerColumn\n" + |
| "----------\n", |
| JavacTestOptions.SKIP); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=320911 (variation) |
| public void test016() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportRedundantSuperinterface, CompilerOptions.ERROR); |
| runNegativeTest( |
| // test directory preparation |
| true /* flush output directory */, |
| new String[] { /* test files */ |
| "X.java", |
| "interface IVerticalRulerColumn {}\n" + |
| "interface IVerticalRulerInfo {}\n" + |
| "interface IVerticalRulerInfoExtension {}\n" + |
| "interface IChangeRulerColumn extends IVerticalRulerColumn, IVerticalRulerInfoExtension {}\n" + |
| "interface IRevisionRulerColumn extends IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + |
| "class Z implements IChangeRulerColumn {}\n" + |
| "class Y extends Z implements IRevisionRulerColumn {}\n" + |
| "public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" |
| }, |
| // compiler options |
| null /* no class libraries */, |
| customOptions /* custom options */, |
| // compiler results |
| "----------\n" + |
| "1. ERROR in X.java (at line 8)\n" + |
| " public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + |
| " ^^^^^^^^^^^^^^^^^^^^\n" + |
| "Redundant superinterface IVerticalRulerColumn for the type X, already defined by IRevisionRulerColumn\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 8)\n" + |
| " public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + |
| " ^^^^^^^^^^^^^^^^^^\n" + |
| "Redundant superinterface IVerticalRulerInfo for the type X, already defined by IRevisionRulerColumn\n" + |
| "----------\n" + |
| "3. ERROR in X.java (at line 8)\n" + |
| " public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + |
| " ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + |
| "Redundant superinterface IVerticalRulerInfoExtension for the type X, already defined by IRevisionRulerColumn\n" + |
| "----------\n", |
| JavacTestOptions.SKIP); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=320911 (variation) |
| public void test017() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportRedundantSuperinterface, CompilerOptions.ERROR); |
| runNegativeTest( |
| // test directory preparation |
| true /* flush output directory */, |
| new String[] { /* test files */ |
| "X.java", |
| "interface IVerticalRulerColumn {}\n" + |
| "interface IVerticalRulerInfo {}\n" + |
| "interface IVerticalRulerInfoExtension {}\n" + |
| "interface IChangeRulerColumn extends IVerticalRulerColumn, IVerticalRulerInfoExtension {}\n" + |
| "interface IRevisionRulerColumn extends IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + |
| "class Z implements IRevisionRulerColumn{}\n" + |
| "class C extends Z {}\n" + |
| "class B extends C implements IChangeRulerColumn {}\n" + |
| "class H extends B {}\n" + |
| "class Y extends H {}\n" + |
| "public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" |
| }, |
| // compiler options |
| null /* no class libraries */, |
| customOptions /* custom options */, |
| // compiler results |
| "----------\n" + |
| "1. ERROR in X.java (at line 11)\n" + |
| " public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + |
| " ^^^^^^^^^^^^^^^^^^^^\n" + |
| "Redundant superinterface IVerticalRulerColumn for the type X, already defined by IRevisionRulerColumn\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 11)\n" + |
| " public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + |
| " ^^^^^^^^^^^^^^^^^^\n" + |
| "Redundant superinterface IVerticalRulerInfo for the type X, already defined by IRevisionRulerColumn\n" + |
| "----------\n" + |
| "3. ERROR in X.java (at line 11)\n" + |
| " public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + |
| " ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + |
| "Redundant superinterface IVerticalRulerInfoExtension for the type X, already defined by IRevisionRulerColumn\n" + |
| "----------\n", |
| JavacTestOptions.SKIP); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=320911 (variation) |
| public void test018() { |
| Map customOptions = getCompilerOptions(); |
| customOptions.put(CompilerOptions.OPTION_ReportRedundantSuperinterface, CompilerOptions.ERROR); |
| runNegativeTest( |
| // test directory preparation |
| true /* flush output directory */, |
| new String[] { /* test files */ |
| "X.java", |
| "interface IVerticalRulerColumn {}\n" + |
| "interface IVerticalRulerInfo {}\n" + |
| "interface IVerticalRulerInfoExtension {}\n" + |
| "interface IChangeRulerColumn extends IVerticalRulerColumn, IVerticalRulerInfoExtension {}\n" + |
| "interface IRevisionRulerColumn extends IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + |
| "class Z implements IVerticalRulerInfoExtension {}\n" + |
| "class C extends Z {}\n" + |
| "class B extends C implements IChangeRulerColumn {}\n" + |
| "class H extends B implements IVerticalRulerInfo {}\n" + |
| "class Y extends H implements IVerticalRulerColumn {}\n" + |
| "public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" |
| }, |
| // compiler options |
| null /* no class libraries */, |
| customOptions /* custom options */, |
| // compiler results |
| "----------\n" + |
| "1. ERROR in X.java (at line 10)\n" + |
| " class Y extends H implements IVerticalRulerColumn {}\n" + |
| " ^^^^^^^^^^^^^^^^^^^^\n" + |
| "Redundant superinterface IVerticalRulerColumn for the type Y, already defined by IChangeRulerColumn\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 11)\n" + |
| " public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + |
| " ^^^^^^^^^^^^^^^^^^^^\n" + |
| "Redundant superinterface IVerticalRulerColumn for the type X, already defined by Y\n" + |
| "----------\n" + |
| "3. ERROR in X.java (at line 11)\n" + |
| " public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + |
| " ^^^^^^^^^^^^^^^^^^\n" + |
| "Redundant superinterface IVerticalRulerInfo for the type X, already defined by H\n" + |
| "----------\n" + |
| "4. ERROR in X.java (at line 11)\n" + |
| " public final class X extends Y implements IVerticalRulerColumn, IVerticalRulerInfo, IVerticalRulerInfoExtension {}\n" + |
| " ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + |
| "Redundant superinterface IVerticalRulerInfoExtension for the type X, already defined by Z\n" + |
| "----------\n", |
| JavacTestOptions.SKIP); |
| } |
| } |