diff --git a/selfie-runner-junit5/src/test/kotlin/com/diffplug/selfie/junit5/Harness.kt b/selfie-runner-junit5/src/test/kotlin/com/diffplug/selfie/junit5/Harness.kt index 1980958f..56301dd2 100644 --- a/selfie-runner-junit5/src/test/kotlin/com/diffplug/selfie/junit5/Harness.kt +++ b/selfie-runner-junit5/src/test/kotlin/com/diffplug/selfie/junit5/Harness.kt @@ -16,7 +16,6 @@ package com.diffplug.selfie.junit5 import io.kotest.matchers.shouldBe -import java.io.StringReader import java.util.regex.Matcher import java.util.regex.Pattern import javax.xml.parsers.DocumentBuilderFactory @@ -194,7 +193,7 @@ open class Harness(subproject: String) { buildLauncher.run() return null } catch (e: BuildException) { - return parseBuildException(task) + return parseBuildException(task, e) } } @@ -204,27 +203,32 @@ open class Harness(subproject: String) { * * Parses the exception message as well as stacktrace. */ - private fun parseBuildException(task: String): AssertionFailedError { - val xmlFile = + private fun parseBuildException(task: String, e: BuildException): AssertionFailedError { + val xpFactory = XPathFactory.newInstance() + val xPath = xpFactory.newXPath() + val failure = subprojectFolder .resolve("build") .resolve("test-results") .resolve(task) - .resolve("TEST-" + task.lowercase() + ".junit5.UT_" + javaClass.simpleName + ".xml") - val xml = FileSystem.SYSTEM.read(xmlFile) { readUtf8() } - val dbFactory = DocumentBuilderFactory.newInstance() - val dBuilder = dbFactory.newDocumentBuilder() - val xmlInput = InputSource(StringReader(xml)) - val doc = dBuilder.parse(xmlInput) - val xpFactory = XPathFactory.newInstance() - val xPath = xpFactory.newXPath() - - // Value1 - val xpath = "/testsuite/testcase/failure" - val failures = xPath.evaluate(xpath, doc, XPathConstants.NODESET) as NodeList - val failure = failures.item(0) - val type = failure.attributes.getNamedItem("type").nodeValue - val message = failure.attributes.getNamedItem("message").nodeValue.replace(" ", "\n") + .toFile() + .walkTopDown() + .filter { it.isFile && it.name.endsWith(".xml") } + .mapNotNull { + val dbFactory = DocumentBuilderFactory.newInstance() + val dBuilder = dbFactory.newDocumentBuilder() + it.inputStream().use { source -> dBuilder.parse(InputSource(source)) } + } + .mapNotNull { + val xpath = "/testsuite/testcase/failure" + val failures = xPath.evaluate(xpath, it, XPathConstants.NODESET) as NodeList + failures.item(0) + } + .firstOrNull() + ?: return AssertionFailedError("Unable to find exception: " + e.stackTraceToString()) + val attributes = failure!!.attributes + val type = attributes.getNamedItem("type").nodeValue + val message = attributes.getNamedItem("message").nodeValue.replace(" ", "\n") val lines = failure.textContent.replace(message, "").trim().split("\n") val stacktrace: MutableList = ArrayList() val tracePattern = diff --git a/selfie-runner-junit5/src/test/kotlin/com/diffplug/selfie/junit5/WithinMethodGCTest.kt b/selfie-runner-junit5/src/test/kotlin/com/diffplug/selfie/junit5/WithinMethodGCTest.kt index cafcbb27..ab05eeca 100644 --- a/selfie-runner-junit5/src/test/kotlin/com/diffplug/selfie/junit5/WithinMethodGCTest.kt +++ b/selfie-runner-junit5/src/test/kotlin/com/diffplug/selfie/junit5/WithinMethodGCTest.kt @@ -101,5 +101,17 @@ class WithinMethodGCTest : Harness("undertest-junit5") { ut_mirror().lineWith("root").uncomment() ut_mirror().lineWith("selfie2()").commentOut() ut_mirror().lineWith("selfie()").uncomment() + gradleWriteSS() + ut_snapshot() + .assertContent( + """ + ╔═ selfie ═╗ + root + ╔═ selfie/leaf ═╗ + maple + ╔═ [end of file] ═╗ + + """ + .trimIndent()) } } diff --git a/undertest-junit5/src/test/kotlin/undertest/junit5/__snapshots__/UT_WithinMethodGCTest.ss b/undertest-junit5/src/test/kotlin/undertest/junit5/__snapshots__/UT_WithinMethodGCTest.ss index 1dd2c432..aed42119 100644 --- a/undertest-junit5/src/test/kotlin/undertest/junit5/__snapshots__/UT_WithinMethodGCTest.ss +++ b/undertest-junit5/src/test/kotlin/undertest/junit5/__snapshots__/UT_WithinMethodGCTest.ss @@ -1,3 +1,5 @@ -╔═ selfie2/leaf ═╗ +╔═ selfie ═╗ +root +╔═ selfie/leaf ═╗ maple ╔═ [end of file] ═╗