[Wasm] Add JS interop tests
This commit is contained in:
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.js.test.es6.semantics.AbstractIrJsTypeScriptExportES
|
||||
import org.jetbrains.kotlin.js.test.ir.semantics.*
|
||||
import org.jetbrains.kotlin.js.test.semantics.*
|
||||
import org.jetbrains.kotlin.js.test.wasm.semantics.AbstractIrCodegenBoxWasmTest
|
||||
import org.jetbrains.kotlin.js.test.wasm.semantics.AbstractIrCodegenWasmJsInteropWasmTest
|
||||
import org.jetbrains.kotlin.test.TargetBackend
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
@@ -111,6 +112,14 @@ fun main(args: Array<String>) {
|
||||
)
|
||||
}
|
||||
|
||||
testClass<AbstractIrCodegenWasmJsInteropWasmTest> {
|
||||
model("codegen/boxWasmJsInterop", targetBackend = TargetBackend.WASM)
|
||||
}
|
||||
|
||||
testClass<AbstractIrCodegenWasmJsInteropJsTest> {
|
||||
model("codegen/boxWasmJsInterop", targetBackend = TargetBackend.JS_IR)
|
||||
}
|
||||
|
||||
testClass<AbstractIrJsCodegenBoxES6Test> {
|
||||
model("codegen/box", targetBackend = TargetBackend.JS_IR_ES6, excludeDirs = jvmOnlyBoxTests)
|
||||
}
|
||||
|
||||
@@ -257,14 +257,27 @@ abstract class BasicBoxTest(
|
||||
val additionalCommonFiles = additionalCommonFileDirectories.flatMap { baseDir ->
|
||||
JsTestUtils.getFilesInDirectoryByExtension(baseDir + "/", JavaScript.EXTENSION)
|
||||
}
|
||||
val inputJsFiles = inputFiles
|
||||
.filter { it.fileName.endsWith(".js") }
|
||||
.map { inputJsFile ->
|
||||
val sourceFile = File(inputJsFile.fileName)
|
||||
val targetFile = File(outputDir, inputJsFile.module.outputFileSimpleName() + "-js-" + sourceFile.name)
|
||||
FileUtil.copy(File(inputJsFile.fileName), targetFile)
|
||||
targetFile.absolutePath
|
||||
|
||||
val inputJsFilesBefore = mutableListOf<String>()
|
||||
val inputJsFilesAfter = mutableListOf<String>()
|
||||
|
||||
fun copyInputJsFile(inputJsFile: TestFile): String {
|
||||
val sourceFile = File(inputJsFile.fileName)
|
||||
val targetFile = File(outputDir, inputJsFile.module.outputFileSimpleName() + "-js-" + sourceFile.name)
|
||||
FileUtil.copy(File(inputJsFile.fileName), targetFile)
|
||||
return targetFile.absolutePath
|
||||
}
|
||||
|
||||
inputFiles.forEach {
|
||||
val name = it.fileName
|
||||
when {
|
||||
name.endsWith("__after.js") ->
|
||||
inputJsFilesAfter += copyInputJsFile(it)
|
||||
|
||||
name.endsWith(".js") ->
|
||||
inputJsFilesBefore += copyInputJsFile(it)
|
||||
}
|
||||
}
|
||||
|
||||
val additionalFiles = mutableListOf<String>()
|
||||
|
||||
@@ -288,23 +301,23 @@ abstract class BasicBoxTest(
|
||||
additionalMainFiles += additionalMainJsFile
|
||||
}
|
||||
|
||||
val allJsFiles = additionalFiles + inputJsFiles + generatedJsFiles.map { it.first } + globalCommonFiles + localCommonFiles +
|
||||
additionalCommonFiles + additionalMainFiles
|
||||
val allJsFiles = additionalFiles + inputJsFilesBefore + generatedJsFiles.map { it.first } + globalCommonFiles + localCommonFiles +
|
||||
additionalCommonFiles + additionalMainFiles + inputJsFilesAfter
|
||||
|
||||
val dceAllJsFiles = additionalFiles + inputJsFiles + generatedJsFiles.map {
|
||||
val dceAllJsFiles = additionalFiles + inputJsFilesBefore + generatedJsFiles.map {
|
||||
it.first.replace(
|
||||
outputDir.absolutePath,
|
||||
dceOutputDir.absolutePath
|
||||
)
|
||||
} + globalCommonFiles + localCommonFiles + additionalCommonFiles + additionalMainFiles
|
||||
} + globalCommonFiles + localCommonFiles + additionalCommonFiles + additionalMainFiles + inputJsFilesAfter
|
||||
|
||||
val pirAllJsFiles = additionalFiles + inputJsFiles + generatedJsFiles.map {
|
||||
val pirAllJsFiles = additionalFiles + inputJsFilesBefore + generatedJsFiles.map {
|
||||
it.first.replace(
|
||||
outputDir.absolutePath,
|
||||
pirOutputDir.absolutePath
|
||||
)
|
||||
} +
|
||||
globalCommonFiles + localCommonFiles + additionalCommonFiles + additionalMainFiles
|
||||
globalCommonFiles + localCommonFiles + additionalCommonFiles + additionalMainFiles + inputJsFilesAfter
|
||||
|
||||
|
||||
val dontRunGeneratedCode =
|
||||
|
||||
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.ir.backend.js.MainModule
|
||||
import org.jetbrains.kotlin.ir.backend.js.ModulesStructure
|
||||
import org.jetbrains.kotlin.ir.backend.js.loadKlib
|
||||
import org.jetbrains.kotlin.ir.backend.js.prepareAnalyzedSourceModule
|
||||
import org.jetbrains.kotlin.ir.backend.js.utils.sanitizeName
|
||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
|
||||
import org.jetbrains.kotlin.js.config.JsConfig
|
||||
import org.jetbrains.kotlin.js.facade.TranslationUnit
|
||||
@@ -65,11 +66,27 @@ abstract class BasicWasmBoxTest(
|
||||
val outputWatFile = outputFileBase + ".wat"
|
||||
val outputWasmFile = outputFileBase + ".wasm"
|
||||
val outputJsFile = outputFileBase + ".js"
|
||||
|
||||
val languageVersionSettings = inputFiles.mapNotNull { it.languageVersionSettings }.firstOrNull()
|
||||
|
||||
val kotlinFiles = inputFiles.filter { it.fileName.endsWith(".kt") }
|
||||
val psiFiles = createPsiFiles(kotlinFiles.map { File(it.fileName).canonicalPath }.sorted())
|
||||
val kotlinFiles = mutableListOf<String>()
|
||||
val jsFilesBefore = mutableListOf<String>()
|
||||
val jsFilesAfter = mutableListOf<String>()
|
||||
|
||||
inputFiles.forEach {
|
||||
val name = it.fileName
|
||||
when {
|
||||
name.endsWith(".kt") ->
|
||||
kotlinFiles += name
|
||||
|
||||
name.endsWith("__after.js") ->
|
||||
jsFilesAfter += name
|
||||
|
||||
name.endsWith(".js") ->
|
||||
jsFilesBefore += name
|
||||
}
|
||||
}
|
||||
|
||||
val psiFiles = createPsiFiles(kotlinFiles.map { File(it).canonicalPath }.sorted())
|
||||
val config = createConfig(languageVersionSettings)
|
||||
translateFiles(
|
||||
file,
|
||||
@@ -87,7 +104,9 @@ abstract class BasicWasmBoxTest(
|
||||
"--experimental-wasm-typed-funcref",
|
||||
"--experimental-wasm-gc",
|
||||
"--experimental-wasm-eh",
|
||||
outputJsFile
|
||||
*jsFilesBefore.toTypedArray(),
|
||||
outputJsFile,
|
||||
*jsFilesAfter.toTypedArray(),
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -162,6 +181,8 @@ abstract class BasicWasmBoxTest(
|
||||
const wasmBinary = read(String.raw`${outputWasmFile.absoluteFile}`, 'binary');
|
||||
const wasmModule = new WebAssembly.Module(wasmBinary);
|
||||
wasmInstance = new WebAssembly.Instance(wasmModule, { runtime, js_code });
|
||||
|
||||
const ${sanitizeName(config.moduleId)} = wasmInstance.exports;
|
||||
|
||||
const actualResult = importStringFromWasm(wasmInstance.exports.$testFunction());
|
||||
if (actualResult !== "OK")
|
||||
@@ -215,7 +236,7 @@ abstract class BasicWasmBoxTest(
|
||||
|
||||
companion object {
|
||||
const val TEST_DATA_DIR_PATH = "js/js.translator/testData/"
|
||||
const val TEST_MODULE = "WASM_TESTS"
|
||||
const val TEST_MODULE = "main"
|
||||
private const val TEST_FUNCTION = "box"
|
||||
}
|
||||
}
|
||||
|
||||
+6
@@ -24,6 +24,12 @@ abstract class AbstractJsCodegenInlineTest : BasicBoxTest(
|
||||
"codegen/boxInline"
|
||||
)
|
||||
|
||||
abstract class AbstractIrCodegenWasmJsInteropJsTest : BasicBoxTest(
|
||||
"compiler/testData/codegen/wasmJsInterop",
|
||||
"codegen/wasmJsInteropWasm"
|
||||
)
|
||||
|
||||
|
||||
abstract class AbstractJsLegacyPrimitiveArraysBoxTest : BasicBoxTest(
|
||||
"compiler/testData/codegen/box/arrays/",
|
||||
"codegen/box/arrays-legacy-primitivearrays/",
|
||||
|
||||
+5
@@ -10,4 +10,9 @@ import org.jetbrains.kotlin.js.test.BasicWasmBoxTest
|
||||
abstract class AbstractIrCodegenBoxWasmTest : BasicWasmBoxTest(
|
||||
"compiler/testData/codegen/box/",
|
||||
"codegen/wasmBox/"
|
||||
)
|
||||
|
||||
abstract class AbstractIrCodegenWasmJsInteropWasmTest : BasicWasmBoxTest(
|
||||
"compiler/testData/codegen/wasmJsInterop",
|
||||
"codegen/wasmJsInteropJs"
|
||||
)
|
||||
Reference in New Issue
Block a user