blob: c53e2dc91d08494e9b42eceeaf8548742bf719e7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2010 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.jdt.core.tests.compiler.regression;
import java.io.File;
import java.util.Map;
import junit.framework.Test;
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.internal.compiler.classfmt.ClassFileConstants;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
public class EnumTest extends AbstractComparableTest {
String reportMissingJavadocComments = null;
public EnumTest(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[] { 181 };
// TESTS_RANGE = new int[] { 21, 50 };
}
public static Test suite() {
return buildComparableTestSuite(testClass());
}
public static Class testClass() {
return EnumTest.class;
}
protected Map getCompilerOptions() {
Map options = super.getCompilerOptions();
options.put(CompilerOptions.OPTION_DocCommentSupport, CompilerOptions.ENABLED);
options.put(CompilerOptions.OPTION_ReportInvalidJavadoc, CompilerOptions.ERROR);
options.put(CompilerOptions.OPTION_ReportInvalidJavadocTags, CompilerOptions.ENABLED);
options.put(CompilerOptions.OPTION_ReportInvalidJavadocTagsVisibility, CompilerOptions.PRIVATE);
options.put(CompilerOptions.OPTION_ReportMissingJavadocTags, CompilerOptions.ERROR);
options.put(CompilerOptions.OPTION_ReportMissingJavadocTagsVisibility, CompilerOptions.PRIVATE);
options.put(CompilerOptions.OPTION_ReportMissingOverrideAnnotationForInterfaceMethodImplementation, CompilerOptions.DISABLED);
options.put(CompilerOptions.OPTION_ReportUnusedLocal, CompilerOptions.IGNORE);
options.put(CompilerOptions.OPTION_ReportUnusedParameter, CompilerOptions.IGNORE);
options.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.IGNORE);
if (this.reportMissingJavadocComments != null)
options.put(CompilerOptions.OPTION_ReportMissingJavadocComments, this.reportMissingJavadocComments);
return options;
}
/* (non-Javadoc)
* @see junit.framework.TestCase#setUp()
*/
protected void setUp() throws Exception {
super.setUp();
this.reportMissingJavadocComments = null;
}
// test simple valid enum and its usage
public void test000() {
runConformTest(
new String[] {
"e/X.java",
"package e;\n" +
"import e.T;\n" +
"import static e.T.*;\n" +
"\n" +
"public class X {\n" +
" public static void main(String[] args) {\n" +
" System.out.print(\"JDTCore team:\");\n" +
" T oldest = null;\n" +
" int maxAge = Integer.MIN_VALUE;\n" +
" for (T t : T.values()) {\n" +
" if (t == YODA) continue;// skip YODA\n" +
" t.setRole(t.isManager());\n" +
" if (t.age() > maxAge) {\n" +
" oldest = t;\n" +
" maxAge = t.age();\n" +
" }\n" +
" System.out.print(\" \"+ t + ':'+t.age()+':'+location(t)+':'+t.role);\n" +
" }\n" +
" System.out.println(\" WINNER is:\" + T.valueOf(oldest.name()));\n" +
" }\n" +
"\n" +
" private enum Location { SNZ, OTT }\n" +
"\n" +
" private static Location location(T t) {\n" +
" switch(t) {\n" +
" case PHILIPPE: \n" +
" case DAVID:\n" +
" case JEROME:\n" +
" case FREDERIC:\n" +
" return Location.SNZ;\n" +
" case OLIVIER:\n" +
" case KENT:\n" +
" return Location.OTT;\n" +
" default:\n" +
" throw new AssertionError(\"Unknown team member: \" + t);\n" +
" }\n" +
" }\n" +
"}\n",
"e/T.java",
"package e;\n" +
"public enum T {\n" +
" PHILIPPE(37) {\n" +
" public boolean isManager() {\n" +
" return true;\n" +
" }\n" +
" },\n" +
" DAVID(27),\n" +
" JEROME(33),\n" +
" OLIVIER(35),\n" +
" KENT(40),\n" +
" YODA(41),\n" +
" FREDERIC;\n" +
" final static int OLD = 41;\n" +
"\n" +
" enum Role { M, D }\n" +
"\n" +
" int age;\n" +
" Role role;\n" +
"\n" +
" T() { this(OLD); }\n" +
" T(int age) {\n" +
" this.age = age;\n" +
" }\n" +
" public int age() { return this.age; }\n" +
" public boolean isManager() { return false; }\n" +
" void setRole(boolean mgr) {\n" +
" this.role = mgr ? Role.M : Role.D;\n" +
" }\n" +
"}\n"
},
"JDTCore team: PHILIPPE:37:SNZ:M DAVID:27:SNZ:D JEROME:33:SNZ:D OLIVIER:35:OTT:D KENT:40:OTT:D FREDERIC:41:SNZ:D WINNER is:FREDERIC"
);
}
// check assignment to enum constant is disallowed
public void test001() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X { \n" +
" BLEU, \n" +
" BLANC, \n" +
" ROUGE;\n" +
" static {\n" +
" BLEU = null;\n" +
" }\n" +
"}"
},
"----------\n" +
"1. ERROR in X.java (at line 6)\n" +
" BLEU = null;\n" +
" ^^^^\n" +
"The final field X.BLEU cannot be assigned\n" +
"----------\n");
}
// check diagnosis for duplicate enum constants
public void test002() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X { \n" +
" \n" +
" BLEU, \n" +
" BLANC, \n" +
" ROUGE,\n" +
" BLEU;\n" +
"}"
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" BLEU, \n" +
" ^^^^\n" +
"Duplicate field X.BLEU\n" +
"----------\n" +
"2. ERROR in X.java (at line 6)\n" +
" BLEU;\n" +
" ^^^^\n" +
"Duplicate field X.BLEU\n" +
"----------\n");
}
// check properly rejecting enum constant modifiers
public void test003() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X { \n" +
" \n" +
" public BLEU, \n" +
" transient BLANC, \n" +
" ROUGE, \n" +
" abstract RED {\n" +
" void test() {}\n" +
" }\n" +
"}"
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" public BLEU, \n" +
" ^^^^\n" +
"Illegal modifier for the enum constant BLEU; no modifier is allowed\n" +
"----------\n" +
"2. ERROR in X.java (at line 4)\n" +
" transient BLANC, \n" +
" ^^^^^\n" +
"Illegal modifier for the enum constant BLANC; no modifier is allowed\n" +
"----------\n" +
"3. ERROR in X.java (at line 6)\n" +
" abstract RED {\n" +
" ^^^\n" +
"Illegal modifier for the enum constant RED; no modifier is allowed\n" +
"----------\n");
}
// check using an enum constant
public void test004() {
this.runConformTest(
new String[] {
"X.java",
"public enum X { \n" +
" \n" +
" BLEU,\n" +
" BLANC,\n" +
" ROUGE;\n" +
" \n" +
" public static void main(String[] args) {\n" +
" System.out.println(BLEU);\n" +
" }\n" +
" \n" +
"}\n"
},
"BLEU");
}
// check method override diagnosis (with no enum constants)
public void test005() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X { \n" +
" ;\n" +
" protected Object clone() { return this; }\n" +
"}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" protected Object clone() { return this; }\n" +
" ^^^^^^^\n" +
"Cannot override the final method from Enum<X>\n" +
"----------\n" +
"2. WARNING in X.java (at line 3)\n" +
" protected Object clone() { return this; }\n" +
" ^^^^^^^\n" +
"The method clone() of type X should be tagged with @Override since it actually overrides a superclass method\n" +
"----------\n");
}
// check generated #values() method
public void test006() {
this.runConformTest(
new String[] {
"X.java",
"public enum X { \n" +
" \n" +
" BLEU,\n" +
" BLANC,\n" +
" ROUGE;\n" +
" \n" +
" public static void main(String[] args) {\n" +
" for(X x: X.values()) {\n" +
" System.out.print(x);\n" +
" }\n" +
" }\n" +
" \n" +
"}\n"
},
"BLEUBLANCROUGE");
}
// tolerate user definition for $VALUES
public void test007() {
this.runConformTest(
new String[] {
"X.java",
"public enum X { \n" +
" \n" +
" BLEU,\n" +
" BLANC,\n" +
" ROUGE;\n" +
" \n" +
" int $VALUES;\n" +
" public static void main(String[] args) {\n" +
" for(X x: X.values()) {\n" +
" System.out.print(x);\n" +
" }\n" +
" }\n" +
" \n" +
"}\n"
},
"BLEUBLANCROUGE");
}
// reject user definition for #values()
public void test008() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X { \n" +
" \n" +
" BLEU,\n" +
" BLANC,\n" +
" ROUGE;\n" +
" \n" +
" void dup() {} \n" +
" void values() {} \n" +
" void dup() {} \n" +
" void values() {} \n" +
" Missing dup() {} \n" +
" public static void main(String[] args) {\n" +
" for(X x: X.values()) {\n" +
" System.out.print(x);\n" +
" }\n" +
" }\n" +
" \n" +
"}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 7)\n" +
" void dup() {} \n" +
" ^^^^^\n" +
"Duplicate method dup() in type X\n" +
"----------\n" +
"2. ERROR in X.java (at line 8)\n" +
" void values() {} \n" +
" ^^^^^^^^\n" +
"The enum X already defines the method values() implicitly\n" +
"----------\n" +
"3. ERROR in X.java (at line 9)\n" +
" void dup() {} \n" +
" ^^^^^\n" +
"Duplicate method dup() in type X\n" +
"----------\n" +
"4. ERROR in X.java (at line 10)\n" +
" void values() {} \n" +
" ^^^^^^^^\n" +
"The enum X already defines the method values() implicitly\n" +
"----------\n" +
"5. ERROR in X.java (at line 11)\n" +
" Missing dup() {} \n" +
" ^^^^^^^\n" +
"Missing cannot be resolved to a type\n" +
"----------\n" +
"6. ERROR in X.java (at line 11)\n" +
" Missing dup() {} \n" +
" ^^^^^\n" +
"Duplicate method dup() in type X\n" +
"----------\n");
}
// switch on enum
public void test009() {
this.runConformTest(
new String[] {
"X.java",
"public enum X {\n" +
" \n" +
" BLEU,\n" +
" BLANC,\n" +
" ROUGE;\n" +
" \n" +
" //void values() {}\n" +
" \n" +
" public static void main(String[] args) {\n" +
" X x = BLEU;\n" +
" switch(x) {\n" +
" case BLEU :\n" +
" System.out.println(\"SUCCESS\");\n" +
" break;\n" +
" case BLANC :\n" +
" case ROUGE :\n" +
" System.out.println(\"FAILED\");\n" +
" break;\n" +
" }\n" +
" }\n" +
" \n" +
"}"
},
"SUCCESS");
}
// duplicate switch case
public void test010() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X {\n" +
" \n" +
" BLEU,\n" +
" BLANC,\n" +
" ROUGE;\n" +
" \n" +
" //void values() {}\n" +
" \n" +
" public static void main(String[] args) {\n" +
" X x = BLEU;\n" +
" switch(x) {\n" +
" case BLEU :\n" +
" break;\n" +
" case BLEU :\n" +
" case BLANC :\n" +
" case ROUGE :\n" +
" System.out.println(\"FAILED\");\n" +
" break;\n" +
" }\n" +
" }\n" +
" \n" +
"}"
},
"----------\n" +
"1. ERROR in X.java (at line 12)\n" +
" case BLEU :\n" +
" ^^^^^^^^^\n" +
"Duplicate case\n" +
"----------\n" +
"2. ERROR in X.java (at line 14)\n" +
" case BLEU :\n" +
" ^^^^^^^^^\n" +
"Duplicate case\n" +
"----------\n");
}
// reject user definition for #values()
public void test011() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X { \n" +
" \n" +
" BLEU,\n" +
" BLANC,\n" +
" ROUGE;\n" +
" \n" +
" void values() {} \n" +
" void values() {} \n" +
" public static void main(String[] args) {\n" +
" for(X x: X.values()) {\n" +
" System.out.print(x);\n" +
" }\n" +
" }\n" +
" \n" +
"}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 7)\n" +
" void values() {} \n" +
" ^^^^^^^^\n" +
"The enum X already defines the method values() implicitly\n" +
"----------\n" +
"2. ERROR in X.java (at line 8)\n" +
" void values() {} \n" +
" ^^^^^^^^\n" +
"The enum X already defines the method values() implicitly\n" +
"----------\n");
}
// check abstract method diagnosis
public void test012() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X implements Runnable { \n" +
" \n" +
" BLEU,\n" +
" BLANC,\n" +
" ROUGE;\n" +
"}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 1)\n" +
" public enum X implements Runnable { \n" +
" ^\n" +
"The type X must implement the inherited abstract method Runnable.run()\n" +
"----------\n");
}
// check enum constants with wrong arguments
public void test013() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X { \n" +
" \n" +
" BLEU(10),\n" +
" BLANC(20),\n" +
" ROUGE(30);\n" +
"}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" BLEU(10),\n" +
" ^^^^\n" +
"The constructor X(int) is undefined\n" +
"----------\n" +
"2. ERROR in X.java (at line 4)\n" +
" BLANC(20),\n" +
" ^^^^^\n" +
"The constructor X(int) is undefined\n" +
"----------\n" +
"3. ERROR in X.java (at line 5)\n" +
" ROUGE(30);\n" +
" ^^^^^\n" +
"The constructor X(int) is undefined\n" +
"----------\n");
}
// check enum constants with extra arguments
public void test014() {
this.runConformTest(
new String[] {
"X.java",
"public enum X { \n" +
" \n" +
" BLEU(10),\n" +
" BLANC(20),\n" +
" ROUGE(30);\n" +
"\n" +
" int val;\n" +
" X(int val) {\n" +
" this.val = val;\n" +
" }\n" +
"\n" +
" public static void main(String[] args) {\n" +
" for(X x: values()) {\n" +
" System.out.print(x.val);\n" +
" }\n" +
" }\n" +
"}\n"
},
"102030");
}
// check enum constants with wrong arguments
public void test015() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X { \n" +
" \n" +
" BLEU(10),\n" +
" BLANC(),\n" +
" ROUGE(30);\n" +
"\n" +
" int val;\n" +
" X(int val) {\n" +
" this.val = val;\n" +
" }\n" +
"\n" +
" public static void main(String[] args) {\n" +
" for(X x: values()) {\n" +
" System.out.print(x.val);\n" +
" }\n" +
" }\n" +
"}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 4)\n" +
" BLANC(),\n" +
" ^^^^^\n" +
"The constructor X() is undefined\n" +
"----------\n");
}
// check enum constants with wrong arguments
public void test016() {
this.runConformTest(
new String[] {
"X.java",
"public enum X {\n" +
" \n" +
" BLEU(10) {\n" +
" String foo() { // inner\n" +
" return super.foo() + this.val;\n" +
" }\n" +
" },\n" +
" BLANC(20),\n" +
" ROUGE(30);\n" +
"\n" +
" int val;\n" +
" X(int val) {\n" +
" this.val = val;\n" +
" }\n" +
" String foo() { // outer\n" +
" return this.name();\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" for(X x: values()) {\n" +
" System.out.print(x.foo());\n" +
" }\n" +
" }\n" +
"}\n"
},
"BLEU10BLANCROUGE");
}
// check enum constants with empty arguments
public void test017() {
this.runConformTest(
new String[] {
"X.java",
"public enum X {\n" +
" \n" +
" BLEU()\n" +
"}\n"
},
"");
}
// cannot extend enums
public void test018() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X {\n" +
" BLEU()\n" +
"}\n" +
"\n" +
"class XX extends X implements X {\n" +
"}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 5)\n" +
" class XX extends X implements X {\n" +
" ^\n" +
"The type X cannot be the superclass of XX; a superclass must be a class\n" +
"----------\n" +
"2. ERROR in X.java (at line 5)\n" +
" class XX extends X implements X {\n" +
" ^\n" +
"The type X cannot be a superinterface of XX; a superinterface must be an interface\n" +
"----------\n");
}
// 74851
public void test019() {
this.runConformTest(
new String[] {
"MonthEnum.java",
"public enum MonthEnum {\n" +
" JANUARY (30),\n" +
" FEBRUARY (28),\n" +
" MARCH (31),\n" +
" APRIL (30),\n" +
" MAY (31),\n" +
" JUNE (30),\n" +
" JULY (31),\n" +
" AUGUST (31),\n" +
" SEPTEMBER (31),\n" +
" OCTOBER (31),\n" +
" NOVEMBER (30),\n" +
" DECEMBER (31);\n" +
" \n" +
" private final int days;\n" +
" \n" +
" MonthEnum(int days) {\n" +
" this.days = days;\n" +
" }\n" +
" \n" +
" public int getDays() {\n" +
" boolean leapYear = true;\n" +
" switch(this) {\n" +
" case FEBRUARY: if(leapYear) return days+1;\n" +
" }\n" +
" return days;\n" +
" }\n" +
" \n" +
" public static void main(String[] args) {\n" +
" System.out.println(JANUARY.getDays());\n" +
" }\n" +
" \n" +
"}\n",
},
"30");
}
// 74226
public void test020() {
this.runConformTest(
new String[] {
"Foo.java",
"public class Foo{\n" +
" public enum Rank {FIRST,SECOND,THIRD}\n" +
" public void setRank(Rank rank){}\n" +
"}\n",
},
"");
}
// 74226 variation - check nested enum is implicitly static
public void test021() {
this.runNegativeTest(
new String[] {
"Foo.java",
"public class Foo {\n" +
" public static enum Rank {FIRST,SECOND,THIRD;\n" +
" void bar() { foo(); } \n" +
" }\n" +
" public void setRank(Rank rank){}\n" +
" void foo() {}\n" +
"}\n",
},
"----------\n" +
"1. ERROR in Foo.java (at line 3)\n" +
" void bar() { foo(); } \n" +
" ^^^\n" +
"Cannot make a static reference to the non-static method foo() from the type Foo\n" +
"----------\n");
}
// 77151 - cannot use qualified name to denote enum constants in switch case label
public void test022() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" \n" +
" enum MX { BLEU, BLANC, ROUGE }\n" +
" \n" +
" void foo(MX e) {\n" +
" switch(e) {\n" +
" case MX.BLEU : break;\n" +
" case MX.BLANC : break;\n" +
" case MX.ROUGE : break;\n" +
" }\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 7)\n" +
" case MX.BLEU : break;\n" +
" ^^^^^^^\n" +
"The qualified case label X.MX.BLEU must be replaced with the unqualified enum constant BLEU\n" +
"----------\n" +
"2. ERROR in X.java (at line 8)\n" +
" case MX.BLANC : break;\n" +
" ^^^^^^^^\n" +
"The qualified case label X.MX.BLANC must be replaced with the unqualified enum constant BLANC\n" +
"----------\n" +
"3. ERROR in X.java (at line 9)\n" +
" case MX.ROUGE : break;\n" +
" ^^^^^^^^\n" +
"The qualified case label X.MX.ROUGE must be replaced with the unqualified enum constant ROUGE\n" +
"----------\n");
}
// 77212
public void test023() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public enum RuleType{ SUCCESS, FAILURE }\n" +
" public static void main(String[] args) {\n" +
" System.out.print(RuleType.valueOf(RuleType.SUCCESS.name()));\n" +
" }\n" +
"}",
},
"SUCCESS");
}
// 77244 - cannot declare final enum
public void test024() {
this.runNegativeTest(
new String[] {
"X.java",
"public final enum X {\n" +
" FOO() {}\n" +
"}\n" +
"\n",
},
"----------\n" +
"1. ERROR in X.java (at line 1)\n" +
" public final enum X {\n" +
" ^\n" +
"Illegal modifier for the enum X; only public is permitted\n" +
"----------\n");
}
// values is using arraycopy instead of clone
public void test025() {
this.runConformTest(
new String[] {
"X.java",
"public enum X {\n" +
" SUC, CESS;\n" +
" public static void main(String[] args) {\n" +
" for (X x : values()) {\n" +
" System.out.print(x.name());\n" +
" }\n" +
" }\n" +
"}",
},
"SUCCESS");
}
// check enum name visibility
public void test026() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" enum Couleur { BLEU, BLANC, ROUGE }\n" +
"}\n" +
"\n" +
"class Y {\n" +
" void foo(Couleur c) {\n" +
" switch (c) {\n" +
" case BLEU :\n" +
" break;\n" +
" case BLANC :\n" +
" break;\n" +
" case ROUGE :\n" +
" break;\n" +
" }\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 6)\n" +
" void foo(Couleur c) {\n" +
" ^^^^^^^\n" +
"Couleur cannot be resolved to a type\n" +
"----------\n" +
"2. ERROR in X.java (at line 8)\n" +
" case BLEU :\n" +
" ^^^^\n" +
"BLEU cannot be resolved to a variable\n" +
"----------\n" +
"3. ERROR in X.java (at line 10)\n" +
" case BLANC :\n" +
" ^^^^^\n" +
"BLANC cannot be resolved to a variable\n" +
"----------\n" +
"4. ERROR in X.java (at line 12)\n" +
" case ROUGE :\n" +
" ^^^^^\n" +
"ROUGE cannot be resolved to a variable\n" +
"----------\n");
}
// check enum name visibility
public void test027() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" enum Couleur { BLEU, BLANC, ROUGE }\n" +
" class Y {\n" +
" void foo(Couleur c) {\n" +
" switch (c) {\n" +
" case BLEU :\n" +
" break;\n" +
" case BLANC :\n" +
" break;\n" +
" case ROUGE :\n" +
" break;\n" +
" }\n" +
" } \n" +
" }\n" +
"}\n",
},
"");
}
// check enum name visibility
public void test028() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" enum Couleur { \n" +
" BLEU, BLANC, ROUGE;\n" +
" static int C = 0;\n" +
" static void FOO() {}\n" +
" }\n" +
" class Y {\n" +
" void foo(Couleur c) {\n" +
" switch (c) {\n" +
" case BLEU :\n" +
" break;\n" +
" case BLANC :\n" +
" break;\n" +
" case ROUGE :\n" +
" break;\n" +
" }\n" +
" FOO();\n" +
" C++;\n" +
" } \n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 17)\n" +
" FOO();\n" +
" ^^^\n" +
"The method FOO() is undefined for the type X.Y\n" +
"----------\n" +
"2. ERROR in X.java (at line 18)\n" +
" C++;\n" +
" ^\n" +
"C cannot be resolved to a variable\n" +
"----------\n");
}
// check enum name visibility
public void test029() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" enum Couleur { \n" +
" BLEU, BLANC, ROUGE; // take precedence over toplevel BLEU type\n" +
" }\n" +
" class Y {\n" +
" void foo(Couleur c) {\n" +
" switch (c) {\n" +
" case BLEU :\n" +
" break;\n" +
" case BLANC :\n" +
" break;\n" +
" case ROUGE :\n" +
" break;\n" +
" }\n" +
" } \n" +
" }\n" +
"}\n" +
"\n" +
"class BLEU {}\n",
},
"");
}
// check enum name visibility
public void test030() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" enum Couleur { \n" +
" BLEU, BLANC, ROUGE; // take precedence over sibling constant from Color\n" +
" }\n" +
" enum Color { \n" +
" BLEU, BLANC, ROUGE;\n" +
" }\n" +
" class Y {\n" +
" void foo(Couleur c) {\n" +
" switch (c) {\n" +
" case BLEU :\n" +
" break;\n" +
" case BLANC :\n" +
" break;\n" +
" case ROUGE :\n" +
" break;\n" +
" }\n" +
" } \n" +
" }\n" +
"}\n" +
"\n" +
"class BLEU {}\n",
},
"");
}
// check enum name visibility
public void test031() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" enum Couleur { \n" +
" BLEU, BLANC, ROUGE; // take precedence over toplevel BLEU type\n" +
" }\n" +
" class Y implements IX, JX {\n" +
" void foo(Couleur c) {\n" +
" switch (c) {\n" +
" case BLEU :\n" +
" break;\n" +
" case BLANC :\n" +
" break;\n" +
" case ROUGE :\n" +
" break;\n" +
" }\n" +
" } \n" +
" }\n" +
"}\n" +
"\n" +
"interface IX {\n" +
" int BLEU = 1;\n" +
"}\n" +
"interface JX {\n" +
" int BLEU = 2;\n" +
"}\n" +
"class BLEU {}\n" +
"\n",
},
"");
}
// check Enum cannot be used as supertype (explicitly)
public void test032() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X extends Enum {\n" +
"}",
},
"----------\n" +
"1. WARNING in X.java (at line 1)\n" +
" public class X extends Enum {\n" +
" ^^^^\n" +
"Enum is a raw type. References to generic type Enum<E> should be parameterized\n" +
"----------\n" +
"2. ERROR in X.java (at line 1)\n" +
" public class X extends Enum {\n" +
" ^^^^\n" +
"The type X may not subclass Enum explicitly\n" +
"----------\n");
}
// Javadoc in enum (see bug 78018)
public void test033() {
this.runConformTest(
new String[] {
"E.java",
" /**\n" +
" * Valid javadoc\n" +
" * @author ffr\n" +
" */\n" +
"public enum E {\n" +
" /** Valid javadoc */\n" +
" TEST,\n" +
" /** Valid javadoc */\n" +
" VALID;\n" +
" /** Valid javadoc */\n" +
" public void foo() {}\n" +
"}\n"
}
);
}
public void test034() {
this.runNegativeTest(
new String[] {
"E.java",
" /**\n" +
" * Invalid javadoc\n" +
" * @exception NullPointerException Invalid tag\n" +
" * @throws NullPointerException Invalid tag\n" +
" * @return Invalid tag\n" +
" * @param x Invalid tag\n" +
" */\n" +
"public enum E { TEST, VALID }\n"
},
"----------\n" +
"1. ERROR in E.java (at line 3)\n" +
" * @exception NullPointerException Invalid tag\n" +
" ^^^^^^^^^\n" +
"Javadoc: Unexpected tag\n" +
"----------\n" +
"2. ERROR in E.java (at line 4)\n" +
" * @throws NullPointerException Invalid tag\n" +
" ^^^^^^\n" +
"Javadoc: Unexpected tag\n" +
"----------\n" +
"3. ERROR in E.java (at line 5)\n" +
" * @return Invalid tag\n" +
" ^^^^^^\n" +
"Javadoc: Unexpected tag\n" +
"----------\n" +
"4. ERROR in E.java (at line 6)\n" +
" * @param x Invalid tag\n" +
" ^^^^^\n" +
"Javadoc: Unexpected tag\n" +
"----------\n",
JavacTestOptions.Excuse.EclipseWarningConfiguredAsError
);
}
public void test035() {
this.runConformTest(
new String[] {
"E.java",
" /**\n" +
" * @see \"Valid normal string\"\n" +
" * @see <a href=\"http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/javadoc.html\">Valid URL link reference</a>\n" +
" * @see Object\n" +
" * @see #TEST\n" +
" * @see E\n" +
" * @see E#TEST\n" +
" */\n" +
"public enum E { TEST, VALID }\n"
}
);
}
public void test036() {
this.runNegativeTest(
new String[] {
"E.java",
" /**\n" +
" * @see \"invalid\" no text allowed after the string\n" +
" * @see <a href=\"invalid\">invalid</a> no text allowed after the href\n" +
" * @see\n" +
" * @see #VALIDE\n" +
" */\n" +
"public enum E { TEST, VALID }\n"
},
"----------\n" +
"1. ERROR in E.java (at line 2)\n" +
" * @see \"invalid\" no text allowed after the string\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
"Javadoc: Unexpected text\n" +
"----------\n" +
"2. ERROR in E.java (at line 3)\n" +
" * @see <a href=\"invalid\">invalid</a> no text allowed after the href\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
"Javadoc: Unexpected text\n" +
"----------\n" +
"3. ERROR in E.java (at line 4)\n" +
" * @see\n" +
" ^^^\n" +
"Javadoc: Missing reference\n" +
"----------\n" +
"4. ERROR in E.java (at line 5)\n" +
" * @see #VALIDE\n" +
" ^^^^^^\n" +
"Javadoc: VALIDE cannot be resolved or is not a field\n" +
"----------\n",
JavacTestOptions.Excuse.EclipseWarningConfiguredAsError
);
}
public void test037() {
this.runConformTest(
new String[] {
"E.java",
" /**\n" +
" * Value test: {@value #TEST}\n" +
" * or: {@value E#TEST}\n" +
" */\n" +
"public enum E { TEST, VALID }\n"
}
);
}
public void test038() {
this.reportMissingJavadocComments = CompilerOptions.ERROR;
this.runNegativeTest(
new String[] {
"E.java",
"public enum E { TEST, VALID;\n" +
" public void foo() {}\n" +
"}"
},
"----------\n" +
"1. ERROR in E.java (at line 1)\n" +
" public enum E { TEST, VALID;\n" +
" ^\n" +
"Javadoc: Missing comment for public declaration\n" +
"----------\n" +
"2. ERROR in E.java (at line 1)\n" +
" public enum E { TEST, VALID;\n" +
" ^^^^\n" +
"Javadoc: Missing comment for public declaration\n" +
"----------\n" +
"3. ERROR in E.java (at line 1)\n" +
" public enum E { TEST, VALID;\n" +
" ^^^^^\n" +
"Javadoc: Missing comment for public declaration\n" +
"----------\n" +
"4. ERROR in E.java (at line 2)\n" +
" public void foo() {}\n" +
" ^^^^^\n" +
"Javadoc: Missing comment for public declaration\n" +
"----------\n",
JavacTestOptions.Excuse.EclipseWarningConfiguredAsError
);
}
public void test039() {
this.runNegativeTest(
new String[] {
"E.java",
"public enum E {\n" +
" /**\n" +
" * @exception NullPointerException Invalid tag\n" +
" * @throws NullPointerException Invalid tag\n" +
" * @return Invalid tag\n" +
" * @param x Invalid tag\n" +
" */\n" +
" TEST,\n" +
" VALID;\n" +
"}\n"
},
"----------\n" +
"1. ERROR in E.java (at line 3)\n" +
" * @exception NullPointerException Invalid tag\n" +
" ^^^^^^^^^\n" +
"Javadoc: Unexpected tag\n" +
"----------\n" +
"2. ERROR in E.java (at line 4)\n" +
" * @throws NullPointerException Invalid tag\n" +
" ^^^^^^\n" +
"Javadoc: Unexpected tag\n" +
"----------\n" +
"3. ERROR in E.java (at line 5)\n" +
" * @return Invalid tag\n" +
" ^^^^^^\n" +
"Javadoc: Unexpected tag\n" +
"----------\n" +
"4. ERROR in E.java (at line 6)\n" +
" * @param x Invalid tag\n" +
" ^^^^^\n" +
"Javadoc: Unexpected tag\n" +
"----------\n",
JavacTestOptions.Excuse.EclipseWarningConfiguredAsError
);
}
public void test040() {
this.runConformTest(
new String[] {
"E.java",
"public enum E {\n" +
" /**\n" +
" * @see E\n" +
" * @see #VALID\n" +
" */\n" +
" TEST,\n" +
" /**\n" +
" * @see E#TEST\n" +
" * @see E\n" +
" */\n" +
" VALID;\n" +
" /**\n" +
" * @param x the object\n" +
" * @return String\n" +
" * @see Object\n" +
" */\n" +
" public String val(Object x) { return x.toString(); }\n" +
"}\n"
}
);
}
public void test041() {
this.runNegativeTest(
new String[] {
"E.java",
"public enum E {\n" +
" /**\n" +
" * @see e\n" +
" * @see #VALIDE\n" +
" */\n" +
" TEST,\n" +
" /**\n" +
" * @see E#test\n" +
" * @see EUX\n" +
" */\n" +
" VALID;\n" +
" /**\n" +
" * @param obj the object\n" +
" * @return\n" +
" * @see Objet\n" +
" */\n" +
" public String val(Object x) { return x.toString(); }\n" +
"}\n"
},
"----------\n" +
"1. ERROR in E.java (at line 3)\n" +
" * @see e\n" +
" ^\n" +
"Javadoc: e cannot be resolved to a type\n" +
"----------\n" +
"2. ERROR in E.java (at line 4)\n" +
" * @see #VALIDE\n" +
" ^^^^^^\n" +
"Javadoc: VALIDE cannot be resolved or is not a field\n" +
"----------\n" +
"3. ERROR in E.java (at line 8)\n" +
" * @see E#test\n" +
" ^^^^\n" +
"Javadoc: test cannot be resolved or is not a field\n" +
"----------\n" +
"4. ERROR in E.java (at line 9)\n" +
" * @see EUX\n" +
" ^^^\n" +
"Javadoc: EUX cannot be resolved to a type\n" +
"----------\n" +
"5. ERROR in E.java (at line 13)\n" +
" * @param obj the object\n" +
" ^^^\n" +
"Javadoc: Parameter obj is not declared\n" +
"----------\n" +
"6. ERROR in E.java (at line 14)\n" +
" * @return\n" +
" ^^^^^^\n" +
"Javadoc: Description expected after @return\n" +
"----------\n" +
"7. ERROR in E.java (at line 15)\n" +
" * @see Objet\n" +
" ^^^^^\n" +
"Javadoc: Objet cannot be resolved to a type\n" +
"----------\n" +
"8. ERROR in E.java (at line 17)\n" +
" public String val(Object x) { return x.toString(); }\n" +
" ^\n" +
"Javadoc: Missing tag for parameter x\n" +
"----------\n",
JavacTestOptions.Excuse.EclipseWarningConfiguredAsError
);
}
public void test042() {
this.runConformTest(
new String[] {
"E.java",
"public enum E {\n" +
" /**\n" +
" * Test value: {@value #TEST}\n" +
" */\n" +
" TEST,\n" +
" /**\n" +
" * Valid value: {@value E#VALID}\n" +
" */\n" +
" VALID;\n" +
" /**\n" +
" * Test value: {@value #TEST}\n" +
" * Valid value: {@value E#VALID}\n" +
" * @param x the object\n" +
" * @return String\n" +
" */\n" +
" public String val(Object x) { return x.toString(); }\n" +
"}\n"
}
);
}
// External javadoc references to enum
public void test043() {
this.runConformTest(
new String[] {
"test/E.java",
"package test;\n" +
"public enum E { TEST, VALID }\n",
"test/X.java",
"import static test.E.TEST;\n" +
" /**\n" +
" * @see test.E\n" +
" * @see test.E#VALID\n" +
" * @see #TEST\n" +
" */\n" +
"public class X {}\n"
}
);
}
public void test044() {
this.runConformTest(
new String[] {
"test/E.java",
"package test;\n" +
"public enum E { TEST, VALID }\n",
"test/X.java",
"import static test.E.TEST;\n" +
" /**\n" +
" * Valid value = {@value test.E#VALID}\n" +
" * Test value = {@value #TEST}\n" +
" */\n" +
"public class X {}\n"
}
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=78321
*/
public void test045() {
this.runConformTest(
new String[] {
"X.java",
"public enum X\n" +
"{\n" +
" FIRST,\n" +
" SECOND,\n" +
" THIRD;\n" +
"\n" +
" static {\n" +
" for (X t : values()) {\n" +
" System.out.print(t.name());\n" +
" }\n" +
" }\n" +
"\n" +
" X() {\n" +
" }\n" +
"\n" +
" public static void main(String[] args) {\n" +
" }\n" +
"}"
},
"FIRSTSECONDTHIRD"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=78464
*/
public void test046() {
this.runConformTest(
new String[] {
"X.java",
"public enum X {\n" +
" a(1);\n" +
" X(int i) {\n" +
" }\n" +
"}"
},
""
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=78914
*/
public void test047() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X {\n" +
" ;\n" +
" X() {\n" +
" super();\n" +
" }\n" +
"}"
},
"----------\n" +
"1. ERROR in X.java (at line 4)\n" +
" super();\n" +
" ^^^^^^^^\n" +
"Cannot invoke super constructor from enum constructor X()\n" +
"----------\n"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=77211
*/
public void test048() {
this.runConformTest(
new String[] {
"StopLight.java",
"public enum StopLight{\n" +
" RED{\n" +
" public StopLight next(){ return GREEN; }\n" +
" },\n" +
" GREEN{\n" +
" public StopLight next(){ return YELLOW; }\n" +
" },\n" +
" YELLOW{\n" +
" public StopLight next(){ return RED; }\n" +
" };\n" +
"\n" +
" public abstract StopLight next();\n" +
"}"
},
""
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=78915
*/
public void test049() {
this.runNegativeTest(
new String[] {
"X.java",
"public abstract enum X {}"
},
"----------\n" +
"1. ERROR in X.java (at line 1)\n" +
" public abstract enum X {}\n" +
" ^\n" +
"Illegal modifier for the enum X; only public is permitted\n" +
"----------\n"
);
}
public void test050() {
this.runConformTest(
new String[] {
"X.java",
"public enum X {}"
},
""
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=78914 - variation
*/
public void test051() {
this.runConformTest(
new String[] {
"X.java",
"public enum X {\n" +
" BLEU (0) {\n" +
" }\n" +
" ;\n" +
" X() {\n" +
" this(0);\n" +
" }\n" +
" X(int i) {\n" +
" }\n" +
"}\n"
},
""
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=78916
*/
public void test052() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X {\n" +
" A\n" +
" ;\n" +
" \n" +
" public abstract void foo();\n" +
"}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 2)\n" +
" A\n" +
" ^\n" +
"The enum constant A must implement the abstract method foo()\n" +
"----------\n"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=78916 - variation
*/
public void test053() {
this.runConformTest(
new String[] {
"X.java",
"public enum X {\n" +
" A () { public void foo() {} }\n" +
" ;\n" +
" \n" +
" public abstract void foo();\n" +
"}\n"
},
""
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=78916 - variation
*/
public void test054() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X {\n" +
" A() {}\n" +
" ;\n" +
" \n" +
" public abstract void foo();\n" +
"}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 2)\n" +
" A() {}\n" +
" ^\n" +
"The enum constant A must implement the abstract method foo()\n" +
"----------\n"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=78916 - variation
*/
public void test055() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X {\n" +
" ;\n" +
" \n" +
" public abstract void foo();\n" +
"}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 4)\n" +
" public abstract void foo();\n" +
" ^^^^^\n" +
"The enum X can only define the abstract method foo() if it also defines enum constants with corresponding implementations\n" +
"----------\n"
);
}
// TODO (philippe) enum cannot be declared as local type
// TODO (philippe) check one cannot redefine Enum incorrectly
// TODO (philippe) check enum syntax recovery
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=78914 - variation
*/
public void test056() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"public enum X {\n" +
" PLUS {\n" +
" double eval(double x, double y) { return x + y; }\n" +
" };\n" +
"\n" +
" // Perform the arithmetic X represented by this constant\n" +
" abstract double eval(double x, double y);\n" +
"}"
},
""
);
String expectedOutput =
"// Signature: Ljava/lang/Enum<LX;>;\n" +
"public abstract enum X {\n";
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class"));
String actualOutput =
disassembler.disassemble(
classFileBytes,
"\n",
ClassFileBytesDisassembler.DETAILED);
int index = actualOutput.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(actualOutput, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, actualOutput);
}
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=77430
*/
public void test057() {
this.runConformTest(
new String[] {
"Enum2.java",
"public class Enum2 {\n" +
" enum Color { RED, GREEN };\n" +
" public static void main(String[] args) {\n" +
" Color c= Color.GREEN;\n" +
" switch (c) {\n" +
" case RED:\n" +
" System.out.println(Color.RED);\n" +
" break;\n" +
" case GREEN:\n" +
" System.out.println(c);\n" +
" break;\n" +
" }\n" +
" }\n" +
"}\n"
},
"GREEN"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=77430 - variation
*/
public void test058() {
this.runNegativeTest(
new String[] {
"X.java",
"enum X { a }\n" +
"class A {\n" +
" public static void main(String[] args) {\n" +
" test(X.a, 9);\n" +
" test2(X.a, 3);\n" +
" }\n" +
" static void test(X x, int a) {\n" +
" if (x == a) a++; // incomparable types: X and int\n" +
" switch(x) {\n" +
" case a : System.out.println(a); // prints \'9\'\n" +
" }\n" +
" }\n" +
" static void test2(X x, final int aa) {\n" +
" switch(x) {\n" +
" case aa : // unqualified enum constant error\n" +
" System.out.println(a); // cannot find a\n" +
" }\n" +
" }\n" +
"}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 8)\n" +
" if (x == a) a++; // incomparable types: X and int\n" +
" ^^^^^^\n" +
"Incompatible operand types X and int\n" +
"----------\n" +
"2. ERROR in X.java (at line 15)\n" +
" case aa : // unqualified enum constant error\n" +
" ^^\n" +
"aa cannot be resolved or is not a field\n" +
"----------\n" +
"3. ERROR in X.java (at line 16)\n" +
" System.out.println(a); // cannot find a\n" +
" ^\n" +
"a cannot be resolved to a variable\n" +
"----------\n"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=81262
*/
public void test059() {
this.runConformTest(
new String[] {
"X.java",
"public enum X {\n" +
" MONDAY {\n" +
" public void foo() {\n" +
" }\n" +
" };\n" +
" private X() {\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" System.out.println(\"SUCCESS\");\n" +
" }\n" +
"}\n"
},
"SUCCESS");
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=81589
*/
public void test060() {
this.runNegativeTest(
new String[] {
"com/flarion/test/a/MyEnum.java",
"package com.flarion.test.a;\n" +
"public enum MyEnum {\n" +
"\n" +
" First, Second;\n" +
" \n" +
"}\n",
"com/flarion/test/b/MyClass.java",
"package com.flarion.test.b;\n" +
"import com.flarion.test.a.MyEnum;\n" +
"import static com.flarion.test.a.MyEnum.First;\n" +
"import static com.flarion.test.a.MyEnum.Second;\n" +
"public class MyClass {\n" +
"\n" +
" public void myMethod() {\n" +
" MyEnum e = MyEnum.First;\n" +
" switch (e) {\n" +
" case First:\n" +
" break;\n" +
" case Second:\n" +
" break;\n" +
" }\n" +
" throw new Exception();\n" + // fake error to cause dump of unused import warnings
" }\n" +
"}\n",
},
"----------\n" +
"1. WARNING in com\\flarion\\test\\b\\MyClass.java (at line 3)\n" +
" import static com.flarion.test.a.MyEnum.First;\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
"The import com.flarion.test.a.MyEnum.First is never used\n" +
"----------\n" +
"2. WARNING in com\\flarion\\test\\b\\MyClass.java (at line 4)\n" +
" import static com.flarion.test.a.MyEnum.Second;\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
"The import com.flarion.test.a.MyEnum.Second is never used\n" +
"----------\n" +
"3. ERROR in com\\flarion\\test\\b\\MyClass.java (at line 15)\n" +
" throw new Exception();\n" +
" ^^^^^^^^^^^^^^^^^^^^^^\n" +
"Unhandled exception type Exception\n" +
"----------\n");
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=82217
*/
public void test061() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X {\n" +
" A, B, C;\n" +
" public static final X D = null;\n" +
"}\n" +
"\n" +
"class A {\n" +
" private void foo(X x) {\n" +
" switch (x) {\n" +
" case D:\n" +
" }\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. WARNING in X.java (at line 8)\n" +
" switch (x) {\n" +
" ^\n" +
"The enum constant A needs a corresponding case label in this enum switch on X\n" +
"----------\n" +
"2. WARNING in X.java (at line 8)\n" +
" switch (x) {\n" +
" ^\n" +
"The enum constant B needs a corresponding case label in this enum switch on X\n" +
"----------\n" +
"3. WARNING in X.java (at line 8)\n" +
" switch (x) {\n" +
" ^\n" +
"The enum constant C needs a corresponding case label in this enum switch on X\n" +
"----------\n" +
"4. ERROR in X.java (at line 9)\n" +
" case D:\n" +
" ^\n" +
"The field X.D cannot be referenced from an enum case label; only enum constants can be used in enum switch\n" +
"----------\n");
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=82217 - variation with qualified name
*/
public void test062() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X {\n" +
" A, B, C;\n" +
" public static final X D = null;\n" +
"}\n" +
"\n" +
"class A {\n" +
" private void foo(X x) {\n" +
" switch (x) {\n" +
" case X.D:\n" +
" }\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. WARNING in X.java (at line 8)\n" +
" switch (x) {\n" +
" ^\n" +
"The enum constant A needs a corresponding case label in this enum switch on X\n" +
"----------\n" +
"2. WARNING in X.java (at line 8)\n" +
" switch (x) {\n" +
" ^\n" +
"The enum constant B needs a corresponding case label in this enum switch on X\n" +
"----------\n" +
"3. WARNING in X.java (at line 8)\n" +
" switch (x) {\n" +
" ^\n" +
"The enum constant C needs a corresponding case label in this enum switch on X\n" +
"----------\n" +
"4. ERROR in X.java (at line 9)\n" +
" case X.D:\n" +
" ^\n" +
"The field X.D cannot be referenced from an enum case label; only enum constants can be used in enum switch\n" +
"----------\n");
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=81945
*/
public void test063() {
this.runConformTest(
new String[] {
"X.java",
"public class X<T> {\n" +
" enum Option { ALPHA, BRAVO };\n" +
" void method1(Option item) {\n" +
" switch (item) {\n" +
" case ALPHA: break;\n" +
" case BRAVO: break;\n" +
" }\n" +
" }\n" +
"}\n",
},
"");
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=82590
*/
public void test064() {
this.runConformTest(
new String[] {
"X.java",
"public enum X implements B {\n" +
"\n" +
" C1 {\n" +
" public void test() {};\n" +
" },\n" +
" C2 {\n" +
" public void test() {};\n" +
" }\n" +
"}\n" +
"\n" +
"interface B {\n" +
" public void test();\n" +
" \n" +
"}\n",
},
"");
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=83847
*/
public void test065() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X {\n" +
" A;\n" +
" private void foo() {\n" +
" X e= new X() {\n" +
" };\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 4)\n" +
" X e= new X() {\n" +
" ^\n" +
"Cannot instantiate the type X\n" +
"----------\n");
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=83860
*/
public void test066() {
this.runConformTest(
new String[] {
"X.java",
"public enum X {\n" +
" SUCCESS (0) {};\n" +
" private X(int i) {}\n" +
" public static void main(String[] args) {\n" +
" for (X x : values()) {\n" +
" System.out.print(x);\n" +
" }\n" +
" }\n" +
"}",
},
"SUCCESS");
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=83219
*/
public void test067() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X {\n" +
" ONE, TWO, THREE;\n" +
" abstract int getSquare();\n" +
" abstract int getSquare();\n" +
"}",
},
"----------\n" +
"1. ERROR in X.java (at line 2)\n" +
" ONE, TWO, THREE;\n" +
" ^^^\n" +
"The enum constant ONE must implement the abstract method getSquare()\n" +
"----------\n" +
"2. ERROR in X.java (at line 2)\n" +
" ONE, TWO, THREE;\n" +
" ^^^\n" +
"The enum constant TWO must implement the abstract method getSquare()\n" +
"----------\n" +
"3. ERROR in X.java (at line 2)\n" +
" ONE, TWO, THREE;\n" +
" ^^^^^\n" +
"The enum constant THREE must implement the abstract method getSquare()\n" +
"----------\n" +
"4. ERROR in X.java (at line 3)\n" +
" abstract int getSquare();\n" +
" ^^^^^^^^^^^\n" +
"Duplicate method getSquare() in type X\n" +
"----------\n" +
"5. ERROR in X.java (at line 4)\n" +
" abstract int getSquare();\n" +
" ^^^^^^^^^^^\n" +
"Duplicate method getSquare() in type X\n" +
"----------\n");
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=83648
*/
public void test068() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X {\n" +
" A(1, 3), B(1, 3), C(1, 3) { }\n" +
" ;\n" +
" public X(int i, int j) { }\n" +
"}",
},
"----------\n" +
"1. ERROR in X.java (at line 4)\n" +
" public X(int i, int j) { }\n" +
" ^^^^^^^^^^^^^^^\n" +
"Illegal modifier for the enum constructor; only private is permitted.\n" +
"----------\n");
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=83648
*/
public void test069() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X {\n" +
" A(1, 3), B(1, 3), C(1, 3) { }\n" +
" ;\n" +
" protected X(int i, int j) { }\n" +
"}",
},
"----------\n" +
"1. ERROR in X.java (at line 4)\n" +
" protected X(int i, int j) { }\n" +
" ^^^^^^^^^^^^^^^\n" +
"Illegal modifier for the enum constructor; only private is permitted.\n" +
"----------\n");
}
public void test070() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"public enum X {\n" +
" PLUS {\n" +
" double eval(double x, double y) { return x + y; }\n" +
" };\n" +
"\n" +
" // Perform the arithmetic X represented by this constant\n" +
" abstract double eval(double x, double y);\n" +
"}"
},
""
);
String expectedOutput =
" // Method descriptor #18 (Ljava/lang/String;I)V\n" +
" // Stack: 3, Locals: 3\n" +
" private X(java.lang.String arg0, int arg1);\n" +
" 0 aload_0 [this]\n" +
" 1 aload_1 [arg0]\n" +
" 2 iload_2 [arg1]\n" +
" 3 invokespecial java.lang.Enum(java.lang.String, int) [25]\n" +
" 6 return\n";
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class"));
String actualOutput =
disassembler.disassemble(
classFileBytes,
"\n",
ClassFileBytesDisassembler.DETAILED);
int index = actualOutput.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(actualOutput, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, actualOutput);
}
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=83901
public void test071() {
this.runConformTest( // no methods to implement
new String[] {
"X1.java",
"public enum X1 implements I {\n" +
" ;\n" +
"}\n" +
"interface I {}\n"
},
""
);
this.runConformTest( // no methods to implement with constant
new String[] {
"X1a.java",
"public enum X1a implements I {\n" +
" A;\n" +
"}\n" +
"interface I {}\n"
},
""
);
this.runConformTest( // no methods to implement with constant body
new String[] {
"X1b.java",
"public enum X1b implements I {\n" +
" A() { void random() {} };\n" +
"}\n" +
"interface I {}\n"
},
""
);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=83901
public void test072() {
this.runConformTest( // implement inherited method
new String[] {
"X2.java",
"public enum X2 implements I {\n" +
" ;\n" +
" public void test() {}\n" +
"}\n" +
"interface I { void test(); }\n"
},
""
);
this.runConformTest( // implement inherited method with constant
new String[] {
"X2a.java",
"public enum X2a implements I {\n" +
" A;\n" +
" public void test() {}\n" +
"}\n" +
"interface I { void test(); }\n"
},
""
);
this.runConformTest( // implement inherited method with constant body
new String[] {
"X2b.java",
"public enum X2b implements I {\n" +
" A() { public void test() {} };\n" +
" public void test() {}\n" +
"}\n" +
"interface I { void test(); }\n"
},
""
);
this.runConformTest( // implement inherited method with random constant body
new String[] {
"X2c.java",
"public enum X2c implements I {\n" +
" A() { void random() {} };\n" +
" public void test() {}\n" +
"}\n" +
"interface I { void test(); }\n"
},
""
);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=83901
public void test073() {
this.runNegativeTest( // implement inherited method but as abstract
new String[] {
"X3.java",
"public enum X3 implements I {\n" +
" ;\n" +
" public abstract void test();\n" +
"}\n" +
"interface I { void test(); }\n"
},
"----------\n" +
"1. ERROR in X3.java (at line 3)\n" +
" public abstract void test();\n" +
" ^^^^^^\n" +
"The enum X3 can only define the abstract method test() if it also defines enum constants with corresponding implementations\n" +
"----------\n"
// X3 is not abstract and does not override abstract method test() in X3
);
this.runNegativeTest( // implement inherited method as abstract with constant
new String[] {
"X3a.java",
"public enum X3a implements I {\n" +
" A;\n" +
" public abstract void test();\n" +
"}\n" +
"interface I { void test(); }\n"
},
"----------\n" +
"1. ERROR in X3a.java (at line 2)\n" +
" A;\n" +
" ^\n" +
"The enum constant A must implement the abstract method test()\n" +
"----------\n"
// X3a is not abstract and does not override abstract method test() in X3a
);
this.runConformTest( // implement inherited method as abstract with constant body
new String[] {
"X3b.java",
"public enum X3b implements I {\n" +
" A() { public void test() {} };\n" +
" public abstract void test();\n" +
"}\n" +
"interface I { void test(); }\n"
},
""
);
this.runNegativeTest( // implement inherited method as abstract with random constant body
new String[] {
"X3c.java",
"public enum X3c implements I {\n" +
" A() { void random() {} };\n" +
" public abstract void test();\n" +
"}\n" +
"interface I { void test(); }\n"
},
"----------\n" +
"1. ERROR in X3c.java (at line 2)\n" +
" A() { void random() {} };\n" +
" ^\n" +
"The enum constant A must implement the abstract method test()\n" +
"----------\n"
// <anonymous X3c$1> is not abstract and does not override abstract method test() in X3c
);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=83901
public void test074() {
this.runNegativeTest( // define abstract method
new String[] {
"X4.java",
"public enum X4 {\n" +
" ;\n" +
" public abstract void test();\n" +
"}\n"
},
"----------\n" +
"1. ERROR in X4.java (at line 3)\n" +
" public abstract void test();\n" +
" ^^^^^^\n" +
"The enum X4 can only define the abstract method test() if it also defines enum constants with corresponding implementations\n" +
"----------\n"
// X4 is not abstract and does not override abstract method test() in X4
);
this.runNegativeTest( // define abstract method with constant
new String[] {
"X4a.java",
"public enum X4a {\n" +
" A;\n" +
" public abstract void test();\n" +
"}\n"
},
"----------\n" +
"1. ERROR in X4a.java (at line 2)\n" +
" A;\n" +
" ^\n" +
"The enum constant A must implement the abstract method test()\n" +
"----------\n"
// X4a is not abstract and does not override abstract method test() in X4a
);
this.runConformTest( // define abstract method with constant body
new String[] {
"X4b.java",
"public enum X4b {\n" +
" A() { public void test() {} };\n" +
" public abstract void test();\n" +
"}\n"
},
""
);
this.runNegativeTest( // define abstract method with random constant body
new String[] {
"X4c.java",
"public enum X4c {\n" +
" A() { void random() {} };\n" +
" public abstract void test();\n" +
"}\n"
},
"----------\n" +
"1. ERROR in X4c.java (at line 2)\n" +
" A() { void random() {} };\n" +
" ^\n" +
"The enum constant A must implement the abstract method test()\n" +
"----------\n"
// <anonymous X4c$1> is not abstract and does not override abstract method test() in X4c
);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=83901
public void test075() {
this.runNegativeTest( // do not implement inherited method
new String[] {
"X5.java",
"public enum X5 implements I {\n" +
" ;\n" +
"}\n" +
"interface I { void test(); }\n"
},
"----------\n" +
"1. ERROR in X5.java (at line 1)\n" +
" public enum X5 implements I {\n" +
" ^^\n" +
"The type X5 must implement the inherited abstract method I.test()\n" +
"----------\n"
// X5 is not abstract and does not override abstract method test() in I
);
this.runNegativeTest( // do not implement inherited method & have constant with no body
new String[] {
"X5a.java",
"public enum X5a implements I {\n" +
" A;\n" +
"}\n" +
"interface I { void test(); }\n"
},
"----------\n" +
"1. ERROR in X5a.java (at line 1)\n" +
" public enum X5a implements I {\n" +
" ^^^\n" +
"The type X5a must implement the inherited abstract method I.test()\n" +
"----------\n"
// X5a is not abstract and does not override abstract method test() in I
);
this.runConformTest( // do not implement inherited method & have constant with body
new String[] {
"X5b.java",
"public enum X5b implements I {\n" +
" A() { public void test() {} };\n" +
" ;\n" +
"}\n" +
"interface I { void test(); }\n"
},
""
);
this.runNegativeTest( // do not implement inherited method & have constant with random body
new String[] {
"X5c.java",
"public enum X5c implements I {\n" +
" A() { void random() {} };\n" +
" ;\n" +
" private X5c() {}\n" +
"}\n" +
"interface I { void test(); }\n"
},
"----------\n" +
"1. ERROR in X5c.java (at line 2)\n" +
" A() { void random() {} };\n" +
" ^\n" +
"The enum constant A must implement the abstract method test()\n" +
"----------\n"
// <anonymous X5c$1> is not abstract and does not override abstract method test() in I
);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=83902
public void test076() { // bridge method needed
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String[] args) { ((I) E.A).foo(); }\n" +
"}\n" +
"interface I { I foo(); }\n" +
"enum E implements I {\n" +
" A;\n" +
" public E foo() {\n" +
" System.out.println(\"SUCCESS\");\n" +
" return null;\n" +
" }\n" +
"}\n"
},
"SUCCESS"
);
}
public void test077() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" \n" +
" public static void main(String[] args) {\n" +
" E.A.bar();\n" +
" }\n" +
"}\n" +
"enum E {\n" +
" A {\n" +
" void bar() {\n" +
" new M();\n" +
" }\n" +
" };\n" +
" abstract void bar();\n" +
" \n" +
" class M {\n" +
" M() {\n" +
" System.out.println(\"SUCCESS\");\n" +
" }\n" +
" }\n" +
"}\n"
},
"SUCCESS"
);
}
public void test078() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" \n" +
" public static void main(String[] args) {\n" +
" E.A.bar();\n" +
" }\n" +
"}\n" +
"enum E {\n" +
" A {\n" +
" void bar() {\n" +
" new X(){\n" +
" void baz() {\n" +
" new M();\n" +
" }\n" +
" }.baz();\n" +
" }\n" +
" };\n" +
" abstract void bar();\n" +
" \n" +
" class M {\n" +
" M() {\n" +
" System.out.println(\"SUCCESS\");\n" +
" }\n" +
" }\n" +
"}\n"
},
"SUCCESS"
);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=85397
public void test079() throws Exception {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X {\n" +
" A, B;\n" +
" private strictfp X() {}\n" +
"}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" private strictfp X() {}\n" +
" ^^^\n" +
"Illegal modifier for the constructor in type X; only public, protected & private are permitted\n" +
"----------\n"
);
this.runConformTest(
new String[] {
"X.java",
"public strictfp enum X {\n" +
" A, B;\n" +
" private X() {}\n" +
"}\n"
},
""
);
String[] expectedOutputs = new String[] {
" private strictfp X(java.lang.String arg0, int arg1);\n",
" public static strictfp X[] values();\n",
" public static strictfp X valueOf(java.lang.String arg0);\n"
};
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class"));
String actualOutput =
disassembler.disassemble(
classFileBytes,
"\n",
ClassFileBytesDisassembler.DETAILED);
for (int i = 0, max = expectedOutputs.length; i < max; i++) {
String expectedOutput = expectedOutputs[i];
int index = actualOutput.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(actualOutput, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, actualOutput);
}
}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=87064
public void test080() {
this.runConformTest(
new String[] {
"X.java",
"interface TestInterface {\n" +
" int test();\n" +
"}\n" +
"\n" +
"public enum X implements TestInterface {\n" +
" TEST {\n" +
" public int test() {\n" +
" return 42;\n" +
" }\n" +
" },\n" +
" ENUM {\n" +
" public int test() {\n" +
" return 37;\n" +
" }\n" +
" };\n" +
"} \n"
},
""
);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=87818
public void test081() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" void foo() {\n" +
" enum E {}\n" +
" }\n" +
"}"
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" enum E {}\n" +
" ^\n" +
"The member enum E cannot be local\n" +
"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=88223
public void test082() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" class Y {\n" +
" enum E {}\n" +
" }\n" +
"}"
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" enum E {}\n" +
" ^\n" +
"The member enum E must be defined inside a static member type\n" +
"----------\n");
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" static class Y {\n" +
" enum E {}\n" +
" }\n" +
"}"
},
"");
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" void foo() {\n" +
" class Local {\n" +
" enum E {}\n" +
" }\n" +
" }\n" +
"}"
},
"----------\n" +
"1. ERROR in X.java (at line 4)\n" +
" enum E {}\n" +
" ^\n" +
"The member enum E cannot be local\n" +
"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=87998 - check no emulation warning
public void test083() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X {\n" +
" INPUT {\n" +
" @Override\n" +
" public X getReverse() {\n" +
" return OUTPUT;\n" +
" }\n" +
" },\n" +
" OUTPUT {\n" +
" @Override\n" +
" public X getReverse() {\n" +
" return INPUT;\n" +
" }\n" +
" },\n" +
" INOUT {\n" +
" @Override\n" +
" public X getReverse() {\n" +
" return INOUT;\n" +
" }\n" +
" };\n" +
" X(){}\n" +
" Zork z;\n" +
" public abstract X getReverse();\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 21)\n" +
" Zork z;\n" +
" ^^^^\n" +
"Zork cannot be resolved to a type\n" +
"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=87998 - check private constructor generation
public void test084() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"public enum X {\n" +
" INPUT {\n" +
" @Override\n" +
" public X getReverse() {\n" +
" return OUTPUT;\n" +
" }\n" +
" },\n" +
" OUTPUT {\n" +
" @Override\n" +
" public X getReverse() {\n" +
" return INPUT;\n" +
" }\n" +
" },\n" +
" INOUT {\n" +
" @Override\n" +
" public X getReverse() {\n" +
" return INOUT;\n" +
" }\n" +
" };\n" +
" X(){}\n" +
" public abstract X getReverse();\n" +
"}\n",
},
"");
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class"));
String actualOutput =
disassembler.disassemble(
classFileBytes,
"\n",
ClassFileBytesDisassembler.DETAILED);
String expectedOutput =
" // Method descriptor #20 (Ljava/lang/String;I)V\n" +
" // Stack: 3, Locals: 3\n" +
" private X(java.lang.String arg0, int arg1);\n";
int index = actualOutput.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(actualOutput, 3));
}
if (index == -1) {
assertEquals("unexpected bytecode sequence", expectedOutput, actualOutput);
}
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=88625
public void test085() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" enum Test1 {\n" +
" test11, test12\n" +
" };\n" +
" enum Test2 {\n" +
" test21, test22\n" +
" };\n" +
"\n" +
" void foo1(Test1 t1, Test2 t2) {\n" +
" boolean b = t1 == t2;\n" +
" }\n" +
" void foo2(Test1 t1, Object t2) {\n" +
" boolean b = t1 == t2;\n" +
" }\n" +
" void foo3(Test1 t1, Enum t2) {\n" +
" boolean b = t1 == t2;\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" boolean booleanTest = (Test1.test11 == Test2.test22);\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 10)\n" +
" boolean b = t1 == t2;\n" +
" ^^^^^^^^\n" +
"Incompatible operand types X.Test1 and X.Test2\n" +
"----------\n" +
"2. WARNING in X.java (at line 15)\n" +
" void foo3(Test1 t1, Enum t2) {\n" +
" ^^^^\n" +
"Enum is a raw type. References to generic type Enum<E> should be parameterized\n" +
"----------\n" +
"3. ERROR in X.java (at line 19)\n" +
" boolean booleanTest = (Test1.test11 == Test2.test22);\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
"Incompatible operand types X.Test1 and X.Test2\n" +
"----------\n");
}
public void test086() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" enum Test1 {\n" +
" V;\n" +
" static int foo = 0;\n" +
" }\n" +
"}\n",
},
"");
}
public void test087() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" enum Test1 {\n" +
" V;\n" +
" interface Foo {}\n" +
" }\n" +
"}\n",
},
"");
}
public void test088() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
"\n" +
" enum Test1 {\n" +
" V;\n" +
" }\n" +
" Object foo() {\n" +
" return this;\n" +
" }\n" +
"\n" +
" static class Sub extends X {\n" +
" @Override\n" +
" Test1 foo() {\n" +
" return Test1.V;\n" +
" }\n" +
" }\n" +
"}\n",
},
"");
}
public void test089() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
"\n" +
" enum Test1 {\n" +
" V;\n" +
" protected final Test1 clone() { return V; }\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 5)\n" +
" protected final Test1 clone() { return V; }\n" +
" ^^^^^^^\n" +
"Cannot override the final method from Enum<X.Test1>\n" +
"----------\n" +
"2. WARNING in X.java (at line 5)\n" +
" protected final Test1 clone() { return V; }\n" +
" ^^^^^^^\n" +
"The method clone() of type X.Test1 should be tagged with @Override since it actually overrides a superclass method\n" +
"----------\n");
}
public void test090() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
"\n" +
" enum Test1 {\n" +
" V;\n" +
" public Test1 foo() { return V; }\n" +
" }\n" +
" Zork z;\n" +
"}\n",
"java/lang/Object.java",
"package java.lang;\n" +
"public class Object {\n" +
" public Object foo() { return this; }\n" +
"}\n",
},
"----------\n" +
"1. WARNING in X.java (at line 5)\n" +
" public Test1 foo() { return V; }\n" +
" ^^^^^\n" +
"The method foo() of type X.Test1 should be tagged with @Override since it actually overrides a superclass method\n" +
"----------\n" +
"2. ERROR in X.java (at line 7)\n" +
" Zork z;\n" +
" ^^^^\n" +
"Zork cannot be resolved to a type\n" +
"----------\n");
}
public void test091() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
"\n" +
" enum Test1 {\n" +
" V;\n" +
" void foo() {}\n" +
" }\n" +
" class Member<E extends Test1> {\n" +
" void bar(E e) {\n" +
" e.foo();\n" +
" }\n" +
" }\n" +
"}\n",
},
"");
}
public void test092() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
"\n" +
" enum Test1 {\n" +
" V;\n" +
" void foo() {}\n" +
" }\n" +
" class Member<E extends Object & Test1> {\n" +
" void bar(E e) {\n" +
" e.foo();\n" +
" }\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 7)\n" +
" class Member<E extends Object & Test1> {\n" +
" ^^^^^\n" +
"The type X.Test1 is not an interface; it cannot be specified as a bounded parameter\n" +
"----------\n" +
"2. ERROR in X.java (at line 9)\n" +
" e.foo();\n" +
" ^^^\n" +
"The method foo() is undefined for the type E\n" +
"----------\n");
}
// check wildcard can extend Enum superclass
public void test093() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
"\n" +
" enum Test1 {\n" +
" V;\n" +
" void foo() {}\n" +
" }\n" +
" class Member<E extends Test1> {\n" +
" E e;\n" +
" void bar(Member<? extends Test1> me) {\n" +
" }\n" +
" }\n" +
"}\n",
},
"");
}
// check super bit is set
public void test094() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"public enum X {\n" +
"}\n",
},
"");
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class"));
String actualOutput =
disassembler.disassemble(
classFileBytes,
"\n",
ClassFileBytesDisassembler.DETAILED);
String expectedOutput =
"// Signature: Ljava/lang/Enum<LX;>;\n" +
"public final enum X {\n" +
" \n" +
" // Field descriptor #6 [LX;\n" +
" private static final synthetic X[] ENUM$VALUES;\n" +
" \n" +
" // Method descriptor #8 ()V\n" +
" // Stack: 1, Locals: 0\n" +
" static {};\n" +
" 0 iconst_0\n" +
" 1 anewarray X [1]\n" +
" 4 putstatic X.ENUM$VALUES : X[] [10]\n" +
" 7 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 1]\n" +
" \n" +
" // Method descriptor #15 (Ljava/lang/String;I)V\n" +
" // Stack: 3, Locals: 3\n" +
" private X(java.lang.String arg0, int arg1);\n" +
" 0 aload_0 [this]\n" +
" 1 aload_1 [arg0]\n" +
" 2 iload_2 [arg1]\n" +
" 3 invokespecial java.lang.Enum(java.lang.String, int) [16]\n" +
" 6 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 1]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 7] local: this index: 0 type: X\n" +
" \n" +
" // Method descriptor #21 ()[LX;\n" +
" // Stack: 5, Locals: 3\n" +
" public static X[] values();\n" +
" 0 getstatic X.ENUM$VALUES : X[] [10]\n" +
" 3 dup\n" +
" 4 astore_0\n" +
" 5 iconst_0\n" +
" 6 aload_0\n" +
" 7 arraylength\n" +
" 8 dup\n" +
" 9 istore_1\n" +
" 10 anewarray X [1]\n" +
" 13 dup\n" +
" 14 astore_2\n" +
" 15 iconst_0\n" +
" 16 iload_1\n" +
" 17 invokestatic java.lang.System.arraycopy(java.lang.Object, int, java.lang.Object, int, int) : void [22]\n" +
" 20 aload_2\n" +
" 21 areturn\n" +
" Line numbers:\n" +
" [pc: 0, line: 1]\n" +
" \n" +
" // Method descriptor #29 (Ljava/lang/String;)LX;\n" +
" // Stack: 2, Locals: 1\n" +
" public static X valueOf(java.lang.String arg0);\n" +
" 0 ldc <Class X> [1]\n" +
" 2 aload_0 [arg0]\n" +
" 3 invokestatic java.lang.Enum.valueOf(java.lang.Class, java.lang.String) : java.lang.Enum [30]\n" +
" 6 checkcast X [1]\n" +
" 9 areturn\n" +
" Line numbers:\n" +
" [pc: 0, line: 1]\n";
int index = actualOutput.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(actualOutput, 3));
}
if (index == -1) {
assertEquals("unexpected bytecode sequence", expectedOutput, actualOutput);
}
}
public void test095() { // check missing abstract cases from multiple interfaces
this.runNegativeTest(
new String[] {
"X.java",
"public enum X implements I, J { \n" +
" ROUGE;\n" +
"}\n" +
"interface I { void foo(); }\n" +
"interface J { void foo(); }\n"
},
"----------\n" +
"1. ERROR in X.java (at line 1)\n" +
" public enum X implements I, J { \n" +
" ^\n" +
"The type X must implement the inherited abstract method I.foo()\n" +
"----------\n");
this.runNegativeTest(
new String[] {
"X.java",
"public enum X implements I, J { \n" +
" ROUGE;\n" +
" public void foo() {}\n" +
"}\n" +
"interface I { void foo(int i); }\n" +
"interface J { void foo(); }\n"
},
"----------\n" +
"1. ERROR in X.java (at line 1)\n" +
" public enum X implements I, J { \n" +
" ^\n" +
"The type X must implement the inherited abstract method I.foo(int)\n" +
"----------\n");
}
public void test096() { // check for raw vs. parameterized parameter types
this.runConformTest(
new String[] {
"X.java",
"public enum X implements I { \n" +
" ROUGE;\n" +
" public void foo(A a) {}\n" +
"}\n" +
"interface I { void foo(A<String> a); }\n" +
"class A<T> {}\n"
},
"");
this.runConformTest(
new String[] {
"X.java",
"public enum X implements I { \n" +
" ROUGE { public void foo(A a) {} }\n" +
" ;\n" +
"}\n" +
"interface I { void foo(A<String> a); }\n" +
"class A<T> {}\n"
},
"");
this.runNegativeTest(
new String[] {
"X.java",
"public enum X implements I { \n" +
" ROUGE;\n" +
" public void foo(A<String> a) {}\n" +
"}\n" +
"interface I { void foo(A a); }\n" +
"class A<T> {}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 1)\n" +
" public enum X implements I { \n" +
" ^\n" +
"The type X must implement the inherited abstract method I.foo(A)\n" +
"----------\n" +
"2. ERROR in X.java (at line 3)\n" +
" public void foo(A<String> a) {}\n" +
" ^^^^^^^^^^^^^^^^\n" +
"Name clash: The method foo(A<String>) of type X has the same erasure as foo(A) of type I but does not override it\n" +
"----------\n" +
"3. WARNING in X.java (at line 5)\n" +
" interface I { void foo(A a); }\n" +
" ^\n" +
"A is a raw type. References to generic type A<T> should be parameterized\n" +
"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=89982
public void test097() {
this.runNegativeTest(
new String[] {
"E.java",
"public class E {\n" +
" enum Numbers { ONE, TWO, THREE }\n" +
" static final String BLANK = \" \";\n" +
" void foo(Colors color) {\n" +
" switch (color) {\n" +
" case BLUE:\n" +
" case RED:\n" +
" break;\n" +
" } \n" +
" }\n" +
"}\n" +
"/**\n" +
" * Enumeration of some basic colors.\n" +
" */\n" +
"enum Colors {\n" +
" BLACK,\n" +
" WHITE,\n" +
" RED \n" +
"}\n",
},
"----------\n" +
"1. ERROR in E.java (at line 6)\n" +
" case BLUE:\n" +
" ^^^^\n" +
"BLUE cannot be resolved or is not a field\n" +
"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=89982 - variation
public void test098() {
this.runNegativeTest(
new String[] {
"E.java",
"public class E {\n" +
" enum Numbers { ONE, TWO, THREE }\n" +
" static final String BLANK = \" \";\n" +
" void foo(Colors color) {\n" +
" switch (color) {\n" +
" } \n" +
" }\n" +
"}\n" +
"/**\n" +
" * Enumeration of some basic colors.\n" +
" */\n" +
"enum Colors {\n" +
" BLACK,\n" +
" WHITE,\n" +
" RED; \n" +
" Zork z;\n" +
"}\n",
},
"----------\n" +
"1. WARNING in E.java (at line 5)\n" +
" switch (color) {\n" +
" ^^^^^\n" +
"The enum constant BLACK needs a corresponding case label in this enum switch on Colors\n" +
"----------\n" +
"2. WARNING in E.java (at line 5)\n" +
" switch (color) {\n" +
" ^^^^^\n" +
"The enum constant RED needs a corresponding case label in this enum switch on Colors\n" +
"----------\n" +
"3. WARNING in E.java (at line 5)\n" +
" switch (color) {\n" +
" ^^^^^\n" +
"The enum constant WHITE needs a corresponding case label in this enum switch on Colors\n" +
"----------\n" +
"4. ERROR in E.java (at line 16)\n" +
" Zork z;\n" +
" ^^^^\n" +
"Zork cannot be resolved to a type\n" +
"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=89274
public void test099() {
this.runNegativeTest(
new String[] {
"X.java",
"class A<T> {\n" +
" enum E {\n" +
" v1, v2;\n" +
" }\n" +
"}\n" +
"\n" +
"public class X extends A<Integer> {\n" +
" void a(A.E e) {\n" +
" b(e); // no unchecked warning\n" +
" }\n" +
"\n" +
" void b(E e) {\n" +
" A<Integer>.E e1 = e;\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 13)\n" +
" A<Integer>.E e1 = e;\n" +
" ^^^^^^^^^^^^\n" +
"The member type A<Integer>.E cannot be qualified with a parameterized type, since it is static. Remove arguments from qualifying type A<Integer>\n" +
"----------\n");
}
/* from JLS
"It is a compile-time error to reference a static field of an enum type
that is not a compile-time constant (15.28) from constructors, instance
initializer blocks, or instance variable initializer expressions of that
type. It is a compile-time error for the constructors, instance initializer
blocks, or instance variable initializer expressions of an enum constant e1
to refer to itself or an enum constant of the same type that is declared to
the right of e1."
*/
public void test100() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X {\n" +
"\n" +
" anEnumValue {\n" +
" private final X thisOne = anEnumValue;\n" +
"\n" +
" @Override String getMessage() {\n" +
" return \"Here is what thisOne gets assigned: \" + thisOne;\n" +
" }\n" +
" };\n" +
"\n" +
" abstract String getMessage();\n" +
"\n" +
" public static void main(String[] args) {\n" +
" System.out.println(anEnumValue.getMessage());\n" +
" System.out.println(\"SUCCESS\");\n" +
" }\n" +
"\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 4)\n" +
" private final X thisOne = anEnumValue;\n" +
" ^^^^^^^^^^^\n" +
"Cannot refer to the static enum field X.anEnumValue within an initializer\n" +
"----------\n",
JavacTestOptions.JavacHasABug.JavacBugFixed_6_10);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=91761
public void test101() {
this.runNegativeTest(
new String[] {
"X.java",
"interface Foo {\n" +
" public boolean bar();\n" +
"}\n" +
"enum BugDemo {\n" +
" CONSTANT(new Foo() {\n" +
" public boolean bar() {\n" +
" Zork z;\n" +
" return true;\n" +
" }\n" +
" });\n" +
" BugDemo(Foo foo) {\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 7)\n" +
" Zork z;\n" +
" ^^^^\n" +
"Zork cannot be resolved to a type\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=90775
public void test102() {
this.runNegativeTest(
new String[] {
"X.java",
"import java.util.*;\n" +
"\n" +
"public class X <T> {\n" +
" enum SomeEnum {\n" +
" A, B;\n" +
" static SomeEnum foo() {\n" +
" return null;\n" +
" }\n" +
" }\n" +
" Enum<SomeEnum> e = SomeEnum.A;\n" +
" \n" +
" Set<SomeEnum> set1 = EnumSet.of(SomeEnum.A);\n" +
" Set<SomeEnum> set2 = EnumSet.of(SomeEnum.foo());\n" +
" \n" +
" Foo<Bar> foo = null;\n" +
"}\n" +
"class Foo <U extends Foo<U>> {\n" +
"}\n" +
"class Bar extends Foo {\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 15)\n" +
" Foo<Bar> foo = null;\n" +
" ^^^\n" +
"Bound mismatch: The type Bar is not a valid substitute for the bounded parameter <U extends Foo<U>> of the type Foo<U>\n" +
"----------\n" +
"2. WARNING in X.java (at line 19)\n" +
" class Bar extends Foo {\n" +
" ^^^\n" +
"Foo is a raw type. References to generic type Foo<U> should be parameterized\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=93396
public void test103() {
this.runNegativeTest(
new String[] {
"BadEnum.java",
"public class BadEnum {\n" +
" public interface EnumInterface<T extends Object> {\n" +
" public T getMethod();\n" +
" }\n" +
" public enum EnumClass implements EnumInterface<String> {\n" +
" ENUM1 { public String getMethod() { return \"ENUM1\";} },\n" +
" ENUM2 { public String getMethod() { return \"ENUM2\";} };\n" +
" }\n" +
"}\n" +
"}\n",
},
"----------\n" +
"1. ERROR in BadEnum.java (at line 10)\n" +
" }\n" +
" ^\n" +
"Syntax error on token \"}\", delete this token\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=90215
public void test104() {
this.runConformTest(
new String[] {
"p/Placeholder.java",
"package p;\n" +
"\n" +
"public class Placeholder {\n" +
" public static void main(String... argv) {\n" +
" ClassWithBadEnum.EnumClass constant = ClassWithBadEnum.EnumClass.ENUM1;\n" + // forward ref
" ClassWithBadEnum.main(argv);\n" +
" }\n" +
"} \n" +
"\n",
"p/ClassWithBadEnum.java",
"package p;\n" +
"\n" +
"public class ClassWithBadEnum {\n" +
" public interface EnumInterface<T extends Object> {\n" +
" public T getMethod();\n" +
" }\n" +
"\n" +
" public enum EnumClass implements EnumInterface<String> {\n" +
" ENUM1 { public String getMethod() { return \"ENUM1\";} },\n" +
" ENUM2 { public String getMethod() { return \"ENUM2\";} };\n" +
" }\n" +
" private EnumClass enumVar; \n" +
" public EnumClass getEnumVar() {\n" +
" return enumVar;\n" +
" }\n" +
" public void setEnumVar(EnumClass enumVar) {\n" +
" this.enumVar = enumVar;\n" +
" }\n" +
"\n" +
" public static void main(String... argv) {\n" +
" int a = 1;\n" +
" ClassWithBadEnum badEnum = new ClassWithBadEnum();\n" +
" badEnum.setEnumVar(ClassWithBadEnum.EnumClass.ENUM1);\n" +
" // Should fail if bug manifests itself because there will be two getInternalValue() methods\n" +
" // one returning an Object instead of a String\n" +
" String s3 = badEnum.getEnumVar().getMethod();\n" +
" System.out.println(s3);\n" +
" }\n" +
"} \n",
},
"ENUM1");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=88395
public void test105() {
this.runConformTest(
new String[] {
"pack/X.java",
"package pack;\n" +
"import static pack.Color.*;\n" +
"public class X {\n" +
" public static void main(String[] args) {\n" +
" Color c = BLACK;\n" +
" switch(c) {\n" +
" case BLACK:\n" +
" System.out.print(\"Black\");\n" +
" break;\n" +
" case WHITE:\n" +
" System.out.print(\"White\");\n" +
" break;\n" +
" }\n" +
" }\n" +
"}",
"pack/Color.java",
"package pack;\n" +
"enum Color {WHITE, BLACK}"
},
"Black"
);
this.runConformTest(
new String[] {
"pack/Color.java",
"package pack;\n" +
"enum Color {BLACK, WHITE}"
},
"",
null,
false,
null
);
executeClass(
"pack/X.java",
"Black",
null,
false,
null,
null,
null);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=88395
public void test106() {
this.runConformTest(
new String[] {
"pack/X.java",
"package pack;\n" +
"import static pack.Color.*;\n" +
"public class X {\n" +
" public static void main(String[] args) {\n" +
" Color c = BLACK;\n" +
" switch(c) {\n" +
" }\n" +
" System.out.print(\"SUCCESS\");\n" +
" }\n" +
"}",
"pack/Color.java",
"package pack;\n" +
"enum Color {WHITE, BLACK}"
},
"SUCCESS"
);
this.runConformTest(
new String[] {
"pack/Color.java",
"package pack;\n" +
"enum Color {BLACK, WHITE}"
},
"",
null,
false,
null
);
executeClass(
"pack/X.java",
"SUCCESS",
null,
false,
null,
null,
null);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=88395
public void test107() {
this.runConformTest(
new String[] {
"pack/X.java",
"package pack;\n" +
"import static pack.Color.*;\n" +
"public class X {\n" +
" public static void main(String[] args) {\n" +
" Color c = BLACK;\n" +
" switch(c) {\n" +
" case BLACK:\n" +
" System.out.print(\"Black\");\n" +
" break;\n" +
" case WHITE:\n" +
" System.out.print(\"White\");\n" +
" break;\n" +
" }\n" +
" switch(c) {\n" +
" case BLACK:\n" +
" System.out.print(\"Black\");\n" +
" break;\n" +
" case WHITE:\n" +
" System.out.print(\"White\");\n" +
" break;\n" +
" }\n" +
" }\n" +
"}",
"pack/Color.java",
"package pack;\n" +
"enum Color {WHITE, BLACK}"
},
"BlackBlack"
);
this.runConformTest(
new String[] {
"pack/Color.java",
"package pack;\n" +
"enum Color { BLACK }"
},
"",
null,
false,
null
);
executeClass(
"pack/X.java",
"BlackBlack",
null,
false,
null,
null,
null);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=88395
public void test108() {
this.runConformTest(
new String[] {
"pack/X.java",
"package pack;\n" +
"import static pack.Color.*;\n" +
"public class X {\n" +
" public static void main(String[] args) {\n" +
" Color c = BLACK;\n" +
" switch(c) {\n" +
" case BLACK:\n" +
" System.out.print(\"Black\");\n" +
" break;\n" +
" case WHITE:\n" +
" System.out.print(\"White\");\n" +
" break;\n" +
" default:\n" +
" System.out.print(\"Error\");\n" +
" break;\n" +
" }\n" +
" }\n" +
"}",
"pack/Color.java",
"package pack;\n" +
"enum Color {WHITE, BLACK}"
},
"Black"
);
this.runConformTest(
new String[] {
"pack/Color.java",
"package pack;\n" +
"enum Color {RED, GREEN, YELLOW, BLACK, WHITE}"
},
"",
null,
false,
null
);
executeClass(
"pack/X.java",
"Black",
null,
false,
null,
null,
null);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=88395
public void test109() {
this.runConformTest(
new String[] {
"pack/X.java",
"package pack;\n" +
"import static pack.Color.*;\n" +
"public class X {\n" +
" public static void main(String[] args) {\n" +
" Color c = null;\n" +
" try {\n" +
" c = BLACK;\n" +
" } catch(NoSuchFieldError e) {\n" +
" System.out.print(\"SUCCESS\");\n" +
" return;\n" +
" }\n" +
" switch(c) {\n" +
" case BLACK:\n" +
" System.out.print(\"Black\");\n" +
" break;\n" +
" case WHITE:\n" +
" System.out.print(\"White\");\n" +
" break;\n" +
" }\n" +
" }\n" +
"}",
"pack/Color.java",
"package pack;\n" +
"enum Color {WHITE, BLACK}"
},
"Black"
);
this.runConformTest(
new String[] {
"pack/Color.java",
"package pack;\n" +
"enum Color {RED, GREEN, YELLOW, WHITE}"
},
"",
null,
false,
null
);
executeClass(
"pack/X.java",
"SUCCESS",
null,
false,
null,
null,
null);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=88395
public void test110() {
this.runConformTest(
new String[] {
"pack/X.java",
"package pack;\n" +
"import static pack.Color.*;\n" +
"public class X {\n" +
" public int[] $SWITCH_TABLE$pack$Color;\n" +
" public int[] $SWITCH_TABLE$pack$Color() { return null; }\n" +
" public static void main(String[] args) {\n" +
" Color c = BLACK;\n" +
" switch(c) {\n" +
" case BLACK:\n" +
" System.out.print(\"Black\");\n" +
" break;\n" +
" case WHITE:\n" +
" System.out.print(\"White\");\n" +
" break;\n" +
" }\n" +
" }\n" +
"}",
"pack/Color.java",
"package pack;\n" +
"enum Color {WHITE, BLACK}"
},
"Black"
);
this.runConformTest(
new String[] {
"pack/Color.java",
"package pack;\n" +
"enum Color {BLACK, WHITE}"
},
"",
null,
false,
null
);
executeClass(
"pack/X.java",
"Black",
null,
false,
null,
null,
null);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=88395
public void test111() {
this.runConformTest(
new String[] {
"pack/X.java",
"package pack;\n" +
"import static pack.Color.*;\n" +
"public class X {\n" +
" public int[] $SWITCH_TABLE$pack$Color;\n" +
" public int[] $SWITCH_TABLE$pack$Color() { return null; }\n" +
" public static void main(String[] args) {\n" +
" Color c = BLACK;\n" +
" switch(c) {\n" +
" case BLACK:\n" +
" System.out.print(\"Black\");\n" +
" break;\n" +
" case WHITE:\n" +
" System.out.print(\"White\");\n" +
" break;\n" +
" }\n" +
" foo();\n" +
" }\n" +
" public static void foo() {\n" +
" Color c = BLACK;\n" +
" switch(c) {\n" +
" case BLACK:\n" +
" System.out.print(\"Black\");\n" +
" break;\n" +
" case WHITE:\n" +
" System.out.print(\"White\");\n" +
" break;\n" +
" }\n" +
" }\n" +
"}",
"pack/Color.java",
"package pack;\n" +
"enum Color {WHITE, BLACK}"
},
"BlackBlack"
);
this.runConformTest(
new String[] {
"pack/Color.java",
"package pack;\n" +
"enum Color {BLACK, WHITE}"
},
"",
null,
false,
null
);
executeClass(
"pack/X.java",
"BlackBlack",
null,
false,
null,
null,
null);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=97247
public void test112() {
this.runConformTest(
new String[] {
"com/annot/Foo.java",
"package com.annot;\n" +
"\n" +
"import static com.annot.TestType.*;\n" +
"\n" +
"public class Foo {\n" +
" @Test(type=PERFORMANCE)\n" +
" public void testBar() throws Exception {\n" +
" Test annotation = this.getClass().getMethod(\"testBar\").getAnnotation(Test.class);\n" +
" switch (annotation.type()) {\n" +
" case PERFORMANCE:\n" +
" System.out.println(PERFORMANCE);\n" +
" break;\n" +
" case CORRECTNESS:\n" +
" System.out.println(CORRECTNESS);\n" +
" break;\n" +
" } \n" +
" }\n" +
"}",
"com/annot/Test.java",
"package com.annot;\n" +
"\n" +
"import static com.annot.TestType.CORRECTNESS;\n" +
"import static java.lang.annotation.ElementType.METHOD;\n" +
"\n" +
"import java.lang.annotation.Target;\n" +
"\n" +
"@Target(METHOD)\n" +
"public @interface Test {\n" +
" TestType type() default CORRECTNESS;\n" +
"}",
"com/annot/TestType.java",
"package com.annot;\n" +
"\n" +
"public enum TestType {\n" +
" CORRECTNESS,\n" +
" PERFORMANCE\n" +
"}"
},
""
);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=93789
public void test113() {
this.runNegativeTest(
new String[] {
"X.java",
"enum BugDemo {\n" +
" FOO() {\n" +
" static int bar;\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" static int bar;\n" +
" ^^^\n" +
"The field bar cannot be declared static; static fields can only be declared in static or top level types\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=99428 and https://bugs.eclipse.org/bugs/show_bug.cgi?id=99655
public void test114() {
this.runConformTest(
new String[] {
"EnumTest.java",
"import java.lang.reflect.*;\n" +
"import java.lang.annotation.*;\n" +
"@ExpectedModifiers(Modifier.FINAL)\n" +
"public enum EnumTest {\n" +
" X(255);\n" +
" EnumTest(int r) {}\n" +
" public static void main(String argv[]) throws Exception {\n" +
" test(\"EnumTest\");\n" +
" test(\"EnumTest$EnumA\");\n" +
" test(\"EnumTest$EnumB\");\n" +
" test(\"EnumTest$EnumB2\");\n" +
" test(\"EnumTest$EnumB3\");\n" +
// TODO (kent) need verifier to detect when an Enum should be tagged as abstract
//" test(\"EnumTest$EnumC\");\n" +
//" test(\"EnumTest$EnumC2\");\n" +
" test(\"EnumTest$EnumC3\");\n" +
" test(\"EnumTest$EnumD\");\n" +
" }\n" +
" static void test(String className) throws Exception {\n" +
" Class c = Class.forName(className);\n" +
" ExpectedModifiers em = (ExpectedModifiers) c.getAnnotation(ExpectedModifiers.class);\n" +
" if (em != null) {\n" +
" int classModifiers = c.getModifiers();\n" +
" int expected = em.value();\n" +
" if (expected != (classModifiers & (Modifier.ABSTRACT|Modifier.FINAL|Modifier.STATIC))) {\n" +
" if ((expected & Modifier.ABSTRACT) != (classModifiers & Modifier.ABSTRACT))\n" +
" System.out.println(\"FAILED ABSTRACT: \" + className);\n" +
" if ((expected & Modifier.FINAL) != (classModifiers & Modifier.FINAL))\n" +
" System.out.println(\"FAILED FINAL: \" + className);\n" +
" if ((expected & Modifier.STATIC) != (classModifiers & Modifier.STATIC))\n" +
" System.out.println(\"FAILED STATIC: \" + className);\n" +
" }\n" +
" }\n" +
" }\n" +
" @ExpectedModifiers(Modifier.FINAL|Modifier.STATIC)\n" +
" enum EnumA {\n" +
" A;\n" +
" }\n" +
" @ExpectedModifiers(Modifier.STATIC)\n" +
" enum EnumB {\n" +
" B {\n" +
" int value() { return 1; }\n" +
" };\n" +
" int value(){ return 0; }\n" +
" }\n" +
" @ExpectedModifiers(Modifier.STATIC)\n" +
" enum EnumB2 {\n" +
" B2 {};\n" +
" int value(){ return 0; }\n" +
" }\n" +
" @ExpectedModifiers(Modifier.FINAL|Modifier.STATIC)\n" +
" enum EnumB3 {\n" +
" B3;\n" +
" int value(){ return 0; }\n" +
" }\n" +
" @ExpectedModifiers(Modifier.STATIC)\n" +
" enum EnumC implements I {\n" +
" C {\n" +
" int value() { return 1; }\n" +
" };\n" +
" int value(){ return 0; }\n" +
" public void foo(){}\n" +
" }\n" +
" @ExpectedModifiers(Modifier.STATIC)\n" +
" enum EnumC2 implements I {\n" +
" C2 {};\n" +
" int value(){ return 0; }\n" +
" public void foo(){}\n" +
" }\n" +
" @ExpectedModifiers(Modifier.FINAL|Modifier.STATIC)\n" +
" enum EnumC3 implements I {\n" +
" C3;\n" +
" int value(){ return 0; }\n" +
" public void foo(){}\n" +
" }\n" +
" @ExpectedModifiers(Modifier.ABSTRACT|Modifier.STATIC)\n" +
" enum EnumD {\n" +
" D {\n" +
" int value() { return 1; }\n" +
" };\n" +
" abstract int value();\n" +
" }\n" +
"}\n" +
"interface I {\n" +
" void foo();\n" +
"}\n" +
"@Retention(RetentionPolicy.RUNTIME)\n" +
"@interface ExpectedModifiers {\n" +
" int value();\n" +
"}"
},
"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=101713
public void test115() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X {\n" +
" VALUE;\n" +
"\n" +
" static int ASD;\n" +
" final static int CST = 0;\n" +
" \n" +
" private X() {\n" +
" VALUE = null;\n" +
" ASD = 5;\n" +
" X.VALUE = null;\n" +
" X.ASD = 5;\n" +
" \n" +
" System.out.println(CST);\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 8)\n" +
" VALUE = null;\n" +
" ^^^^^\n" +
"Cannot refer to the static enum field X.VALUE within an initializer\n" +
"----------\n" +
"2. ERROR in X.java (at line 9)\n" +
" ASD = 5;\n" +
" ^^^\n" +
"Cannot refer to the static enum field X.ASD within an initializer\n" +
"----------\n" +
"3. ERROR in X.java (at line 10)\n" +
" X.VALUE = null;\n" +
" ^^^^^\n" +
"Cannot refer to the static enum field X.VALUE within an initializer\n" +
"----------\n" +
"4. ERROR in X.java (at line 11)\n" +
" X.ASD = 5;\n" +
" ^^^\n" +
"Cannot refer to the static enum field X.ASD within an initializer\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=101713 - variation
public void test116() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X { \n" +
" BLEU, \n" +
" BLANC, \n" +
" ROUGE;\n" +
" {\n" +
" BLEU = null;\n" +
" }\n" +
"}"
},
"----------\n" +
"1. ERROR in X.java (at line 6)\n" +
" BLEU = null;\n" +
" ^^^^\n" +
"Cannot refer to the static enum field X.BLEU within an initializer\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=101713 - variation
public void test117() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X { \n" +
" BLEU, \n" +
" BLANC, \n" +
" ROUGE;\n" +
" {\n" +
" X x = BLEU.BLANC; // ko\n" +
" X x2 = BLEU; // ko\n" +
" }\n" +
" static {\n" +
" X x = BLEU.BLANC; // ok\n" +
" X x2 = BLEU; // ok\n" +
" } \n" +
" X dummy = BLEU; // ko\n" +
" static X DUMMY = BLANC; // ok\n" +
" X() {\n" +
" X x = BLEU.BLANC; // ko\n" +
" X x2 = BLEU; // ko\n" +
" }\n" +
"}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 6)\n" +
" X x = BLEU.BLANC; // ko\n" +
" ^^^^\n" +
"Cannot refer to the static enum field X.BLEU within an initializer\n" +
"----------\n" +
"2. ERROR in X.java (at line 6)\n" +
" X x = BLEU.BLANC; // ko\n" +
" ^^^^^\n" +
"Cannot refer to the static enum field X.BLANC within an initializer\n" +
"----------\n" +
"3. WARNING in X.java (at line 6)\n" +
" X x = BLEU.BLANC; // ko\n" +
" ^^^^^\n" +
"The static field X.BLANC should be accessed in a static way\n" +
"----------\n" +
"4. ERROR in X.java (at line 7)\n" +
" X x2 = BLEU; // ko\n" +
" ^^^^\n" +
"Cannot refer to the static enum field X.BLEU within an initializer\n" +
"----------\n" +
"5. WARNING in X.java (at line 10)\n" +
" X x = BLEU.BLANC; // ok\n" +
" ^^^^^\n" +
"The static field X.BLANC should be accessed in a static way\n" +
"----------\n" +
"6. ERROR in X.java (at line 13)\n" +
" X dummy = BLEU; // ko\n" +
" ^^^^\n" +
"Cannot refer to the static enum field X.BLEU within an initializer\n" +
"----------\n" +
"7. ERROR in X.java (at line 16)\n" +
" X x = BLEU.BLANC; // ko\n" +
" ^^^^\n" +
"Cannot refer to the static enum field X.BLEU within an initializer\n" +
"----------\n" +
"8. ERROR in X.java (at line 16)\n" +
" X x = BLEU.BLANC; // ko\n" +
" ^^^^^\n" +
"Cannot refer to the static enum field X.BLANC within an initializer\n" +
"----------\n" +
"9. WARNING in X.java (at line 16)\n" +
" X x = BLEU.BLANC; // ko\n" +
" ^^^^^\n" +
"The static field X.BLANC should be accessed in a static way\n" +
"----------\n" +
"10. ERROR in X.java (at line 17)\n" +
" X x2 = BLEU; // ko\n" +
" ^^^^\n" +
"Cannot refer to the static enum field X.BLEU within an initializer\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=102265
public void test118() {
this.runNegativeTest(
new String[] {
"X.java",
"import java.util.ArrayList;\n" +
"\n" +
"public enum X {\n" +
" one,\n" +
" two;\n" +
" \n" +
" static ArrayList someList;\n" +
" \n" +
" private X() {\n" +
" if (someList == null) {\n" +
" someList = new ArrayList();\n" +
" }\n" +
" }\n" +
"}\n"
},
"----------\n" +
"1. WARNING in X.java (at line 7)\n" +
" static ArrayList someList;\n" +
" ^^^^^^^^^\n" +
"ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized\n" +
"----------\n" +
"2. ERROR in X.java (at line 10)\n" +
" if (someList == null) {\n" +
" ^^^^^^^^\n" +
"Cannot refer to the static enum field X.someList within an initializer\n" +
"----------\n" +
"3. ERROR in X.java (at line 11)\n" +
" someList = new ArrayList();\n" +
" ^^^^^^^^\n" +
"Cannot refer to the static enum field X.someList within an initializer\n" +
"----------\n" +
"4. WARNING in X.java (at line 11)\n" +
" someList = new ArrayList();\n" +
" ^^^^^^^^^\n" +
"ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized\n" +
"----------\n");
}
public void test119() {
this.runConformTest(
new String[] {
"X.java",
"public enum X {\n" +
" BLEU, BLANC, ROUGE;\n" +
" final static int CST = 0;\n" +
" enum Member {\n" +
" ;\n" +
" Object obj1 = CST;\n" +
" Object obj2 = BLEU;\n" +
" }\n" +
"}\n"
},
"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=102213
public void test120() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X {\n" +
"\n" +
" A() {\n" +
" final X a = A;\n" +
" final X a2 = B.A;\n" +
" @Override void foo() {\n" +
" System.out.println(String.valueOf(a));\n" +
" System.out.println(String.valueOf(a2));\n" +
" }\n" +
" },\n" +
" B() {\n" +
" @Override void foo(){}\n" +
" };\n" +
" abstract void foo();\n" +
"\n" +
" public static void main(String[] args) {\n" +
" A.foo();\n" +
" }\n" +
"}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 4)\n" +
" final X a = A;\n" +
" ^\n" +
"Cannot refer to the static enum field X.A within an initializer\n" +
"----------\n" +
"2. ERROR in X.java (at line 5)\n" +
" final X a2 = B.A;\n" +
" ^\n" +
"Cannot refer to the static enum field X.B within an initializer\n" +
"----------\n" +
"3. ERROR in X.java (at line 5)\n" +
" final X a2 = B.A;\n" +
" ^\n" +
"Cannot refer to the static enum field X.A within an initializer\n" +
"----------\n" +
"4. WARNING in X.java (at line 5)\n" +
" final X a2 = B.A;\n" +
" ^\n" +
"The static field X.A should be accessed in a static way\n" +
"----------\n",
JavacTestOptions.JavacHasABug.JavacBugFixed_6_10);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=92165
public void test121() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X {\n" +
"\n" +
" UNKNOWN();\n" +
"\n" +
" private static String error;\n" +
"\n" +
" {\n" +
" error = \"error\";\n" +
" }\n" +
"\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 8)\n" +
" error = \"error\";\n" +
" ^^^^^\n" +
"Cannot refer to the static enum field X.error within an initializer\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=105592
public void test122() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public enum State {\n" +
" NORMAL\n" +
" }\n" +
" public void foo() {\n" +
" State state = State.NORMAL;\n" +
" switch (state) {\n" +
" case (NORMAL) :\n" +
" System.out.println(State.NORMAL);\n" +
" break;\n" +
" }\n" +
" }\n" +
"}"
},
"----------\n" +
"1. ERROR in X.java (at line 8)\n" +
" case (NORMAL) :\n" +
" ^^^^^^^^\n" +
"Enum constants cannot be surrounded by parenthesis\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=110403
public void test123() {
this.runNegativeTest(
new String[] {
"Foo.java",
"enum Foo {\n" +
" A(0);\n" +
" Foo(int x) {\n" +
" t[0]=x;\n" +
" }\n" +
" private static final int[] t = new int[12];\n" +
"}",
},
"----------\n" +
"1. ERROR in Foo.java (at line 4)\n" +
" t[0]=x;\n" +
" ^\n" +
"Cannot refer to the static enum field Foo.t within an initializer\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=1101417
public void test124() {
this.runNegativeTest(
new String[] {
"X.java",
" public enum X {\n" +
" max {\n" +
" { \n" +
" val=3; \n" +
" } \n" +
" @Override public String toString() {\n" +
" return Integer.toString(val);\n" +
" }\n" +
" }; \n" +
" {\n" +
" val=2;\n" +
" }\n" +
" private int val; \n" +
" public static void main(String[] args) {\n" +
" System.out.println(max); // 3\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 4)\n" +
" val=3; \n" +
" ^^^\n" +
"Cannot make a static reference to the non-static field val\n" +
"----------\n" +
"2. ERROR in X.java (at line 7)\n" +
" return Integer.toString(val);\n" +
" ^^^\n" +
"Cannot make a static reference to the non-static field val\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=112231
public void test125() {
this.runNegativeTest(
new String[] {
"X.java",
"\n" +
"public class X {\n" +
" interface I {\n" +
" int values();\n" +
" enum E implements I {\n" +
" A, B, C;\n" +
" }\n" +
" }\n" +
"}"
},
"----------\n" +
"1. ERROR in X.java (at line 5)\n" +
" enum E implements I {\n" +
" ^\n" +
"This static method cannot hide the instance method from X.I\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=126087
public void test126() {
this.runConformTest(
new String[] {
"X.java",
" public class X {\n" +
" enum NoValues {}\n" +
" public static void main(String[] args) {\n" +
" System.out.println(\"[\"+NoValues.values().length+\"]\");\n" +
" }\n" +
" }\n"
},
"[0]");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=126087
public void test127() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"public enum X {\n" +
" VALUE {\n" +
" void foo() {\n" +
" };\n" +
" };\n" +
" abstract void foo();\n" +
" public static void main(String[] args) {\n" +
" System.out.println(\"[\"+X.values().length+\"]\");\n" +
" }\n" +
"}"
},
"[1]");
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class"));
String actualOutput =
disassembler.disassemble(
classFileBytes,
"\n",
ClassFileBytesDisassembler.DETAILED);
String expectedOutput =
" private static final synthetic X[] ENUM$VALUES;\n";
int index = actualOutput.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(actualOutput, 3));
}
if (index == -1) {
assertEquals("unexpected bytecode sequence", expectedOutput, actualOutput);
}
disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X$1.class"));
actualOutput =
disassembler.disassemble(
classFileBytes,
"\n",
ClassFileBytesDisassembler.DETAILED);
expectedOutput =
"ENUM$VALUES";
index = actualOutput.indexOf(expectedOutput);
if (index != -1) {
System.out.println(Util.displayString(actualOutput, 3));
}
if (index != -1) {
assertTrue("Must not have field ENUM$VALUES", false);
}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=127766
public void test128() {
Map options = getCompilerOptions();
options.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.IGNORE);
options.put(CompilerOptions.OPTION_ReportMissingSerialVersion, CompilerOptions.IGNORE);
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main( String[] args) {\n" +
" Enum e = new Enum(\"foo\", 2) {\n" +
" public int compareTo( Object o) {\n" +
" return 0;\n" +
" }\n" +
" };\n" +
" System.out.println(e);\n" +
" }\n" +
"}",
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" Enum e = new Enum(\"foo\", 2) {\n" +
" ^^^^\n" +
"The type new Enum(){} may not subclass Enum explicitly\n" +
"----------\n",
null,
true,
options);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=141155
public void test129() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"public enum X {\n" +
" A, B, C;\n" +
"}\n",
},
"");
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class"));
String actualOutput =
disassembler.disassemble(
classFileBytes,
"\n",
ClassFileBytesDisassembler.DETAILED);
String expectedOutput =
"// Signature: Ljava/lang/Enum<LX;>;\n" +
"public final enum X {\n" +
" \n" +
" // Field descriptor #6 LX;\n" +
" public static final enum X A;\n" +
" \n" +
" // Field descriptor #6 LX;\n" +
" public static final enum X B;\n" +
" \n" +
" // Field descriptor #6 LX;\n" +
" public static final enum X C;\n" +
" \n" +
" // Field descriptor #10 [LX;\n" +
" private static final synthetic X[] ENUM$VALUES;\n" +
" \n" +
" // Method descriptor #12 ()V\n" +
" // Stack: 4, Locals: 0\n" +
" static {};\n" +
" 0 new X [1]\n" +
" 3 dup\n" +
" 4 ldc <String \"A\"> [14]\n" +
" 6 iconst_0\n" +
" 7 invokespecial X(java.lang.String, int) [15]\n" +
" 10 putstatic X.A : X [19]\n" +
" 13 new X [1]\n" +
" 16 dup\n" +
" 17 ldc <String \"B\"> [21]\n" +
" 19 iconst_1\n" +
" 20 invokespecial X(java.lang.String, int) [15]\n" +
" 23 putstatic X.B : X [22]\n" +
" 26 new X [1]\n" +
" 29 dup\n" +
" 30 ldc <String \"C\"> [24]\n" +
" 32 iconst_2\n" +
" 33 invokespecial X(java.lang.String, int) [15]\n" +
" 36 putstatic X.C : X [25]\n" +
" 39 iconst_3\n" +
" 40 anewarray X [1]\n" +
" 43 dup\n" +
" 44 iconst_0\n" +
" 45 getstatic X.A : X [19]\n" +
" 48 aastore\n" +
" 49 dup\n" +
" 50 iconst_1\n" +
" 51 getstatic X.B : X [22]\n" +
" 54 aastore\n" +
" 55 dup\n" +
" 56 iconst_2\n" +
" 57 getstatic X.C : X [25]\n" +
" 60 aastore\n" +
" 61 putstatic X.ENUM$VALUES : X[] [27]\n" +
" 64 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 2]\n" +
" [pc: 39, line: 1]\n" +
" \n" +
" // Method descriptor #18 (Ljava/lang/String;I)V\n" +
" // Stack: 3, Locals: 3\n" +
" private X(java.lang.String arg0, int arg1);\n" +
" 0 aload_0 [this]\n" +
" 1 aload_1 [arg0]\n" +
" 2 iload_2 [arg1]\n" +
" 3 invokespecial java.lang.Enum(java.lang.String, int) [31]\n" +
" 6 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 1]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 7] local: this index: 0 type: X\n" +
" \n" +
" // Method descriptor #34 ()[LX;\n" +
" // Stack: 5, Locals: 3\n" +
" public static X[] values();\n" +
" 0 getstatic X.ENUM$VALUES : X[] [27]\n" +
" 3 dup\n" +
" 4 astore_0\n" +
" 5 iconst_0\n" +
" 6 aload_0\n" +
" 7 arraylength\n" +
" 8 dup\n" +
" 9 istore_1\n" +
" 10 anewarray X [1]\n" +
" 13 dup\n" +
" 14 astore_2\n" +
" 15 iconst_0\n" +
" 16 iload_1\n" +
" 17 invokestatic java.lang.System.arraycopy(java.lang.Object, int, java.lang.Object, int, int) : void [35]\n" +
" 20 aload_2\n" +
" 21 areturn\n" +
" Line numbers:\n" +
" [pc: 0, line: 1]\n" +
" \n" +
" // Method descriptor #42 (Ljava/lang/String;)LX;\n" +
" // Stack: 2, Locals: 1\n" +
" public static X valueOf(java.lang.String arg0);\n" +
" 0 ldc <Class X> [1]\n" +
" 2 aload_0 [arg0]\n" +
" 3 invokestatic java.lang.Enum.valueOf(java.lang.Class, java.lang.String) : java.lang.Enum [43]\n" +
" 6 checkcast X [1]\n" +
" 9 areturn\n" +
" Line numbers:\n" +
" [pc: 0, line: 1]\n" +
"}";
int index = actualOutput.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(actualOutput, 3));
}
if (index == -1) {
assertEquals("unexpected bytecode sequence", expectedOutput, actualOutput);
}
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=141810
public void test130() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String[] args) {\n" +
" for(Action a : Action.values()) {\n" +
" switch(a) {\n" +
" case ONE:\n" +
" System.out.print(\"1\");\n" +
" break;\n" +
" case TWO:\n" +
" System.out.print(\"2\");\n" +
" break;\n" +
" default:\n" +
" System.out.print(\"default\");\n" +
" }\n" +
" }\n" +
" }\n" +
"}",
"Action.java",
"enum Action { ONE, TWO }"
},
"12"
);
this.runConformTest(
new String[] {
"Action.java",
"enum Action {ONE, TWO, THREE}"
},
"",
null,
false,
null
);
executeClass(
"X.java",
"12default",
null,
false,
null,
null,
null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=145732
public void test131() {
this.runConformTest(
new String[] {
"X.java",
"public enum X {\n" +
" //A,B\n" +
" ;\n" +
" public static void main(String[] args) {\n" +
" try {\n" +
" System.out.println(X.valueOf(null));\n" +
" } catch (NullPointerException e) {\n" +
" System.out.println(\"NullPointerException\");\n" +
" } catch (IllegalArgumentException e) {\n" +
" System.out.println(\"IllegalArgumentException\");\n" +
" }\n" +
" }\n" +
"}\n",
},
"NullPointerException");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=145732 - variation
public void test132() {
this.runConformTest(
new String[] {
"X.java",
"public enum X {\n" +
" A,B\n" +
" ;\n" +
" public static void main(String[] args) {\n" +
" try {\n" +
" System.out.println(X.valueOf(null));\n" +
" } catch (NullPointerException e) {\n" +
" System.out.println(\"NullPointerException\");\n" +
" } catch (IllegalArgumentException e) {\n" +
" System.out.println(\"IllegalArgumentException\");\n" +
" }\n" +
" }\n" +
"}\n",
},
"NullPointerException");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=147747
public void test133() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"public enum X {\n" +
" A, B, C;\n" +
" public static void main(String[] args) {}\n" +
"}\n",
},
"");
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"X.class"));
String actualOutput =
disassembler.disassemble(
classFileBytes,
"\n",
ClassFileBytesDisassembler.DETAILED);
String expectedOutput =
" // Method descriptor #12 ()V\n" +
" // Stack: 4, Locals: 0\n" +
" static {};\n" +
" 0 new X [1]\n" +
" 3 dup\n" +
" 4 ldc <String \"A\"> [14]\n" +
" 6 iconst_0\n" +
" 7 invokespecial X(java.lang.String, int) [15]\n" +
" 10 putstatic X.A : X [19]\n" +
" 13 new X [1]\n" +
" 16 dup\n" +
" 17 ldc <String \"B\"> [21]\n" +
" 19 iconst_1\n" +
" 20 invokespecial X(java.lang.String, int) [15]\n" +
" 23 putstatic X.B : X [22]\n" +
" 26 new X [1]\n" +
" 29 dup\n" +
" 30 ldc <String \"C\"> [24]\n" +
" 32 iconst_2\n" +
" 33 invokespecial X(java.lang.String, int) [15]\n" +
" 36 putstatic X.C : X [25]\n" +
" 39 iconst_3\n" +
" 40 anewarray X [1]\n" +
" 43 dup\n" +
" 44 iconst_0\n" +
" 45 getstatic X.A : X [19]\n" +
" 48 aastore\n" +
" 49 dup\n" +
" 50 iconst_1\n" +
" 51 getstatic X.B : X [22]\n" +
" 54 aastore\n" +
" 55 dup\n" +
" 56 iconst_2\n" +
" 57 getstatic X.C : X [25]\n" +
" 60 aastore\n" +
" 61 putstatic X.ENUM$VALUES : X[] [27]\n" +
" 64 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 2]\n" +
" [pc: 39, line: 1]\n";
int index = actualOutput.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(actualOutput, 3));
}
if (index == -1) {
assertEquals("unexpected bytecode sequence", expectedOutput, actualOutput);
}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=149042
public void test134() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X {\n" +
" INITIAL ,\n" +
" OPENED {\n" +
" {\n" +
" System.out.printf(\"After the %s constructor\\n\",INITIAL);\n" +
" }\n" +
" }\n" +
"}",
},
"----------\n" +
"1. ERROR in X.java (at line 5)\n" +
" System.out.printf(\"After the %s constructor\\n\",INITIAL);\n" +
" ^^^^^^^\n" +
"Cannot refer to the static enum field X.INITIAL within an initializer\n" +
"----------\n",
JavacTestOptions.JavacHasABug.JavacBugFixed_6_10);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=149562
// a default case is required to consider that b is initialized (in case E
// takes new values in the future)
public void test135() {
this.runNegativeTest(
new String[] {
"E.java",
"public enum E {\n" +
" A,\n" +
" B\n" +
"}",
"X.java",
"public class X {\n" +
" boolean foo(E e) {\n" +
" boolean b;\n" +
" switch (e) {\n" +
" case A:\n" +
" b = true;\n" +
" break;\n" +
" case B:\n" +
" b = false;\n" +
" break;\n" +
" }\n" +
" return b;\n" +
" }\n" +
"}",
},
"----------\n" +
"1. ERROR in X.java (at line 12)\n" +
" return b;\n" +
" ^\n" +
"The local variable b may not have been initialized\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=151368
public void test136() {
this.runConformTest(
new String[] {
"X.java",
"import p.BeanName;\n" +
"public class X {\n" +
" Object o = BeanName.CreateStepApiOperation;\n" +
"}",
"p/BeanName.java",
"package p;\n" +
"public enum BeanName {\n" +
"\n" +
" //~ Enum constants ---------------------------------------------------------\n" +
"\n" +
" AbortAllJobsOperation,\n" +
" AbortJobApiOperation,\n" +
" AbortStepOperation,\n" +
" AclVoter,\n" +
" AcquireNamedLockApiOperation,\n" +
" AuthenticationManager,\n" +
" BeginStepOperation,\n" +
" CloneApiOperation,\n" +
" CommanderDao,\n" +
" CommanderServer,\n" +
" ConfigureQuartzOperation,\n" +
" CreateAclEntryApiOperation,\n" +
" CreateActualParameterApiOperation,\n" +
" CreateFormalParameterApiOperation,\n" +
" CreateProcedureApiOperation,\n" +
" CreateProjectApiOperation,\n" +
" CreateResourceApiOperation,\n" +
" CreateScheduleApiOperation,\n" +
" CreateStepApiOperation,\n" +
" DeleteAclEntryApiOperation,\n" +
" DeleteActualParameterApiOperation,\n" +
" DeleteFormalParameterApiOperation,\n" +
" DeleteJobApiOperation,\n" +
" DeleteProcedureApiOperation,\n" +
" DeleteProjectApiOperation,\n" +
" DeletePropertyApiOperation,\n" +
" DeleteResourceApiOperation,\n" +
" DeleteScheduleApiOperation,\n" +
" DeleteStepApiOperation,\n" +
" DispatchApiRequestOperation,\n" +
" DumpStatisticsApiOperation,\n" +
" ExpandJobStepAction,\n" +
" ExportApiOperation,\n" +
" FinishStepOperation,\n" +
" GetAccessApiOperation,\n" +
" GetAclEntryApiOperation,\n" +
" GetActualParameterApiOperation,\n" +
" GetActualParametersApiOperation,\n" +
" GetFormalParameterApiOperation,\n" +
" GetFormalParametersApiOperation,\n" +
" GetJobDetailsApiOperation,\n" +
" GetJobInfoApiOperation,\n" +
" GetJobStatusApiOperation,\n" +
" GetJobStepDetailsApiOperation,\n" +
" GetJobStepStatusApiOperation,\n" +
" GetJobsApiOperation,\n" +
" GetProcedureApiOperation,\n" +
" GetProceduresApiOperation,\n" +
" GetProjectApiOperation,\n" +
" GetProjectsApiOperation,\n" +
" GetPropertiesApiOperation,\n" +
" GetPropertyApiOperation,\n" +
" GetResourceApiOperation,\n" +
" GetResourcesApiOperation,\n" +
" GetResourcesInPoolApiOperation,\n" +
" GetScheduleApiOperation,\n" +
" GetSchedulesApiOperation,\n" +
" GetStepApiOperation,\n" +
" GetStepsApiOperation,\n" +
" GetVersionsApiOperation,\n" +
" GraphWorkflowApiOperation,\n" +
" HibernateFlushListener,\n" +
" ImportApiOperation,\n" +
" IncrementPropertyApiOperation,\n" +
" InvokeCommandOperation,\n" +
" InvokePostProcessorOperation,\n" +
" LoginApiOperation,\n" +
" LogManager,\n" +
" LogMessageApiOperation,\n" +
" ModifyAclEntryApiOperation,\n" +
" ModifyActualParameterApiOperation,\n" +
" ModifyFormalParameterApiOperation,\n" +
" ModifyProcedureApiOperation,\n" +
" ModifyProjectApiOperation,\n" +
" ModifyPropertyApiOperation,\n" +
" ModifyResourceApiOperation,\n" +
" ModifyScheduleApiOperation,\n" +
" ModifyStepApiOperation,\n" +
" MoveStepApiOperation,\n" +
" PauseSchedulerApiOperation,\n" +
" QuartzQueue,\n" +
" QuartzScheduler,\n" +
" ReleaseNamedLockApiOperation,\n" +
" ResourceInvoker,\n" +
" RunProcedureApiOperation,\n" +
" RunQueryApiOperation,\n" +
" SaxReader,\n" +
" ScheduleStepsOperation,\n" +
" SessionCache,\n" +
" SetJobNameApiOperation,\n" +
" SetPropertyApiOperation,\n" +
" SetStepStatusAction,\n" +
" StartWorkflowOperation,\n" +
" StateRefreshOperation,\n" +
" StepCompletionPrecondition,\n" +
" StepOutcomePrecondition,\n" +
" StepScheduler,\n" +
" TemplateOperation,\n" +
" TimeoutWatchdog,\n" +
" UpdateConfigurationOperation,\n" +
" Workspace,\n" +
" XmlRequestHandler;\n" +
"\n" +
" //~ Static fields/initializers ---------------------------------------------\n" +
"\n" +
" public static final int MAX_BEAN_NAME_LENGTH = 33;\n" +
"\n" +
" //~ Methods ----------------------------------------------------------------\n" +
"\n" +
" /**\n" +
" * Get this bean name as a property name, i.e. uncapitalized.\n" +
" *\n" +
" * @return String\n" +
" */\n" +
" public String getPropertyName()\n" +
" {\n" +
" return null;\n" +
" }\n" +
"}\n", // =================,
},
"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=156540
public void test137() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
"\n" +
" interface Interface {\n" +
" public int value();\n" +
" }\n" +
"\n" +
" public enum MyEnum implements Interface {\n" +
" ;\n" +
"\n" +
" MyEnum(int value) { this.value = value; } \n" +
" public int value() { return this.value; }\n" +
"\n" +
" private int value;\n" +
" }\n" +
"\n" +
" public static void main(String[] args) {\n" +
" System.out.println(MyEnum.values().length);\n" +
" }\n" +
"}", // =================,
},
"0");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=156591
public void test138() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X {\n" +
" PLUS {\n" +
" double eval(double x, double y) {\n" +
" return x + y;\n" +
" }\n" +
" },\n" +
" MINUS {\n" +
" @Override\n" +
" abstract double eval(double x, double y);\n" +
" };\n" +
" abstract double eval(double x, double y);\n" +
"}\n" +
"\n", // =================
},
"----------\n" +
"1. WARNING in X.java (at line 3)\n" +
" double eval(double x, double y) {\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^^\n" +
"The method eval(double, double) of type new X(){} should be tagged with @Override since it actually overrides a superclass method\n" +
"----------\n" +
"2. ERROR in X.java (at line 7)\n" +
" MINUS {\n" +
" ^^^^^\n" +
"The enum constant MINUS cannot define abstract methods\n" +
"----------\n" +
"3. ERROR in X.java (at line 9)\n" +
" abstract double eval(double x, double y);\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^^\n" +
"The method eval cannot be abstract in the enum constant MINUS\n" +
"----------\n"
);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=156591 - variation
public void test139() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X {\n" +
" PLUS {\n" +
" double eval(double x, double y) {\n" +
" return x + y;\n" +
" }\n" +
" },\n" +
" MINUS {\n" +
" abstract double eval2(double x, double y);\n" +
" };\n" +
"\n" +
" abstract double eval(double x, double y);\n" +
"}\n" +
"\n", // =================
},
"----------\n" +
"1. WARNING in X.java (at line 3)\n" +
" double eval(double x, double y) {\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^^\n" +
"The method eval(double, double) of type new X(){} should be tagged with @Override since it actually overrides a superclass method\n" +
"----------\n" +
"2. ERROR in X.java (at line 7)\n" +
" MINUS {\n" +
" ^^^^^\n" +
"The enum constant MINUS cannot define abstract methods\n" +
"----------\n" +
"3. ERROR in X.java (at line 7)\n" +
" MINUS {\n" +
" ^^^^^\n" +
"The enum constant MINUS must implement the abstract method eval(double, double)\n" +
"----------\n" +
"4. ERROR in X.java (at line 8)\n" +
" abstract double eval2(double x, double y);\n" +
" ^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
"The method eval2 cannot be abstract in the enum constant MINUS\n" +
"----------\n"
);
}
//check final modifier
public void test140() {
this.runConformTest(
new String[] {
"X.java",
"public enum X {\n" +
" PLUS {/*ANONYMOUS*/}, MINUS;\n" +
" void bar(X x) {\n" +
" Runnable r = (Runnable)x;\n" +
" }\n" +
"}", // =================
},
"");
}
//check final modifier
public void test141() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X {\n" +
" PLUS, MINUS;\n" +
" void bar(X x) {\n" +
" Runnable r = (Runnable)x;\n" +
" }\n" +
"}", // =================
},
"----------\n" +
"1. ERROR in X.java (at line 4)\n" +
" Runnable r = (Runnable)x;\n" +
" ^^^^^^^^^^^\n" +
"Cannot cast from X to Runnable\n" +
"----------\n");
}
public void test142() {
this.runConformTest(
new String[] {
"X.java",
"enum Week {\n" +
" Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday\n" +
"}\n" +
"public class X {\n" +
" public static void main(String[] args) {\n" +
" new X().foo();\n" +
" new X().bar(); \n" +
" }\n" +
" void foo() {\n" +
" for (Week w : Week.values())\n" +
" System.out.print(w + \" \");\n" +
" }\n" +
" void bar() {\n" +
" for (Week w : java.util.EnumSet.range(Week.Monday, Week.Friday)) {\n" +
" System.out.print(w + \" \");\n" +
" }\n" +
" }\n" +
"}\n", // =================
},
"Monday Tuesday Wednesday Thursday Friday Saturday Sunday Monday Tuesday Wednesday Thursday Friday");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=166866
public void test143() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X {\n" +
" A {\n" +
" @Override\n" +
" public String toString() {\n" +
" return a();\n" +
" }\n" +
" public abstract String a();\n" +
" }\n" +
"}",
},
"----------\n" +
"1. ERROR in X.java (at line 2)\n" +
" A {\n" +
" ^\n" +
"The enum constant A cannot define abstract methods\n" +
"----------\n" +
"2. ERROR in X.java (at line 7)\n" +
" public abstract String a();\n" +
" ^^^\n" +
"The method a cannot be abstract in the enum constant A\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=186822
public void test144() {
this.runNegativeTest(
new String[] {
"X.java",
"public enum X<T> {}",
},
"----------\n" +
"1. ERROR in X.java (at line 1)\n" +
" public enum X<T> {}\n" +
" ^\n" +
"Syntax error, enum declaration cannot have type parameters\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=186822
public void test145() {
Map options = getCompilerOptions();
options.put(CompilerOptions.OPTION_ReportNonStaticAccessToStatic, CompilerOptions.ERROR);
runNegativeTest(
// test directory preparation
true /* flush output directory */,
new String[] { /* test files */
"EnumA.java",
"public enum EnumA {\n" +
" B1,\n" +
" B2;\n" +
" public void foo(){}\n" +
"}",
"ClassC.java",
"public class ClassC {\n" +
" void bar() {\n" +
" EnumA.B1.B1.foo();\n" +
" EnumA.B1.B2.foo();\n" +
" }\n" +
"}"
},
// compiler options
null /* no class libraries */,
options /* custom options */,
// compiler results
"----------\n" + /* expected compiler log */
"1. ERROR in ClassC.java (at line 3)\n" +
" EnumA.B1.B1.foo();\n" +
" ^^\n" +
"The static field EnumA.B1 should be accessed in a static way\n" +
"----------\n" +
"2. ERROR in ClassC.java (at line 4)\n" +
" EnumA.B1.B2.foo();\n" +
" ^^\n" +
"The static field EnumA.B2 should be accessed in a static way\n" +
"----------\n",
// javac options
JavacTestOptions.Excuse.EclipseWarningConfiguredAsError /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=207915
public void test146() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" enum MyEnum {\n" +
" A, B\n" +
" }\n" +
" final String test;\n" +
" public X(MyEnum e) { // error\n" +
" switch (e) {\n" +
" case A:\n" +
" test = \"a\";\n" +
" break;\n" +
" case B:\n" +
" test = \"a\";\n" +
" break;\n" +
" // default: test = \"unknown\"; // enabling this line fixes above error\n" +
" }\n" +
" }\n" +
"}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 6)\n" +
" public X(MyEnum e) { // error\n" +
" ^^^^^^^^^^^\n" +
"The blank final field test may not have been initialized\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=227502
public void test147() {
this.runNegativeTest(
new String[] {
"p/X.java",
"package p;\n" +
"public class X {\n" +
" public abstract enum E {\n" +
" SUCCESS;\n" +
" }\n" +
"}\n"
},
"----------\n" +
"1. ERROR in p\\X.java (at line 3)\n" +
" public abstract enum E {\n" +
" ^\n" +
"Illegal modifier for the member enum E; only public, protected, private & static are permitted\n" +
"----------\n",
null,
true, // flush output
null,
true, // generate output
false,
false);
runConformTest(
// test directory preparation
false /* do not flush output directory */,
new String[] { /* test files */
"Y.java",
"import p.X;\n" +
"public class Y {\n" +
" public static void main(String[] args) {\n" +
" System.out.println(X.E.SUCCESS);\n" +
" }\n" +
"}\n"
},
// compiler results
null /* do not check compiler log */,
// runtime results
"null" /* expected output string */,
"" /* expected error string */,
// javac options
JavacTestOptions.Excuse.JavacCompilesBogusReferencedFileAgain /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=227502 - variation
public void test148() {
this.runNegativeTest(
new String[] {
"p/X.java",
"package p;\n" +
"public class X {\n" +
" public abstract enum E implements Runnable {\n" +
" SUCCESS;\n" +
" }\n" +
"}\n"
},
"----------\n" +
"1. ERROR in p\\X.java (at line 3)\n" +
" public abstract enum E implements Runnable {\n" +
" ^\n" +
"Illegal modifier for the member enum E; only public, protected, private & static are permitted\n" +
"----------\n" +
"2. ERROR in p\\X.java (at line 3)\n" +
" public abstract enum E implements Runnable {\n" +
" ^\n" +
"The type X.E must implement the inherited abstract method Runnable.run()\n" +
"----------\n",
null,
true, // flush output
null,
true, // generate output
false,
false);
runConformTest(
// test directory preparation
false /* do not flush output directory */,
new String[] { /* test files */
"Y.java",
"import p.X;\n" +
"public class Y {\n" +
" public static void main(String[] args) {\n" +
" System.out.println(X.E.SUCCESS);\n" +
" }\n" +
"}\n"
},
// compiler results
null /* do not check compiler log */,
// runtime results
"null" /* expected output string */,
"" /* expected error string */,
// javac options
JavacTestOptions.Excuse.JavacCompilesBogusReferencedFileAgain /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=227502 - variation
public void test149() throws Exception {
this.runConformTest(
new String[] {
"p/X.java",
"package p;\n" +
"public class X {\n" +
" public enum E implements Runnable {\n" +
" SUCCESS;\n" +
" public void run(){}\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" Class<E> c = E.class;\n" +
" System.out.println(c.getName() + \":\" + X.E.SUCCESS);\n" +
" }\n" +
"}\n"
},
"p.X$E:SUCCESS");
String expectedOutput =
"// Signature: Ljava/lang/Enum<Lp/X$E;>;Ljava/lang/Runnable;\n" +
"public static final enum p.X$E implements java.lang.Runnable {\n";
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"p" + File.separator + "X$E.class"));
String actualOutput =
disassembler.disassemble(
classFileBytes,
"\n",
ClassFileBytesDisassembler.DETAILED);
int index = actualOutput.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(actualOutput, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, actualOutput);
}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=227502 - variation
public void test150() throws Exception {
this.runConformTest(
new String[] {
"p/X.java",
"package p;\n" +
"public class X {\n" +
" public enum E implements Runnable {\n" +
" SUCCESS;\n" +
" public void run(){}\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" Class<E> c = E.class;\n" +
" System.out.println(c.getName() + \":\" + X.E.SUCCESS);\n" +
" }\n" +
"}\n"
},
"p.X$E:SUCCESS");
this.runConformTest(
new String[] {
"Y.java",
"import p.X;\n" +
"public class Y {\n" +
" public static void main(String[] args) {\n" +
" System.out.println(X.E.SUCCESS);\n" +
" }\n" +
"}\n"
},
"SUCCESS",
null,
false,
null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=227502 - variation
public void test151() throws Exception {
this.runConformTest(
new String[] {
"p/X.java",
"package p;\n" +
"public class X {\n" +
" public enum E implements Runnable {\n" +
" SUCCESS {};\n" +
" public void run(){}\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" Class<E> c = E.class;\n" +
" System.out.println(c.getName() + \":\" + X.E.SUCCESS);\n" +
" }\n" +
"}\n"
},
"p.X$E:SUCCESS");
String expectedOutput =
"// Signature: Ljava/lang/Enum<Lp/X$E;>;Ljava/lang/Runnable;\n" +
"public abstract static enum p.X$E implements java.lang.Runnable {\n";
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(OUTPUT_DIR + File.separator +"p" + File.separator + "X$E.class"));
String actualOutput =
disassembler.disassemble(
classFileBytes,
"\n",
ClassFileBytesDisassembler.DETAILED);
int index = actualOutput.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(actualOutput, 3));
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, actualOutput);
}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=227502 - variation
public void test152() {
this.runConformTest(
new String[] {
"p/X.java",
"package p;\n" +
"public class X {\n" +
" public enum E implements Runnable {\n" +
" SUCCESS {};\n" +
" public void run(){}\n" +
" }\n" +
"}\n"
},
"");
this.runConformTest(
new String[] {
"Y.java",
"import p.X;\n" +
"public class Y {\n" +
" public static void main(String[] args) {\n" +
" System.out.println(X.E.SUCCESS);\n" +
" }\n" +
"}\n"
},
"SUCCESS",
null,
false,
null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=228109
public void test153() {
this.runNegativeTest(
new String[] {
"TestEnum.java",
"public enum TestEnum {\n" +
" RED, GREEN, BLUE; \n" +
" static int test = 0; \n" +
"\n" +
" TestEnum() {\n" +
" TestEnum.test=10;\n" +
" }\n" +
"}\n"
},
"----------\n" +
"1. ERROR in TestEnum.java (at line 6)\n" +
" TestEnum.test=10;\n" +
" ^^^^\n" +
"Cannot refer to the static enum field TestEnum.test within an initializer\n" +
"----------\n",
JavacTestOptions.JavacHasABug.JavacBugFixed_6_10);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=228109 - variation
public void test154() {
this.runNegativeTest(
new String[] {
"TestEnum2.java",
"public enum TestEnum2 {\n" +
" ; \n" +
" static int test = 0; \n" +
" TestEnum2() {\n" +
" TestEnum2.test=11;\n" +
" }\n" +
"}\n" +
"class X {\n" +
" static int test = 0;\n" +
" X() {\n" +
" X.test = 13;\n" +
" }\n" +
"}\n"
},
"----------\n" +
"1. ERROR in TestEnum2.java (at line 5)\n" +
" TestEnum2.test=11;\n" +
" ^^^^\n" +
"Cannot refer to the static enum field TestEnum2.test within an initializer\n" +
"----------\n",
JavacTestOptions.JavacHasABug.JavacBugFixed_6_10);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=228109 - variation
public void test155() {
this.runConformTest(
new String[] {
"TestEnum.java",
"public enum TestEnum {\n" +
" RED, GREEN, BLUE; \n" +
" static int test = 0; \n" +
"}\n" +
"\n" +
"enum TestEnum2 {\n" +
" ; \n" +
" TestEnum2() {\n" +
" TestEnum.test=12;\n" +
" }\n" +
"}\n"
},
"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=228109 - variation
public void test156() {
this.runConformTest(
new String[] {
"TestEnum.java",
"public enum TestEnum {\n" +
" RED, GREEN, BLUE; \n" +
" static int test = 0; \n" +
"\n" +
" TestEnum() {\n" +
" new Object() {\n" +
" { TestEnum.test=10; }\n" +
" };\n" +
" }\n" +
"}\n"
},
"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=228109 - variation
public void test157() {
this.runNegativeTest(
new String[] {
"Foo.java",
"enum Foo {\n" +
" ONE, TWO, THREE;\n" +
" static int val = 10;\n" +
" Foo () {\n" +
" this(Foo.val);\n" +
" System.out.println(Foo.val);\n" +
" }\n" +
" Foo(int i){}\n" +
" {\n" +
" System.out.println(Foo.val);\n" +
" }\n" +
" int field = Foo.val;\n" +
"}\n"
},
"----------\n" +
"1. ERROR in Foo.java (at line 5)\n" +
" this(Foo.val);\n" +
" ^^^\n" +
"Cannot refer to the static enum field Foo.val within an initializer\n" +
"----------\n" +
"2. ERROR in Foo.java (at line 6)\n" +
" System.out.println(Foo.val);\n" +
" ^^^\n" +
"Cannot refer to the static enum field Foo.val within an initializer\n" +
"----------\n" +
"3. ERROR in Foo.java (at line 10)\n" +
" System.out.println(Foo.val);\n" +
" ^^^\n" +
"Cannot refer to the static enum field Foo.val within an initializer\n" +
"----------\n" +
"4. ERROR in Foo.java (at line 12)\n" +
" int field = Foo.val;\n" +
" ^^^\n" +
"Cannot refer to the static enum field Foo.val within an initializer\n" +
"----------\n",
JavacTestOptions.JavacHasABug.JavacBugFixed_6_10);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=228109 - variation
public void test158() {
this.runNegativeTest(
new String[] {
"Foo.java",
"enum Foo {\n" +
" ONE, TWO, THREE;\n" +
" static int val = 10;\n" +
" Foo () {\n" +
" this(val);\n" +
" System.out.println(val);\n" +
" }\n" +
" Foo(int i){}\n" +
" {\n" +
" System.out.println(val);\n" +
" }\n" +
" int field = val;\n" +
"}\n"
},
"----------\n" +
"1. ERROR in Foo.java (at line 5)\n" +
" this(val);\n" +
" ^^^\n" +
"Cannot refer to the static enum field Foo.val within an initializer\n" +
"----------\n" +
"2. ERROR in Foo.java (at line 6)\n" +
" System.out.println(val);\n" +
" ^^^\n" +
"Cannot refer to the static enum field Foo.val within an initializer\n" +
"----------\n" +
"3. ERROR in Foo.java (at line 10)\n" +
" System.out.println(val);\n" +
" ^^^\n" +
"Cannot refer to the static enum field Foo.val within an initializer\n" +
"----------\n" +
"4. ERROR in Foo.java (at line 12)\n" +
" int field = val;\n" +
" ^^^\n" +
"Cannot refer to the static enum field Foo.val within an initializer\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=228109 - variation
public void test159() {
this.runNegativeTest(
new String[] {
"Foo.java",
"enum Foo {\n" +
" ONE, TWO, THREE;\n" +
" static int val = 10;\n" +
" Foo () {\n" +
" this(get().val);\n" +
" System.out.println(get().val);\n" +
" }\n" +
" Foo(int i){}\n" +
" {\n" +
" System.out.println(get().val);\n" +
" }\n" +
" int field = get().val;\n" +
" Foo get() { return ONE; }\n" +
"}\n"
},
"----------\n" +
"1. ERROR in Foo.java (at line 5)\n" +
" this(get().val);\n" +
" ^^^\n" +
"Cannot refer to an instance method while explicitly invoking a constructor\n" +
"----------\n" +
"2. WARNING in Foo.java (at line 5)\n" +
" this(get().val);\n" +
" ^^^\n" +
"The static field Foo.val should be accessed in a static way\n" +
"----------\n" +
"3. ERROR in Foo.java (at line 5)\n" +
" this(get().val);\n" +
" ^^^\n" +
"Cannot refer to the static enum field Foo.val within an initializer\n" +
"----------\n" +
"4. WARNING in Foo.java (at line 6)\n" +
" System.out.println(get().val);\n" +
" ^^^\n" +
"The static field Foo.val should be accessed in a static way\n" +
"----------\n" +
"5. ERROR in Foo.java (at line 6)\n" +
" System.out.println(get().val);\n" +
" ^^^\n" +
"Cannot refer to the static enum field Foo.val within an initializer\n" +
"----------\n" +
"6. WARNING in Foo.java (at line 10)\n" +
" System.out.println(get().val);\n" +
" ^^^\n" +
"The static field Foo.val should be accessed in a static way\n" +
"----------\n" +
"7. ERROR in Foo.java (at line 10)\n" +
" System.out.println(get().val);\n" +
" ^^^\n" +
"Cannot refer to the static enum field Foo.val within an initializer\n" +
"----------\n" +
"8. WARNING in Foo.java (at line 12)\n" +
" int field = get().val;\n" +
" ^^^\n" +
"The static field Foo.val should be accessed in a static way\n" +
"----------\n" +
"9. ERROR in Foo.java (at line 12)\n" +
" int field = get().val;\n" +
" ^^^\n" +
"Cannot refer to the static enum field Foo.val within an initializer\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=228109 - variation
public void test160() {
this.runNegativeTest(
new String[] {
"Foo.java",
"enum Foo {\n" +
" ONE, TWO, THREE;\n" +
" static int val = 10;\n" +
" Foo () {\n" +
" this(get().val = 1);\n" +
" System.out.println(get().val = 2);\n" +
" }\n" +
" Foo(int i){}\n" +
" {\n" +
" System.out.println(get().val = 3);\n" +
" }\n" +
" int field = get().val = 4;\n" +
" Foo get() { return ONE; }\n" +
"}\n"
},
"----------\n" +
"1. ERROR in Foo.java (at line 5)\n" +
" this(get().val = 1);\n" +
" ^^^\n" +
"Cannot refer to an instance method while explicitly invoking a constructor\n" +
"----------\n" +
"2. WARNING in Foo.java (at line 5)\n" +
" this(get().val = 1);\n" +
" ^^^\n" +
"The static field Foo.val should be accessed in a static way\n" +
"----------\n" +
"3. ERROR in Foo.java (at line 5)\n" +
" this(get().val = 1);\n" +
" ^^^\n" +
"Cannot refer to the static enum field Foo.val within an initializer\n" +
"----------\n" +
"4. WARNING in Foo.java (at line 6)\n" +
" System.out.println(get().val = 2);\n" +
" ^^^\n" +
"The static field Foo.val should be accessed in a static way\n" +
"----------\n" +
"5. ERROR in Foo.java (at line 6)\n" +
" System.out.println(get().val = 2);\n" +
" ^^^\n" +
"Cannot refer to the static enum field Foo.val within an initializer\n" +
"----------\n" +
"6. WARNING in Foo.java (at line 10)\n" +
" System.out.println(get().val = 3);\n" +
" ^^^\n" +
"The static field Foo.val should be accessed in a static way\n" +
"----------\n" +
"7. ERROR in Foo.java (at line 10)\n" +
" System.out.println(get().val = 3);\n" +
" ^^^\n" +
"Cannot refer to the static enum field Foo.val within an initializer\n" +
"----------\n" +
"8. WARNING in Foo.java (at line 12)\n" +
" int field = get().val = 4;\n" +
" ^^^\n" +
"The static field Foo.val should be accessed in a static way\n" +
"----------\n" +
"9. ERROR in Foo.java (at line 12)\n" +
" int field = get().val = 4;\n" +
" ^^^\n" +
"Cannot refer to the static enum field Foo.val within an initializer\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=228109 - variation
public void test161() {
this.runConformTest(
new String[] {
"EnumTest1.java",
"enum EnumTest1 {\n" +
" ;\n" +
" static int foo = EnumTest2.bar;\n" +
"}\n" +
"enum EnumTest2 {\n" +
" ;\n" +
" static int bar = EnumTest1.foo;\n" +
"}\n"
},
"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=239225
public void test162() {
this.runNegativeTest(
new String[] {
"Status.java", // =================
"import java.util.HashMap;\n" +
"import java.util.Map;\n" +
"\n" +
"public enum Status {\n" +
" GOOD((byte) 0x00), BAD((byte) 0x02);\n" +
"\n" +
" private static Map<Byte, Status> mapping;\n" +
"\n" +
" private Status(final byte newValue) {\n" +
"\n" +
" if (Status.mapping == null) {\n" +
" Status.mapping = new HashMap<Byte, Status>();\n" +
" }\n" +
"\n" +
" Status.mapping.put(newValue, this);\n" +
" }\n" +
"}\n", // =================
},
"----------\n" +
"1. ERROR in Status.java (at line 11)\n" +
" if (Status.mapping == null) {\n" +
" ^^^^^^^\n" +
"Cannot refer to the static enum field Status.mapping within an initializer\n" +
"----------\n" +
"2. ERROR in Status.java (at line 12)\n" +
" Status.mapping = new HashMap<Byte, Status>();\n" +
" ^^^^^^^\n" +
"Cannot refer to the static enum field Status.mapping within an initializer\n" +
"----------\n" +
"3. ERROR in Status.java (at line 15)\n" +
" Status.mapping.put(newValue, this);\n" +
" ^^^^^^^\n" +
"Cannot refer to the static enum field Status.mapping within an initializer\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=239225 - variation
public void test163() {
this.runConformTest(
new String[] {
"Status.java", // =================
"import java.util.HashMap;\n" +
"import java.util.Map;\n" +
"\n" +
"enum Status {\n" +
" GOOD((byte) 0x00), BAD((byte) 0x02);\n" +
" private byte value;\n" +
" private static Map<Byte, Status> mapping;\n" +
" private Status(final byte newValue) {\n" +
" this.value = newValue;\n" +
" }\n" +
" static {\n" +
" Status.mapping = new HashMap<Byte, Status>();\n" +
" for (Status s : values()) {\n" +
" Status.mapping.put(s.value, s);\n" +
" }\n" +
" }\n" +
"}\n", // =================
},
"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=251523
public void test164() {
this.runNegativeTest(
new String[] {
"X.java", // =================
"public enum X {\n" +
" ;\n" +
" private X valueOf(String arg0) { return null; }\n" +
"}\n", // =================
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" private X valueOf(String arg0) { return null; }\n" +
" ^^^^^^^^^^^^^^^^^^^^\n" +
"The enum X already defines the method valueOf(String) implicitly\n" +
"----------\n"
);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=251523 - variation
public void test165() throws Exception {
this.runNegativeTest(
new String[] {
"X.java", // =================
"class Other {\n" +
" int dupField;//1\n" +
" int dupField;//2\n" +
" int dupField;//3\n" +
" int dupField;//4\n" +
" void dupMethod(int i) {}//5\n" +
" void dupMethod(int i) {}//6\n" +
" void dupMethod(int i) {}//7\n" +
" void dupMethod(int i) {}//8\n" +
" void foo() {\n" +
" int i = dupMethod(dupField);\n" +
" }\n" +
"}\n" +
"\n" +
"public enum X {\n" +
" ;\n" +
" private X valueOf(String arg0) { return null; }//9\n" +
" private X valueOf(String arg0) { return null; }//10\n" +
" private X valueOf(String arg0) { return null; }//11\n" +
" void foo() {\n" +
" int i = valueOf(\"\");\n" +
" }\n" +
"}\n", // =================
},
"----------\n" +
"1. ERROR in X.java (at line 2)\n" +
" int dupField;//1\n" +
" ^^^^^^^^\n" +
"Duplicate field Other.dupField\n" +
"----------\n" +
"2. ERROR in X.java (at line 3)\n" +
" int dupField;//2\n" +
" ^^^^^^^^\n" +
"Duplicate field Other.dupField\n" +
"----------\n" +
"3. ERROR in X.java (at line 4)\n" +
" int dupField;//3\n" +
" ^^^^^^^^\n" +
"Duplicate field Other.dupField\n" +
"----------\n" +
"4. ERROR in X.java (at line 5)\n" +
" int dupField;//4\n" +
" ^^^^^^^^\n" +
"Duplicate field Other.dupField\n" +
"----------\n" +
"5. ERROR in X.java (at line 6)\n" +
" void dupMethod(int i) {}//5\n" +
" ^^^^^^^^^^^^^^^^\n" +
"Duplicate method dupMethod(int) in type Other\n" +
"----------\n" +
"6. ERROR in X.java (at line 7)\n" +
" void dupMethod(int i) {}//6\n" +
" ^^^^^^^^^^^^^^^^\n" +
"Duplicate method dupMethod(int) in type Other\n" +
"----------\n" +
"7. ERROR in X.java (at line 8)\n" +
" void dupMethod(int i) {}//7\n" +
" ^^^^^^^^^^^^^^^^\n" +
"Duplicate method dupMethod(int) in type Other\n" +
"----------\n" +
"8. ERROR in X.java (at line 9)\n" +
" void dupMethod(int i) {}//8\n" +
" ^^^^^^^^^^^^^^^^\n" +
"Duplicate method dupMethod(int) in type Other\n" +
"----------\n" +
"9. ERROR in X.java (at line 11)\n" +
" int i = dupMethod(dupField);\n" +
" ^^^^^^^^^^^^^^^^^^^\n" +
"Type mismatch: cannot convert from void to int\n" +
"----------\n" +
"10. ERROR in X.java (at line 17)\n" +
" private X valueOf(String arg0) { return null; }//9\n" +
" ^^^^^^^^^^^^^^^^^^^^\n" +
"The enum X already defines the method valueOf(String) implicitly\n" +
"----------\n" +
"11. ERROR in X.java (at line 18)\n" +
" private X valueOf(String arg0) { return null; }//10\n" +
" ^^^^^^^^^^^^^^^^^^^^\n" +
"The enum X already defines the method valueOf(String) implicitly\n" +
"----------\n" +
"12. ERROR in X.java (at line 19)\n" +
" private X valueOf(String arg0) { return null; }//11\n" +
" ^^^^^^^^^^^^^^^^^^^^\n" +
"The enum X already defines the method valueOf(String) implicitly\n" +
"----------\n" +
"13. ERROR in X.java (at line 21)\n" +
" int i = valueOf(\"\");\n" +
" ^^^^^^^^^^^\n" +
"Type mismatch: cannot convert from X to int\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=251814
public void test166() throws Exception {
this.runNegativeTest(
new String[] {
"X.java", // =================
"public enum X {\n" +
" ;\n" +
" private int valueOf(String arg0) { return 0; }//11\n" +
" void foo() {\n" +
" int i = valueOf(\"\");\n" +
" }\n" +
"}\n", // =================
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" private int valueOf(String arg0) { return 0; }//11\n" +
" ^^^^^^^^^^^^^^^^^^^^\n" +
"The enum X already defines the method valueOf(String) implicitly\n" +
"----------\n" +
"2. ERROR in X.java (at line 5)\n" +
" int i = valueOf(\"\");\n" +
" ^^^^^^^^^^^\n" +
"Type mismatch: cannot convert from X to int\n" +
"----------\n",
null,
true, // flush output
null,
true, // generate output
false,
false);
// check for presence of #valueOf(...) in problem type
String expectedOutput =
"public final enum X {\n" +
" \n" +
" // Method descriptor #6 (Ljava/lang/String;I)V\n" +
" // Stack: 3, Locals: 3\n" +
" private X(java.lang.String arg0, int arg1);\n" +
" 0 new java.lang.Error [8]\n" +
" 3 dup\n" +
" 4 ldc <String \"Unresolved compilation problems: \\n\\tThe enum X already defines the method valueOf(String) implicitly\\n\\tType mismatch: cannot convert from X to int\\n\"> [10]\n" +
" 6 invokespecial java.lang.Error(java.lang.String) [12]\n" +
" 9 athrow\n" +
" Line numbers:\n" +
" [pc: 0, line: 3]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 10] local: this index: 0 type: X\n" +
" \n" +
" // Method descriptor #20 ()V\n" +
" // Stack: 3, Locals: 1\n" +
" void foo();\n" +
" 0 new java.lang.Error [8]\n" +
" 3 dup\n" +
" 4 ldc <String \"Unresolved compilation problem: \\n\\tType mismatch: cannot convert from X to int\\n\"> [21]\n" +
" 6 invokespecial java.lang.Error(java.lang.String) [12]\n" +
" 9 athrow\n" +
" Line numbers:\n" +
" [pc: 0, line: 5]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 10] local: this index: 0 type: X\n" +
"}";
checkDisassembledClassFile(OUTPUT_DIR + File.separator + "X.class", "X", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=251814 - variation
public void test167() throws Exception {
this.runNegativeTest(
new String[] {
"X.java", // =================
"public enum X {\n" +
" ;\n" +
" static int valueOf(String arg0) { return 0; }//9\n" +
" void foo() {\n" +
" int i = X.valueOf(\"\");\n" +
" }\n" +
"}\n",
"Other.java",// =================
"public class Other {\n" +
" void foo() {\n" +
" int i = X.valueOf(\"\");\n" +
" }\n" +
"}\n", // =================
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" static int valueOf(String arg0) { return 0; }//9\n" +
" ^^^^^^^^^^^^^^^^^^^^\n" +
"The enum X already defines the method valueOf(String) implicitly\n" +
"----------\n" +
"2. ERROR in X.java (at line 5)\n" +
" int i = X.valueOf(\"\");\n" +
" ^^^^^^^^^^^^^\n" +
"Type mismatch: cannot convert from X to int\n" +
"----------\n" +
"----------\n" +
"1. ERROR in Other.java (at line 3)\n" +
" int i = X.valueOf(\"\");\n" +
" ^^^^^^^^^^^^^\n" +
"Type mismatch: cannot convert from X to int\n" +
"----------\n",
null,
true, // flush output
null,
true, // generate output
false,
false);
// check consistency of problem when incremental compiling against X problemType
this.runNegativeTest(
new String[] {
"Other.java",// =================
"public class Other {\n" +
" void foo() {\n" +
" int i = X.valueOf(\"\");\n" +
" }\n" +
"}\n", // =================
},
"----------\n" +
"1. ERROR in Other.java (at line 3)\n" +
" int i = X.valueOf(\"\");\n" +
" ^^^^^^^\n" +
"The method valueOf(Class<T>, String) in the type Enum<X> is not applicable for the arguments (String)\n" +
"----------\n",
null,
false, // flush output
null,
true, // generate output
false,
false);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=255452
public void test168() {
this.runNegativeTest(
new String[] {
"X.java", // =================
"enum BadEnum {\n" +
" CRAZY(CRAZY), // <-- illegal forward reference reported by all compilers\n" +
" IMPOSSIBLE(BadEnum.IMPOSSIBLE); // <-- illegal forward reference (javac 1.6 only)\n" +
" private BadEnum(BadEnum self) {\n" +
" }\n" +
"}\n" +
"public class X {\n" +
" X x1 = new X(x1);//1 - WRONG\n" +
" static X X2 = new X(X.X2);//2 - OK\n" +
" X x3 = new X(this.x3);//3 - OK\n" +
" X(X x) {}\n" +
" X(int i) {}\n" +
" static int VALUE() { return 13; }\n" +
" int value() { return 14; }\n" +
"}\n" +
"class Y extends X {\n" +
" X x1 = new X(x1);//6 - WRONG\n" +
" static X X2 = new X(Y.X2);//7 - OK\n" +
" X x3 = new X(this.x3);//8 - OK\n" +
" Y(Y y) { super(y); }\n" +
"}\n", // =================
},
"----------\n" +
"1. ERROR in X.java (at line 2)\n" +
" CRAZY(CRAZY), // <-- illegal forward reference reported by all compilers\n" +
" ^^^^^\n" +
"Cannot reference a field before it is defined\n" +
"----------\n" +
"2. ERROR in X.java (at line 3)\n" +
" IMPOSSIBLE(BadEnum.IMPOSSIBLE); // <-- illegal forward reference (javac 1.6 only)\n" +
" ^^^^^^^^^^\n" +
"Cannot reference a field before it is defined\n" +
"----------\n" +
"3. ERROR in X.java (at line 8)\n" +
" X x1 = new X(x1);//1 - WRONG\n" +
" ^^\n" +
"Cannot reference a field before it is defined\n" +
"----------\n" +
"4. WARNING in X.java (at line 17)\n" +
" X x1 = new X(x1);//6 - WRONG\n" +
" ^^\n" +
"The field Y.x1 is hiding a field from type X\n" +
"----------\n" +
"5. ERROR in X.java (at line 17)\n" +
" X x1 = new X(x1);//6 - WRONG\n" +
" ^^\n" +
"Cannot reference a field before it is defined\n" +
"----------\n" +
"6. WARNING in X.java (at line 18)\n" +
" static X X2 = new X(Y.X2);//7 - OK\n" +
" ^^\n" +
"The field Y.X2 is hiding a field from type X\n" +
"----------\n" +
"7. WARNING in X.java (at line 19)\n" +
" X x3 = new X(this.x3);//8 - OK\n" +
" ^^\n" +
"The field Y.x3 is hiding a field from type X\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=255452 - variation
public void test169() {
this.runNegativeTest(
new String[] {
"X.java", // =================
"enum BadEnum {\n" +
" NOWAY(BadEnum.NOWAY.CONST),\n" +
" INVALID(INVALID.CONST),\n" +
" WRONG(WRONG.VALUE()),\n" +
" ILLEGAL(ILLEGAL.value());\n" +
" final static int CONST = 12;\n" +
" private BadEnum(int i) {\n" +
" }\n" +
" static int VALUE() { return 13; }\n" +
" int value() { return 14; }\n" +
"}\n" +
"public class X {\n" +
" final static int CONST = 12;\n" +
" X x4 = new X(x4.CONST);//4 - WRONG\n" +
" X x5 = new X(x5.value());//5 - WRONG\n" +
" X(int i) {}\n" +
" static int VALUE() { return 13; }\n" +
" int value() { return 14; }\n" +
"}\n", // =================
},
"----------\n" +
"1. ERROR in X.java (at line 2)\n" +
" NOWAY(BadEnum.NOWAY.CONST),\n" +
" ^^^^^\n" +
"Cannot reference a field before it is defined\n" +
"----------\n" +
"2. WARNING in X.java (at line 2)\n" +
" NOWAY(BadEnum.NOWAY.CONST),\n" +
" ^^^^^\n" +
"The static field BadEnum.CONST should be accessed in a static way\n" +
"----------\n" +
"3. ERROR in X.java (at line 3)\n" +
" INVALID(INVALID.CONST),\n" +
" ^^^^^^^\n" +
"Cannot reference a field before it is defined\n" +
"----------\n" +
"4. WARNING in X.java (at line 3)\n" +
" INVALID(INVALID.CONST),\n" +
" ^^^^^\n" +
"The static field BadEnum.CONST should be accessed in a static way\n" +
"----------\n" +
"5. ERROR in X.java (at line 4)\n" +
" WRONG(WRONG.VALUE()),\n" +
" ^^^^^\n" +
"Cannot reference a field before it is defined\n" +
"----------\n" +
"6. WARNING in X.java (at line 4)\n" +
" WRONG(WRONG.VALUE()),\n" +
" ^^^^^^^^^^^^^\n" +
"The static method VALUE() from the type BadEnum should be accessed in a static way\n" +
"----------\n" +
"7. ERROR in X.java (at line 5)\n" +
" ILLEGAL(ILLEGAL.value());\n" +
" ^^^^^^^\n" +
"Cannot reference a field before it is defined\n" +
"----------\n" +
"8. ERROR in X.java (at line 14)\n" +
" X x4 = new X(x4.CONST);//4 - WRONG\n" +
" ^^\n" +
"Cannot reference a field before it is defined\n" +
"----------\n" +
"9. WARNING in X.java (at line 14)\n" +
" X x4 = new X(x4.CONST);//4 - WRONG\n" +
" ^^^^^\n" +
"The static field X.CONST should be accessed in a static way\n" +
"----------\n" +
"10. ERROR in X.java (at line 15)\n" +
" X x5 = new X(x5.value());//5 - WRONG\n" +
" ^^\n" +
"Cannot reference a field before it is defined\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=263877
public void test170() {
this.runNegativeTest(
new String[] {
"X.java", // =================
"enum Days {\n" +
" Monday(\"Mon\", Days.OFFSET + 0), // should not complain\n" +
" Tuesday(\"Tue\", Days.Wednesday.hashCode()), // should complain since enum constant\n" +
" Wednesday(\"Wed\", OFFSET + 2); // should complain since unqualified\n" +
" public static final int OFFSET = 0; // cannot move this above, else more errors\n" +
" Days(String abbr, int index) {\n" +
" }\n" +
"}\n" +
"\n" +
"class X {\n" +
" public static final int FOO = X.OFFSET + 0;\n" +
" public static final int BAR = OFFSET + 1;\n" +
" public static final int OFFSET = 0; // cannot move this above, else more errors\n" +
"}\n", // =================
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" Tuesday(\"Tue\", Days.Wednesday.hashCode()), // should complain since enum constant\n" +
" ^^^^^^^^^\n" +
"Cannot reference a field before it is defined\n" +
"----------\n" +
"2. ERROR in X.java (at line 4)\n" +
" Wednesday(\"Wed\", OFFSET + 2); // should complain since unqualified\n" +
" ^^^^^^\n" +
"Cannot reference a field before it is defined\n" +
"----------\n" +
"3. ERROR in X.java (at line 12)\n" +
" public static final int BAR = OFFSET + 1;\n" +
" ^^^^^^\n" +
"Cannot reference a field before it is defined\n" +
"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=267670. Make sure we don't emit any unused
// warnings about enumerators. Since these could be used in indirect ways not obvious.
public void test171() {
Map customOptions = getCompilerOptions();
customOptions.put(CompilerOptions.OPTION_ReportUnusedLocal, CompilerOptions.WARNING);
this.runConformTest(
true,
new String[] {
"X.java",
"public class X { \n" +
" private enum Colors {\n" +
" BLEU,\n" +
" BLANC,\n" +
" ROUGE\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" for (Colors c: Colors.values()) {\n" +
" System.out.print(c);\n" +
" }\n" +
" }\n" +
"}\n"
},
null, customOptions,
"",
"BLEUBLANCROUGE", null,
JavacTestOptions.Excuse.EclipseHasSomeMoreWarnings);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=267670. Make sure we don't emit any unused
// warnings about enumerators. Since these could be used in indirect ways not obvious. This
// test also verifies that while we don't complain about individual enumerators not being used
// we DO complain if the enumeration type itself is not used.
public void test172() {
Map customOptions = getCompilerOptions();
customOptions.put(CompilerOptions.OPTION_ReportUnusedLocal, CompilerOptions.WARNING);
this.runConformTest(
true,
new String[] {
"X.java",
"public class X { \n" +
" private enum Greet {\n" +
" HELLO, HOWDY, BONJOUR; \n" +
" }\n" +
" private enum Colors {\n" +
" RED, BLACK, BLUE;\n"+
" }\n" +
" private enum Complaint {" +
" WARNING, ERROR, FATAL_ERROR, PANIC;\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" Greet g = Greet.valueOf(\"HELLO\");\n" +
" System.out.print(g);\n" +
" Colors c = Enum.valueOf(Colors.class, \"RED\");\n" +
" System.out.print(c);\n" +
" }\n" +
"}\n"
},
null, customOptions,
"",
"HELLORED", null,
JavacTestOptions.Excuse.EclipseHasSomeMoreWarnings);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=273990
public void test173() {
this.runNegativeTest(
new String[] {
"E.java",
"public enum E {\n" +
" A(E.STATIK);\n" +
" private static int STATIK = 1;\n" +
" private E(final int i) {}\n" +
"}\n",
"E2.java",
"public enum E2 {\n" +
" A(E2.STATIK);\n" +
" static int STATIK = 1;\n" +
" private E2(final int i) {}\n" +
"}\n"
},
"----------\n" +
"1. ERROR in E.java (at line 2)\n" +
" A(E.STATIK);\n" +
" ^^^^^^\n" +
"Cannot reference a field before it is defined\n" +
"----------\n" +
"----------\n" +
"1. ERROR in E2.java (at line 2)\n" +
" A(E2.STATIK);\n" +
" ^^^^^^\n" +
"Cannot reference a field before it is defined\n" +
"----------\n"
);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=278562
public void test174() {
this.runConformTest(
new String[] {
"X.java",
"import java.util.HashMap;\n" +
"import java.util.Map;\n" +
"interface S {}\n" +
"enum A implements S {\n" +
" L;\n" +
"}\n" +
"public class X {\n" +
" public static void main(String[] args) throws Exception {\n" +
" i(A.L);\n" +
" }\n" +
" static void i(Enum<? extends S> enumConstant) {\n" +
" Map m = new HashMap();\n" +
" for (Enum e : enumConstant.getDeclaringClass().getEnumConstants()) {\n" +
" m.put(e.name(), e);\n" +
" }\n" +
" System.out.print(1);\n" +
" }\n" +
"}\n"
},
"1"
);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=278562
public void test175() {
this.runConformTest(
new String[] {
"X.java",
"import java.util.HashMap;\n" +
"import java.util.Map;\n" +
"interface S {}\n" +
"enum A implements S {\n" +
" L, M, N, O;\n" +
"}\n" +
"public class X {\n" +
" public static void main(String[] args) throws Exception {\n" +
" i(new Enum[] {A.L, A.M, A.N, A.O});\n" +
" }\n" +
" static void i(Enum[] tab) {\n" +
" Map m = new HashMap();\n" +
" for (Enum s : tab) {\n" +
" m.put(s.name(), s);\n" +
" }\n" +
" System.out.print(1);\n" +
" }\n" +
"}\n"
},
"1"
);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=285701
public void test176() {
if(this.complianceLevel < ClassFileConstants.JDK1_6) {
return;
}
this.runConformTest(
new String[] {
"X.java",
"public enum X {\n" +
" A(\"\"), B(\"SUCCESS\"), C(\"Hello\");\n" +
" \n" +
" String message;\n" +
" \n" +
" X(@Deprecated String s) {\n" +
" this.message = s;\n" +
" }\n" +
" @Override\n" +
" public String toString() {\n" +
" return this.message;\n" +
" }\n" +
"}"
},
""
);
Map options = getCompilerOptions();
options.put(CompilerOptions.OPTION_Process_Annotations, CompilerOptions.ENABLED);
this.runConformTest(
false,
new String[] {
"Y.java",
"public class Y {\n" +
" public static void main(String[] args) {\n" +
" System.out.println(X.B);\n" +
" }\n" +
"}"
},
null,
options,
"",
"SUCCESS",
"",
null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=285701
public void test177() {
if(this.complianceLevel < ClassFileConstants.JDK1_6) {
return;
}
this.runConformTest(
new String[] {
"X.java",
"public enum X {\n" +
" A(\"\", 0, \"A\"), B(\"SUCCESS\", 0, \"B\"), C(\"Hello\", 0, \"C\");\n" +
" \n" +
" private String message;\n" +
" private int index;\n" +
" private String name;\n" +
" \n" +
" X(@Deprecated String s, int i, @Deprecated String name) {\n" +
" this.message = s;\n" +
" this.index = i;\n" +
" this.name = name;\n" +
" }\n" +
" @Override\n" +
" public String toString() {\n" +
" return this.message + this.name;\n" +
" }\n" +
"}"
},
""
);
Map options = getCompilerOptions();
options.put(CompilerOptions.OPTION_Process_Annotations, CompilerOptions.ENABLED);
this.runConformTest(
false,
new String[] {
"Y.java",
"public class Y {\n" +
" public static void main(String[] args) {\n" +
" System.out.println(X.B);\n" +
" }\n" +
"}"
},
null,
options,
"",
"SUCCESSB",
"",
null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=285701
public void test178() {
if(this.complianceLevel < ClassFileConstants.JDK1_6) {
return;
}
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static enum Y {\n" +
" A(\"\", 0, \"A\"), B(\"SUCCESS\", 0, \"B\"), C(\"Hello\", 0, \"C\");\n" +
" \n" +
" private String message;\n" +
" private int index;\n" +
" private String name;\n" +
" Y(@Deprecated String s, int i, @Deprecated String name) {\n" +
" this.message = s;\n" +
" this.index = i;\n" +
" this.name = name;\n" +
" }\n" +
" @Override\n" +
" public String toString() {\n" +
" return this.message + this.name;\n" +
" }\n" +
" }\n" +
"}"
},
""
);
Map options = getCompilerOptions();
options.put(CompilerOptions.OPTION_Process_Annotations, CompilerOptions.ENABLED);
this.runConformTest(
false,
new String[] {
"Z.java",
"public class Z {\n" +
" public static void main(String[] args) {\n" +
" System.out.println(X.Y.B);\n" +
" }\n" +
"}"
},
null,
options,
"",
"SUCCESSB",
"",
null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=285701
public void test179() {
if(this.complianceLevel < ClassFileConstants.JDK1_6) {
return;
}
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public enum Y {\n" +
" A(\"\", 0, \"A\"), B(\"SUCCESS\", 0, \"B\"), C(\"Hello\", 0, \"C\");\n" +
" \n" +
" private String message;\n" +
" private int index;\n" +
" private String name;\n" +
" Y(@Deprecated String s, int i, @Deprecated String name) {\n" +
" this.message = s;\n" +
" this.index = i;\n" +
" this.name = name;\n" +
" }\n" +
" @Override\n" +
" public String toString() {\n" +
" return this.message + this.name;\n" +
" }\n" +
" }\n" +
"}"
},
""
);
Map options = getCompilerOptions();
options.put(CompilerOptions.OPTION_Process_Annotations, CompilerOptions.ENABLED);
this.runConformTest(
false,
new String[] {
"Z.java",
"public class Z {\n" +
" public static void main(String[] args) {\n" +
" System.out.println(X.Y.B);\n" +
" }\n" +
"}"
},
null,
options,
"",
"SUCCESSB",
"",
null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=289892
public void test180() {
this.runConformTest(
new String[] {
"p/package-info.java",
"@p.Annot(state=p.MyEnum.BROKEN)\n" +
"package p;",
"p/Annot.java",
"package p;\n" +
"@Annot(state=MyEnum.KO)\n" +
"public @interface Annot {\n" +
" MyEnum state() default MyEnum.KO;\n" +
"}",
"p/MyEnum.java",
"package p;\n" +
"@Annot(state=MyEnum.KO)\n" +
"public enum MyEnum {\n" +
" WORKS, OK, KO, BROKEN, ;\n" +
"}",
"test180/package-info.java",
"@p.Annot(state=p.MyEnum.OK)\n" +
"package test180;",
"test180/Test.java",
"package test180;\n" +
"import p.MyEnum;\n" +
"import p.Annot;\n" +
"@Annot(state=MyEnum.OK)\n" +
"public class Test {}",
},
""
);
Map options = getCompilerOptions();
options.put(CompilerOptions.OPTION_Process_Annotations, CompilerOptions.ENABLED);
this.runConformTest(
false,
new String[] {
"X.java",
"import test180.Test;\n" +
"public class X {\n" +
" public static void main(String[] args) {\n" +
" System.out.println(Test.class);\n" +
" }\n" +
"}"
},
null,
options,
"",
"class test180.Test",
"",
null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=300133
public void test181() {
this.runConformTest(
new String[] {
"X.java",
"public enum X {\n" +
" A {\n" +
" @Override\n" +
" public Object foo(final String s) {\n" +
" class Local {\n" +
" public String toString() {\n" +
" return s;\n" +
" }\n" +
" }\n" +
" return new Local();\n" +
" }\n" +
" };\n" +
" public abstract Object foo(String s);\n" +
" public static void main(String... args) {\n" +
" System.out.println(A.foo(\"SUCCESS\"));\n" +
" }\n" +
"}"
},
"SUCCESS");
}
}