diff --git a/libraries/kotlin.test/wasm/js/src/main/kotlin/kotlin/test/ExternalFrameworkAdapter.kt b/libraries/kotlin.test/wasm/js/src/main/kotlin/kotlin/test/ExternalFrameworkAdapter.kt new file mode 100644 index 00000000000..8beadf371ea --- /dev/null +++ b/libraries/kotlin.test/wasm/js/src/main/kotlin/kotlin/test/ExternalFrameworkAdapter.kt @@ -0,0 +1,29 @@ +/* + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package kotlin.test + +internal external interface ExternalFrameworkAdapter : JsAny { + fun suite(name: String, ignored: Boolean, suiteFn: () -> Unit) + fun test(name: String, ignored: Boolean, testFn: () -> JsAny?) +} + +private fun createExternalFrameworkAdapter( + suiteFn: (String, Boolean, () -> Unit) -> Unit, + testFn: (String, Boolean, () -> JsAny?) -> Unit +): ExternalFrameworkAdapter = js("{ return { suite: suiteFn, test: testFn } }") + +private class ExternalAdapterWrapper(private val externalAdapter: ExternalFrameworkAdapter) : FrameworkAdapter { + override fun suite(name: String, ignored: Boolean, suiteFn: () -> Unit) = externalAdapter.suite(name, ignored, suiteFn) + override fun test(name: String, ignored: Boolean, testFn: () -> Any?) = externalAdapter.test(name, ignored, { testFn()?.toJsReference() }) +} + +internal fun FrameworkAdapter.externalize(): ExternalFrameworkAdapter = + createExternalFrameworkAdapter( + suiteFn = this::suite, + testFn = { name, ignored, testFn -> this.test(name, ignored, { testFn() }) } + ) + +internal fun ExternalFrameworkAdapter.internalize(): FrameworkAdapter = ExternalAdapterWrapper(this) diff --git a/libraries/kotlin.test/wasm/js/src/main/kotlin/kotlin/test/JasmineLikeAdapter.kt b/libraries/kotlin.test/wasm/js/src/main/kotlin/kotlin/test/JasmineLikeAdapter.kt index 1af68e5e0bd..3635681332e 100644 --- a/libraries/kotlin.test/wasm/js/src/main/kotlin/kotlin/test/JasmineLikeAdapter.kt +++ b/libraries/kotlin.test/wasm/js/src/main/kotlin/kotlin/test/JasmineLikeAdapter.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -68,25 +68,3 @@ internal class JasmineLikeAdapter : FrameworkAdapter { } } -internal external interface ExternalFrameworkAdapter : JsAny { - fun suite(name: String, ignored: Boolean, suiteFn: () -> Unit) - fun test(name: String, ignored: Boolean, testFn: () -> JsReference?) -} - -private fun createExternalJasmineLikeAdapter( - suiteFn: (String, Boolean, () -> Unit) -> Unit, - testFn: (String, Boolean, () -> JsReference?) -> Unit -): ExternalFrameworkAdapter = js("{ return { suite: suiteFn, test: testFn } }") - -private class ExternalAdapterWrapper(private val externalAdapter: ExternalFrameworkAdapter) : FrameworkAdapter { - override fun suite(name: String, ignored: Boolean, suiteFn: () -> Unit) = externalAdapter.suite(name, ignored, suiteFn) - override fun test(name: String, ignored: Boolean, testFn: () -> Any?) = externalAdapter.test(name, ignored, { testFn()?.toJsReference() }) -} - -internal fun JasmineLikeAdapter.externalize(): ExternalFrameworkAdapter = - createExternalJasmineLikeAdapter( - suiteFn = this::suite, - testFn = { name, ignored, testFn -> this.test(name, ignored, { testFn()?.get() }) } - ) - -internal fun ExternalFrameworkAdapter.internalize(): FrameworkAdapter = ExternalAdapterWrapper(this) diff --git a/libraries/kotlin.test/wasm/js/src/test/kotlin/AdapterTransformerTest.kt b/libraries/kotlin.test/wasm/js/src/test/kotlin/AdapterTransformerTest.kt new file mode 100644 index 00000000000..ffcf25c3ac1 --- /dev/null +++ b/libraries/kotlin.test/wasm/js/src/test/kotlin/AdapterTransformerTest.kt @@ -0,0 +1,51 @@ +/* + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package kotlin.test.tests + +import kotlin.test.* + +private fun wrapAdapter(externalAdapter: ExternalFrameworkAdapter): ExternalFrameworkAdapter = js("""{ + return { + suite: (name, ignored, suiteFn) => externalAdapter.suite(name, ignored, suiteFn), + test: (name, ignored, testFn) => externalAdapter.test(name, ignored, () => 'overridden') + }; +}""") + +private class TestAdapter : FrameworkAdapter { + var testResult: Any? = null + override fun suite(name: String, ignored: Boolean, suiteFn: () -> Unit) = suiteFn() + override fun test(name: String, ignored: Boolean, testFn: () -> Any?) { testResult = testFn() } +} + +class AdapterTransformerTest { + @Test + fun loopAround() { + val frameworkAdapter = TestAdapter() + + val adapter = frameworkAdapter.externalize().internalize() + adapter.test("someTest", false) { "abc".toJsString() } + check(frameworkAdapter.testResult !is String) + check(frameworkAdapter.testResult.toString() == "abc") + + adapter.test("someTest", false) { "abc" } + check(frameworkAdapter.testResult is String) + check(frameworkAdapter.testResult == "abc") + + adapter.test("someTest", false) { 42 } + check(frameworkAdapter.testResult is Int) + check(frameworkAdapter.testResult == 42) + } + + @Test + fun wrappedAdapter() { + val adapter = TestAdapter() + + val roundTripAdapter = wrapAdapter(adapter.externalize()).internalize() + roundTripAdapter.test("someTest", false) { "abc".toJsString() } + check(adapter.testResult !is String) + check(adapter.testResult.toString() == "overridden") + } +} \ No newline at end of file