diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/mocha/KotlinMocha.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/mocha/KotlinMocha.kt index df60c46bfb5..44175ac5fe4 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/mocha/KotlinMocha.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/mocha/KotlinMocha.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTestFramework import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinTestRunnerCliArgs +import java.io.File class KotlinMocha(override val compilation: KotlinJsCompilation) : KotlinJsTestFramework { private val project: Project = compilation.target.project @@ -59,19 +60,31 @@ class KotlinMocha(override val compilation: KotlinJsCompilation) : KotlinJsTestF exclude = task.excludePatterns ) - createAdapterJs(task) - val mocha = npmProject.require("mocha/bin/mocha") - val adapter = npmProject.require("./$ADAPTER_NODEJS") + + val file = task.nodeModulesToLoad + .map { npmProject.require(it) } + .single() + + val adapter = createAdapterJs(file, debug) val args = mutableListOf( "--require", npmProject.require("source-map-support/register.js") - ).apply { + if (debug) { + // Idle run of tests to load file with source maps to enable break points + add("--require") + add( + npmProject.require("kotlin-test-js-runner/kotlin-test-nodejs-idle-runner.js") + ) + add("--require") + add(file) + + add("--inspect-brk") + } add(mocha) - addAll(cliArg("--inspect-brk", debug)) - add(adapter) + add(adapter.canonicalPath) addAll(cliArgs.toList()) addAll(cliArg("--reporter", "kotlin-test-js-runner/mocha-kotlin-reporter.js")) addAll(cliArg("--timeout", timeout)) @@ -85,27 +98,33 @@ class KotlinMocha(override val compilation: KotlinJsCompilation) : KotlinJsTestF ) } - private fun cliArg(cli: String, value: Boolean): List { - return if (value) listOf(cli) else emptyList() - } - private fun cliArg(cli: String, value: String?): List { return value?.let { listOf(cli, it) } ?: emptyList() } - private fun createAdapterJs(task: KotlinJsTest) { + private fun createAdapterJs( + file: String, + debug: Boolean + ): File { val npmProject = compilation.npmProject - val file = task.nodeModulesToLoad - .map { npmProject.require(it) } - .single() val adapterJs = npmProject.dir.resolve(ADAPTER_NODEJS) adapterJs.printWriter().use { writer -> val adapter = npmProject.require("kotlin-test-js-runner/kotlin-test-nodejs-runner.js") + val escapedFile = file.jsQuoted() + + if (debug) { + // Invalidate caches after idle run + writer.println("delete require.cache[require.resolve($escapedFile)]") + writer.println("delete require.cache[require.resolve('kotlin-test')]") + } + writer.println("require(${adapter.jsQuoted()})") - writer.println("module.exports = require(${file.jsQuoted()})") + writer.println("module.exports = require($escapedFile)") } + + return adapterJs } companion object { diff --git a/libraries/tools/kotlin-test-js-runner/build.gradle.kts b/libraries/tools/kotlin-test-js-runner/build.gradle.kts index e4518f67863..48a27ebe27d 100644 --- a/libraries/tools/kotlin-test-js-runner/build.gradle.kts +++ b/libraries/tools/kotlin-test-js-runner/build.gradle.kts @@ -51,6 +51,7 @@ tasks { inputs.dir("src") inputs.files( "nodejs.ts", + "nodejs-idle.ts", "karma.ts", "karma-kotlin-reporter.js", "karma-debug-runner.js", diff --git a/libraries/tools/kotlin-test-js-runner/nodejs-idle.ts b/libraries/tools/kotlin-test-js-runner/nodejs-idle.ts new file mode 100755 index 00000000000..5d4a45fbe62 --- /dev/null +++ b/libraries/tools/kotlin-test-js-runner/nodejs-idle.ts @@ -0,0 +1,15 @@ +import {KotlinTestRunner} from "./src/KotlinTestRunner"; + +const kotlin_test = require('kotlin-test'); + +const nothingTest: KotlinTestRunner = { + suite(name: string, isIgnored: boolean, fn: () => void): void { + console.error("suite", name) + }, + test(name: string, isIgnored: boolean, fn: () => void): void { + console.error("test", name) + + } +}; + +kotlin_test.setAdapter(nothingTest); \ No newline at end of file diff --git a/libraries/tools/kotlin-test-js-runner/rollup.config.js b/libraries/tools/kotlin-test-js-runner/rollup.config.js index b0e8871231e..ddde86ca9ce 100644 --- a/libraries/tools/kotlin-test-js-runner/rollup.config.js +++ b/libraries/tools/kotlin-test-js-runner/rollup.config.js @@ -16,6 +16,16 @@ export default [ }, plugins: plugins() }, + { + input: './nodejs-idle.ts', + output: { + file: 'lib/kotlin-test-nodejs-idle-runner.js', + format: 'cjs', + banner: '#!/usr/bin/env node', + sourcemap: true + }, + plugins: plugins() + }, { input: './karma.ts', output: {