From 231d5a6fdd14db93be643760396d641b0397ea91 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Thu, 6 Sep 2018 17:58:30 +0700 Subject: [PATCH] LightTestMigration: support of multi-test files --- .../testFramework/InspectionTestCase.java | 2 +- .../testFramework/LightTestMigration.java | 42 ++++++++++++------- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/java/testFramework/src/com/intellij/testFramework/InspectionTestCase.java b/java/testFramework/src/com/intellij/testFramework/InspectionTestCase.java index 148b9fd8f136..735f27117bb5 100644 --- a/java/testFramework/src/com/intellij/testFramework/InspectionTestCase.java +++ b/java/testFramework/src/com/intellij/testFramework/InspectionTestCase.java @@ -126,7 +126,7 @@ public abstract class InspectionTestCase extends PsiTestCase { InspectionTestUtil.compareToolResults(context, checkRange, testDir, ContainerUtil.append(Collections.singletonList(toolWrapper), additional)); if (MIGRATE_TEST) { - myMigration = new LightTestMigration(getClass(), testDir, tools, getTestProjectSdk()); + myMigration = new LightTestMigration(getTestName(false), getClass(), testDir, tools, getTestProjectSdk()); } } diff --git a/java/testFramework/src/com/intellij/testFramework/LightTestMigration.java b/java/testFramework/src/com/intellij/testFramework/LightTestMigration.java index 94c2c15869fa..72c0ce8f0165 100644 --- a/java/testFramework/src/com/intellij/testFramework/LightTestMigration.java +++ b/java/testFramework/src/com/intellij/testFramework/LightTestMigration.java @@ -29,6 +29,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.text.MessageFormat; import java.time.Year; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; @@ -39,21 +40,27 @@ import java.util.stream.Collectors; */ @SuppressWarnings("UseOfSystemOutOrSystemErr") class LightTestMigration { + private final String myName; private final Class myTestClass; private final Path myDir; private final List> myTools; private final Sdk mySdk; + private static final List ourTestNames = new ArrayList<>(); private static final Map JDK_MAP = EntryStream.of( "java 1.7", "JAVA_1_7", "java 1.8", "JAVA_8", "java 9", "JAVA_9" ).toMap(); + private Path myBaseDir; + private Path myBasePath; - LightTestMigration(Class testClass, + LightTestMigration(String name, + Class testClass, String dir, List> tools, Sdk sdk) { + myName = name; myTestClass = testClass; myDir = Paths.get(dir); myTools = tools; @@ -61,9 +68,12 @@ class LightTestMigration { } void tryMigrate() throws Exception { + myBasePath = Paths.get(JavaTestUtil.getJavaTestDataPath()); Path javaFile = getSoleJavaFile(myDir); String fileText = new String(Files.readAllBytes(javaFile), StandardCharsets.UTF_8); - Path targetFile = myDir.resolve(javaFile.getFileName()); + String testName = myName.isEmpty() ? javaFile.getFileName().toString().replaceFirst(".java$", "") : myName; + myBaseDir = myName.isEmpty() ? myDir : myDir.getParent(); + Path targetFile = myBaseDir.resolve(testName + ".java"); IdeaTestFixtureFactory factory = IdeaTestFixtureFactory.getFixtureFactory(); LightProjectDescriptor descriptor = new LightProjectDescriptor() { @Nullable @@ -92,36 +102,38 @@ class LightTestMigration { Files.createDirectories(myDir); Files.write(targetFile, expectedText.getBytes(StandardCharsets.UTF_8)); System.out.println("Written: " + targetFile); - generateClassTemplate(javaFile); + if (ourTestNames.isEmpty()) { + Runtime.getRuntime().addShutdownHook(new Thread(this::generateClassTemplate)); + } + ourTestNames.add(testName); javaFixture.tearDown(); } - private void generateClassTemplate(Path javaFile) { + private void generateClassTemplate() { String pathSpec; - Path basePath = Paths.get(JavaTestUtil.getJavaTestDataPath()); Set> importedClasses = StreamEx.of(myTools.stream().>map(wrapper -> wrapper.getTool().getClass())) .append(LightCodeInsightFixtureTestCase.class, LightProjectDescriptor.class, NotNull.class) .toSet(); - if (myDir.startsWith(basePath)) { - Path relativePath = basePath.relativize(myDir); + if (myBaseDir.startsWith(myBasePath)) { + Path relativePath = myBasePath.relativize(myBaseDir); importedClasses.add(JavaTestUtil.class); pathSpec = "JavaTestUtil.getRelativeJavaTestDataPath() + \"/" + StringUtil.escapeStringCharacters(relativePath.toString().replace('\\', '/')) + '"'; } else { - basePath = Paths.get(PathManagerEx.getCommunityHomePath()); - if (myDir.startsWith(basePath)) { - Path relativePath = basePath.relativize(myDir); + Path basePath = Paths.get(PathManagerEx.getCommunityHomePath()); + if (myBaseDir.startsWith(basePath)) { + Path relativePath = basePath.relativize(myBaseDir); pathSpec = "\"/" + StringUtil.escapeStringCharacters(relativePath.toString().replace('\\', '/')) + '"'; } else { - pathSpec = '"' + StringUtil.escapeStringCharacters(myDir.toString()) + '"'; + pathSpec = "\"!!! Unable to convert path!!! " + StringUtil.escapeStringCharacters(myBaseDir.toString()) + '"'; } } String imports = generateImports(importedClasses); - String testMethodName = "test" + javaFile.getFileName().toString().replaceFirst(".java$", ""); + String testMethods = ourTestNames.stream().map(name -> " public void test"+name+"() {\n doTest();\n }\n\n").collect(Collectors.joining()); String inspections = myTools.stream().map(InspectionToolWrapper::getTool).map(InspectionProfileEntry::getClass).map(Class::getSimpleName) .map(name -> "new " + name + "()").collect(Collectors.joining(", ")); @@ -150,11 +162,9 @@ class LightTestMigration { " myFixture.testHighlighting(getTestName(false) + \".java\");\n" + " '}'\n" + "\n" + - " public void {5}() '{'\n" + - " doTest();\n" + - " '}'\n" + + "{5}" + "'}'\n", - myTestClass.getPackage().getName(), imports, myTestClass.getSimpleName(), pathSpec, inspections, testMethodName, guessedJdk, year); + myTestClass.getPackage().getName(), imports, myTestClass.getSimpleName(), pathSpec, inspections, testMethods, guessedJdk, year); System.out.println("Class template: (" + myTestClass.getSimpleName() + ".java)"); System.out.println("=============================="); System.out.println(classTemplate);