Generate test suites
This commit is contained in:
@@ -37,6 +37,10 @@ public class Printer {
|
|||||||
|
|
||||||
public void print(Object... objects) {
|
public void print(Object... objects) {
|
||||||
out.append(indent);
|
out.append(indent);
|
||||||
|
printWithNoIndent(objects);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void printWithNoIndent(Object... objects) {
|
||||||
for (Object object : objects) {
|
for (Object object : objects) {
|
||||||
out.append(object);
|
out.append(object);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,12 +36,14 @@ public class TestDataSource {
|
|||||||
private final boolean recursive;
|
private final boolean recursive;
|
||||||
private final FileFilter filter;
|
private final FileFilter filter;
|
||||||
private final String doTestMethodName;
|
private final String doTestMethodName;
|
||||||
|
private final String testClassName;
|
||||||
|
|
||||||
public TestDataSource(@NotNull File rootFile, boolean recursive, @NotNull FileFilter filter, String doTestMethodName) {
|
public TestDataSource(@NotNull File rootFile, boolean recursive, @NotNull FileFilter filter, String doTestMethodName) {
|
||||||
this.rootFile = rootFile;
|
this.rootFile = rootFile;
|
||||||
this.recursive = recursive;
|
this.recursive = recursive;
|
||||||
this.filter = filter;
|
this.filter = filter;
|
||||||
this.doTestMethodName = doTestMethodName;
|
this.doTestMethodName = doTestMethodName;
|
||||||
|
this.testClassName = StringUtil.capitalize(rootFile.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection<TestDataFile> getFiles() {
|
public Collection<TestDataFile> getFiles() {
|
||||||
@@ -72,10 +74,14 @@ public class TestDataSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void getAllTestsPresentCheck(@NotNull Printer p) {
|
public void getAllTestsPresentCheck(@NotNull Printer p) {
|
||||||
p.println("allTestsPresent(new File(\"" + rootFile + "\"), " + recursive + ");");
|
p.println("allTestsPresent(" + getTestClassName() + ".class, new File(\"" + rootFile + "\"), " + recursive + ");");
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getAllTestsPresentMethodName() {
|
public String getAllTestsPresentMethodName() {
|
||||||
return "allTestsPresentIn" + StringUtil.capitalize(rootFile.getName());
|
return "allTestsPresentIn" + StringUtil.capitalize(rootFile.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getTestClassName() {
|
||||||
|
return testClassName;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import java.io.File;
|
|||||||
import java.io.FileFilter;
|
import java.io.FileFilter;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author abreslav
|
* @author abreslav
|
||||||
@@ -40,8 +41,8 @@ public class TestGenerator {
|
|||||||
|
|
||||||
private final String baseDir;
|
private final String baseDir;
|
||||||
private final String testDataFileExtension;
|
private final String testDataFileExtension;
|
||||||
private final String testClassPackage;
|
private final String suiteClassPackage;
|
||||||
private final String testClassName;
|
private final String suiteClassName;
|
||||||
private final String baseTestClassPackage;
|
private final String baseTestClassPackage;
|
||||||
private final String baseTestClassName;
|
private final String baseTestClassName;
|
||||||
private final Collection<TestDataSource> testDataSources;
|
private final Collection<TestDataSource> testDataSources;
|
||||||
@@ -50,8 +51,8 @@ public class TestGenerator {
|
|||||||
public TestGenerator(
|
public TestGenerator(
|
||||||
@NotNull String baseDir,
|
@NotNull String baseDir,
|
||||||
@NotNull String testDataFileExtension,
|
@NotNull String testDataFileExtension,
|
||||||
@NotNull String testClassPackage,
|
@NotNull String suiteClassPackage,
|
||||||
@NotNull String testClassName,
|
@NotNull String suiteClassName,
|
||||||
@NotNull String baseTestClassPackage,
|
@NotNull String baseTestClassPackage,
|
||||||
@NotNull String baseTestClassName,
|
@NotNull String baseTestClassName,
|
||||||
@NotNull Collection<TestDataSource> testDataSources,
|
@NotNull Collection<TestDataSource> testDataSources,
|
||||||
@@ -59,8 +60,8 @@ public class TestGenerator {
|
|||||||
) {
|
) {
|
||||||
this.baseDir = baseDir;
|
this.baseDir = baseDir;
|
||||||
this.testDataFileExtension = testDataFileExtension;
|
this.testDataFileExtension = testDataFileExtension;
|
||||||
this.testClassPackage = testClassPackage;
|
this.suiteClassPackage = suiteClassPackage;
|
||||||
this.testClassName = testClassName;
|
this.suiteClassName = suiteClassName;
|
||||||
this.baseTestClassPackage = baseTestClassPackage;
|
this.baseTestClassPackage = baseTestClassPackage;
|
||||||
this.baseTestClassName = baseTestClassName;
|
this.baseTestClassName = baseTestClassName;
|
||||||
this.testDataSources = testDataSources;
|
this.testDataSources = testDataSources;
|
||||||
@@ -72,10 +73,12 @@ public class TestGenerator {
|
|||||||
Printer p = new Printer(out);
|
Printer p = new Printer(out);
|
||||||
|
|
||||||
p.print(FileUtil.loadFile(new File("injector-generator/copyright.txt")));
|
p.print(FileUtil.loadFile(new File("injector-generator/copyright.txt")));
|
||||||
p.println("package ", testClassPackage, ";");
|
p.println("package ", suiteClassPackage, ";");
|
||||||
p.println();
|
p.println();
|
||||||
p.println("import org.junit.Assert;");
|
p.println("import org.junit.Assert;");
|
||||||
p.println("import org.junit.Test;");
|
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;");
|
||||||
@@ -88,24 +91,55 @@ public class TestGenerator {
|
|||||||
p.println("import ", baseTestClassPackage, ".", baseTestClassName, ";");
|
p.println("import ", baseTestClassPackage, ".", baseTestClassName, ";");
|
||||||
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 */");
|
||||||
p.println("public class ", testClassName, " extends ", baseTestClassName, " {");
|
generateSuiteAnnotations(p);
|
||||||
|
p.println("public class ", suiteClassName, " {");
|
||||||
|
p.pushIndent();
|
||||||
|
|
||||||
|
for (TestDataSource testDataSource : testDataSources) {
|
||||||
|
generateTestClass(p, testDataSource);
|
||||||
|
p.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
p.popIndent();
|
||||||
|
p.println("}");
|
||||||
|
|
||||||
|
String testSourceFilePath = baseDir + suiteClassPackage.replace(".", "/") + "/" + suiteClassName + ".java";
|
||||||
|
FileUtil.writeToFile(new File(testSourceFilePath), out.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
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();
|
p.pushIndent();
|
||||||
|
|
||||||
Collection<TestDataFile> files = Lists.newArrayList();
|
Collection<TestDataFile> files = Lists.newArrayList();
|
||||||
for (TestDataSource testDataSource : testDataSources) {
|
files.addAll(testDataSource.getFiles());
|
||||||
files.addAll(testDataSource.getFiles());
|
|
||||||
|
|
||||||
p.println("@Test");
|
p.println("@Test");
|
||||||
p.println("public void " + testDataSource.getAllTestsPresentMethodName() + "() throws Exception {");
|
p.println("public void " + testDataSource.getAllTestsPresentMethodName() + "() throws Exception {");
|
||||||
p.pushIndent();
|
p.pushIndent();
|
||||||
|
|
||||||
testDataSource.getAllTestsPresentCheck(p);
|
testDataSource.getAllTestsPresentCheck(p);
|
||||||
|
|
||||||
p.popIndent();
|
p.popIndent();
|
||||||
p.println("}");
|
p.println("}");
|
||||||
p.println();
|
p.println();
|
||||||
}
|
|
||||||
|
|
||||||
for (TestDataFile file : files) {
|
for (TestDataFile file : files) {
|
||||||
p.println("@Test");
|
p.println("@Test");
|
||||||
@@ -123,16 +157,13 @@ public class TestGenerator {
|
|||||||
|
|
||||||
p.popIndent();
|
p.popIndent();
|
||||||
p.println("}");
|
p.println("}");
|
||||||
|
|
||||||
String testSourceFilePath = baseDir + testClassPackage.replace(".", "/") + "/" + testClassName + ".java";
|
|
||||||
FileUtil.writeToFile(new File(testSourceFilePath), out.toString());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void generateAllTestsPresent(Printer p) {
|
private void generateAllTestsPresent(Printer p) {
|
||||||
String[] methodText = new String[] {
|
String[] methodText = new String[] {
|
||||||
"public static void allTestsPresent(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 : " + testClassName + ".class.getDeclaredMethods()) {",
|
" for (Method method : clazz.getDeclaredMethods()) {",
|
||||||
" if (method.isAnnotationPresent(Test.class)) {",
|
" if (method.isAnnotationPresent(Test.class)) {",
|
||||||
" methodNames.add(method.getName().toLowerCase() + \"." + testDataFileExtension + "\");",
|
" methodNames.add(method.getName().toLowerCase() + \"." + testDataFileExtension + "\");",
|
||||||
" }",
|
" }",
|
||||||
@@ -140,7 +171,7 @@ public class TestGenerator {
|
|||||||
" for (File file : testDataDir.listFiles()) {",
|
" for (File file : testDataDir.listFiles()) {",
|
||||||
" if (file.isDirectory()) {",
|
" if (file.isDirectory()) {",
|
||||||
" if (recursive) {",
|
" if (recursive) {",
|
||||||
" allTestsPresent(file, recursive);",
|
" allTestsPresent(clazz, file, recursive);",
|
||||||
" }",
|
" }",
|
||||||
" }",
|
" }",
|
||||||
" else {",
|
" else {",
|
||||||
|
|||||||
Reference in New Issue
Block a user