feat(logging): Improve logging output, CLI option parsing, and test report formatting.

This commit is contained in:
2025-05-15 16:39:46 +00:00
parent 3fc4cee2b1
commit 78ffad2f7d
9 changed files with 644 additions and 168 deletions

View File

@@ -7,6 +7,7 @@ import { coloredString as cs } from '@push.rocks/consolecolor';
import * as plugins from './tstest.plugins.js';
import { TapTestResult } from './tstest.classes.tap.testresult.js';
import * as logPrefixes from './tstest.logprefixes.js';
import { TsTestLogger } from './tstest.logging.js';
export class TapParser {
testStore: TapTestResult[] = [];
@@ -19,11 +20,15 @@ export class TapParser {
activeTapTestResult: TapTestResult;
pretaskRegex = /^::__PRETASK:(.*)$/;
private logger: TsTestLogger;
/**
* the constructor for TapParser
*/
constructor(public fileName: string) {}
constructor(public fileName: string, logger?: TsTestLogger) {
this.logger = logger;
}
private _getNewTapTestResult() {
this.activeTapTestResult = new TapTestResult(this.testStore.length + 1);
@@ -45,9 +50,9 @@ export class TapParser {
logLineIsTapProtocol = true;
const regexResult = this.expectedTestsRegex.exec(logLine);
this.expectedTests = parseInt(regexResult[2]);
console.log(
`${logPrefixes.TapPrefix} ${cs(`Expecting ${this.expectedTests} tests!`, 'blue')}`
);
if (this.logger) {
this.logger.tapOutput(`Expecting ${this.expectedTests} tests!`);
}
// initiating first TapResult
this._getNewTapTestResult();
@@ -55,7 +60,9 @@ export class TapParser {
logLineIsTapProtocol = true;
const pretaskContentMatch = this.pretaskRegex.exec(logLine);
if (pretaskContentMatch && pretaskContentMatch[1]) {
console.log(`${logPrefixes.TapPretaskPrefix} Pretask ->${pretaskContentMatch[1]}: Success.`);
if (this.logger) {
this.logger.tapOutput(`Pretask -> ${pretaskContentMatch[1]}: Success.`);
}
}
} else if (this.testStatusRegex.test(logLine)) {
logLineIsTapProtocol = true;
@@ -73,26 +80,20 @@ export class TapParser {
// test for protocol error
if (testId !== this.activeTapTestResult.id) {
console.log(
`${logPrefixes.TapErrorPrefix} Something is strange! Test Ids are not equal!`
);
if (this.logger) {
this.logger.error('Something is strange! Test Ids are not equal!');
}
}
this.activeTapTestResult.setTestResult(testOk);
if (testOk) {
console.log(
logPrefixes.TapPrefix,
`${cs(`T${testId} ${plugins.figures.tick}`, 'green')} ${plugins.figures.arrowRight} ` +
cs(testSubject, 'blue') +
` | ${cs(`${testDuration} ms`, 'orange')}`
);
if (this.logger) {
this.logger.testResult(testSubject, true, testDuration);
}
} else {
console.log(
logPrefixes.TapPrefix,
`${cs(`T${testId} ${plugins.figures.cross}`, 'red')} ${plugins.figures.arrowRight} ` +
cs(testSubject, 'blue') +
` | ${cs(`${testDuration} ms`, 'orange')}`
);
if (this.logger) {
this.logger.testResult(testSubject, false, testDuration);
}
}
}
@@ -100,7 +101,9 @@ export class TapParser {
if (this.activeTapTestResult) {
this.activeTapTestResult.addLogLine(logLine);
}
console.log(logLine);
if (this.logger) {
this.logger.tapOutput(logLine);
}
}
if (this.activeTapTestResult && this.activeTapTestResult.testSettled) {
@@ -172,38 +175,32 @@ export class TapParser {
// check wether all tests ran
if (this.expectedTests === this.receivedTests) {
console.log(
`${logPrefixes.TapPrefix} ${cs(
`${this.receivedTests} out of ${this.expectedTests} Tests completed!`,
'green'
)}`
);
if (this.logger) {
this.logger.tapOutput(`${this.receivedTests} out of ${this.expectedTests} Tests completed!`);
}
} else {
console.log(
`${logPrefixes.TapErrorPrefix} ${cs(
`Only ${this.receivedTests} out of ${this.expectedTests} completed!`,
'red'
)}`
);
if (this.logger) {
this.logger.error(`Only ${this.receivedTests} out of ${this.expectedTests} completed!`);
}
}
if (!this.expectedTests) {
console.log(cs('Error: No tests were defined. Therefore the testfile failed!', 'red'));
if (this.logger) {
this.logger.error('No tests were defined. Therefore the testfile failed!');
}
} else if (this.expectedTests !== this.receivedTests) {
console.log(
cs(
'Error: The amount of received tests and expectedTests is unequal! Therefore the testfile failed',
'red'
)
);
if (this.logger) {
this.logger.error('The amount of received tests and expectedTests is unequal! Therefore the testfile failed');
}
} else if (this.getErrorTests().length === 0) {
console.log(`${logPrefixes.TapPrefix} ${cs(`All tests are successfull!!!`, 'green')}`);
if (this.logger) {
this.logger.tapOutput('All tests are successfull!!!');
this.logger.testFileEnd(this.receivedTests, 0, 0);
}
} else {
console.log(
`${logPrefixes.TapPrefix} ${cs(
`${this.getErrorTests().length} tests threw an error!!!`,
'red'
)}`
);
if (this.logger) {
this.logger.tapOutput(`${this.getErrorTests().length} tests threw an error!!!`, true);
this.logger.testFileEnd(this.receivedTests - this.getErrorTests().length, this.getErrorTests().length, 0);
}
}
}
}