Target test frameworks (JUnit 3 and 4) supported separately

This commit is contained in:
Andrey Breslav
2012-07-05 17:51:45 +04:00
parent 4683ba4dee
commit 0192e16f39
2 changed files with 147 additions and 62 deletions
@@ -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();
}
}
@@ -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<String> 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<String> 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<String> 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<TestDataSource> 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<TestDataSource> 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<TestDataSource> 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<TestDataSource> 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<TestDataSource> 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<TestDataFile> 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<String> methodNames = new HashSet<String>();",
" 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<String> methodNames = new HashSet<String>();",
" 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);