[Wasm] Fix invalid value passing through externalized FrameworkAdapter
Fixed #KT-66440
This commit is contained in:
committed by
Space Team
parent
29efe8645c
commit
c8f84a74b9
@@ -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)
|
||||||
@@ -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.
|
* 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<Any>?)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createExternalJasmineLikeAdapter(
|
|
||||||
suiteFn: (String, Boolean, () -> Unit) -> Unit,
|
|
||||||
testFn: (String, Boolean, () -> JsReference<Any>?) -> 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)
|
|
||||||
|
|||||||
@@ -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")
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user