Target test frameworks (JUnit 3 and 4) supported separately
This commit is contained in:
@@ -40,7 +40,8 @@ public class ReadJavaBinaryClassTestGenerator {
|
|||||||
Arrays.asList(
|
Arrays.asList(
|
||||||
new TestDataSource(new File("compiler/testData/readJavaBinaryClass"), true, TestGenerator.filterFilesByExtension(extension), "doTest")
|
new TestDataSource(new File("compiler/testData/readJavaBinaryClass"), true, TestGenerator.filterFilesByExtension(extension), "doTest")
|
||||||
),
|
),
|
||||||
ReadJavaBinaryClassTestGenerator.class.getName()
|
ReadJavaBinaryClassTestGenerator.class.getName(),
|
||||||
|
TestGenerator.TargetTestFrameworks.JUNIT_3
|
||||||
).generateAndSave();
|
).generateAndSave();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,13 +23,111 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileFilter;
|
import java.io.FileFilter;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author abreslav
|
* @author abreslav
|
||||||
*/
|
*/
|
||||||
public class TestGenerator {
|
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) {
|
public static FileFilter filterFilesByExtension(@NotNull final String extension) {
|
||||||
return new FileFilter() {
|
return new FileFilter() {
|
||||||
@Override
|
@Override
|
||||||
@@ -47,6 +145,21 @@ public class TestGenerator {
|
|||||||
private final String baseTestClassName;
|
private final String baseTestClassName;
|
||||||
private final Collection<TestDataSource> testDataSources;
|
private final Collection<TestDataSource> testDataSources;
|
||||||
private final String generatorName;
|
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(
|
public TestGenerator(
|
||||||
@NotNull String baseDir,
|
@NotNull String baseDir,
|
||||||
@@ -56,7 +169,8 @@ public class TestGenerator {
|
|||||||
@NotNull String baseTestClassPackage,
|
@NotNull String baseTestClassPackage,
|
||||||
@NotNull String baseTestClassName,
|
@NotNull String baseTestClassName,
|
||||||
@NotNull Collection<TestDataSource> testDataSources,
|
@NotNull Collection<TestDataSource> testDataSources,
|
||||||
@NotNull String generatorName
|
@NotNull String generatorName,
|
||||||
|
@NotNull TargetTestFramework targetTestFramework
|
||||||
) {
|
) {
|
||||||
this.baseDir = baseDir;
|
this.baseDir = baseDir;
|
||||||
this.testDataFileExtension = testDataFileExtension;
|
this.testDataFileExtension = testDataFileExtension;
|
||||||
@@ -66,6 +180,7 @@ public class TestGenerator {
|
|||||||
this.baseTestClassName = baseTestClassName;
|
this.baseTestClassName = baseTestClassName;
|
||||||
this.testDataSources = testDataSources;
|
this.testDataSources = testDataSources;
|
||||||
this.generatorName = generatorName;
|
this.generatorName = generatorName;
|
||||||
|
this.targetTestFramework = targetTestFramework;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void generateAndSave() throws IOException {
|
public void generateAndSave() throws IOException {
|
||||||
@@ -75,11 +190,9 @@ public class TestGenerator {
|
|||||||
p.print(FileUtil.loadFile(new File("injector-generator/copyright.txt")));
|
p.print(FileUtil.loadFile(new File("injector-generator/copyright.txt")));
|
||||||
p.println("package ", suiteClassPackage, ";");
|
p.println("package ", suiteClassPackage, ";");
|
||||||
p.println();
|
p.println();
|
||||||
p.println("import junit.framework.TestSuite;");
|
for (String importedClassName : targetTestFramework.getImports()) {
|
||||||
p.println("import org.junit.Assert;");
|
p.println("import ", importedClassName, ";");
|
||||||
p.println("import org.junit.Test;");
|
}
|
||||||
p.println("import org.junit.runner.RunWith;");
|
|
||||||
p.println("import org.junit.runners.Suite;");
|
|
||||||
p.println();
|
p.println();
|
||||||
|
|
||||||
p.println("import java.io.File;");
|
p.println("import java.io.File;");
|
||||||
@@ -93,7 +206,7 @@ public class TestGenerator {
|
|||||||
p.println();
|
p.println();
|
||||||
|
|
||||||
p.println("/* This class is generated by ", generatorName, ". DO NOT MODIFY MANUALLY */");
|
p.println("/* This class is generated by ", generatorName, ". DO NOT MODIFY MANUALLY */");
|
||||||
generateSuiteAnnotations(p);
|
targetTestFramework.generateSuiteClassAnnotations(this, p);
|
||||||
p.println("public class ", suiteClassName, " {");
|
p.println("public class ", suiteClassName, " {");
|
||||||
p.pushIndent();
|
p.pushIndent();
|
||||||
|
|
||||||
@@ -102,7 +215,7 @@ public class TestGenerator {
|
|||||||
p.println();
|
p.println();
|
||||||
}
|
}
|
||||||
|
|
||||||
generateSuiteMethod(p);
|
targetTestFramework.generateExtraSuiteClassMethods(this, p);
|
||||||
|
|
||||||
p.popIndent();
|
p.popIndent();
|
||||||
p.println("}");
|
p.println("}");
|
||||||
@@ -113,36 +226,6 @@ public class TestGenerator {
|
|||||||
System.out.println("Output written to file:\n" + testSourceFile.getAbsolutePath());
|
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) {
|
private void generateTestClass(Printer p, TestDataSource testDataSource) {
|
||||||
p.println("public static class ", testDataSource.getTestClassName(), " extends ", baseTestClassName, " {");
|
p.println("public static class ", testDataSource.getTestClassName(), " extends ", baseTestClassName, " {");
|
||||||
p.pushIndent();
|
p.pushIndent();
|
||||||
@@ -150,7 +233,7 @@ public class TestGenerator {
|
|||||||
Collection<TestDataFile> files = Lists.newArrayList();
|
Collection<TestDataFile> files = Lists.newArrayList();
|
||||||
files.addAll(testDataSource.getFiles());
|
files.addAll(testDataSource.getFiles());
|
||||||
|
|
||||||
p.println("@Test");
|
targetTestFramework.generateTestMethodAnnotations(this, p);
|
||||||
p.println("public void " + testDataSource.getAllTestsPresentMethodName() + "() throws Exception {");
|
p.println("public void " + testDataSource.getAllTestsPresentMethodName() + "() throws Exception {");
|
||||||
p.pushIndent();
|
p.pushIndent();
|
||||||
|
|
||||||
@@ -161,7 +244,7 @@ public class TestGenerator {
|
|||||||
p.println();
|
p.println();
|
||||||
|
|
||||||
for (TestDataFile file : files) {
|
for (TestDataFile file : files) {
|
||||||
p.println("@Test");
|
targetTestFramework.generateTestMethodAnnotations(this, p);
|
||||||
p.println("public void ", file.getTestMethodName(), "() throws Exception {");
|
p.println("public void ", file.getTestMethodName(), "() throws Exception {");
|
||||||
p.pushIndent();
|
p.pushIndent();
|
||||||
|
|
||||||
@@ -179,28 +262,29 @@ public class TestGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void generateAllTestsPresent(Printer p) {
|
private void generateAllTestsPresent(Printer p) {
|
||||||
|
String isTestMethod = targetTestFramework.getIsTestMethodCondition("method");
|
||||||
String[] methodText = new String[] {
|
String[] methodText = new String[] {
|
||||||
"public static void allTestsPresent(Class<?> clazz, File testDataDir, boolean recursive) {",
|
"public static void allTestsPresent(Class<?> clazz, File testDataDir, boolean recursive) {",
|
||||||
" Set<String> methodNames = new HashSet<String>();",
|
" Set<String> methodNames = new HashSet<String>();",
|
||||||
" for (Method method : clazz.getDeclaredMethods()) {",
|
" for (Method method : clazz.getDeclaredMethods()) {",
|
||||||
" if (method.isAnnotationPresent(Test.class)) {",
|
" if (" + isTestMethod + ") {",
|
||||||
" methodNames.add(method.getName().toLowerCase() + \"." + testDataFileExtension + "\");",
|
" methodNames.add(method.getName().toLowerCase() + \"." + testDataFileExtension + "\");",
|
||||||
" }",
|
" }",
|
||||||
" }",
|
" }",
|
||||||
" for (File file : testDataDir.listFiles()) {",
|
" for (File file : testDataDir.listFiles()) {",
|
||||||
" if (file.isDirectory()) {",
|
" if (file.isDirectory()) {",
|
||||||
" if (recursive) {",
|
" if (recursive) {",
|
||||||
" allTestsPresent(clazz, file, recursive);",
|
" allTestsPresent(clazz, file, recursive);",
|
||||||
" }",
|
" }",
|
||||||
" }",
|
" }",
|
||||||
" else {",
|
" else {",
|
||||||
" String name = file.getName();",
|
" String name = file.getName();",
|
||||||
" if (name.endsWith(\"." + testDataFileExtension + "\") && !methodNames.contains(\"test\" + name.toLowerCase())) {",
|
" 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 + "\");",
|
" Assert.fail(\"Test data file missing from the generated test class: \" + file + \"\\nPlease re-run the generator: " + generatorName + "\");",
|
||||||
" }",
|
" }",
|
||||||
" }",
|
" }",
|
||||||
" }",
|
" }",
|
||||||
"}"};
|
"}"};
|
||||||
|
|
||||||
for (String s : methodText) {
|
for (String s : methodText) {
|
||||||
p.println(s);
|
p.println(s);
|
||||||
|
|||||||
Reference in New Issue
Block a user