feat(logging): Improve logging output, CLI option parsing, and test report formatting.
This commit is contained in:
		| @@ -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); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user