Compare commits
12 Commits
Author | SHA1 | Date | |
---|---|---|---|
4456cd68d0 | |||
8f61b5648f | |||
5e1b378ac6 | |||
a0ed5c7a16 | |||
7a20c0a27f | |||
12414d7b5d | |||
addf9e51e9 | |||
24a6b7480b | |||
953a4e4b72 | |||
e7192800ea | |||
1516f843aa | |||
f29558d6d1 |
22
package-lock.json
generated
22
package-lock.json
generated
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@pushrocks/tstest",
|
||||
"version": "1.0.6",
|
||||
"name": "@gitzone/tstest",
|
||||
"version": "1.0.12",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
@ -151,6 +151,11 @@
|
||||
"@types/chai": "*"
|
||||
}
|
||||
},
|
||||
"@types/figures": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/figures/-/figures-2.0.0.tgz",
|
||||
"integrity": "sha512-mcRgJ+ncKuNI+Dwac7omO18B8C8u+YBS+AU/oyLhEyjAnT3cUUThhHgZpbiIvu5ZqSvdD30BXtrqg9nxc3OKMg=="
|
||||
},
|
||||
"@types/form-data": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-2.2.1.tgz",
|
||||
@ -397,11 +402,24 @@
|
||||
"integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
|
||||
"dev": true
|
||||
},
|
||||
"escape-string-regexp": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
|
||||
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
|
||||
},
|
||||
"esprima": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
|
||||
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
|
||||
},
|
||||
"figures": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
|
||||
"integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
|
||||
"requires": {
|
||||
"escape-string-regexp": "^1.0.5"
|
||||
}
|
||||
},
|
||||
"first-chunk-stream": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz",
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@pushrocks/tstest",
|
||||
"version": "1.0.6",
|
||||
"name": "@gitzone/tstest",
|
||||
"version": "1.0.12",
|
||||
"private": false,
|
||||
"description": "a test utility to run tests that match test/**/*.ts",
|
||||
"main": "dist/index.js",
|
||||
@ -28,6 +28,8 @@
|
||||
"@pushrocks/smartfile": "^6.0.3",
|
||||
"@pushrocks/smartlog": "^2.0.1",
|
||||
"@pushrocks/smartpromise": "^2.0.5",
|
||||
"@pushrocks/smartshell": "^2.0.5"
|
||||
"@pushrocks/smartshell": "^2.0.5",
|
||||
"@types/figures": "^2.0.0",
|
||||
"figures": "^2.0.0"
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,7 @@
|
||||
import * as plugins from './tstest.plugins';
|
||||
import * as paths from './tstest.paths';
|
||||
import * as logPrefixes from './tstest.logprefixes';
|
||||
|
||||
import { coloredString as cs } from '@pushrocks/consolecolor';
|
||||
|
||||
import { TestDirectory } from './tstest.classes.testdirectory';
|
||||
@ -15,11 +17,12 @@ export class TsTest {
|
||||
|
||||
async run() {
|
||||
const fileNamesToRun: string[] = await this.testDir.getTestFilePathArray();
|
||||
console.log(`Found ${fileNamesToRun.length} Testfile(s):`);
|
||||
console.log(`${logPrefixes.TsTestPrefix} Found ${fileNamesToRun.length} Testfile(s):`);
|
||||
for (const fileName of fileNamesToRun) {
|
||||
console.log(cs(fileName, 'orange'));
|
||||
console.log(`${logPrefixes.TsTestPrefix} ${cs(fileName, 'orange')}`);
|
||||
}
|
||||
console.log('-'.repeat(16));
|
||||
console.log(''); // force new line
|
||||
const smartshellInstance = new plugins.smartshell.Smartshell({
|
||||
executor: 'bash',
|
||||
pathDirectories: [paths.binDirectory],
|
||||
@ -28,10 +31,12 @@ export class TsTest {
|
||||
const tapCombinator = new TapCombinator(); // lets create the TapCombinator
|
||||
for (const fileName of fileNamesToRun) {
|
||||
console.log(`${cs('=> ', 'blue')} Running ${cs(fileName, 'orange')}`);
|
||||
console.log(`=`.repeat(16));
|
||||
const tapParser = new TapParser();
|
||||
console.log(cs(`=`.repeat(16), 'cyan'));
|
||||
const tapParser = new TapParser(fileName);
|
||||
const execResultStreaming = await smartshellInstance.execStreamingSilent(`tsrun ${fileName}`);
|
||||
await tapParser.handleTapProcess(execResultStreaming.childProcess);
|
||||
console.log(cs(`^`.repeat(16), 'cyan'));
|
||||
console.log(''); // force new line
|
||||
tapCombinator.addTapParser(tapParser);
|
||||
}
|
||||
tapCombinator.evaluate();
|
||||
|
@ -1,3 +1,7 @@
|
||||
import * as plugins from './tstest.plugins';
|
||||
import { coloredString as cs } from '@pushrocks/consolecolor';
|
||||
|
||||
export const TapPrefix = plugins.consolecolor.coloredString(`:::TAP:::`, 'green', 'black');
|
||||
export const TapPrefix = cs(`::TAP::`, 'pink', 'black');
|
||||
export const TapErrorPrefix = cs(` !!!TAP PROTOCOL ERROR!!! `, 'red', 'black');
|
||||
|
||||
export const TsTestPrefix = cs(`**TSTEST**`, 'pink', 'black');
|
||||
|
@ -8,4 +8,7 @@ import * as smartlog from '@pushrocks/smartlog';
|
||||
import * as smartpromise from '@pushrocks/smartpromise';
|
||||
import * as smartshell from '@pushrocks/smartshell';
|
||||
|
||||
export { consolecolor, path, smartfile, smartlog, smartpromise, smartshell };
|
||||
// sindresorhus
|
||||
import * as figures from 'figures';
|
||||
|
||||
export { consolecolor, figures, path, smartfile, smartlog, smartpromise, smartshell };
|
||||
|
@ -5,6 +5,7 @@ import * as plugins from './tstest.plugins';
|
||||
import { coloredString as cs } from '@pushrocks/consolecolor';
|
||||
|
||||
import { TapParser } from './tstest.tap.parser';
|
||||
import * as logPrefixes from './tstest.logprefixes';
|
||||
|
||||
export class TapCombinator {
|
||||
tapParserStore: TapParser[] = [];
|
||||
@ -13,8 +14,35 @@ export class TapCombinator {
|
||||
}
|
||||
|
||||
evaluate() {
|
||||
console.log(`Ran ${this.tapParserStore.length} Testfiles!`);
|
||||
console.log(`${logPrefixes.TsTestPrefix} Ran ${this.tapParserStore.length} Testfiles!`);
|
||||
console.log(`${logPrefixes.TsTestPrefix} Here are the overall results:`);
|
||||
|
||||
let failGlobal = false; // determine wether tstest should fail
|
||||
for (const tapParser of this.tapParserStore) {
|
||||
if(tapParser.getErrorTests().length === 0) {
|
||||
console.log(
|
||||
logPrefixes.TsTestPrefix +
|
||||
cs(` ${tapParser.fileName} ${plugins.figures.tick}`, 'green') +
|
||||
' | ' +
|
||||
cs(` all tests completed successfully!`, 'blue')
|
||||
)
|
||||
} else {
|
||||
console.log(
|
||||
logPrefixes.TsTestPrefix +
|
||||
cs(` ${tapParser.fileName} ${plugins.figures.cross}`, 'red') +
|
||||
' | ' +
|
||||
cs(` Errors ocurred, please check for the logs!`, 'blue')
|
||||
);
|
||||
failGlobal = true;
|
||||
}
|
||||
}
|
||||
console.log(cs('-'.repeat(16), 'cyan'));
|
||||
console.log(cs('*'.repeat(16), 'cyan'));
|
||||
console.log(cs('-'.repeat(16), 'cyan'));
|
||||
if(!failGlobal) {
|
||||
console.log(cs('Ending with code 0: TESTS ARE PASSING!', 'green'));
|
||||
} else {
|
||||
console.log(cs('Ending with code 1: TESTS ARE FAILING!', 'red'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -6,18 +6,26 @@ import { coloredString as cs } from '@pushrocks/consolecolor';
|
||||
// ============
|
||||
import * as plugins from './tstest.plugins';
|
||||
import { TapTestResult } from './tstest.tap.testresult';
|
||||
import * as logPrefixes from './tstest.logprefixes';
|
||||
|
||||
export class TapParser {
|
||||
resultStore: TapTestResult[] = [];
|
||||
testStore: TapTestResult[] = [];
|
||||
|
||||
expectedTestsRegex = /([0-9]*)\.\.([0-9]*)/;
|
||||
expectedTests: number;
|
||||
receivedTests: number;
|
||||
|
||||
testStatusRegex = /(ok|not\sok)\s([0-9]+)\s-\s/;
|
||||
testStatusRegex = /(ok|not\sok)\s([0-9]+)\s-\s(.*)\s#\stime=(.*)ms$/;
|
||||
activeTapTestResult: TapTestResult;
|
||||
|
||||
/**
|
||||
* the constructor for TapParser
|
||||
*/
|
||||
constructor(public fileName: string) {}
|
||||
|
||||
|
||||
private _getNewTapTestResult() {
|
||||
this.activeTapTestResult = new TapTestResult(this.resultStore.length + 1);
|
||||
this.activeTapTestResult = new TapTestResult(this.testStore.length + 1);
|
||||
}
|
||||
|
||||
private _processLog(logChunk: Buffer | string) {
|
||||
@ -36,7 +44,12 @@ export class TapParser {
|
||||
logLineIsTapProtocol = true;
|
||||
const regexResult = this.expectedTestsRegex.exec(logLine);
|
||||
this.expectedTests = parseInt(regexResult[2]);
|
||||
console.log(`:::TAP::: Expecting ${this.expectedTests} tests!`);
|
||||
console.log(
|
||||
`${logPrefixes.TapPrefix} ${cs(
|
||||
`Expecting ${this.expectedTests} tests!`,
|
||||
'blue'
|
||||
)}`
|
||||
);
|
||||
|
||||
// initiating first TapResult
|
||||
this._getNewTapTestResult();
|
||||
@ -51,16 +64,33 @@ export class TapParser {
|
||||
return false;
|
||||
})();
|
||||
|
||||
const testSubject = regexResult[3];
|
||||
const testDuration = parseInt(regexResult[4]);
|
||||
|
||||
// test for protocol error
|
||||
if (testId !== this.activeTapTestResult.id) {
|
||||
console.log(`:::TAP PROTOCOL ERROR::: Something is strange! Test Ids are not equal!`);
|
||||
console.log(
|
||||
`${
|
||||
logPrefixes.TapErrorPrefix
|
||||
} Something is strange! Test Ids are not equal!`
|
||||
);
|
||||
}
|
||||
this.activeTapTestResult.setTestResult(testOk);
|
||||
|
||||
if (testOk) {
|
||||
console.log(cs(`:::TAP::: Success: Test ${testId} is ok!`, 'green', 'black'));
|
||||
console.log(
|
||||
logPrefixes.TapPrefix,
|
||||
`${cs(`T${testId} ${plugins.figures.tick}`, 'green')} | ` +
|
||||
cs(testSubject, 'blue') +
|
||||
` | ${cs(`${testDuration} ms`, 'orange')}`
|
||||
);
|
||||
} else {
|
||||
console.log(cs(`:::TAP::: Error: Test ${testId} is NOT ok!`, 'green', 'black'));
|
||||
console.log(
|
||||
logPrefixes.TapPrefix,
|
||||
`${cs(`T${testId} ${plugins.figures.cross}`, 'red')} | ` +
|
||||
cs(testSubject, 'blue') +
|
||||
` | ${cs(`${testDuration} ms`, 'orange')}`
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -72,12 +102,28 @@ export class TapParser {
|
||||
}
|
||||
|
||||
if (this.activeTapTestResult && this.activeTapTestResult.testSettled) {
|
||||
this.resultStore.push(this.activeTapTestResult);
|
||||
this.testStore.push(this.activeTapTestResult);
|
||||
this._getNewTapTestResult();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* returns all tests that are not completed
|
||||
*/
|
||||
getUncompletedTests() {
|
||||
// TODO:
|
||||
}
|
||||
|
||||
/**
|
||||
* returns all tests that threw an error
|
||||
*/
|
||||
getErrorTests() {
|
||||
return this.testStore.filter(tapTestArg => {
|
||||
return !tapTestArg.testOk;
|
||||
});
|
||||
}
|
||||
|
||||
async handleTapProcess(childProcessArg: ChildProcess) {
|
||||
const done = plugins.smartpromise.defer();
|
||||
childProcessArg.stdout.on('data', data => {
|
||||
@ -87,6 +133,43 @@ export class TapParser {
|
||||
this._processLog(data);
|
||||
});
|
||||
childProcessArg.on('exit', () => {
|
||||
this.receivedTests = this.testStore.length;
|
||||
|
||||
// check wether all tests ran
|
||||
if (this.expectedTests === this.receivedTests) {
|
||||
console.log(
|
||||
`${logPrefixes.TapPrefix} ${cs(
|
||||
`${this.receivedTests} out of ${
|
||||
this.expectedTests
|
||||
} Tests completed!`,
|
||||
'green'
|
||||
)}`
|
||||
);
|
||||
} else {
|
||||
console.log(
|
||||
`${logPrefixes.TapErrorPrefix} ${cs(
|
||||
`Only ${this.receivedTests} out of ${
|
||||
this.expectedTests
|
||||
} completed!`,
|
||||
'red'
|
||||
)}`
|
||||
);
|
||||
}
|
||||
if (this.getErrorTests().length === 0) {
|
||||
console.log(
|
||||
`${logPrefixes.TapPrefix} ${cs(
|
||||
`All tests are successfull!!!`,
|
||||
'green'
|
||||
)}`
|
||||
);
|
||||
} else {
|
||||
console.log(
|
||||
`${logPrefixes.TapPrefix} ${cs(
|
||||
`${this.getErrorTests().length} tests threw an error!!!`,
|
||||
'red'
|
||||
)}`
|
||||
);
|
||||
}
|
||||
done.resolve();
|
||||
});
|
||||
await done.promise;
|
||||
|
Reference in New Issue
Block a user