Skip to content
This repository has been archived by the owner on May 24, 2024. It is now read-only.

Commit

Permalink
Merge pull request #8 from MarkusAmshove/publish-assertions-failure-d…
Browse files Browse the repository at this point in the history
…iagnostics

Publish assertion failures also as diagnostic
  • Loading branch information
MarkusAmshove committed Nov 22, 2023
2 parents d9d471e + 7852a3c commit 8e4c3ef
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 2 deletions.
4 changes: 3 additions & 1 deletion src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@ import { testData, NatUnitTestCase, NatUnitTest, testToTestCase } from './natuni
import { NatUnitCodeLensProvider } from './natunit/codelenses';

let natparmItem: vscode.StatusBarItem;
let diagnostics: vscode.DiagnosticCollection;

export async function activate(context: vscode.ExtensionContext) {
const ctrl = vscode.tests.createTestController('natunitTestController', 'NatUnit');
context.subscriptions.push(ctrl);

const hasDebugCapabilities = await canDebugTests();

diagnostics = vscode.languages.createDiagnosticCollection('NatUnit');
context.subscriptions.push(vscode.languages.registerCodeLensProvider('natural', new NatUnitCodeLensProvider(hasDebugCapabilities)));

context.subscriptions.push(vscode.workspace.onDidChangeConfiguration(e => {
Expand Down Expand Up @@ -240,7 +242,7 @@ function createRunHandler(ctrl: vscode.TestController, isDebug: boolean) {
const folders = vscode.workspace.workspaceFolders;
await vscode.debug.startDebugging(folders ? folders[0] : undefined, debugConfig(data.path));
} else {
await data.run(run, natparm);
await data.run(run, natparm, diagnostics);
}
}

Expand Down
42 changes: 41 additions & 1 deletion src/natunit/testTree.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ import { natunitConfig } from './config';
const textDecoder = new TextDecoder('utf-8');

export type NatUnitTestData = NatUnitTestCase | NatUnitTest;
type NatUnitDiagnostic = {
line: number;
message: string;
}

Check warning on line 16 in src/natunit/testTree.ts

View workflow job for this annotation

GitHub Actions / build

Missing semicolon

export const testData = new WeakMap<vscode.TestItem, NatUnitTestData>();
export const testToTestCase = new WeakMap<vscode.TestItem, NatUnitTestCase>();
Expand Down Expand Up @@ -84,13 +88,16 @@ export class NatUnitTestCase {
ascend(0); // finish and assign children for all remaining items
}

async run(testRun: vscode.TestRun, natparm: string): Promise<void> {
async run(testRun: vscode.TestRun, natparm: string, diagnostics: vscode.DiagnosticCollection): Promise<void> {
const splittedPath = this.tests[0].uri?.path.split('/')

Check warning on line 92 in src/natunit/testTree.ts

View workflow job for this annotation

GitHub Actions / build

Missing semicolon
if(!splittedPath) {
this.tests.forEach(t => testRun.skipped(t));
return;
}

const testCaseUri = vscode.Uri.file(this.path);
diagnostics.delete(testCaseUri);

const testCaseName = splittedPath.pop()!.replace(".NSN", "");
const testFileLibrary = splittedPath[splittedPath.indexOf('Natural-Libraries') + 1];

Expand All @@ -114,6 +121,7 @@ export class NatUnitTestCase {
await new Promise((resolve, _) => testProcess.on('close', resolve));

const resultFiles = await vscode.workspace.findFiles(`build/test-results/natunit/${natparm}/${testFileLibrary}-${testCaseName}.xml`);
let newDiagnostics : NatUnitDiagnostic[] = [];
for (let resultFile of resultFiles) {
const suiteResult = await this.parseTestResults(resultFile.fsPath);
const reportResult = this.extractResults(suiteResult.testcase);
Expand All @@ -124,21 +132,53 @@ export class NatUnitTestCase {
testRun.skipped(test);
continue;
}

if(result.failure) {
testRun.failed(test, {
message: result.failure._message,
...this.parseFailure(result.failure._message)
}, result._time);
const diagnostic = this.extractDiagnostic(result.failure._message);
if(diagnostic) {
newDiagnostics.push(diagnostic);
}
continue;
}
if(result.error) {
testRun.errored(test, {
message: result.error._message,
});
const diagnostic = this.extractDiagnostic(result.error._message);
if(diagnostic) {
newDiagnostics.push(diagnostic);
}
continue;
}

testRun.passed(test, result._time * 1000);
}
}

const document = await vscode.workspace.openTextDocument(testCaseUri);
const diagnosticsToPublish = newDiagnostics.map(d => new vscode.Diagnostic(
document.lineAt(d.line).range,
d.message,
vscode.DiagnosticSeverity.Error
));
diagnostics.set(testCaseUri, diagnosticsToPublish);
}

private extractDiagnostic(message: string) : NatUnitDiagnostic | undefined {
const lineNumberRegex = new RegExp(`^\\s*${this.name}\\s*\\((\\d+)\\)`);
const matches = lineNumberRegex.exec(message);
if (matches && matches.length > 0) {
const linenumber = Number.parseInt(matches[1]);
const actualLinenumber = linenumber + 3; // Natural +4 but zero based
return {
line: actualLinenumber,
message: message,
};
}
}

private parseFailure(failureMessage: string) : {actualOutput: string, expectedOutput: string} {
Expand Down

0 comments on commit 8e4c3ef

Please sign in to comment.