enable test generator to generate tests using JUnit 4 infrastructure

This commit is contained in:
Jiaxiang Chen
2019-09-16 12:20:11 -07:00
committed by max-kammerer
parent 2c78f1fe85
commit 74e4e8b18e
2 changed files with 25 additions and 7 deletions
@@ -19,21 +19,24 @@ class TestGroup(
) { ) {
inline fun <reified T : TestCase> testClass( inline fun <reified T : TestCase> testClass(
suiteTestClassName: String = getDefaultSuiteTestClassName(T::class.java.simpleName), suiteTestClassName: String = getDefaultSuiteTestClassName(T::class.java.simpleName),
useJunit4: Boolean = false,
noinline init: TestClass.() -> Unit noinline init: TestClass.() -> Unit
) { ) {
testClass(T::class.java.name, suiteTestClassName, init) testClass(T::class.java.name, suiteTestClassName, useJunit4, init)
} }
fun testClass( fun testClass(
baseTestClassName: String, baseTestClassName: String,
suiteTestClassName: String = getDefaultSuiteTestClassName(baseTestClassName.substringAfterLast('.')), suiteTestClassName: String = getDefaultSuiteTestClassName(baseTestClassName.substringAfterLast('.')),
useJunit4: Boolean,
init: TestClass.() -> Unit init: TestClass.() -> Unit
) { ) {
TestGenerator( TestGenerator(
testsRoot, testsRoot,
suiteTestClassName, suiteTestClassName,
baseTestClassName, baseTestClassName,
TestClass().apply(init).testModels TestClass().apply(init).testModels,
useJunit4
).generateAndSave() ).generateAndSave()
} }
@@ -11,7 +11,9 @@ import org.jetbrains.kotlin.test.KotlinTestUtils
import org.jetbrains.kotlin.test.TargetBackend import org.jetbrains.kotlin.test.TargetBackend
import org.jetbrains.kotlin.test.TestMetadata import org.jetbrains.kotlin.test.TestMetadata
import org.jetbrains.kotlin.utils.Printer import org.jetbrains.kotlin.utils.Printer
import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.junit.runners.BlockJUnit4ClassRunner
import java.io.File import java.io.File
import java.io.IOException import java.io.IOException
import java.util.* import java.util.*
@@ -20,7 +22,8 @@ class TestGenerator(
baseDir: String, baseDir: String,
suiteTestClassFqName: String, suiteTestClassFqName: String,
baseTestClassFqName: String, baseTestClassFqName: String,
testClassModels: Collection<TestClassModel> testClassModels: Collection<TestClassModel>,
useJunit4: Boolean
) { ) {
private val baseTestClassPackage: String private val baseTestClassPackage: String
@@ -28,6 +31,7 @@ class TestGenerator(
private val suiteClassName: String private val suiteClassName: String
private val baseTestClassName: String private val baseTestClassName: String
private val testClassModels: Collection<TestClassModel> private val testClassModels: Collection<TestClassModel>
private val useJunit4: Boolean
private val testSourceFilePath: String private val testSourceFilePath: String
init { init {
@@ -36,6 +40,7 @@ class TestGenerator(
this.suiteClassPackage = suiteTestClassFqName.substringBeforeLast('.', baseTestClassPackage) this.suiteClassPackage = suiteTestClassFqName.substringBeforeLast('.', baseTestClassPackage)
this.suiteClassName = suiteTestClassFqName.substringAfterLast('.', suiteTestClassFqName) this.suiteClassName = suiteTestClassFqName.substringAfterLast('.', suiteTestClassFqName)
this.testClassModels = ArrayList(testClassModels) this.testClassModels = ArrayList(testClassModels)
this.useJunit4 = useJunit4
this.testSourceFilePath = baseDir + "/" + this.suiteClassPackage.replace(".", "/") + "/" + this.suiteClassName + ".java" this.testSourceFilePath = baseDir + "/" + this.suiteClassPackage.replace(".", "/") + "/" + this.suiteClassName + ".java"
@@ -60,7 +65,9 @@ class TestGenerator(
p.println("package ", suiteClassPackage, ";") p.println("package ", suiteClassPackage, ";")
p.println() p.println()
p.println("import com.intellij.testFramework.TestDataPath;") p.println("import com.intellij.testFramework.TestDataPath;")
p.println("import ", RUNNER.canonicalName, ";") if (!useJunit4) {
p.println("import ", RUNNER.canonicalName, ";")
}
p.println("import " + KotlinTestUtils::class.java.canonicalName + ";") p.println("import " + KotlinTestUtils::class.java.canonicalName + ";")
p.println("import " + TargetBackend::class.java.canonicalName + ";") p.println("import " + TargetBackend::class.java.canonicalName + ";")
if (suiteClassPackage != baseTestClassPackage) { if (suiteClassPackage != baseTestClassPackage) {
@@ -68,6 +75,10 @@ class TestGenerator(
} }
p.println("import " + TestMetadata::class.java.canonicalName + ";") p.println("import " + TestMetadata::class.java.canonicalName + ";")
p.println("import " + RunWith::class.java.canonicalName + ";") p.println("import " + RunWith::class.java.canonicalName + ";")
if (useJunit4) {
p.println("import " + BlockJUnit4ClassRunner::class.java.canonicalName + ";")
p.println("import " + Test::class.java.canonicalName + ";")
}
p.println() p.println()
p.println("import java.io.File;") p.println("import java.io.File;")
p.println("import java.util.regex.Pattern;") p.println("import java.util.regex.Pattern;")
@@ -115,7 +126,7 @@ class TestGenerator(
generateMetadata(p, testClassModel) generateMetadata(p, testClassModel)
generateTestDataPath(p, testClassModel) generateTestDataPath(p, testClassModel)
p.println("@RunWith(", RUNNER.simpleName, ".class)") p.println("@RunWith(", if (useJunit4) JUNIT4_RUNNER.simpleName else RUNNER.simpleName, ".class)")
p.println("public " + staticModifier + "class ", testClassModel.name, " extends ", baseTestClassName, " {") p.println("public " + staticModifier + "class ", testClassModel.name, " extends ", baseTestClassName, " {")
p.pushIndent() p.pushIndent()
@@ -134,7 +145,7 @@ class TestGenerator(
p.println() p.println()
} }
generateTestMethod(p, methodModel) generateTestMethod(p, methodModel, useJunit4)
} }
for (innerTestClass in innerTestClasses) { for (innerTestClass in innerTestClasses) {
@@ -156,8 +167,12 @@ class TestGenerator(
companion object { companion object {
private val GENERATED_FILES = HashSet<String>() private val GENERATED_FILES = HashSet<String>()
private val RUNNER = JUnit3RunnerWithInners::class.java private val RUNNER = JUnit3RunnerWithInners::class.java
private val JUNIT4_RUNNER = BlockJUnit4ClassRunner::class.java
private fun generateTestMethod(p: Printer, methodModel: MethodModel) { private fun generateTestMethod(p: Printer, methodModel: MethodModel, useJunit4: Boolean) {
if (useJunit4 && (methodModel !is RunTestMethodModel)) {
p.println("@Test")
}
generateMetadata(p, methodModel) generateMetadata(p, methodModel)
methodModel.generateSignature(p) methodModel.generateSignature(p)