unit-tests: Refactor filters in test runner
This commit is contained in:
@@ -2,17 +2,20 @@ package konan.test
|
||||
|
||||
class GTestLogger : TestLoggerWithStatistics() {
|
||||
|
||||
override fun startTesting(runner: TestRunner) {
|
||||
super.startTesting(runner)
|
||||
println("[==========] Running ${runner.totalTests} tests from ${runner.totalSuites} test case.")
|
||||
// Just hack to deal with the Clion parser. TODO: Remove it after changes in the parser.
|
||||
println("[----------] Global test environment set-up.")
|
||||
}
|
||||
private val Collection<TestSuite>.totalTestsNotIgnored: Int
|
||||
get() = asSequence().filter { !it.ignored }.sumBy { it.testCases.values.count { !it.ignored } }
|
||||
|
||||
override fun startIteration(runner: TestRunner, iteration: Int) {
|
||||
private val Collection<TestSuite>.totalNotIgnored: Int
|
||||
get() = filter { !it.ignored }.size
|
||||
|
||||
override fun startIteration(runner: TestRunner, iteration: Int, suites: Collection<TestSuite>) {
|
||||
if (runner.iterations != 1) {
|
||||
println("\nRepeating all tests (iteration $iteration) . . .\n")
|
||||
}
|
||||
super.startIteration(runner, iteration, suites)
|
||||
println("[==========] Running ${suites.totalTestsNotIgnored} tests from ${suites.totalNotIgnored} test cases.")
|
||||
// Just hack to deal with the Clion parser. TODO: Remove it after changes in the parser.
|
||||
println("[----------] Global test environment set-up.")
|
||||
}
|
||||
|
||||
private fun printResults(timeMillis: Long) = with (statistics) {
|
||||
@@ -31,7 +34,7 @@ class GTestLogger : TestLoggerWithStatistics() {
|
||||
}
|
||||
}
|
||||
|
||||
override fun finishTesting(runner: TestRunner, timeMillis: Long) = printResults(timeMillis)
|
||||
override fun finishIteration(runner: TestRunner, iteration: Int, timeMillis: Long) = printResults(timeMillis)
|
||||
|
||||
override fun startSuite(suite: TestSuite) = println("[----------] ${suite.size} tests from ${suite.name}")
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ interface TestListener {
|
||||
fun startTesting(runner: TestRunner)
|
||||
fun finishTesting(runner: TestRunner, timeMillis: Long)
|
||||
|
||||
fun startIteration(runner: TestRunner, iteration: Int)
|
||||
fun startIteration(runner: TestRunner, iteration: Int, suites: Collection<TestSuite>)
|
||||
fun finishIteration(runner: TestRunner, iteration: Int, timeMillis: Long)
|
||||
|
||||
fun startSuite(suite: TestSuite)
|
||||
@@ -20,7 +20,7 @@ interface TestListener {
|
||||
open class BaseTestListener: TestListener {
|
||||
override fun startTesting(runner: TestRunner) {}
|
||||
override fun finishTesting(runner: TestRunner, timeMillis: Long) {}
|
||||
override fun startIteration(runner: TestRunner, iteration: Int) {}
|
||||
override fun startIteration(runner: TestRunner, iteration: Int, suites: Collection<TestSuite>) {}
|
||||
override fun finishIteration(runner: TestRunner, iteration: Int, timeMillis: Long) {}
|
||||
override fun startSuite(suite: TestSuite) {}
|
||||
override fun finishSuite(suite: TestSuite, timeMillis: Long) {}
|
||||
|
||||
@@ -1,23 +1,16 @@
|
||||
package konan.test
|
||||
|
||||
interface TestLogger: TestListener {
|
||||
fun logTestList(runner: TestRunner)
|
||||
fun logTestList(runner: TestRunner, suites: Collection<TestSuite>)
|
||||
fun log(message: String)
|
||||
}
|
||||
|
||||
open class BaseTestLogger: BaseTestListener(), TestLogger {
|
||||
|
||||
protected val TestRunner.totalTests
|
||||
get() = filterTests().filter { !it.ignored }.size
|
||||
|
||||
protected val TestRunner.totalSuites
|
||||
get() = suites.filter { !it.ignored }.size
|
||||
|
||||
override fun log(message: String) = println(message)
|
||||
override fun logTestList(runner: TestRunner) {
|
||||
runner.filterTests().groupBy { it.suite }.forEach { (suite, tests) ->
|
||||
override fun logTestList(runner: TestRunner, suites: Collection<TestSuite>) {
|
||||
suites.forEach { suite ->
|
||||
println("${suite.name}.")
|
||||
tests.forEach {
|
||||
suite.testCases.values.forEach {
|
||||
println(" ${it.name}")
|
||||
}
|
||||
}
|
||||
@@ -29,7 +22,7 @@ open class TestLoggerWithStatistics: BaseTestLogger() {
|
||||
protected val statistics = MutableTestStatistics()
|
||||
|
||||
override fun startTesting(runner: TestRunner) = statistics.reset()
|
||||
override fun startIteration(runner: TestRunner, iteration: Int) = statistics.reset()
|
||||
override fun startIteration(runner: TestRunner, iteration: Int, suites: Collection<TestSuite>) = statistics.reset()
|
||||
|
||||
override fun finishSuite(suite: TestSuite, timeMillis: Long) = statistics.registerSuite()
|
||||
override fun pass(testCase: TestCase, timeMillis: Long) = statistics.registerPass()
|
||||
@@ -38,7 +31,7 @@ open class TestLoggerWithStatistics: BaseTestLogger() {
|
||||
}
|
||||
|
||||
class SilentTestLogger: BaseTestLogger() {
|
||||
override fun logTestList(runner: TestRunner) {}
|
||||
override fun logTestList(runner: TestRunner, suites: Collection<TestSuite>) {}
|
||||
override fun log(message: String) {}
|
||||
}
|
||||
|
||||
@@ -46,7 +39,8 @@ class SimpleTestLogger: BaseTestLogger() {
|
||||
override fun startTesting(runner: TestRunner) = println("Starting testing")
|
||||
override fun finishTesting(runner: TestRunner, timeMillis: Long) = println("Testing finished")
|
||||
|
||||
override fun startIteration(runner: TestRunner, iteration: Int) = println("Starting iteration: $iteration")
|
||||
override fun startIteration(runner: TestRunner, iteration: Int, suites: Collection<TestSuite>) =
|
||||
println("Starting iteration: $iteration")
|
||||
override fun finishIteration(runner: TestRunner, iteration: Int, timeMillis: Long) =
|
||||
println("Iteration finished: $iteration")
|
||||
|
||||
|
||||
@@ -20,14 +20,19 @@ object TestRunner {
|
||||
var exitCode = 0
|
||||
private set
|
||||
|
||||
private val TestCase.matchFilters: Boolean
|
||||
get() = filters.map { it(this) }.all { it }
|
||||
class FilteredSuite(val innerSuite: TestSuite): TestSuite by innerSuite {
|
||||
|
||||
private val TestSuite.testCasesFiltered
|
||||
get() = testCases.values.filter { it.matchFilters }
|
||||
private val TestCase.matchFilters: Boolean
|
||||
get() = filters.map { it(this) }.all { it }
|
||||
|
||||
// TODO: We can cache it.
|
||||
fun filterTests(): Collection<TestCase> = suites.flatMap { it.testCasesFiltered }
|
||||
override val size: Int
|
||||
get() = testCases.size
|
||||
|
||||
override val testCases: Map<String, TestCase> = innerSuite.testCases.filter { it.value.matchFilters }
|
||||
override fun toString() = innerSuite.toString()
|
||||
}
|
||||
|
||||
private fun filterSuites(): Collection<TestSuite> = suites.map { FilteredSuite(it) }
|
||||
|
||||
fun register(suite: TestSuite) = suites_.add(suite)
|
||||
fun register(suites: Iterable<TestSuite>) = suites_.addAll(suites)
|
||||
@@ -79,7 +84,7 @@ object TestRunner {
|
||||
when (arg.size) {
|
||||
1 -> when (arg[0]) {
|
||||
"--gtest_list_tests",
|
||||
"--ktest_list_tests" -> { logger.logTestList(this); result = false }
|
||||
"--ktest_list_tests" -> { logger.logTestList(this, filterSuites()); result = false }
|
||||
"-h",
|
||||
"--help" -> { logger.log(help); result = false }
|
||||
else -> throw IllegalArgumentException("Unknown option: $it\n$help")
|
||||
@@ -96,7 +101,9 @@ object TestRunner {
|
||||
"--ktest_repeat",
|
||||
"--gtest_repeat" -> iterations = value.toIntOrNull() ?:
|
||||
throw IllegalArgumentException("Cannot parse number: $value")
|
||||
else -> throw IllegalArgumentException("Unknown option: $it\n$help")
|
||||
else -> if (key.startsWith("--ktest_")) {
|
||||
throw IllegalArgumentException("Unknown option: $it\n$help")
|
||||
}
|
||||
}
|
||||
}
|
||||
else -> throw IllegalArgumentException("Unknown option: $it\n$help")
|
||||
@@ -191,7 +198,7 @@ object TestRunner {
|
||||
|
||||
private fun TestSuite.run() {
|
||||
doBeforeClass()
|
||||
testCasesFiltered.forEach { testCase ->
|
||||
testCases.values.forEach { testCase ->
|
||||
if (testCase.ignored) {
|
||||
sendToListeners { ignore(testCase) }
|
||||
} else {
|
||||
@@ -210,9 +217,10 @@ object TestRunner {
|
||||
}
|
||||
|
||||
private fun runIteration(iteration: Int) {
|
||||
sendToListeners { startIteration(this@TestRunner, iteration) }
|
||||
val suitesFiltered = filterSuites()
|
||||
sendToListeners { startIteration(this@TestRunner, iteration, suitesFiltered) }
|
||||
val iterationTime = measureTimeMillis {
|
||||
suites.forEach {
|
||||
suitesFiltered.forEach {
|
||||
if (it.ignored) {
|
||||
sendToListeners { ignoreSuite(it) }
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user