From 0192e16f39368382569ba753ec6094f1fcd9d898 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 5 Jul 2012 17:51:45 +0400 Subject: [PATCH] Target test frameworks (JUnit 3 and 4) supported separately --- .../ReadJavaBinaryClassTestGenerator.java | 3 +- .../jet/test/generator/TestGenerator.java | 206 ++++++++++++------ 2 files changed, 147 insertions(+), 62 deletions(-) diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/ReadJavaBinaryClassTestGenerator.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/ReadJavaBinaryClassTestGenerator.java index 1cc720c5b3b..a92c5d126a1 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/ReadJavaBinaryClassTestGenerator.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/ReadJavaBinaryClassTestGenerator.java @@ -40,7 +40,8 @@ public class ReadJavaBinaryClassTestGenerator { Arrays.asList( new TestDataSource(new File("compiler/testData/readJavaBinaryClass"), true, TestGenerator.filterFilesByExtension(extension), "doTest") ), - ReadJavaBinaryClassTestGenerator.class.getName() + ReadJavaBinaryClassTestGenerator.class.getName(), + TestGenerator.TargetTestFrameworks.JUNIT_3 ).generateAndSave(); } } diff --git a/compiler/tests/org/jetbrains/jet/test/generator/TestGenerator.java b/compiler/tests/org/jetbrains/jet/test/generator/TestGenerator.java index c1f0c6270f1..7383c62e5e1 100644 --- a/compiler/tests/org/jetbrains/jet/test/generator/TestGenerator.java +++ b/compiler/tests/org/jetbrains/jet/test/generator/TestGenerator.java @@ -23,13 +23,111 @@ import org.jetbrains.annotations.NotNull; import java.io.File; import java.io.FileFilter; import java.io.IOException; +import java.util.Arrays; import java.util.Collection; import java.util.Iterator; +import java.util.List; /** * @author abreslav */ public class TestGenerator { + + public interface TargetTestFramework { + List getImports(); + + void generateSuiteClassAnnotations(@NotNull TestGenerator testGenerator, @NotNull Printer p); + void generateExtraSuiteClassMethods(@NotNull TestGenerator testGenerator, @NotNull Printer p); + void generateTestMethodAnnotations(@NotNull TestGenerator testGenerator, @NotNull Printer p); + String getIsTestMethodCondition(@NotNull String methodVariableName); + } + + public enum TargetTestFrameworks implements TargetTestFramework { + JUNIT_3 { + @Override + public List getImports() { + return Arrays.asList( + "junit.framework.Assert", + "junit.framework.Test", + "junit.framework.TestSuite" + ); + } + + @Override + public void generateSuiteClassAnnotations(@NotNull TestGenerator testGenerator, @NotNull Printer p) { + // Do nothing + } + + @Override + public void generateExtraSuiteClassMethods(@NotNull TestGenerator testGenerator, @NotNull Printer p) { + p.println("public static Test suite() {"); + p.pushIndent(); + p.println("TestSuite suite = new TestSuite();"); + + for (TestDataSource testDataSource : testGenerator.testDataSources) { + p.println("suite.addTestSuite(", testDataSource.getTestClassName(), ".class);"); + } + + p.println("return suite;"); + p.popIndent(); + p.println("}"); + } + + @Override + public void generateTestMethodAnnotations(@NotNull TestGenerator testGenerator, @NotNull Printer p) { + // Do nothing + } + + @Override + public String getIsTestMethodCondition(@NotNull String methodVariableName) { + return "method.getName().startsWith(\"test\")"; + } + }, + JUNIT_4 { + @Override + public List getImports() { + return Arrays.asList( + "org.junit.Assert", + "org.junit.Test", + "org.junit.runner.RunWith", + "org.junit.runners.Suite" + ); + } + + @Override + public void generateSuiteClassAnnotations(@NotNull TestGenerator testGenerator, @NotNull Printer p) { + p.println("@RunWith(Suite.class)"); + p.println("@Suite.SuiteClasses({"); + p.pushIndent(); + for (Iterator iterator = testGenerator.testDataSources.iterator(); iterator.hasNext(); ) { + TestDataSource testDataSource = iterator.next(); + p.print(testGenerator.suiteClassName, ".", testDataSource.getTestClassName(), ".class"); + if (iterator.hasNext()) { + p.printWithNoIndent(","); + } + p.println(); + } + p.popIndent(); + p.println("})"); + } + + @Override + public void generateExtraSuiteClassMethods(@NotNull TestGenerator testGenerator, @NotNull Printer p) { + // Do nothing + } + + @Override + public void generateTestMethodAnnotations(@NotNull TestGenerator testGenerator, @NotNull Printer p) { + p.println("@Test"); + } + + @Override + public String getIsTestMethodCondition(@NotNull String methodVariableName) { + return "method.isAnnotationPresent(Test.class)"; + } + } + } + public static FileFilter filterFilesByExtension(@NotNull final String extension) { return new FileFilter() { @Override @@ -47,6 +145,21 @@ public class TestGenerator { private final String baseTestClassName; private final Collection testDataSources; private final String generatorName; + private final TargetTestFramework targetTestFramework; + + public TestGenerator( + @NotNull String baseDir, + @NotNull String testDataFileExtension, + @NotNull String suiteClassPackage, + @NotNull String suiteClassName, + @NotNull String baseTestClassPackage, + @NotNull String baseTestClassName, + @NotNull Collection testDataSources, + @NotNull String generatorName +) { + this(baseDir, testDataFileExtension, suiteClassPackage, suiteClassName, baseTestClassPackage, baseTestClassName, testDataSources, + generatorName, TargetTestFrameworks.JUNIT_4); + } public TestGenerator( @NotNull String baseDir, @@ -56,7 +169,8 @@ public class TestGenerator { @NotNull String baseTestClassPackage, @NotNull String baseTestClassName, @NotNull Collection testDataSources, - @NotNull String generatorName + @NotNull String generatorName, + @NotNull TargetTestFramework targetTestFramework ) { this.baseDir = baseDir; this.testDataFileExtension = testDataFileExtension; @@ -66,6 +180,7 @@ public class TestGenerator { this.baseTestClassName = baseTestClassName; this.testDataSources = testDataSources; this.generatorName = generatorName; + this.targetTestFramework = targetTestFramework; } public void generateAndSave() throws IOException { @@ -75,11 +190,9 @@ public class TestGenerator { p.print(FileUtil.loadFile(new File("injector-generator/copyright.txt"))); p.println("package ", suiteClassPackage, ";"); p.println(); - p.println("import junit.framework.TestSuite;"); - p.println("import org.junit.Assert;"); - p.println("import org.junit.Test;"); - p.println("import org.junit.runner.RunWith;"); - p.println("import org.junit.runners.Suite;"); + for (String importedClassName : targetTestFramework.getImports()) { + p.println("import ", importedClassName, ";"); + } p.println(); p.println("import java.io.File;"); @@ -93,7 +206,7 @@ public class TestGenerator { p.println(); p.println("/* This class is generated by ", generatorName, ". DO NOT MODIFY MANUALLY */"); - generateSuiteAnnotations(p); + targetTestFramework.generateSuiteClassAnnotations(this, p); p.println("public class ", suiteClassName, " {"); p.pushIndent(); @@ -102,7 +215,7 @@ public class TestGenerator { p.println(); } - generateSuiteMethod(p); + targetTestFramework.generateExtraSuiteClassMethods(this, p); p.popIndent(); p.println("}"); @@ -113,36 +226,6 @@ public class TestGenerator { System.out.println("Output written to file:\n" + testSourceFile.getAbsolutePath()); } - private void generateSuiteMethod(Printer p) { - p.println("public static junit.framework.Test suite() {"); - p.pushIndent(); - p.println("TestSuite suite = new TestSuite();"); - - for (TestDataSource testDataSource : testDataSources) { - p.println("suite.addTestSuite(", testDataSource.getTestClassName(), ".class);"); - } - - p.println("return suite;"); - p.popIndent(); - p.println("}"); - } - - private void generateSuiteAnnotations(Printer p) { - p.println("@RunWith(Suite.class)"); - p.println("@Suite.SuiteClasses({"); - p.pushIndent(); - for (Iterator iterator = testDataSources.iterator(); iterator.hasNext(); ) { - TestDataSource testDataSource = iterator.next(); - p.print(suiteClassName, ".", testDataSource.getTestClassName(), ".class"); - if (iterator.hasNext()) { - p.printWithNoIndent(","); - } - p.println(); - } - p.popIndent(); - p.println("})"); - } - private void generateTestClass(Printer p, TestDataSource testDataSource) { p.println("public static class ", testDataSource.getTestClassName(), " extends ", baseTestClassName, " {"); p.pushIndent(); @@ -150,7 +233,7 @@ public class TestGenerator { Collection files = Lists.newArrayList(); files.addAll(testDataSource.getFiles()); - p.println("@Test"); + targetTestFramework.generateTestMethodAnnotations(this, p); p.println("public void " + testDataSource.getAllTestsPresentMethodName() + "() throws Exception {"); p.pushIndent(); @@ -161,7 +244,7 @@ public class TestGenerator { p.println(); for (TestDataFile file : files) { - p.println("@Test"); + targetTestFramework.generateTestMethodAnnotations(this, p); p.println("public void ", file.getTestMethodName(), "() throws Exception {"); p.pushIndent(); @@ -179,28 +262,29 @@ public class TestGenerator { } private void generateAllTestsPresent(Printer p) { + String isTestMethod = targetTestFramework.getIsTestMethodCondition("method"); String[] methodText = new String[] { - "public static void allTestsPresent(Class clazz, File testDataDir, boolean recursive) {", - " Set methodNames = new HashSet();", - " for (Method method : clazz.getDeclaredMethods()) {", - " if (method.isAnnotationPresent(Test.class)) {", - " methodNames.add(method.getName().toLowerCase() + \"." + testDataFileExtension + "\");", - " }", - " }", - " for (File file : testDataDir.listFiles()) {", - " if (file.isDirectory()) {", - " if (recursive) {", - " allTestsPresent(clazz, file, recursive);", - " }", - " }", - " else {", - " String name = file.getName();", - " if (name.endsWith(\"." + testDataFileExtension + "\") && !methodNames.contains(\"test\" + name.toLowerCase())) {", - " Assert.fail(\"Test data file missing from the generated test class: \" + file + \"\\nPlease re-run the generator: " + generatorName + "\");", - " }", - " }", - " }", - "}"}; + "public static void allTestsPresent(Class clazz, File testDataDir, boolean recursive) {", + " Set methodNames = new HashSet();", + " for (Method method : clazz.getDeclaredMethods()) {", + " if (" + isTestMethod + ") {", + " methodNames.add(method.getName().toLowerCase() + \"." + testDataFileExtension + "\");", + " }", + " }", + " for (File file : testDataDir.listFiles()) {", + " if (file.isDirectory()) {", + " if (recursive) {", + " allTestsPresent(clazz, file, recursive);", + " }", + " }", + " else {", + " String name = file.getName();", + " if (name.endsWith(\"." + testDataFileExtension + "\") && !methodNames.contains(\"test\" + name.toLowerCase())) {", + " Assert.fail(\"Test data file missing from the generated test class: \" + file + \"\\nPlease re-run the generator: " + generatorName + "\");", + " }", + " }", + " }", + "}"}; for (String s : methodText) { p.println(s);