From a539c9251d484367700bcdd8b9cf51f8f0add5b7 Mon Sep 17 00:00:00 2001 From: Ilya Matveev Date: Tue, 26 Sep 2017 16:20:47 +0300 Subject: [PATCH] unit-tests: Refactor filters in test runner --- .../src/main/kotlin/konan/test/GTestLogger.kt | 19 +++++++----- .../main/kotlin/konan/test/TestListener.kt | 4 +-- .../src/main/kotlin/konan/test/TestLogger.kt | 22 +++++--------- .../src/main/kotlin/konan/test/TestRunner.kt | 30 ++++++++++++------- 4 files changed, 40 insertions(+), 35 deletions(-) diff --git a/runtime/src/main/kotlin/konan/test/GTestLogger.kt b/runtime/src/main/kotlin/konan/test/GTestLogger.kt index 709b6ae067d..1cccff2177b 100644 --- a/runtime/src/main/kotlin/konan/test/GTestLogger.kt +++ b/runtime/src/main/kotlin/konan/test/GTestLogger.kt @@ -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.totalTestsNotIgnored: Int + get() = asSequence().filter { !it.ignored }.sumBy { it.testCases.values.count { !it.ignored } } - override fun startIteration(runner: TestRunner, iteration: Int) { + private val Collection.totalNotIgnored: Int + get() = filter { !it.ignored }.size + + override fun startIteration(runner: TestRunner, iteration: Int, suites: Collection) { 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}") diff --git a/runtime/src/main/kotlin/konan/test/TestListener.kt b/runtime/src/main/kotlin/konan/test/TestListener.kt index 9ec3153728a..2177a17e666 100644 --- a/runtime/src/main/kotlin/konan/test/TestListener.kt +++ b/runtime/src/main/kotlin/konan/test/TestListener.kt @@ -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) 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) {} override fun finishIteration(runner: TestRunner, iteration: Int, timeMillis: Long) {} override fun startSuite(suite: TestSuite) {} override fun finishSuite(suite: TestSuite, timeMillis: Long) {} diff --git a/runtime/src/main/kotlin/konan/test/TestLogger.kt b/runtime/src/main/kotlin/konan/test/TestLogger.kt index 34b431cfbad..86510829322 100644 --- a/runtime/src/main/kotlin/konan/test/TestLogger.kt +++ b/runtime/src/main/kotlin/konan/test/TestLogger.kt @@ -1,23 +1,16 @@ package konan.test interface TestLogger: TestListener { - fun logTestList(runner: TestRunner) + fun logTestList(runner: TestRunner, suites: Collection) 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) { + 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) = 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) {} 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) = + println("Starting iteration: $iteration") override fun finishIteration(runner: TestRunner, iteration: Int, timeMillis: Long) = println("Iteration finished: $iteration") diff --git a/runtime/src/main/kotlin/konan/test/TestRunner.kt b/runtime/src/main/kotlin/konan/test/TestRunner.kt index c3247c8e6f7..bd24024f8e0 100644 --- a/runtime/src/main/kotlin/konan/test/TestRunner.kt +++ b/runtime/src/main/kotlin/konan/test/TestRunner.kt @@ -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 = suites.flatMap { it.testCasesFiltered } + override val size: Int + get() = testCases.size + + override val testCases: Map = innerSuite.testCases.filter { it.value.matchFilters } + override fun toString() = innerSuite.toString() + } + + private fun filterSuites(): Collection = suites.map { FilteredSuite(it) } fun register(suite: TestSuite) = suites_.add(suite) fun register(suites: Iterable) = 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 {