diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b760a8d2..d384f3175 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ Changes to Calva. ## [Unreleased] +- [Test runner does not show stacktrace on error](https://github.com/BetterThanTomorrow/calva/issues/424) + ## [2.0.307] - 2022-10-11 - [Support user level `~/.config/calva/config.edn`](https://github.com/BetterThanTomorrow/calva/issues/1887) diff --git a/src/nrepl/index.ts b/src/nrepl/index.ts index 945ebc85b..af01cde6a 100644 --- a/src/nrepl/index.ts +++ b/src/nrepl/index.ts @@ -515,6 +515,24 @@ export class NReplSession { }); } + testStacktrace(ns: string, test: string, index: number) { + return new Promise((resolve, reject) => { + let id = this.client.nextId; + this.messageHandlers[id] = (msg) => { + resolve(msg); + return true; + }; + this.client.write({ + op: 'test-stacktrace', + id, + session: this.sessionId, + ns, + var: test, + index: index, + }); + }); + } + testNs(ns: string) { return this.testVarQuery({ 'ns-query': { diff --git a/src/testRunner.ts b/src/testRunner.ts index 0c3195d63..4f2ff5e0c 100644 --- a/src/testRunner.ts +++ b/src/testRunner.ts @@ -168,7 +168,7 @@ function useTestExplorer(): boolean | undefined { return vscode.workspace.getConfiguration('calva').get('useTestExplorer'); } -function reportTests( +async function reportTests( controller: vscode.TestController, session: NReplSession, possibleResults: cider.TestResults[] @@ -208,7 +208,15 @@ function reportTests( cider.cleanUpWhiteSpace(a); const messages = cider.detailedMessage(a); - if (messages) { + + if (a.type == 'error') { + const stackTrace = await session.testStacktrace(ns, test, a.index); + + outputWindow.saveStacktrace(stackTrace.stacktrace); + outputWindow.append(messages, (_, afterResultLocation) => { + outputWindow.markLastStacktraceRange(afterResultLocation); + }); + } else if (messages) { outputWindow.append(messages); }