/*******************************************************************************
 * Copyright (c) 2005, 2012 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
 *     Stephan Herrmann - Contribution for bug 374605 - Unreasonable warning for enum-based switch statements
 *******************************************************************************/
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.JavaCore;
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.ASTVisitor;
import org.eclipse.jdt.internal.compiler.ast.SingleNameReference;
import org.eclipse.jdt.internal.compiler.lookup.BlockScope;
import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;

public class SwitchTest extends AbstractRegressionTest {
	
	private static final long JDKLevelSupportingStringSwitch = ClassFileConstants.JDK1_7;

static {
//	TESTS_NUMBERS = new int[] { 22 };
//	TESTS_NAMES = new String[] { "testFor356002", "testFor356002_2", "testFor356002_3" };
}
public SwitchTest(String name) {
	super(name);
}
public static Test suite() {
	return buildAllCompliancesTestSuite(testClass());
}

public void test001() {
	this.runConformTest(new String[] {
		"p/X.java",
		"package p;\n" +
		"public class X {\n" +
		"  public static void main(String args[]) {\n" +
		"    foo();\n" +
		"  }\n" +
		"  public static void foo() {\n" +
		"    try {\n" +
		"      switch(0) {\n" +
		"      case 0 :\n" +
		"      case 1 - (1 << 31) :\n" +
		"      case (1 << 30) :\n" +
		"      }\n" +
		"    } catch (OutOfMemoryError e) {\n" +
		"    }\n" +
		"  }\n" +
		"}\n",
	});
}
public void test002() {
	this.runConformTest(new String[] {
		"p/X.java",
		"package p;\n" +
		"public class X {\n" +
		"  int k;\n" +
		"  public void foo() {\n" +
		"    int c;\n" +
		"    switch (k) {\n" +
		"      default :\n" +
		"        c = 2;\n" +
		"        break;\n" +
		"      case 2 :\n" +
		"        c = 3;\n" +
		"        break;\n" +
		"    }\n" +
		"  }\n" +
		"}\n",
	});
}

public void test003() {
	this.runConformTest(new String[] {
		"p/X.java",
		"package p;\n" +
		"public class X {\n" +
		"  int i = 0;\n" +
		"  void foo() {\n" +
		"    switch (i) {\n" +
		"      case 1 :\n" +
		"        {\n" +
		"          int j;\n" +
		"          break;\n" +
		"        }\n" +
		"    }\n" +
		"  }\n" +
		"}\n",
	});
}

public void test004() {
	this.runConformTest(new String[] {
		"p/X.java",
		"package p;\n" +
		"public class X {\n" +
		"  public static int foo() {\n" +
		"    int i = 0, j;\n" +
		"    switch (i) {\n" +
		"      default :\n" +
		"        int k = 2;\n" +
		"        j = k;\n" +
		"    }\n" +
		"    if (j != -2) {\n" +
		"      return 1;\n" +
		"    }\n" +
		"    return 0;\n" +
		"  }\n" +
		"}\n",
	});
}

public void test005() {
	this.runConformTest(new String[] {
		"p/BugJavaCase.java",
		"package p;\n" +
		"class BugJavaCase {\n" +
		"  public static final int BC_ZERO_ARG = 1;\n" +
		"  public void test01(int i) {\n" +
		"    switch (i) {\n" +
		"      case BC_ZERO_ARG :\n" +
		"        System.out.println(\"i = \" + i);\n" +
		"        break;\n" +
		"    }\n" +
		"  }\n" +
		"}\n",
	});
}


public void test006() {
	this.runConformTest(new String[] {
		"p/X.java",
		"package p;\n" +
		"public class X {\n" +
		"  public static void main(String args[]) {\n" +
		"    foo(); \n" +
		"  } \n" +
		" \n" +
		"  public static void foo() { \n" +
		"    char x = 5;\n" +
		"    final short b = 5;\n" +
		"    int a;\n" +
		"    \n" +
		"    switch (x) {\n" +
		"      case b:        // compile time error\n" +
		"        a = 0;\n" +
		"        break; \n" +
		"      default:\n" +
		"        a=1;\n" +
		"    }\n" +
		"    \n" +
		"  }\n" +
		"}\n",
	});
}

public void test007() {
	this.runNegativeTest(
		new String[] {
			"p/X.java",
			"package p;\n" +
			"class X {\n" +
			"  void v() {\n" +
			"    switch (1) {\n" +
			"      case (int) (1.0 / 0.0) :\n" +
			"        break;\n" +
			"      case (int) (2.0 / 0.0) :\n" +
			"        break;\n" +
			"    }\n" +
			"  }\n" +
			"}",
		},
		"----------\n" +
		"1. ERROR in p\\X.java (at line 5)\n" +
		"	case (int) (1.0 / 0.0) :\n" +
		"	^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Duplicate case\n" +
		"----------\n" +
		"2. ERROR in p\\X.java (at line 7)\n" +
		"	case (int) (2.0 / 0.0) :\n" +
		"	^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Duplicate case\n" +
		"----------\n"
	);
}
public void test008() {
	this.runConformTest(new String[] {
		"X.java",
		"public class X {\n" +
		"	public static void main(String[] args) {\n" +
		"		switch(args.length){\n" +
		"		}\n" +
		"		System.out.println(\"SUCCESS\");\n" +
		"	}\n" +
		"}\n",
	},
	"SUCCESS");
}
public void test009() {
	this.runConformTest(new String[] {
		"X.java",
		"public class X {\n" +
		"    public static void main(String argv[]) {\n" +
		"        switch (81391861) {\n" +
		"        case (81391861) :\n" +
		"        	System.out.println(\"SUCCESS\");\n" +
		"            break;\n" +
		"        default:\n" +
		"        	System.out.println(\"FAILED\");\n" +
		"        }\n" +
		"    }\n" +
		"}\n",
	},
	"SUCCESS");
}
public void test010() {
	String newMessage =
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	switch(this){\n" +
			"	       ^^^^\n" +
			"Cannot switch on a value of type X. Only convertible int values, strings or enum variables are permitted\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 6)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 11)\n" +
			"	switch(x){\n" +
			"	       ^\n" +
			"x cannot be resolved to a variable\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 13)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n";
	String oldMessage =
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	switch(this){\n" +
			"	       ^^^^\n" +
			"Cannot switch on a value of type X. Only convertible int values or enum variables are permitted\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 6)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 11)\n" +
			"	switch(x){\n" +
			"	       ^\n" +
			"x cannot be resolved to a variable\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 13)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n";
	this.runNegativeTest(new String[] {
		"X.java",
		"public class X {\n" +
		"	\n" +
		"	void foo(){\n" +
		"		switch(this){\n" +
		"			case 0 : \n" +
		"				Zork z;\n" +
		"		}\n" +
		"	}\n" +
		"	\n" +
		"	void bar(){\n" +
		"		switch(x){\n" +
		"			case 0 : \n" +
		"				Zork z;\n" +
		"		}\n" +
		"	}	\n" +
		"}\n",
	},
	this.complianceLevel >= JDKLevelSupportingStringSwitch ? newMessage : oldMessage);
	
}
public void test011() {
	this.runConformTest(new String[] {
		"X.java",
		"public class X {\n" +
		"	public static void main(String args[]) {\n" +
		"		switch (args.length) {\n" +
		"			case 1 :\n" +
		"				System.out.println();\n" +
		"			case 3 :\n" +
		"				break;\n" +
		"			default :\n" +
		"		}\n" +
		"		System.out.println(\"SUCCESS\");\n" +
		"	}\n" +
		"}\n",
	},
	"SUCCESS");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=86813
public void test012() throws Exception {
	this.runConformTest(new String[] {
		"X.java",
		"public class X {\n" +
		"  public static void main(String[] args) {\n" +
		"    boolean x= true;\n" +
		"    try {\n" +
		"      int i= 1;\n" +
		"      switch (i) { // <-- breakpoint here\n" +
		"        case 1:\n" +
		"          break;      //step 1 \n" +
		"        case 2:\n" +
		"          x = false;   //step 2 \n" +
		"          break;\n" +
		"      }\n" +
		"    }catch(Exception e) {\n" +
		"    }\n" +
		"    System.out.println(\"SUCCESS\");\n" +
		"  }\n" +
		"}\n",
	},
	"SUCCESS");

	String expectedOutput =
		"  // Method descriptor #15 ([Ljava/lang/String;)V\n" +
		"  // Stack: 2, Locals: 3\n" +
		"  public static void main(java.lang.String[] args);\n" +
		"     0  iconst_1\n" +
		"     1  istore_1 [x]\n" +
		"     2  iconst_1\n" +
		"     3  istore_2 [i]\n" +
		"     4  iload_2 [i]\n" +
		"     5  tableswitch default: 33\n" +
		"          case 1: 28\n" +
		"          case 2: 31\n" +
		"    28  goto 37\n" +
		"    31  iconst_0\n" +
		"    32  istore_1 [x]\n" +
		"    33  goto 37\n" +
		"    36  astore_2\n" +
		"    37  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
		"    40  ldc <String \"SUCCESS\"> [22]\n" +
		"    42  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n" +
		"    45  return\n" +
		"      Exception Table:\n" +
		"        [pc: 2, pc: 33] -> 36 when : java.lang.Exception\n" +
		"      Line numbers:\n" +
		"        [pc: 0, line: 3]\n" +
		"        [pc: 2, line: 5]\n" +
		"        [pc: 4, line: 6]\n" +
		"        [pc: 28, line: 8]\n" +
		"        [pc: 31, line: 10]\n" +
		"        [pc: 33, line: 12]\n" +
		"        [pc: 36, line: 13]\n" +
		"        [pc: 37, line: 15]\n" +
		"        [pc: 45, line: 16]\n" +
		"      Local variable table:\n" +
		"        [pc: 0, pc: 46] local: args index: 0 type: java.lang.String[]\n" +
		"        [pc: 2, pc: 46] local: x index: 1 type: boolean\n" +
		"        [pc: 4, pc: 36] local: i index: 2 type: int\n";

	File f = new File(OUTPUT_DIR + File.separator + "X.class");
	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
	int index = result.indexOf(expectedOutput);
	if (index == -1 || expectedOutput.length() == 0) {
		System.out.println(Util.displayString(result, 3));
	}
	if (index == -1) {
		assertEquals("Wrong contents", expectedOutput, result);
	}
}
public void test013() throws Exception {
	this.runConformTest(new String[] {
		"X.java",
		"public class X {\n" +
		"\n" +
		"	public static void main(String[] args) {\n" +
		"		X x;\n" +
		"		Object o = null;\n" +
		"		for (int i = 0; i < 10; i++) {\n" +
		"			if (i < 90) {\n" +
		"				x = new X();\n" +
		"				if (i > 4) {\n" +
		"					o = new Object();\n" +
		"				} else {\n" +
		"					o = null;\n" +
		"				}\n" +
		"				switch (2) {\n" +
		"					case 0:\n" +
		"						if (o instanceof String) {\n" +
		"							System.out.print(\"1\");\n" +
		"							return;\n" +
		"						} else {\n" +
		"							break;\n" +
		"						}\n" +
		"					default: {\n" +
		"						Object diff = o;\n" +
		"						if (diff != null) {\n" +
		"							System.out.print(\"2\");\n" +
		"						}\n" +
		"						break;\n" +
		"					}\n" +
		"				}\n" +
		"				System.out.print(\"3\");				\n" +
		"			}\n" +
		"		}\n" +
		"	}\n" +
		"}\n",
	},
	"333332323232323");

	String expectedOutput = new CompilerOptions(getCompilerOptions()).complianceLevel < ClassFileConstants.JDK1_6
		?	"  // Method descriptor #15 ([Ljava/lang/String;)V\n" +
			"  // Stack: 2, Locals: 5\n" +
			"  public static void main(java.lang.String[] args);\n" +
			"      0  aconst_null\n" +
			"      1  astore_2 [o]\n" +
			"      2  iconst_0\n" +
			"      3  istore_3 [i]\n" +
			"      4  goto 103\n" +
			"      7  iload_3 [i]\n" +
			"      8  bipush 90\n" +
			"     10  if_icmpge 100\n" +
			"     13  new X [1]\n" +
			"     16  dup\n" +
			"     17  invokespecial X() [16]\n" +
			"     20  astore_1 [x]\n" +
			"     21  iload_3 [i]\n" +
			"     22  iconst_4\n" +
			"     23  if_icmple 37\n" +
			"     26  new java.lang.Object [3]\n" +
			"     29  dup\n" +
			"     30  invokespecial java.lang.Object() [8]\n" +
			"     33  astore_2 [o]\n" +
			"     34  goto 39\n" +
			"     37  aconst_null\n" +
			"     38  astore_2 [o]\n" +
			"     39  iconst_2\n" +
			"     40  tableswitch default: 76\n" +
			"          case 0: 60\n" +
			"     60  aload_2 [o]\n" +
			"     61  instanceof java.lang.String [17]\n" +
			"     64  ifeq 92\n" +
			"     67  getstatic java.lang.System.out : java.io.PrintStream [19]\n" +
			"     70  ldc <String \"1\"> [25]\n" +
			"     72  invokevirtual java.io.PrintStream.print(java.lang.String) : void [27]\n" +
			"     75  return\n" +
			"     76  aload_2 [o]\n" +
			"     77  astore 4 [diff]\n" +
			"     79  aload 4 [diff]\n" +
			"     81  ifnull 92\n" +
			"     84  getstatic java.lang.System.out : java.io.PrintStream [19]\n" +
			"     87  ldc <String \"2\"> [33]\n" +
			"     89  invokevirtual java.io.PrintStream.print(java.lang.String) : void [27]\n" +
			"     92  getstatic java.lang.System.out : java.io.PrintStream [19]\n" +
			"     95  ldc <String \"3\"> [35]\n" +
			"     97  invokevirtual java.io.PrintStream.print(java.lang.String) : void [27]\n" +
			"    100  iinc 3 1 [i]\n" +
			"    103  iload_3 [i]\n" +
			"    104  bipush 10\n" +
			"    106  if_icmplt 7\n" +
			"    109  return\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 5]\n" +
			"        [pc: 2, line: 6]\n" +
			"        [pc: 7, line: 7]\n" +
			"        [pc: 13, line: 8]\n" +
			"        [pc: 21, line: 9]\n" +
			"        [pc: 26, line: 10]\n" +
			"        [pc: 37, line: 12]\n" +
			"        [pc: 39, line: 14]\n" +
			"        [pc: 60, line: 16]\n" +
			"        [pc: 67, line: 17]\n" +
			"        [pc: 75, line: 18]\n" +
			"        [pc: 76, line: 23]\n" +
			"        [pc: 79, line: 24]\n" +
			"        [pc: 84, line: 25]\n" +
			"        [pc: 92, line: 30]\n" +
			"        [pc: 100, line: 6]\n" +
			"        [pc: 109, line: 33]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 110] local: args index: 0 type: java.lang.String[]\n" +
			"        [pc: 21, pc: 100] local: x index: 1 type: X\n" +
			"        [pc: 2, pc: 110] local: o index: 2 type: java.lang.Object\n" +
			"        [pc: 4, pc: 109] local: i index: 3 type: int\n" +
			"        [pc: 79, pc: 92] local: diff index: 4 type: java.lang.Object\n"
		:
			"  // Method descriptor #15 ([Ljava/lang/String;)V\n" +
			"  // Stack: 2, Locals: 5\n" +
			"  public static void main(java.lang.String[] args);\n" +
			"      0  aconst_null\n" +
			"      1  astore_2 [o]\n" +
			"      2  iconst_0\n" +
			"      3  istore_3 [i]\n" +
			"      4  goto 103\n" +
			"      7  iload_3 [i]\n" +
			"      8  bipush 90\n" +
			"     10  if_icmpge 100\n" +
			"     13  new X [1]\n" +
			"     16  dup\n" +
			"     17  invokespecial X() [16]\n" +
			"     20  astore_1 [x]\n" +
			"     21  iload_3 [i]\n" +
			"     22  iconst_4\n" +
			"     23  if_icmple 37\n" +
			"     26  new java.lang.Object [3]\n" +
			"     29  dup\n" +
			"     30  invokespecial java.lang.Object() [8]\n" +
			"     33  astore_2 [o]\n" +
			"     34  goto 39\n" +
			"     37  aconst_null\n" +
			"     38  astore_2 [o]\n" +
			"     39  iconst_2\n" +
			"     40  tableswitch default: 76\n" +
			"          case 0: 60\n" +
			"     60  aload_2 [o]\n" +
			"     61  instanceof java.lang.String [17]\n" +
			"     64  ifeq 92\n" +
			"     67  getstatic java.lang.System.out : java.io.PrintStream [19]\n" +
			"     70  ldc <String \"1\"> [25]\n" +
			"     72  invokevirtual java.io.PrintStream.print(java.lang.String) : void [27]\n" +
			"     75  return\n" +
			"     76  aload_2 [o]\n" +
			"     77  astore 4 [diff]\n" +
			"     79  aload 4 [diff]\n" +
			"     81  ifnull 92\n" +
			"     84  getstatic java.lang.System.out : java.io.PrintStream [19]\n" +
			"     87  ldc <String \"2\"> [33]\n" +
			"     89  invokevirtual java.io.PrintStream.print(java.lang.String) : void [27]\n" +
			"     92  getstatic java.lang.System.out : java.io.PrintStream [19]\n" +
			"     95  ldc <String \"3\"> [35]\n" +
			"     97  invokevirtual java.io.PrintStream.print(java.lang.String) : void [27]\n" +
			"    100  iinc 3 1 [i]\n" +
			"    103  iload_3 [i]\n" +
			"    104  bipush 10\n" +
			"    106  if_icmplt 7\n" +
			"    109  return\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 5]\n" +
			"        [pc: 2, line: 6]\n" +
			"        [pc: 7, line: 7]\n" +
			"        [pc: 13, line: 8]\n" +
			"        [pc: 21, line: 9]\n" +
			"        [pc: 26, line: 10]\n" +
			"        [pc: 37, line: 12]\n" +
			"        [pc: 39, line: 14]\n" +
			"        [pc: 60, line: 16]\n" +
			"        [pc: 67, line: 17]\n" +
			"        [pc: 75, line: 18]\n" +
			"        [pc: 76, line: 23]\n" +
			"        [pc: 79, line: 24]\n" +
			"        [pc: 84, line: 25]\n" +
			"        [pc: 92, line: 30]\n" +
			"        [pc: 100, line: 6]\n" +
			"        [pc: 109, line: 33]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 110] local: args index: 0 type: java.lang.String[]\n" +
			"        [pc: 21, pc: 100] local: x index: 1 type: X\n" +
			"        [pc: 2, pc: 110] local: o index: 2 type: java.lang.Object\n" +
			"        [pc: 4, pc: 109] local: i index: 3 type: int\n" +
			"        [pc: 79, pc: 92] local: diff index: 4 type: java.lang.Object\n" +
			"      Stack map table: number of frames 8\n" +
			"        [pc: 7, full, stack: {}, locals: {java.lang.String[], _, java.lang.Object, int}]\n" +
			"        [pc: 37, full, stack: {}, locals: {java.lang.String[], X, java.lang.Object, int}]\n" +
			"        [pc: 39, same]\n" +
			"        [pc: 60, same]\n" +
			"        [pc: 76, same]\n" +
			"        [pc: 92, same]\n" +
			"        [pc: 100, full, stack: {}, locals: {java.lang.String[], _, java.lang.Object, int}]\n" +
			"        [pc: 103, same]\n";

	File f = new File(OUTPUT_DIR + File.separator + "X.class");
	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
	int index = result.indexOf(expectedOutput);
	if (index == -1 || expectedOutput.length() == 0) {
		System.out.println(Util.displayString(result, 3));
	}
	if (index == -1) {
		assertEquals("Wrong contents", expectedOutput, result);
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=245257
public void test014() {
	Map options = getCompilerOptions();
	options.put(CompilerOptions.OPTION_ReportFallthroughCase, CompilerOptions.ERROR);
	this.runNegativeTest(new String[] {
		"X.java",
		"public class X {\n" + 
		"	void foo1(int i) {\n" + 
		"		switch (i) {\n" + 
		"			case 0://OK\n" + 
		"			case 1://OK\n" + 
		"				System.out.println();\n" + 
		"				//$FALL-THROUGH$\n" + 
		"			case 2://OK\n" + 
		"				System.out.println(); //$FALL-THROUGH$\n" + 
		"			case 3://OK\n" + 
		"				System.out.println();\n" + 
		"				//$FALL-THROUGH$ - some allowed explanation\n" + 
		"			case 4://OK\n" + 
		"			case 5://OK\n" + 
		"				System.out.println();\n" + 
		"				//$FALL-THROUGH$ - not last comment, thus inoperant\n" + 
		"				// last comment is not fall-through explanation\n" + 
		"			case 6://WRONG\n" + 
		"				//$FALL-THROUGH$ - useless since not leading the case\n" + 
		"				System.out.println();\n" + 
		"				/*$FALL-THROUGH$ - block comment, is also allowed */\n" + 
		"			case 7://OK\n" + 
		"				System.out.println(\"aa\"); //$NON-NLS-1$\n" + 
		"		}\n" + 
		"	}\n" + 
		"}\n",
	},
	"----------\n" + 
	"1. ERROR in X.java (at line 18)\n" + 
	"	case 6://WRONG\n" + 
	"	^^^^^^\n" + 
	"Switch case may be entered by falling through previous case. If intended, add a new comment //$FALL-THROUGH$ on the line above\n" + 
	"----------\n",
	null,
	true,
	options);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=245257 - variation
public void test015() {
	Map options = getCompilerOptions();
	options.put(CompilerOptions.OPTION_ReportFallthroughCase, CompilerOptions.ERROR);
	this.runNegativeTest(new String[] {
		"X.java",
		"public class X {\n" + 
		"	void foo1(int i) {\n" + 
		"		switch (i) {\n" + 
		"			case 0://OK\n" + 
		"			case 1://OK\n" + 
		"				System.out.println();\n" + 
		"				//	  $FALL-THROUGH$\n" + 
		"			case 2://OK\n" + 
		"				System.out.println(); // 	 $FALL-THROUGH$\n" + 
		"			case 3://OK\n" + 
		"				System.out.println();\n" + 
		"				//	$FALL-THROUGH$ - some allowed explanation\n" + 
		"			case 4://OK\n" + 
		"			case 5://OK\n" + 
		"				System.out.println();\n" + 
		"				// $FALL-THROUGH$ - not last comment, thus inoperant\n" + 
		"				// last comment is not fall-through explanation\n" + 
		"			case 6://WRONG\n" + 
		"				// $FALL-THROUGH$ - useless since not leading the case\n" + 
		"				System.out.println();\n" + 
		"				/* $FALL-THROUGH$ - block comment, is also allowed */\n" + 
		"			case 7://OK\n" + 
		"				System.out.println(\"aa\"); //$NON-NLS-1$\n" + 
		"		}\n" + 
		"	}\n" + 
		"}\n",
	},
	"----------\n" + 
	"1. ERROR in X.java (at line 18)\n" + 
	"	case 6://WRONG\n" + 
	"	^^^^^^\n" + 
	"Switch case may be entered by falling through previous case. If intended, add a new comment //$FALL-THROUGH$ on the line above\n" + 
	"----------\n",
	null,
	true,
	options);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=245257 - variation
public void test016() {
	Map options = getCompilerOptions();
	options.put(CompilerOptions.OPTION_ReportFallthroughCase, CompilerOptions.ERROR);
	this.runNegativeTest(new String[] {
		"X.java",
		"public class X {\n" + 
		"	void foo1(int i) {\n" + 
		"		switch (i) {\n" + 
		"			case 0://OK\n" + 
		"			case 1://OK\n" + 
		"				System.out.println();\n" + 
		"				//	  $FALL-THROUGH - missing trailing $ in tag\n" + 
		"			case 2://WRONG\n" + 
		"				System.out.println();\n" + 
		"		}\n" + 
		"	}\n" + 
		"}\n",
	},
	"----------\n" + 
	"1. ERROR in X.java (at line 8)\n" + 
	"	case 2://WRONG\n" + 
	"	^^^^^^\n" + 
	"Switch case may be entered by falling through previous case. If intended, add a new comment //$FALL-THROUGH$ on the line above\n" + 
	"----------\n",
	null,
	true,
	options);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=245257 - variation
public void test017() {
	Map options = getCompilerOptions();
	options.put(CompilerOptions.OPTION_ReportFallthroughCase, CompilerOptions.ERROR);
	this.runNegativeTest(new String[] {
		"X.java",
		"public class X {\n" + 
		"	void foo1(char previousChar) {\n" + 
		"		switch(previousChar) {\n" + 
		"			case \'/\':\n" + 
		"				if (previousChar == \'*\') {\n" + 
		"					// End of javadoc\n" + 
		"					break;\n" + 
		"					//$FALL-THROUGH$ into default case\n" + 
		"				}\n" + 
		"			default :\n" + 
		"		}\n" + 
		"	}\n" + 
		"}\n",
	},
	"----------\n" + 
	"1. ERROR in X.java (at line 10)\n" + 
	"	default :\n" + 
	"	^^^^^^^\n" + 
	"Switch case may be entered by falling through previous case. If intended, add a new comment //$FALL-THROUGH$ on the line above\n" + 
	"----------\n",
	null,
	true,
	options);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=286682
public void test018() {
	this.runConformTest(new String[] {
		"p/X.java",
		"package p;\n" +
		"public class X {\n" +
		"  public static void foo(int i) { \n" +
		"    switch (i) {\n" +
		"    }\n" +
		"  }\n" +
		"}\n",
	},
	new ASTVisitor() {
		public boolean visit(SingleNameReference reference, BlockScope scope) {
			assertNotNull("No scope", scope);
			return true;
		}
	}
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=314830
public void test019() {
	if (this.complianceLevel < ClassFileConstants.JDK1_5) return;
	this.runConformTest(new String[] {
		"X.java",
		"public class X {\n" +
		"	public static void main(String[] args) {\n" +
		"		try {\n" +
		"			switch((Integer) null) {};\n" + 
		"			System.out.println(\"FAILED\");\n" + 
		"		} catch(NullPointerException e) {\n" + 
		"			System.out.println(\"SUCCESS\");\n" + 
		"		}\n" +
		"	}\n" +
		"}\n",
	},
	"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=314830
public void test020() {
	if (this.complianceLevel < ClassFileConstants.JDK1_5) return;
	this.runConformTest(new String[] {
		"X.java",
		"public class X {\n" +
		"	public static void main(String[] args) {\n" +
		"		try {\n" +
		"			switch(foo()) {};\n" + 
		"			System.out.println(\"FAILED\");\n" + 
		"		} catch(NullPointerException e) {\n" + 
		"			System.out.println(\"SUCCESS\");\n" + 
		"		}\n" +
		"	}" +
		"	static Integer foo() {\n" +
		"		return (Integer) null;\n" +
		"	}\n" +
		"}\n",
	},
	"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=314830
public void test021() {
	if (this.complianceLevel < ClassFileConstants.JDK1_5) return;
	this.runConformTest(new String[] {
		"X.java",
		"public class X {\n" +
		"	public static void main(String[] args) {\n" +
		"		try {\n" +
		"			switch((Character) null) {\n" + 
		"				default: System.out.println(\"FAILED\");\n" + 
		"			}\n" + 
		"		} catch(NullPointerException e) {\n" + 
		"			System.out.println(\"SUCCESS\");\n" + 
		"		}\n" +
		"	}\n" +
		"}\n",
	},
	"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=314830
public void test022() {
	if (this.complianceLevel < ClassFileConstants.JDK1_5) return;
	this.runConformTest(new String[] {
		"X.java",
		"public class X {\n" +
		"	public static void main(String[] args) {\n" +
		"		java.math.RoundingMode mode = null;\n" + 
		"		try {\n" +
		"			switch (mode) {}\n" + 
		"			System.out.println(\"FAILED\");\n" + 
		"		} catch(NullPointerException e) {\n" + 
		"			System.out.println(\"SUCCESS\");\n" + 
		"		}\n" +
		"	}\n" +
		"}\n",
	},
	"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=314830
public void test023() {
	if (this.complianceLevel < ClassFileConstants.JDK1_5) return;
	this.runConformTest(new String[] {
		"X.java",
		"public class X {\n" +
		"	public static void main(String[] args) {\n" +
		"		java.math.RoundingMode mode = java.math.RoundingMode.FLOOR;\n" + 
		"		try {\n" +
		"			switch (mode) {\n" +
		"				default: System.out.println(\"SUCCESS\");\n" + 
		"			}\n" + 
		"		} catch(NullPointerException e) {\n" + 
		"			System.out.println(\"FAILED\");\n" + 
		"		}\n" +
		"	}\n" +
		"}\n",
	},
	"SUCCESS");
}

// JDK7: Strings in Switch.
public void testStringSwitchAtJDK6() {
		String newMessage = 		
			"----------\n" + 
			"1. ERROR in X.java (at line 4)\n" + 
			"	default: return args;\n" + 
			"	         ^^^^^^^^^^^^\n" + 
			"Void methods cannot return a value\n" + 
			"----------\n";
		String oldMessage = 
			"----------\n" + 
			"1. ERROR in X.java (at line 3)\n" + 
			"	switch(args[0]) {\n" + 
			"	       ^^^^^^^\n" + 
			"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 4)\n" + 
			"	default: return args;\n" + 
			"	         ^^^^^^^^^^^^\n" + 
			"Void methods cannot return a value\n" + 
			"----------\n";
			
		this.runNegativeTest(new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void main(String [] args) {\n" +
			"		switch(args[0]) {\n" + 
			"		default: return args;\n" +
			"		}\n" +
			"	}\n" +
			"}\n",
		},
		this.complianceLevel >= JDKLevelSupportingStringSwitch ? newMessage : oldMessage);
}

//JDK7: Strings in Switch.
public void testCaseTypeMismatch() {
	String newMessage = 	
		"----------\n" + 
		"1. ERROR in X.java (at line 4)\n" + 
		"	case 123: break;\n" + 
		"	     ^^^\n" + 
		"Type mismatch: cannot convert from int to String\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 5)\n" + 
		"	case (byte) 1: break;\n" + 
		"	     ^^^^^^^^\n" + 
		"Type mismatch: cannot convert from byte to String\n" + 
		"----------\n" + 
		"3. ERROR in X.java (at line 6)\n" + 
		"	case (char) 2: break;\n" + 
		"	     ^^^^^^^^\n" + 
		"Type mismatch: cannot convert from char to String\n" + 
		"----------\n" + 
		"4. ERROR in X.java (at line 7)\n" + 
		"	case (short)3: break;\n" + 
		"	     ^^^^^^^^\n" + 
		"Type mismatch: cannot convert from short to String\n" + 
		"----------\n" + 
		"5. ERROR in X.java (at line 8)\n" + 
		"	case (int) 4: break;\n" + 
		"	     ^^^^^^^\n" + 
		"Type mismatch: cannot convert from int to String\n" + 
		"----------\n" + 
		"6. ERROR in X.java (at line 9)\n" + 
		"	case (long) 5: break;\n" + 
		"	     ^^^^^^^^\n" + 
		"Type mismatch: cannot convert from long to String\n" + 
		"----------\n" + 
		"7. ERROR in X.java (at line 10)\n" + 
		"	case (float) 6: break;\n" + 
		"	     ^^^^^^^^^\n" + 
		"Type mismatch: cannot convert from float to String\n" + 
		"----------\n" + 
		"8. ERROR in X.java (at line 11)\n" + 
		"	case (double) 7: break;\n" + 
		"	     ^^^^^^^^^^\n" + 
		"Type mismatch: cannot convert from double to String\n" + 
		"----------\n" + 
		"9. ERROR in X.java (at line 12)\n" + 
		"	case (boolean) 8: break;\n" + 
		"	     ^^^^^^^^^^^\n" + 
		"Cannot cast from int to boolean\n" + 
		"----------\n" + 
		"10. ERROR in X.java (at line 12)\n" + 
		"	case (boolean) 8: break;\n" + 
		"	     ^^^^^^^^^^^\n" + 
		"Type mismatch: cannot convert from boolean to String\n" + 
		"----------\n";
		String oldMessage = 
			"----------\n" + 
			"1. ERROR in X.java (at line 3)\n" + 
			"	switch(args[0]) {\n" + 
			"	       ^^^^^^^\n" + 
			"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 12)\n" + 
			"	case (boolean) 8: break;\n" + 
			"	     ^^^^^^^^^^^\n" + 
			"Cannot cast from int to boolean\n" + 
			"----------\n";
				
		this.runNegativeTest(new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void main(String [] args) {\n" +
			"		switch(args[0]) {\n" + 
			"		case 123: break;\n" +
			"       case (byte) 1: break;\n" +
			"       case (char) 2: break;\n" +
			"       case (short)3: break;\n" +
			"       case (int) 4: break;\n" +
			"       case (long) 5: break;\n" +
			"       case (float) 6: break;\n" +
			"       case (double) 7: break;\n" +
			"       case (boolean) 8: break;\n" +
			"		}\n" +
			"	}\n" +
			"}\n",
		},
		this.complianceLevel >= JDKLevelSupportingStringSwitch ? newMessage : oldMessage);
}
// JDK7: Strings in Switch.
public void testCaseTypeMismatch2() {
	if (this.complianceLevel < ClassFileConstants.JDK1_5) {
		return;
	}
	String newMessage = 	
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	case Days.Sunday: break;\n" + 
		"	     ^^^^^^^^^^^\n" + 
		"Type mismatch: cannot convert from Days to String\n" + 
		"----------\n";
		String oldMessage = 
			"----------\n" + 
			"1. ERROR in X.java (at line 6)\n" + 
			"	switch (\"Sunday\") {\n" + 
			"	        ^^^^^^^^\n" + 
			"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
			"----------\n";
				
		this.runNegativeTest(new String[] {
			"X.java",
			"enum Days { Sunday, Monday, Tuesday, Wednesday, Thuresday, Friday, Satuday };\n" +
			"\n" +
			"public class X {\n" +
			"\n" +
			"    public static void main(String argv[]) {\n" +
			"        switch (\"Sunday\") {\n" +
			"            case Days.Sunday: break;\n" +
			"        }\n" +
			"    }\n" +
			"}\n",
		},
		this.complianceLevel >= JDKLevelSupportingStringSwitch ? newMessage : oldMessage);
}
// JDK7: Strings in Switch.
public void testCaseTypeMismatch3() {
	if (this.complianceLevel < ClassFileConstants.JDK1_5) {
		return;
	}
	String newMessage = 	
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	case \"0\": break;\n" + 
		"	     ^^^\n" + 
		"Type mismatch: cannot convert from String to int\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 10)\n" + 
		"	case \"Sunday\": break;\n" + 
		"	     ^^^^^^^^\n" + 
		"Type mismatch: cannot convert from String to Days\n" + 
		"----------\n" + 
		"3. ERROR in X.java (at line 13)\n" + 
		"	case \"0\": break;\n" + 
		"	     ^^^\n" + 
		"Type mismatch: cannot convert from String to Integer\n" + 
		"----------\n";
				
		this.runNegativeTest(new String[] {
			"X.java",
			"enum Days { Sunday, Monday, Tuesday, Wednesday, Thuresday, Friday, Satuday };\n" +
			"\n" +
			"public class X {\n" +
			"\n" +
			"    public static void main(String argv[]) {\n" +
			"        switch (argv.length) {\n" +
			"            case \"0\": break;\n" +
			"        }\n" +
			"        switch(Days.Sunday) {\n" +
			"            case \"Sunday\": break;\n" +
			"        }\n" +
			"        switch (new Integer(argv.length)) {\n" +
			"            case \"0\": break;\n" +
			"        }\n" +
			"    }\n" +
			"}\n",
		},
		newMessage);
}
// JDK7: Strings in Switch.
public void testDuplicateCase() {
		String newMessage = 
			"----------\n" + 
			"1. ERROR in X.java (at line 4)\n" + 
			"	case \"123\": break;\n" + 
			"	^^^^^^^^^^\n" + 
			"Duplicate case\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 5)\n" + 
			"	case \"123\": break;\n" + 
			"	^^^^^^^^^^\n" + 
			"Duplicate case\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 6)\n" + 
			"	default: return args;\n" + 
			"	         ^^^^^^^^^^^^\n" + 
			"Void methods cannot return a value\n" + 
			"----------\n";
		
		String oldMessage = 
			"----------\n" + 
			"1. ERROR in X.java (at line 3)\n" + 
			"	switch(args[0]) {\n" + 
			"	       ^^^^^^^\n" + 
			"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 6)\n" + 
			"	default: return args;\n" + 
			"	         ^^^^^^^^^^^^\n" + 
			"Void methods cannot return a value\n" + 
			"----------\n";
				
		this.runNegativeTest(new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void main(String [] args) {\n" +
			"		switch(args[0]) {\n" + 
			"		case \"123\": break;\n" +
			"		case \"123\": break;\n" +
			"       default: return args;\n" +
			"		}\n" +
			"	}\n" +
			"}\n",
		},
		this.complianceLevel >= JDKLevelSupportingStringSwitch ? newMessage : oldMessage);
}

// JDK7: Strings in Switch.
public void testDuplicateCase2() {
		String newMessage = 
			"----------\n" + 
			"1. ERROR in X.java (at line 9)\n" + 
			"	case \"123\": break;\n" + 
			"	^^^^^^^^^^\n" + 
			"Duplicate case\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 10)\n" + 
			"	case \"123\": break;\n" + 
			"	^^^^^^^^^^\n" + 
			"Duplicate case\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 11)\n" + 
			"	case \"1\" + \"2\" + \"3\": break;\n" + 
			"	^^^^^^^^^^^^^^^^^^^^\n" + 
			"Duplicate case\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 13)\n" + 
			"	case local: break;\n" + 
			"	^^^^^^^^^^\n" + 
			"Duplicate case\n" + 
			"----------\n" + 
			"5. ERROR in X.java (at line 14)\n" + 
			"	case field: break;\n" + 
			"	^^^^^^^^^^\n" + 
			"Duplicate case\n" + 
			"----------\n" + 
			"6. ERROR in X.java (at line 15)\n" + 
			"	case ifield: break;\n" + 
			"	     ^^^^^^\n" + 
			"Cannot make a static reference to the non-static field ifield\n" + 
			"----------\n" + 
			"7. ERROR in X.java (at line 16)\n" + 
			"	case inffield: break;\n" + 
			"	     ^^^^^^^^\n" + 
			"Cannot make a static reference to the non-static field inffield\n" + 
			"----------\n" + 
			"8. ERROR in X.java (at line 19)\n" + 
			"	default: break;\n" + 
			"	^^^^^^^\n" + 
			"The default case is already defined\n" + 
			"----------\n";
		
		String oldMessage = 
			"----------\n" + 
			"1. ERROR in X.java (at line 8)\n" + 
			"	switch(args[0]) {\n" + 
			"	       ^^^^^^^\n" + 
			"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 15)\n" + 
			"	case ifield: break;\n" + 
			"	     ^^^^^^\n" + 
			"Cannot make a static reference to the non-static field ifield\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 16)\n" + 
			"	case inffield: break;\n" + 
			"	     ^^^^^^^^\n" + 
			"Cannot make a static reference to the non-static field inffield\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 19)\n" + 
			"	default: break;\n" + 
			"	^^^^^^^\n" + 
			"The default case is already defined\n" + 
			"----------\n";
				
		this.runNegativeTest(new String[] {
			"X.java",
			"public class X {\n" +
			"    static final String field = \"123\";\n" +
			"    final String ifield = \"123\";\n" +
			"    String inffield = \"123\";\n" +
			"    static String nffield = \"123\";\n" +
			"    public static void main(String [] args, final String argument) {\n" +
			"        final String local = \"123\";\n" +
			"	switch(args[0]) {\n" + 
			"	   case \"123\": break;\n" +
			"      case \"\u0031\u0032\u0033\": break;\n" +
			"	   case \"1\" + \"2\" + \"3\": break;\n" +
			"           default: break;\n" +
			"	   case local: break;\n" +
			"           case field: break;\n" +
			"           case ifield: break;\n" +
			"           case inffield: break;\n" +
			"           case nffield: break;\n" +
			"           case argument: break;\n" +
			"           default: break;\n" +
			"	}\n" +
			"    }\n" +
			"}\n"
		},
		this.complianceLevel >= JDKLevelSupportingStringSwitch ? newMessage : oldMessage);
}
// JDK7: Strings in Switch.
public void testVariableCase() {
		String newMessage = 
			"----------\n" + 
			"1. ERROR in X.java (at line 7)\n" + 
			"	case local: break;\n" + 
			"	     ^^^^^\n" + 
			"case expressions must be constant expressions\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 8)\n" + 
			"	case argument: break;\n" + 
			"	     ^^^^^^^^\n" + 
			"case expressions must be constant expressions\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 9)\n" + 
			"	case inffield: break;\n" + 
			"	     ^^^^^^^^\n" + 
			"case expressions must be constant expressions\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 10)\n" + 
			"	case nffield: break;\n" + 
			"	     ^^^^^^^\n" + 
			"case expressions must be constant expressions\n" + 
			"----------\n" + 
			"5. ERROR in X.java (at line 11)\n" + 
			"	case argument: break;\n" + 
			"	     ^^^^^^^^\n" + 
			"case expressions must be constant expressions\n" + 
			"----------\n";
		
		String oldMessage = 
			"----------\n" + 
			"1. ERROR in X.java (at line 6)\n" + 
			"	switch(args[0]) {\n" + 
			"	       ^^^^^^^\n" + 
			"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
			"----------\n";
				
		this.runNegativeTest(new String[] {
			"X.java",
			"public class X {\n" +
			"    String inffield = \"123\";\n" +
			"    static String nffield = \"123\";\n" +
			"    public void main(String [] args, final String argument) {\n" +
			"        String local = \"123\";\n" +
			"	switch(args[0]) {\n" + 
			"	   case local: break;\n" +
			"	   case argument: break;\n" +
			"      case inffield: break;\n" +
			"      case nffield: break;\n" +
			"      case argument: break;\n" +
			"	}\n" +
			"    }\n" +
			"}\n"
		},
		this.complianceLevel >= JDKLevelSupportingStringSwitch ? newMessage : oldMessage);
}
// JDK7: Strings in Switch.
public void testVariableCaseFinal() {
		String newMessage = 
			"----------\n" + 
			"1. ERROR in X.java (at line 8)\n" + 
			"	case argument: break;\n" + 
			"	     ^^^^^^^^\n" + 
			"case expressions must be constant expressions\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 11)\n" + 
			"	case argument: break;\n" + 
			"	     ^^^^^^^^\n" + 
			"case expressions must be constant expressions\n" + 
			"----------\n";
		
		String oldMessage = 
			"----------\n" + 
			"1. ERROR in X.java (at line 6)\n" + 
			"	switch(args[0]) {\n" + 
			"	       ^^^^^^^\n" + 
			"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
			"----------\n";
				
		this.runNegativeTest(new String[] {
			"X.java",
			"public class X {\n" +
			"    final String inffield = \"12312\";\n" +
			"    final static String nffield = \"123123\";\n" +
			"    public void main(String [] args, final String argument) {\n" +
			"        final String local = \"1233\";\n" +
			"	switch(args[0]) {\n" + 
			"	   case local: break;\n" +
			"	   case argument: break;\n" +
			"      case inffield: break;\n" +
			"      case nffield: break;\n" +
			"      case argument: break;\n" +
			"	}\n" +
			"    }\n" +
			"}\n"
		},
		this.complianceLevel >= JDKLevelSupportingStringSwitch ? newMessage : oldMessage);
}
//JDK7: Strings in Switch.
public void testNullCase() {
		String newMessage = 
			"----------\n" + 
			"1. ERROR in X.java (at line 7)\n" + 
			"	case local: break;\n" + 
			"	     ^^^^^\n" + 
			"case expressions must be constant expressions\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 8)\n" + 
			"	case argument: break;\n" + 
			"	     ^^^^^^^^\n" + 
			"case expressions must be constant expressions\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 9)\n" + 
			"	case inffield: break;\n" + 
			"	     ^^^^^^^^\n" + 
			"case expressions must be constant expressions\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 10)\n" + 
			"	case nffield: break;\n" + 
			"	     ^^^^^^^\n" + 
			"case expressions must be constant expressions\n" + 
			"----------\n" + 
			"5. ERROR in X.java (at line 11)\n" + 
			"	case (String) null: break;\n" + 
			"	     ^^^^^^^^^^^^^\n" + 
			"case expressions must be constant expressions\n" + 
			"----------\n" + 
			"6. ERROR in X.java (at line 12)\n" + 
			"	case true ? (String) null : (String) null : break;\n" + 
			"	     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"case expressions must be constant expressions\n" + 
			"----------\n" + 
			"7. WARNING in X.java (at line 12)\n" + 
			"	case true ? (String) null : (String) null : break;\n" + 
			"	                            ^^^^^^^^^^^^^\n" + 
			"Dead code\n" + 
			"----------\n";
		
		String oldMessage = 
			"----------\n" + 
			"1. ERROR in X.java (at line 6)\n" + 
			"	switch(args[0]) {\n" + 
			"	       ^^^^^^^\n" + 
			"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
			"----------\n";
				
		this.runNegativeTest(new String[] {
			"X.java",
			"public class X {\n" +
			"    final String inffield = null;\n" +
			"    final static String nffield = null;\n" +
			"    public void main(String [] args, final String argument) {\n" +
			"        final String local = null;\n" +
			"	switch(args[0]) {\n" + 
			"	   case local: break;\n" +
			"	   case argument: break;\n" +
			"      case inffield: break;\n" +
			"      case nffield: break;\n" +
			"      case (String) null: break;\n" +
			"      case true ? (String) null : (String) null : break;\n" +
			"	}\n" +
			"    }\n" +
			"}\n"
		},
		this.complianceLevel >= JDKLevelSupportingStringSwitch ? newMessage : oldMessage);
}
// JDK7: Strings in Switch.
public void testDuplicateCase3() {
		String newMessage = 
			"----------\n" + 
			"1. ERROR in X.java (at line 9)\n" + 
			"	case \"123\": break;\n" + 
			"	^^^^^^^^^^\n" + 
			"Duplicate case\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 10)\n" + 
			"	case \"1\" + \"2\" + \"3\": break;\n" + 
			"	^^^^^^^^^^^^^^^^^^^^\n" + 
			"Duplicate case\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 12)\n" + 
			"	case local: break;\n" + 
			"	^^^^^^^^^^\n" + 
			"Duplicate case\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 13)\n" + 
			"	case field: break;\n" + 
			"	^^^^^^^^^^\n" + 
			"Duplicate case\n" + 
			"----------\n" + 
			"5. ERROR in X.java (at line 14)\n" + 
			"	case ifield: break;\n" + 
			"	^^^^^^^^^^^\n" + 
			"Duplicate case\n" + 
			"----------\n" + 
			"6. ERROR in X.java (at line 18)\n" + 
			"	default: break;\n" + 
			"	^^^^^^^\n" + 
			"The default case is already defined\n" + 
			"----------\n";
		
		String oldMessage = 
			"----------\n" + 
			"1. ERROR in X.java (at line 8)\n" + 
			"	switch(args[0]) {\n" + 
			"	       ^^^^^^^\n" + 
			"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 18)\n" + 
			"	default: break;\n" + 
			"	^^^^^^^\n" + 
			"The default case is already defined\n" + 
			"----------\n";
				
		this.runNegativeTest(new String[] {
			"X.java",
			"public class X {\n" +
			"    static final String field = \"123\";\n" +
			"    final String ifield = \"123\";\n" +
			"    String inffield = \"123\";\n" +
			"    static String nffield = \"123\";\n" +
			"    public  void main(String [] args, final String argument) {\n" +
			"        final String local = \"123\";\n" +
			"	switch(args[0]) {\n" + 
			"	   case \"123\": break;\n" +
			"	   case \"1\" + \"2\" + \"3\": break;\n" +
			"           default: break;\n" +
			"	   case local: break;\n" +
			"           case field: break;\n" +
			"           case ifield: break;\n" +
			"           case inffield: break;\n" +
			"           case nffield: break;\n" +
			"           case argument: break;\n" +
			"           default: break;\n" +
			"	}\n" +
			"    }\n" +
			"}\n"
		},
		this.complianceLevel >= JDKLevelSupportingStringSwitch ? newMessage : oldMessage);
}

public void testDuplicateHashCode() {
	String errorMsg = 		
		"----------\n" + 
		"1. ERROR in testDuplicateHashCode.java (at line 5)\n" + 
		"	switch (dispatcher) {\n" + 
		"	        ^^^^^^^^^^\n" + 
		"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
		"----------\n";
	
	String [] sourceFiles = 
		new String[] {
		"testDuplicateHashCode.java",
		"public class testDuplicateHashCode {\n" +
		"	public static void main(String[] argv) {\n" +
		"		String dispatcher = \"\u0000\";\n" +
		"		for (int i = 0; i < 100; i++) {\n" +
		"			switch (dispatcher) {\n" +
		"			case \"\u0000\":\n" +
		"				System.out.print(\"1 \");\n" +
		"				break;\n" +
		"			case \"\u0000\u0000\":\n" +
		"				System.out.print(\"2 \");\n" +
		"				break;\n" +
		"			case \"\u0000\u0000\u0000\":\n" +
		"				System.out.print(\"3 \");\n" +
		"				break;\n" +
		"			case \"\u0000\u0000\u0000\u0000\":\n" +
		"				System.out.print(\"4 \");\n" +
		"				break;\n" +
		"			case \"\u0000\u0000\u0000\u0000\u0000\":\n" +
		"				System.out.print(\"5 \");\n" +
		"				break;\n" +
		"			default:\n" +
		"				System.out.println(\"Default\");\n" +
		"				System.exit(0);\n" +
		"			case \"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\":\n" +
		"				System.out.print(\"8 \");\n" +
		"				break;\n" +
		"			case \"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\":\n" +
		"				System.out.print(\"7 \");\n" +
		"				break;\n" +
		"			case \"\u0000\u0000\u0000\u0000\u0000\u0000\":\n" +
		"				System.out.print(\"6 \");\n" +
		"				break;\n" +
		"			}\n" +
		"			dispatcher += \"\u0000\";\n" +
		"		}\n" +
		"	}\n" +
		"}\n",
	};
	if (this.complianceLevel < JDKLevelSupportingStringSwitch) {
		this.runNegativeTest(sourceFiles, errorMsg);
	} else {
		this.runConformTest(sourceFiles, "1 2 3 4 5 6 7 8 Default");
	}
}
public void testDuplicateHashCode2() {
	String errorMsg = 		
		"----------\n" + 
		"1. ERROR in testDuplicateHashCode.java (at line 5)\n" + 
		"	switch (dispatcher) {\n" + 
		"	        ^^^^^^^^^^\n" + 
		"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
		"----------\n";
	
	String [] sourceFiles = 
		new String[] {
		"testDuplicateHashCode.java",
		"public class testDuplicateHashCode {\n" +
		"	public static void main(String[] argv) {\n" +
		"		String dispatcher = \"\u0000\";\n" +
		"		while(true) {\n" +
		"			switch (dispatcher) {\n" +
		"			case \"\u0000\":\n" +
		"				System.out.print(\"1 \");\n" +
		"               dispatcher += \"\u0000\u0000\";\n" +
		"				break;\n" +
		"			case \"\u0000\u0000\":\n" +
		"				System.out.print(\"2 \");\n" +
		"               dispatcher = \"\";\n" +
		"				break;\n" +
		"			case \"\u0000\u0000\u0000\":\n" +
		"				System.out.print(\"3 \");\n" +
		"               dispatcher += \"\u0000\u0000\";\n" +
		"				break;\n" +
		"			case \"\u0000\u0000\u0000\u0000\":\n" +
		"				System.out.print(\"4 \");\n" +
		"               dispatcher = \"\u0000\u0000\";\n" +
		"				break;\n" +
		"			case \"\u0000\u0000\u0000\u0000\u0000\":\n" +
		"				System.out.print(\"5 \");\n" +
		"               dispatcher += \"\u0000\u0000\";\n" +
		"				break;\n" +
		"			default:\n" +
		"				System.out.println(\"Default\");\n" +
		"				System.exit(0);\n" +
		"			case \"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\":\n" +
		"				System.out.print(\"8 \");\n" +
		"               dispatcher = \"\u0000\u0000\u0000\u0000\u0000\u0000\";\n" +
		"				break;\n" +
		"			case \"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\":\n" +
		"				System.out.print(\"7 \");\n" +
		"               dispatcher += \"\u0000\";\n" +
		"				break;\n" +
		"			case \"\u0000\u0000\u0000\u0000\u0000\u0000\":\n" +
		"				System.out.print(\"6 \");\n" +
		"               dispatcher = \"\u0000\u0000\u0000\u0000\";\n" +
		"				break;\n" +
		"			}\n" +
		"		}\n" +
		"	}\n" +
		"}\n",
	};
	if (this.complianceLevel < JDKLevelSupportingStringSwitch) {
		this.runNegativeTest(sourceFiles, errorMsg);
	} else {
		this.runConformTest(sourceFiles, "1 3 5 7 8 6 4 2 Default");
	}
}
public void testSwitchOnNull() {
	String errorMsg = 		
		"----------\n" + 
		"1. ERROR in testSwitchOnNull.java (at line 13)\n" + 
		"	switch (s) {\n" + 
		"	        ^\n" + 
		"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
		"----------\n" + 
		"2. ERROR in testSwitchOnNull.java (at line 23)\n" + 
		"	switch ((String) null) {\n" + 
		"	        ^^^^^^^^^^^^^\n" + 
		"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
		"----------\n" + 
		"3. ERROR in testSwitchOnNull.java (at line 33)\n" + 
		"	switch (someMethod()) {\n" + 
		"	        ^^^^^^^^^^^^\n" + 
		"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
		"----------\n" + 
		"4. ERROR in testSwitchOnNull.java (at line 40)\n" + 
		"	switch (nullString) {\n" + 
		"	        ^^^^^^^^^^\n" + 
		"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
		"----------\n" + 
		"5. ERROR in testSwitchOnNull.java (at line 47)\n" + 
		"	switch (someMethod()) {\n" + 
		"	        ^^^^^^^^^^^^\n" + 
		"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
		"----------\n";
	
	String [] sourceFiles = 
		new String[] {
		"testSwitchOnNull.java",
		"public class testSwitchOnNull {\n" +
		"\n" +
		"    private static String someMethod() {\n" +
		"        return null;\n" +
		"    }\n" +
		"\n" +
		"    static String nullString = null;\n" +
		"    public static void main(String [] args) {\n" +
		"\n" +
		"        String s = null;\n" +
		"\n" +
		"        try {\n" +
		"            switch (s) {\n" +
		"                default: \n" +
		"                    System.out.println(\"OOPS\");\n" +
		"	            break;\n" +
		"            }\n" +
		"            System.out.println(\"OOPS\");\n" +
		"        } catch (NullPointerException e) {\n" +
		"            System.out.print(\"NPE1\");\n" +
		"        }\n" +
		"        try {\n" +
		"            switch ((String) null) {\n" +
		"                default: \n" +
		"                    System.out.println(\"OOPS\");\n" +
		"	            break;\n" +
		"            }\n" +
		"            System.out.println(\"OOPS\");\n" +
		"        } catch (NullPointerException e) {\n" +
		"            System.out.print(\"NPE2\");\n" +
		"        }\n" +
		"        try {\n" +
		"            switch (someMethod()) {\n" +
		"            }\n" +
		"            System.out.println(\"OOPS\");\n" +
		"        } catch (NullPointerException e) {\n" +
		"            System.out.print(\"NPE3\");\n" +
		"        }\n" +
		"        try {\n" +
		"            switch (nullString) {\n" +
		"            }\n" +
		"            System.out.println(\"OOPS\");\n" +
		"        } catch (NullPointerException e) {\n" +
		"            System.out.print(\"NPE4\");\n" +
		"        }\n" +
		"        try {\n" +
		"            switch (someMethod()) {\n" +
		"                default: \n" +
		"                    System.out.println(\"OOPS\");\n" +
		"	            break;\n" +
		"            }\n" +
		"            System.out.println(\"OOPS\");\n" +
		"        } catch (NullPointerException e) {\n" +
		"            System.out.print(\"NPE5\");\n" +
		"        }\n" +
		"    }\n" +
		"}\n",
	};
	if (this.complianceLevel < JDKLevelSupportingStringSwitch) {
		this.runNegativeTest(sourceFiles, errorMsg);
	} else {
		this.runConformTest(sourceFiles, "NPE1NPE2NPE3NPE4NPE5");
	}
}
public void testSideEffect() {
	String errorMsg = 		
		"----------\n" + 
		"1. ERROR in testSideEffect.java (at line 11)\n" + 
		"	switch(dispatcher()) {\n" + 
		"	       ^^^^^^^^^^^^\n" + 
		"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
		"----------\n";
	
	String [] sourceFiles = 
		new String[] {
		"testSideEffect.java",
		"public class testSideEffect {\n" +
		"    static boolean firstTime = true;\n" +
		"	private static String dispatcher() {\n" +
		"    	if (!firstTime) {\n" +
		"		System.out.print(\"OOPS\");\n" +
		"    	}\n" +
		"    	firstTime = false;\n" +
		"    	return \"\u0000\";\n" +
		"    }\n" +
		"    public static void main(String [] args) {\n" +
		"    		switch(dispatcher()) {\n" +
		"    		case \"\u0000\u0000\": break;\n" +
		"    		case \"\u0000\u0000\u0000\":	break;\n" +
		"    		case \"\u0000\u0000\u0000\u0000\": break;\n" +
		"    		case \"\u0000\u0000\u0000\u0000\u0000\": break;\n" +
		"    		default: System.out.println(\"DONE\");\n" +
		"    		}\n" +
		"    }\n" +
		"}\n",
	};
	if (this.complianceLevel < JDKLevelSupportingStringSwitch) {
		this.runNegativeTest(sourceFiles, errorMsg);
	} else {
		this.runConformTest(sourceFiles, "DONE");
	}
}
public void testFallThrough() {
	String errorMsg = 		
		"----------\n" + 
		"1. ERROR in testFallThrough.java (at line 11)\n" + 
		"	switch(s = dispatcher()) {\n" + 
		"	       ^^^^^^^^^^^^^^^^\n" + 
		"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
		"----------\n";
	
	String [] sourceFiles = 
		new String[] {
		"testFallThrough.java",
		"public class testFallThrough {\n" +
		"    static int index = -1;\n" +
		"    static String string = \"0123456789*\";\n" +
		"    private static String dispatcher() {\n" +
		"    	index++;\n" +
		"     	return string.substring(index,index + 1);\n" +
		"    }\n" +
		"    public static void main(String [] args) {\n" +
		"    	while (true) {\n" +
		"    		String s = null;\n" +
		"    		switch(s = dispatcher()) {\n" +
		"    		case \"2\":\n" +
		"    		case \"0\":\n" +
		"    		case \"4\":\n" +
		"    		case \"8\":\n" +
		"    		case \"6\":\n" +
		"    				System.out.print(s + \"(even) \");\n" +
		"    				break;\n" +
		"    		case \"1\":\n" +
		"    		case \"3\":\n" +
		"    		case \"9\":\n" +
		"    		case \"5\":\n" +
		"    		case \"7\":\n" +
		"    				System.out.print(s + \"(odd) \");\n" +
		"    				break;\n" +
		"    		default: System.out.print(\"DONE\");\n" +
		"    				System.exit(0);\n" +
		"    		}\n" +
		"    	}\n" +
		"    }\n" +
		"}\n",
	};
	if (this.complianceLevel < JDKLevelSupportingStringSwitch) {
		this.runNegativeTest(sourceFiles, errorMsg);
	} else {
		this.runConformTest(sourceFiles, "0(even) 1(odd) 2(even) 3(odd) 4(even) 5(odd) 6(even) 7(odd) 8(even) 9(odd) DONE");
	}
}
public void testFallThrough2() {
	String errorMsg = 		
		"----------\n" + 
		"1. ERROR in testFallThrough.java (at line 11)\n" + 
		"	switch(s = dispatcher()) {\n" + 
		"	       ^^^^^^^^^^^^^^^^\n" + 
		"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
		"----------\n";
	
	String [] sourceFiles = 
		new String[] {
		"testFallThrough.java",
		"public class testFallThrough {\n" +
		"    static int index = -1;\n" +
		"    static String string = \"0123456789*\";\n" +
		"    private static String dispatcher() {\n" +
		"    	index++;\n" +
		"     	return string.substring(index,index + 1);\n" +
		"    }\n" +
		"    public static void main(String [] args) {\n" +
		"    	while (true) {\n" +
		"    		String s = null;\n" +
		"    		switch(s = dispatcher()) {\n" +
		"    		case \"4\": System.out.print(s);\n" +
		"    		case \"3\": System.out.print(s);\n" +
		"    		case \"2\": System.out.print(s);\n" +
		"    		case \"1\": System.out.print(s + \" \");\n" +
		"    		case \"0\": break;\n" +
		"    		default: System.out.print(\"DONE\");\n" +
		"    				System.exit(0);\n" +
		"    		}\n" +
		"    	}\n" +
		"    }\n" +
		"}\n",
	};
	if (this.complianceLevel < JDKLevelSupportingStringSwitch) {
		this.runNegativeTest(sourceFiles, errorMsg);
	} else {
		this.runConformTest(sourceFiles, "1 22 333 4444 DONE");
	}
}
public void testMarysLamb() {
	if (this.complianceLevel < ClassFileConstants.JDK1_5) {
		return;
	}
		
	String errorMsg = 		
		"----------\n" + 
		"1. ERROR in testMarysLamb.java (at line 4)\n" + 
		"	switch(s) {\n" + 
		"	       ^\n" + 
		"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
		"----------\n";
	
	String [] sourceFiles = 
		new String[] {
		"testMarysLamb.java",
		"public class testMarysLamb {\n" +
		"    public static void main(String [] args) {\n" +
		"    	for (String s : new String [] { \"Mary\", \"Had\", \"A\", \"Little\", \"Lamb\" }) {\n" +
		"    		switch(s) {\n" +
		"    			default: System.out.print(s + \" \");\n" +
		"    		}\n" +
		"    	}\n" +
		"    }\n" +
		"}\n",
	};
	if (this.complianceLevel < JDKLevelSupportingStringSwitch) {
		this.runNegativeTest(sourceFiles, errorMsg);
	} else {
		this.runConformTest(sourceFiles, "Mary Had A Little Lamb");
	}
}
public void testBreakOut() {	
	String errorMsg = 		
		"----------\n" + 
		"1. ERROR in testBreakOut.java (at line 5)\n" + 
		"	switch(s) {\n" + 
		"	       ^\n" + 
		"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
		"----------\n";
	
	String [] sourceFiles = 
		new String[] {
		"testBreakOut.java",
		"public class testBreakOut {\n" +
		"    public static void main(String [] args) {\n" +
		"    	junk: while (true) {\n" +
		"    		String s = \"\";\n" +
		"    		switch(s) {\n" +
		"    		case \"7\":\n" +
		"    				System.out.print(s + \"(odd) \");\n" +
		"    				break;\n" +
		"    		default: System.out.print(\"DONE\");\n" +
		"    				System.exit(0);\n" +
		"    				 break junk;\n" +
		"    		}\n" +
		"    	}\n" +
		"   	System.out.println(\"Broken\");\n" +
		"    }\n" +
		"}\n",
	};
	if (this.complianceLevel < JDKLevelSupportingStringSwitch) {
		this.runNegativeTest(sourceFiles, errorMsg);
	} else {
		this.runConformTest(sourceFiles, "DONE");
	}
}
public void testMultipleSwitches() {
	if (this.complianceLevel < ClassFileConstants.JDK1_5) {
		return;
	}
	String errorMsg = 		
		"----------\n" + 
		"1. ERROR in X.java (at line 6)\n" + 
		"	switch (s) {\n" + 
		"	        ^\n" + 
		"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 35)\n" + 
		"	switch (s) {\n" + 
		"	        ^\n" + 
		"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
		"----------\n" + 
		"3. ERROR in X.java (at line 51)\n" + 
		"	switch (s) {\n" + 
		"	        ^\n" + 
		"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
		"----------\n";
	
	String [] sourceFiles = 
		new String[] {
		"X.java",
		"public class X {\n" +
		"\n" +
		"	public static void main(String[] args) {\n" +
		"		\n" +
		"		for (String s: new String [] { \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"DONE\"}) {\n" +
		"			switch (s) {\n" +
		"			case \"Sunday\" : \n" +
		"				System.out.print(\"Sunday\");\n" +
		"				break;\n" +
		"			case \"Monday\" :\n" +
		"				System.out.print(\"Monday\");\n" +
		"				break;\n" +
		"			case \"Tuesday\" :\n" +
		"				System.out.print(\"Tuesday\");\n" +
		"				break;\n" +
		"			case \"Wednesday\":\n" +
		"				System.out.print(\"Wednesday\");\n" +
		"				break;\n" +
		"			case \"Thursday\":\n" +
		"				System.out.print(\"Thursday\");\n" +
		"				break;\n" +
		"			case \"Friday\":\n" +
		"				System.out.print(\"Friday\");\n" +
		"				break;\n" +
		"			case \"Saturday\":\n" +
		"				System.out.print(\"Saturday\");\n" +
		"				break;\n" +
		"			default:\n" +
		"				System.out.print(\" ---- \");\n" +
		"				break;\n" +
		"			}\n" +
		"		}\n" +
		"	  \n" +
		"		for (String s: new String [] { \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"DONE\"}) {\n" +
		"			switch (s) {\n" +
		"			case \"Sunday\" : \n" +
		"			case \"Monday\" :\n" +
		"			case \"Tuesday\" :\n" +
		"			case \"Wednesday\":\n" +
		"			case \"Thursday\":\n" +
		"			case \"Friday\":\n" +
		"			case \"Saturday\":\n" +
		"				System.out.print(s);\n" +
		"				break;\n" +
		"			default:\n" +
		"				System.out.print(\" ---- \");\n" +
		"				break;\n" +
		"			}	\n" +
		"		}\n" +
		"		for (String s: new String [] { \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"DONE\"}) {\n" +
		"			switch (s) {\n" +
		"			case \"Saturday\":\n" +
		"			case \"Sunday\" : \n" +
		"				System.out.print(\"Holiday\");\n" +
		"				break;\n" +
		"			case \"Monday\" :\n" +
		"			case \"Tuesday\" :\n" +
		"			case \"Wednesday\":\n" +
		"			case \"Thursday\":\n" +
		"			case \"Friday\":\n" +
		"				System.out.print(\"Workday\");\n" +
		"				break;\n" +
		"			default:\n" +
		"				System.out.print(\" DONE\");\n" +
		"				break;\n" +
		"			}\n" +
		"		}\n" +
		"	}\n" +
		"\n" +
		"}\n",
	};
	if (this.complianceLevel < JDKLevelSupportingStringSwitch) {
		this.runNegativeTest(sourceFiles, errorMsg);
	} else {
		this.runConformTest(sourceFiles, "SundayMondayTuesdayWednesdayThursdayFridaySaturday ---- SundayMondayTuesdayWednesdayThursdayFridaySaturday ---- HolidayWorkdayWorkdayWorkdayWorkdayWorkdayHoliday DONE");
	}
}
public void testNestedSwitches() {
	if (this.complianceLevel < ClassFileConstants.JDK1_5) {
		return;
	}
	String errorMsg = 		
		"----------\n" + 
		"1. ERROR in X.java (at line 4)\n" + 
		"	switch (s) {\n" + 
		"	        ^\n" + 
		"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 7)\n" + 
		"	switch (s) {\n" + 
		"	        ^\n" + 
		"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
		"----------\n" + 
		"3. ERROR in X.java (at line 18)\n" + 
		"	switch (s) {\n" + 
		"	        ^\n" + 
		"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
		"----------\n";
	
	String [] sourceFiles = 
		new String[] {
		"X.java",
		"public class X {\n" +
		"	public static void main(String[] args) {\n" +
		"		for (String s: new String [] { \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"DONE\"}) {\n" +
		"			switch (s) {\n" +
		"			case \"Saturday\":\n" +
		"			case \"Sunday\" : \n" +
		"				switch (s) {\n" +
		"					case \"Saturday\" : System.out.println (\"Saturday is a holiday\"); break;\n" +
		"					case \"Sunday\"  :  System.out.println (\"Sunday is a holiday\"); break;\n" +
		"					default:          System.out.println(\"Broken\");\n" +
		"				}\n" +
		"				break;\n" +
		"			case \"Monday\" :\n" +
		"			case \"Tuesday\" :\n" +
		"			case \"Wednesday\":\n" +
		"			case \"Thursday\":\n" +
		"			case \"Friday\":\n" +
		"				switch (s) {\n" +
		"					case \"Monday\" :  System.out.println (\"Monday is a workday\"); break;\n" +
		"					case \"Tuesday\" : System.out.println (\"Tuesday is a workday\"); break;\n" +
		"					case \"Wednesday\": System.out.println (\"Wednesday is a workday\"); break;\n" +
		"					case \"Thursday\": System.out.println (\"Thursday is a workday\"); break;\n" +
		"					case \"Friday\":System.out.println (\"Friday is a workday\"); break;\n" +
		"					default: System.out.println(\"Broken\");\n" +
		"				}\n" +
		"				break;\n" +
		"			default:\n" +
		"				System.out.println(\"DONE\");\n" +
		"				break;\n" +
		"			}\n" +
		"		}\n" +
		"	}\n" +
		"}\n",
	};
	if (this.complianceLevel < JDKLevelSupportingStringSwitch) {
		this.runNegativeTest(sourceFiles, errorMsg);
	} else {
		this.runConformTest(sourceFiles, "Sunday is a holiday\n" +
										 "Monday is a workday\n" +
										 "Tuesday is a workday\n" +
										 "Wednesday is a workday\n" +
										 "Thursday is a workday\n" +
										 "Friday is a workday\n" +
										 "Saturday is a holiday\n" +
										 "DONE");
	}
}
public void testFor356002() {
	String errorMsg = 		
			"----------\n" + 
			"1. ERROR in X.java (at line 6)\n" + 
			"	switch (foo()) {\n" + 
			"	        ^^^^^\n" + 
			"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
			"----------\n";
	
	String [] sourceFiles = 
		new String[] {
		"X.java",
		"public class X {\n" + 
		"	private static String foo() {\n" + 
		"		return \"\";\n" + 
		"	}\n" + 
		"	public static void main(String[] args) {\n" + 
		"		switch (foo()) {\n" + 
		"			default: {\n" + 
		"				int j = 0;\n" + 
		"				if (j <= 0)\n" + 
		"					System.out.println(\"DONE\");\n" +
		"			}\n" + 
		"			return;\n" + 
		"		}\n" + 
		"	}\n" + 
		"}",
	};
	if (this.complianceLevel < JDKLevelSupportingStringSwitch) {
		this.runNegativeTest(sourceFiles, errorMsg);
	} else {
		this.runConformTest(sourceFiles, "DONE");
	}
}
public void testFor356002_2() {
	String errorMsg = 		
			"----------\n" + 
			"1. ERROR in X.java (at line 3)\n" + 
			"	switch (\"\") {\n" + 
			"	        ^^\n" + 
			"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
			"----------\n";
	
	String [] sourceFiles = 
		new String[] {
		"X.java",
		"public class X {\n" + 
		"	public static void main(String[] args) {\n" + 
		"		switch (\"\") {\n" + 
		"			default: {\n" + 
		"				int j = 0;\n" + 
		"				if (j <= 0)\n" + 
		"					System.out.println(\"DONE\");\n" +
		"			}\n" + 
		"			return;\n" + 
		"		}\n" + 
		"	}\n" + 
		"}",
	};
	if (this.complianceLevel < JDKLevelSupportingStringSwitch) {
		this.runNegativeTest(sourceFiles, errorMsg);
	} else {
		this.runConformTest(sourceFiles, "DONE");
	}
}
public void testFor356002_3() {
	String errorMsg =
			"----------\n" + 
			"1. ERROR in X.java (at line 7)\n" + 
			"	switch (foo()) {\n" + 
			"	        ^^^^^\n" + 
			"Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted\n" + 
			"----------\n";
	
	String [] sourceFiles =
		new String[] {
		"X.java",
		"public class X {\n" + 
		"	private static String foo() {\n" + 
		"		return null;\n" + 
		"	}\n" + 
		"	public static void main(String[] args) {\n" +
		"		try {\n" +
		"			switch (foo()) {\n" + 
		"				default: {\n" + 
		"					int j = 0;\n" + 
		"					if (j <= 0)\n" + 
		"						;\n" +
		"				}\n" + 
		"				return;\n" + 
		"			}\n" + 
		"		} catch(NullPointerException e) {\n" +
		"			System.out.println(\"DONE\");\n" +
		"		}\n" +
		"	}\n" + 
		"}",
	};
	if (this.complianceLevel < JDKLevelSupportingStringSwitch) {
		this.runNegativeTest(sourceFiles, errorMsg);
	} else {
		this.runConformTest(sourceFiles, "DONE");
	}
}
public void testBug374605() {
	Map options = getCompilerOptions();
	options.put(JavaCore.COMPILER_PB_SWITCH_MISSING_DEFAULT_CASE, JavaCore.WARNING);
	this.runNegativeTest(
			new String[] {
				"p/X.java",
				"package p;\n" +
				"class X {\n" +
				"  void v(int i) {\n" +
				"    switch (i) {\n" +
				"      case 1 :\n" +
				"        break;\n" +
				"      case 2 :\n" +
				"        break;\n" +
				"    }\n" +
				"  }\n" +
				"}",
			},
			"----------\n" +
			"1. WARNING in p\\X.java (at line 4)\n" +
			"	switch (i) {\n" +
			"	        ^\n" +
			"The switch over the type int should have a default case\n" +
			"----------\n",
			null,
			true,
			options
		);	
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=380927
public void testBug380927() {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public final static Object f() {\n" +
				"        final Object a = null;\n" +
				"        Object b;\n" +
				"        label: do {\n" +
				"            switch (0) {\n" +
				"            case 1: {\n" +
				"                b = a;\n" +
				"            }\n" +
				"                break;\n" +
				"            default:\n" +
				"                break label;\n" +
				"            }\n" +
				"        } while (true);\n" +
				"        return a;\n" +
				"    }\n" +
				"    public static void main(final String[] args) {\n" +
				"        f();\n" +
				"        System.out.println(\"Success\");\n" +
				"    }\n" +
				"}\n",
			},
			"Success");	
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=380927
public void testBug380927a() {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public final static Object f() {\n" +
				"        final Object a = null;\n" +
				"        Object b;\n" +
				"        label: while (true) {\n" +
				"            switch (0) {\n" +
				"            case 1: {\n" +
				"                b = a;\n" +
				"            }\n" +
				"                break;\n" +
				"            default:\n" +
				"                break label;\n" +
				"            }\n" +
				"        }\n" +
				"        return a;\n" +
				"    }\n" +
				"    public static void main(final String[] args) {\n" +
				"        f();\n" +
				"        System.out.println(\"Success\");\n" +
				"    }\n" +
				"}\n",
			},
			"Success");	
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=380927
public void testBug380927b() {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public final static Object f() {\n" +
				"        final Object a = null;\n" +
				"        Object b;\n" +
				"        label: for(;;) {\n" +
				"            switch (0) {\n" +
				"            case 1: {\n" +
				"                b = a;\n" +
				"            }\n" +
				"                break;\n" +
				"            default:\n" +
				"                break label;\n" +
				"            }\n" +
				"        }\n" +
				"        return a;\n" +
				"    }\n" +
				"    public static void main(final String[] args) {\n" +
				"        f();\n" +
				"        System.out.println(\"Success\");\n" +
				"    }\n" +
				"}\n",
			},
			"Success");	
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=380927
public void testBug380927c() {
	if (this.complianceLevel < ClassFileConstants.JDK1_5)
		return;
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public final static Object f() {\n" +
				"        final Object a = null;\n" +
				"        Object b;\n" +
				"        label: for(int i : new int [] { 10 }) {\n" +
				"            switch (0) {\n" +
				"            case 1: {\n" +
				"                b = a;\n" +
				"            }\n" +
				"                break;\n" +
				"            default:\n" +
				"                break label;\n" +
				"            }\n" +
				"        }\n" +
				"        return a;\n" +
				"    }\n" +
				"    public static void main(final String[] args) {\n" +
				"        f();\n" +
				"        System.out.println(\"Success\");\n" +
				"    }\n" +
				"}\n",
			},
			"Success");	
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=380927
public void testBug380927d() {
	this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public static void main(String [] args) {\n" +
				"        Object b;\n" +
				"        label: do {\n" +
				"            switch (0) {\n" +
				"            case 1:\n" +
				"                b = null;\n" +
				"                break;\n" +
				"            default:\n" +
				"                break label;\n" +
				"            }\n" +
				"        } while (true);\n" +
				"        System.out.println(b);\n" +
				"    }\n" +
				"}\n",
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 13)\n" + 
			"	System.out.println(b);\n" + 
			"	                   ^\n" + 
			"The local variable b may not have been initialized\n" + 
			"----------\n");	
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=380927
public void testBug380927e() {
	this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public static void main(String [] args) {\n" +
				"        Object b;\n" +
				"        label: while (true) {\n" +
				"            switch (0) {\n" +
				"            case 1:\n" +
				"                b = null;\n" +
				"                break;\n" +
				"            default:\n" +
				"                break label;\n" +
				"            }\n" +
				"        }\n" +
				"        System.out.println(b);\n" +
				"    }\n" +
				"}\n",
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 13)\n" + 
			"	System.out.println(b);\n" + 
			"	                   ^\n" + 
			"The local variable b may not have been initialized\n" + 
			"----------\n");	
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=380927
public void testBug380927f() {
	this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public static void main(String [] args) {\n" +
				"        Object b;\n" +
				"        label: for(;;) {\n" +
				"            switch (0) {\n" +
				"            case 1:\n" +
				"                b = null;\n" +
				"                break;\n" +
				"            default:\n" +
				"                break label;\n" +
				"            }\n" +
				"        }\n" +
				"        System.out.println(b);\n" +
				"    }\n" +
				"}\n",
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 13)\n" + 
			"	System.out.println(b);\n" + 
			"	                   ^\n" + 
			"The local variable b may not have been initialized\n" + 
			"----------\n");	
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=380927
public void testBug380927g() {
	if (this.complianceLevel < ClassFileConstants.JDK1_5)
		return;
	this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public static void main(String [] args) {\n" +
				"        Object b;\n" +
				"        label: for(int i : new int [] { 10 }) {\n" +
				"            switch (0) {\n" +
				"            case 1:\n" +
				"                b = null;\n" +
				"                break;\n" +
				"            default:\n" +
				"                break label;\n" +
				"            }\n" +
				"        }\n" +
				"        System.out.println(b);\n" +
				"    }\n" +
				"}\n",
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 13)\n" + 
			"	System.out.println(b);\n" + 
			"	                   ^\n" + 
			"The local variable b may not have been initialized\n" + 
			"----------\n");	
}
public static Class testClass() {
	return SwitchTest.class;
}
}

