blob: ce758c9b79ae513eb82a55208032bd493c99d589 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2019, 2020 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.ui.tests.quickfix;
import java.util.ArrayList;
import org.junit.After;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.eclipse.jdt.testplugin.JavaProjectHelper;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.ui.tests.core.rules.Java14ProjectTestSetup;
import org.eclipse.jdt.ui.tests.core.rules.ProjectTestSetup;
import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
import org.eclipse.jdt.ui.text.java.correction.CUCorrectionProposal;
@RunWith(JUnit4.class)
public class QuickFixTest14 extends QuickFixTest {
@Rule
public ProjectTestSetup projectSetup = new Java14ProjectTestSetup(true);
private IJavaProject fJProject1;
private IPackageFragmentRoot fSourceFolder;
private static String MODULE_INFO_FILE_CONTENT = ""
+ "module test {\n"
+ "}\n";
@After
public void tearDown() throws Exception {
if (fJProject1 != null) {
JavaProjectHelper.delete(fJProject1);
}
}
@Test
public void testAddDefaultCaseSwitchStatement1() throws Exception {
fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
fJProject1.setRawClasspath(projectSetup.getDefaultClasspath(), null);
JavaProjectHelper.set14CompilerOptions(fJProject1, false);
fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment def= fSourceFolder.createPackageFragment("", false, null);
def.createCompilationUnit("module-info.java", MODULE_INFO_FILE_CONTENT, false, null);
IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
String test= ""
+ "package test;\n"
+ "public class Cls {\n"
+ " public static void foo(Day day) {\n"
+ " switch (day) {\n"
+ " case SATURDAY, SUNDAY -> System.out.println(\"Weekend\");\n"
+ " case MONDAY, TUESDAY, WEDNESDAY -> System.out.println(\"Weekday\");\n"
+ " }\n"
+ " }\n"
+ "}\n"
+ "\n"
+ "enum Day {\n"
+ " MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;\n"
+ "}\n";
ICompilationUnit cu= pack.createCompilationUnit("Cls.java", test, false, null);
CompilationUnit astRoot= getASTRoot(cu);
ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot, 2);
assertNumberOfProposals(proposals, 4);
assertCorrectLabels(proposals);
CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(1);
String preview= getPreviewContent(proposal);
String expected= ""
+ "package test;\n"
+ "public class Cls {\n"
+ " public static void foo(Day day) {\n"
+ " switch (day) {\n"
+ " case SATURDAY, SUNDAY -> System.out.println(\"Weekend\");\n"
+ " case MONDAY, TUESDAY, WEDNESDAY -> System.out.println(\"Weekday\");\n"
+ " default -> throw new IllegalArgumentException(\"Unexpected value: \" + day);\n"
+ " }\n"
+ " }\n"
+ "}\n"
+ "\n"
+ "enum Day {\n"
+ " MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;\n"
+ "}\n";
assertEqualStringsIgnoreOrder(new String[] { preview }, new String[] { expected });
}
@Test
public void testAddDefaultCaseSwitchStatement2() throws Exception {
fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
fJProject1.setRawClasspath(projectSetup.getDefaultClasspath(), null);
JavaProjectHelper.set14CompilerOptions(fJProject1, false);
fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment def= fSourceFolder.createPackageFragment("", false, null);
def.createCompilationUnit("module-info.java", MODULE_INFO_FILE_CONTENT, false, null);
IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
String test= ""
+ "package test;\n"
+ "public class Cls {\n"
+ " public static void foo(Day day) {\n"
+ " switch (day) {\n"
+ " case SATURDAY, SUNDAY: System.out.println(\"Weekend\");\n"
+ " case MONDAY, TUESDAY, WEDNESDAY: System.out.println(\"Weekday\");\n"
+ " }\n"
+ " }\n"
+ "}\n"
+ "\n"
+ "enum Day {\n"
+ " MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;\n"
+ "}\n";
ICompilationUnit cu= pack.createCompilationUnit("Cls.java", test, false, null);
CompilationUnit astRoot= getASTRoot(cu);
ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot, 2);
assertNumberOfProposals(proposals, 4);
assertCorrectLabels(proposals);
CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(1);
String preview= getPreviewContent(proposal);
String expected= ""
+ "package test;\n"
+ "public class Cls {\n"
+ " public static void foo(Day day) {\n"
+ " switch (day) {\n"
+ " case SATURDAY, SUNDAY: System.out.println(\"Weekend\");\n"
+ " case MONDAY, TUESDAY, WEDNESDAY: System.out.println(\"Weekday\");\n"
+ " default :\n"
+ " break;\n"
+ " }\n"
+ " }\n"
+ "}\n"
+ "\n"
+ "enum Day {\n"
+ " MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;\n"
+ "}\n";
assertEqualStringsIgnoreOrder(new String[] { preview }, new String[] { expected });
}
@Test
public void testAddDefaultCaseSwitchStatement3() throws Exception {
fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
fJProject1.setRawClasspath(projectSetup.getDefaultClasspath(), null);
JavaProjectHelper.set14CompilerOptions(fJProject1, false);
fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment def= fSourceFolder.createPackageFragment("", false, null);
def.createCompilationUnit("module-info.java", MODULE_INFO_FILE_CONTENT, false, null);
IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
String test= ""
+ "package test;\n"
+ "public class Cls {\n"
+ " public static void foo(Day day) {\n"
+ " switch (day) {\n"
+ " }\n"
+ " }\n"
+ "}\n"
+ "\n"
+ "enum Day {\n"
+ " MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;\n"
+ "}\n";
ICompilationUnit cu= pack.createCompilationUnit("Cls.java", test, false, null);
CompilationUnit astRoot= getASTRoot(cu);
ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot, 7);
assertNumberOfProposals(proposals, 4);
assertCorrectLabels(proposals);
CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(1);
String preview= getPreviewContent(proposal);
String expected= ""
+ "package test;\n"
+ "public class Cls {\n"
+ " public static void foo(Day day) {\n"
+ " switch (day) {\n"
+ " default :\n"
+ " break;\n"
+ " }\n"
+ " }\n"
+ "}\n"
+ "\n"
+ "enum Day {\n"
+ " MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;\n"
+ "}\n";
assertEqualStringsIgnoreOrder(new String[] { preview }, new String[] { expected });
}
@Test
public void testAddMissingCaseSwitchStatement1() throws Exception {
fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
fJProject1.setRawClasspath(projectSetup.getDefaultClasspath(), null);
JavaProjectHelper.set14CompilerOptions(fJProject1, false);
fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment def= fSourceFolder.createPackageFragment("", false, null);
def.createCompilationUnit("module-info.java", MODULE_INFO_FILE_CONTENT, false, null);
IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
String test= ""
+ "package test;\n"
+ "public class Cls {\n"
+ " public void bar1(Day day) {\n"
+ " switch (day) {\n"
+ " case MONDAY, FRIDAY -> System.out.println(Day.SUNDAY);\n"
+ " case TUESDAY -> System.out.println(7);\n"
+ " case THURSDAY, SATURDAY -> System.out.println(8);\n"
+ " }\n"
+ " }\n"
+ "}\n"
+ "enum Day {\n"
+ " MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;\n"
+ "}\n";
ICompilationUnit cu= pack.createCompilationUnit("Cls.java", test, false, null);
CompilationUnit astRoot= getASTRoot(cu);
ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot, 2);
assertNumberOfProposals(proposals, 4);
assertCorrectLabels(proposals);
CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
String preview= getPreviewContent(proposal);
String expected= ""
+ "package test;\n"
+ "public class Cls {\n"
+ " public void bar1(Day day) {\n"
+ " switch (day) {\n"
+ " case MONDAY, FRIDAY -> System.out.println(Day.SUNDAY);\n"
+ " case TUESDAY -> System.out.println(7);\n"
+ " case THURSDAY, SATURDAY -> System.out.println(8);\n"
+ " case SUNDAY -> throw new UnsupportedOperationException(\"Unimplemented case: \" + day);\n"
+ " case WEDNESDAY -> throw new UnsupportedOperationException(\"Unimplemented case: \" + day);\n"
+ " default -> throw new IllegalArgumentException(\"Unexpected value: \" + day);\n"
+ " }\n"
+ " }\n"
+ "}\n"
+ "enum Day {\n"
+ " MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;\n"
+ "}\n";
assertEqualStringsIgnoreOrder(new String[] { preview }, new String[] { expected });
}
@Test
public void testAddDefaultCaseSwitchExpression1() throws Exception {
fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
fJProject1.setRawClasspath(projectSetup.getDefaultClasspath(), null);
JavaProjectHelper.set14CompilerOptions(fJProject1, false);
fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment def= fSourceFolder.createPackageFragment("", false, null);
def.createCompilationUnit("module-info.java", MODULE_INFO_FILE_CONTENT, false, null);
IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
String test= ""
+ "package test;\n"
+ "public class Cls {\n"
+ " public static void bar3(int input) {\n"
+ " int num = switch (input) {\n"
+ " case 60, 600 -> 6;\n"
+ " case 70 -> 7;\n"
+ " case 80 -> 8;\n"
+ " case 90, 900 -> {\n"
+ " yield 9;\n"
+ " }\n"
+ " };\n"
+ " }\n"
+ "}\n";
ICompilationUnit cu= pack.createCompilationUnit("Cls.java", test, false, null);
CompilationUnit astRoot= getASTRoot(cu);
ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot, 1);
assertNumberOfProposals(proposals, 1);
assertCorrectLabels(proposals);
CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
String preview= getPreviewContent(proposal);
String expected= ""
+ "package test;\n"
+ "public class Cls {\n"
+ " public static void bar3(int input) {\n"
+ " int num = switch (input) {\n"
+ " case 60, 600 -> 6;\n"
+ " case 70 -> 7;\n"
+ " case 80 -> 8;\n"
+ " case 90, 900 -> {\n"
+ " yield 9;\n"
+ " }\n"
+ " default -> throw new IllegalArgumentException(\"Unexpected value: \" + input);\n"
+ " };\n"
+ " }\n"
+ "}\n";
assertEqualStringsIgnoreOrder(new String[] { preview }, new String[] { expected });
}
@Test
public void testAddDefaultCaseSwitchExpression2() throws Exception {
fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
fJProject1.setRawClasspath(projectSetup.getDefaultClasspath(), null);
JavaProjectHelper.set14CompilerOptions(fJProject1, false);
fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment def= fSourceFolder.createPackageFragment("", false, null);
def.createCompilationUnit("module-info.java", MODULE_INFO_FILE_CONTENT, false, null);
IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
String test= ""
+ "package test;\n"
+ "public class Cls {\n"
+ " public static void bar4(int input) {\n"
+ " int num = switch (input) {\n"
+ " case 60, 600:\n"
+ " yield 6;\n"
+ " case 70:\n"
+ " yield 7;\n"
+ " case 80:\n"
+ " yield 8;\n"
+ " case 90, 900:\n"
+ " yield 9;\n"
+ " };\n"
+ " }\n"
+ "}\n";
ICompilationUnit cu= pack.createCompilationUnit("Cls.java", test, false, null);
CompilationUnit astRoot= getASTRoot(cu);
ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot, 1);
assertNumberOfProposals(proposals, 1);
assertCorrectLabels(proposals);
CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
String preview= getPreviewContent(proposal);
String expected= ""
+ "package test;\n"
+ "public class Cls {\n"
+ " public static void bar4(int input) {\n"
+ " int num = switch (input) {\n"
+ " case 60, 600:\n"
+ " yield 6;\n"
+ " case 70:\n"
+ " yield 7;\n"
+ " case 80:\n"
+ " yield 8;\n"
+ " case 90, 900:\n"
+ " yield 9;\n"
+ " default :\n"
+ " throw new IllegalArgumentException(\n"
+ " \"Unexpected value: \" + input);\n"
+ " };\n"
+ " }\n"
+ "}\n";
assertEqualStringsIgnoreOrder(new String[] { preview }, new String[] { expected });
}
@Test
public void testAddMissingCaseSwitchExpression() throws Exception {
fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
fJProject1.setRawClasspath(projectSetup.getDefaultClasspath(), null);
JavaProjectHelper.set14CompilerOptions(fJProject1, false);
fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment def= fSourceFolder.createPackageFragment("", false, null);
def.createCompilationUnit("module-info.java", MODULE_INFO_FILE_CONTENT, false, null);
IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
String test= ""
+ "package test;\n"
+ "public class Cls {\n"
+ " public void bar1(Day day) {\n"
+ " int len = switch (day) {\n"
+ " case MONDAY, FRIDAY:\n"
+ " yield 6;\n"
+ " case TUESDAY:\n"
+ " yield 7;\n"
+ " case THURSDAY, SATURDAY:\n"
+ " yield 8;\n"
+ " };\n"
+ " }\n"
+ "}\n"
+ "enum Day {\n"
+ " MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;\n"
+ "}\n";
ICompilationUnit cu= pack.createCompilationUnit("Cls.java", test, false, null);
CompilationUnit astRoot= getASTRoot(cu);
ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot, 2);
assertNumberOfProposals(proposals, 2);
assertCorrectLabels(proposals);
CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
String preview= getPreviewContent(proposal);
String expected= ""
+ "package test;\n"
+ "public class Cls {\n"
+ " public void bar1(Day day) {\n"
+ " int len = switch (day) {\n"
+ " case MONDAY, FRIDAY:\n"
+ " yield 6;\n"
+ " case TUESDAY:\n"
+ " yield 7;\n"
+ " case THURSDAY, SATURDAY:\n"
+ " yield 8;\n"
+ " case SUNDAY :\n"
+ " throw new UnsupportedOperationException(\n"
+ " \"Unimplemented case: \" + day);\n"
+ " case WEDNESDAY :\n"
+ " throw new UnsupportedOperationException(\n"
+ " \"Unimplemented case: \" + day);\n"
+ " default :\n"
+ " throw new IllegalArgumentException(\n"
+ " \"Unexpected value: \" + day);\n"
+ " };\n"
+ " }\n"
+ "}\n"
+ "enum Day {\n"
+ " MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;\n"
+ "}\n";
assertEqualStringsIgnoreOrder(new String[] { preview }, new String[] { expected });
}
@Test
public void testReplaceIncorrectReturnInSwitchExpressionWithYieldStatement() throws Exception {
fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
fJProject1.setRawClasspath(projectSetup.getDefaultClasspath(), null);
JavaProjectHelper.set14CompilerOptions(fJProject1, false);
fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
IPackageFragment def= fSourceFolder.createPackageFragment("", false, null);
def.createCompilationUnit("module-info.java", MODULE_INFO_FILE_CONTENT, false, null);
IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
String test= ""
+ "package test;\n"
+ "public class Cls {\n"
+ " public static int process(int i) {\n"
+ " var t = switch (i) {\n"
+ " case 0 -> {\n"
+ " return 99;\n"
+ " }\n"
+ " default ->100;\n"
+ " };\n"
+ " return t;\n"
+ " }\n\n"
+ " public static void main(String[] args) {\n"
+ " System.out.println(process(1));\n"
+ " System.out.println(process(0));\n"
+ " }\n"
+ "}";
ICompilationUnit cu= pack.createCompilationUnit("Cls.java", test, false, null);
CompilationUnit astRoot= getASTRoot(cu);
ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot);
assertNumberOfProposals(proposals, 1);
assertCorrectLabels(proposals);
CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
String preview= getPreviewContent(proposal);
String expected= ""
+ "package test;\n"
+ "public class Cls {\n"
+ " public static int process(int i) {\n"
+ " var t = switch (i) {\n"
+ " case 0 -> {\n"
+ " yield 99;\n"
+ " }\n"
+ " default ->100;\n"
+ " };\n"
+ " return t;\n"
+ " }\n\n"
+ " public static void main(String[] args) {\n"
+ " System.out.println(process(1));\n"
+ " System.out.println(process(0));\n"
+ " }\n"
+ "}";
assertEqualStringsIgnoreOrder(new String[] { preview }, new String[] { expected });
}
}