diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KotlinKarma.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KotlinKarma.kt index 1c51e514044..1a5974fff0e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KotlinKarma.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KotlinKarma.kt @@ -352,8 +352,9 @@ class KotlinKarma(override val compilation: KotlinJsCompilation) : KotlinJsTestF override fun processStackTrace(stackTrace: String): String { return stackTrace.lines() + .map(::processName) .joinToString("\n") { line -> - val index = line.indexOf(KARMA_SOURCE_MAP_DELIMETER) + val index = line.indexOf(KARMA_SOURCE_MAP_DELIMITER) if (index == -1) line else @@ -364,6 +365,31 @@ class KotlinKarma(override val compilation: KotlinJsCompilation) : KotlinJsTestF } + private fun processName(line: String): String { + // example: "at MyTest../kotlin/check-js-test-test.js.MyTest.foo (/src/test/kotlin/MyTest.kt:7:8)" + // should be "at MyTest.foo (/src/test/kotlin/MyTest.kt:7:8)" + val stackTraceDelimiter = line.indexOf(STACK_TRACE_DELIMITER) + val webpackLocalDelimiter = line.indexOf(WEBPACK_LOCAL_DELIMITER) + if (stackTraceDelimiter == -1 || webpackLocalDelimiter == -1) { + return line + } + + val traceStartIndex = stackTraceDelimiter + STACK_TRACE_DELIMITER.length + val name = line.substring( + traceStartIndex, + webpackLocalDelimiter + ) // MyTest + val fileStart = line.indexOf("(") + val fullJsName = line.substring(webpackLocalDelimiter, fileStart) // ../kotlin/check-js-test-test.js.MyTest.foo + + val nameIndex = fullJsName.indexOf(name) + if (nameIndex == -1) { + return line + } + + return line.replaceRange(traceStartIndex, fileStart, fullJsName.substring(nameIndex)) + } + override fun getSuiteName(message: BaseTestSuiteMessage): String { val src = message.suiteName.trim() // example: "sample.a DeepPackageTest Inner.HeadlessChrome 74.0.3729 (Mac OS X 10.14.4)" @@ -420,7 +446,10 @@ class KotlinKarma(override val compilation: KotlinJsCompilation) : KotlinJsTestF const val CHROME_CANARY_BIN = "CHROME_CANARY_BIN" const val WEBPACK_PROTOCOL = "webpack://" - const val KARMA_SOURCE_MAP_DELIMETER = " <-" + const val KARMA_SOURCE_MAP_DELIMITER = " <-" + + const val STACK_TRACE_DELIMITER = "at " + const val WEBPACK_LOCAL_DELIMITER = ".." val KARMA_PROBLEM = "(?m)^.*\\d{2} \\d{2} \\d{4,} \\d{2}:\\d{2}:\\d{2}.\\d{3}:(ERROR|WARN) \\[.*]: (.*)\$".toRegex() }