diff --git a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/GTestLogger.kt b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/GTestLogger.kt index 7f3513e9785..a929d659e35 100644 --- a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/GTestLogger.kt +++ b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/GTestLogger.kt @@ -5,6 +5,9 @@ package kotlin.native.internal.test +import kotlin.experimental.ExperimentalNativeApi + +@ExperimentalNativeApi internal class GTestLogger : TestLoggerWithStatistics() { private val Collection.totalTestsNotIgnored: Int diff --git a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/Launcher.kt b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/Launcher.kt index 29befe90a18..e684921499c 100644 --- a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/Launcher.kt +++ b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/Launcher.kt @@ -7,6 +7,7 @@ package kotlin.native.internal.test +import kotlin.experimental.ExperimentalNativeApi import kotlin.system.exitProcess import kotlin.native.concurrent.* @@ -15,21 +16,24 @@ import kotlin.native.concurrent.* // So we keep this object public but protect it with @ExperimentalStdlibApi // to stress that it is not a part of the stable API. // Related YT issue: KT-47915. -@ExperimentalStdlibApi +@ExperimentalNativeApi @ThreadLocal public object GeneratedSuites { val suites = mutableListOf() fun add(suite: TestSuite) = suites.add(suite) } +@ExperimentalNativeApi public fun registerSuite(suite: TestSuite): Unit { GeneratedSuites.add(suite) } +@ExperimentalNativeApi fun testLauncherEntryPoint(args: Array): Int { return TestRunner(GeneratedSuites.suites, args).run() } +@ExperimentalNativeApi fun main(args: Array) { val exitCode = testLauncherEntryPoint(args) if (exitCode != 0) { @@ -38,6 +42,7 @@ fun main(args: Array) { } @OptIn(FreezingIsDeprecated::class) +@ExperimentalNativeApi fun worker(args: Array) { val worker = Worker.start() val exitCode = worker.execute(TransferMode.SAFE, { args.freeze() }) { @@ -49,6 +54,7 @@ fun worker(args: Array) { } } +@ExperimentalNativeApi fun mainNoExit(args: Array) { testLauncherEntryPoint(args) } diff --git a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/TeamCityLogger.kt b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/TeamCityLogger.kt index 984a0eca6f2..3c5946e1890 100644 --- a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/TeamCityLogger.kt +++ b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/TeamCityLogger.kt @@ -5,8 +5,10 @@ package kotlin.native.internal.test +import kotlin.experimental.ExperimentalNativeApi import kotlin.text.StringBuilder +@ExperimentalNativeApi internal class TeamCityLogger : BaseTestLogger() { private fun String.escapeForTC(): String = StringBuilder(length).apply { diff --git a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/TestListener.kt b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/TestListener.kt index 19eb544a61f..ccdfebefd63 100644 --- a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/TestListener.kt +++ b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/TestListener.kt @@ -5,6 +5,9 @@ package kotlin.native.internal.test +import kotlin.experimental.ExperimentalNativeApi + +@ExperimentalNativeApi internal interface TestListener { fun startTesting(runner: TestRunner) fun finishTesting(runner: TestRunner, timeMillis: Long) @@ -22,6 +25,7 @@ internal interface TestListener { fun ignore(testCase: TestCase) } +@ExperimentalNativeApi internal open class BaseTestListener: TestListener { override fun startTesting(runner: TestRunner) {} override fun finishTesting(runner: TestRunner, timeMillis: Long) {} diff --git a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/TestLogger.kt b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/TestLogger.kt index ac2a5daf096..544e68f37a8 100644 --- a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/TestLogger.kt +++ b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/TestLogger.kt @@ -5,11 +5,15 @@ package kotlin.native.internal.test +import kotlin.experimental.ExperimentalNativeApi + +@ExperimentalNativeApi internal interface TestLogger: TestListener { fun logTestList(runner: TestRunner, suites: Collection) fun log(message: String) } +@ExperimentalNativeApi internal open class BaseTestLogger: BaseTestListener(), TestLogger { override fun log(message: String) = println(message) override fun logTestList(runner: TestRunner, suites: Collection) { @@ -22,6 +26,7 @@ internal open class BaseTestLogger: BaseTestListener(), TestLogger { } } +@ExperimentalNativeApi internal open class TestLoggerWithStatistics: BaseTestLogger() { protected val statistics = MutableTestStatistics() @@ -36,12 +41,14 @@ internal open class TestLoggerWithStatistics: BaseTestLogger() { override fun ignore(testCase: TestCase) = statistics.registerIgnore(testCase) } +@ExperimentalNativeApi internal class SilentTestLogger: BaseTestLogger() { override fun logTestList(runner: TestRunner, suites: Collection) {} override fun log(message: String) {} override fun fail(testCase: TestCase, e: Throwable, timeMillis: Long) = e.printStackTrace() } +@ExperimentalNativeApi internal class SimpleTestLogger: BaseTestLogger() { override fun startTesting(runner: TestRunner) = println("Starting testing") override fun finishTesting(runner: TestRunner, timeMillis: Long) = println("Testing finished") diff --git a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/TestRunner.kt b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/TestRunner.kt index 0751ff3439a..666202a5ff7 100644 --- a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/TestRunner.kt +++ b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/TestRunner.kt @@ -5,12 +5,14 @@ package kotlin.native.internal.test +import kotlin.experimental.ExperimentalNativeApi import kotlin.IllegalArgumentException import kotlin.text.StringBuilder import kotlin.time.TimeSource import kotlin.time.measureTime @OptIn(kotlin.time.ExperimentalTime::class) +@ExperimentalNativeApi internal class TestRunner(val suites: List, args: Array) { private val filters = mutableListOf<(TestCase) -> Boolean>() private val listeners = mutableSetOf() diff --git a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/TestStatistics.kt b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/TestStatistics.kt index c047c13a4cd..646c3dc0c40 100644 --- a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/TestStatistics.kt +++ b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/TestStatistics.kt @@ -5,6 +5,9 @@ package kotlin.native.internal.test +import kotlin.experimental.ExperimentalNativeApi + +@ExperimentalNativeApi internal interface TestStatistics { val total: Int val passed: Int @@ -17,6 +20,7 @@ internal interface TestStatistics { val hasFailedTests: Boolean } +@ExperimentalNativeApi internal class MutableTestStatistics: TestStatistics { override var total: Int = 0; private set diff --git a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/TestSuite.kt b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/TestSuite.kt index 5a9fe5dfc85..59480b6559b 100644 --- a/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/TestSuite.kt +++ b/kotlin-native/runtime/src/main/kotlin/kotlin/native/internal/test/TestSuite.kt @@ -5,10 +5,12 @@ package kotlin.native.internal.test +import kotlin.experimental.ExperimentalNativeApi import kotlin.IllegalArgumentException import kotlin.system.getTimeMillis import kotlin.system.measureTimeMillis +@ExperimentalNativeApi public interface TestCase { val name: String val ignored: Boolean @@ -17,8 +19,10 @@ public interface TestCase { fun run() } +@ExperimentalNativeApi internal val TestCase.prettyName get() = "${suite.name}.$name" +@ExperimentalNativeApi public interface TestSuite { val name: String val ignored: Boolean @@ -29,6 +33,7 @@ public interface TestSuite { fun doAfterClass() } +@ExperimentalNativeApi public enum class TestFunctionKind { BEFORE_TEST, AFTER_TEST, @@ -36,6 +41,7 @@ public enum class TestFunctionKind { AFTER_CLASS } +@ExperimentalNativeApi public abstract class AbstractTestSuite>(override val name: String, override val ignored: Boolean) : TestSuite { override fun toString(): String = name @@ -69,6 +75,7 @@ public abstract class AbstractTestSuite>(override val name: St get() = testCases.size } +@ExperimentalNativeApi public abstract class BaseClassSuite(name: String, ignored: Boolean) : AbstractTestSuite Unit>(name, ignored) { @@ -134,6 +141,7 @@ public abstract class BaseClassSuite(name: String, ignored: private typealias TopLevelFun = () -> Unit +@ExperimentalNativeApi public class TopLevelSuite(name: String): AbstractTestSuite(name, false) { class TestCase(name: String, override val suite: TopLevelSuite, testFunction: TopLevelFun, ignored: Boolean)