kizu
Version:
An easy-to-use, fast, and defensive Typescript/Javascript test runner designed to help you to write simple, readable, and maintainable tests.
90 lines (89 loc) • 4.39 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.printResultsByFile = printResultsByFile;
exports.printFileResults = printFileResults;
exports.printSummary = printSummary;
const kleur_1 = __importDefault(require("kleur"));
const isTestPassing_1 = require("./isTestPassing");
const serialize_error_1 = require("serialize-error");
const sortTestResults_1 = require("./sortTestResults");
const log = console.log;
const successSymbol = kleur_1.default.green('✔');
const failureSymbol = kleur_1.default.red('✖');
const hr = kleur_1.default.gray('\n────────────────────────────────\n');
const noTestErrorTpl = (files) => kleur_1.default.red().bold(`
Error: ${files.length} spec file(s) have no tests. This could indicate a compilation error
(ie. Typescript), or an early runtime error. All spec files must have at least one test.
The following spec files do not have any attempted or completed tests:
${files.join(', ')}
`);
function printResultsByFile(resultsByFile, showOnlyFailures = false) {
const sortedResults = (0, sortTestResults_1.sortTestResults)(resultsByFile);
for (const [filename, tests] of sortedResults) {
printFileResults(filename, tests, showOnlyFailures);
}
}
function printFileResults(filename, tests, showOnlyFailures = false) {
const hasFailure = tests.some((test) => !(0, isTestPassing_1.isTestPassing)(test));
if (showOnlyFailures && !hasFailure)
return;
const header = `${kleur_1.default.underline().blue(filename)} ${hasFailure ? failureSymbol : successSymbol}\n`;
log(header);
tests.forEach(((test) => {
if (showOnlyFailures && (0, isTestPassing_1.isTestPassing)(test))
return;
log(`${test.description} ${(0, isTestPassing_1.isTestPassing)(test) ? successSymbol : failureSymbol}`);
test.assertions.forEach((assertion) => {
if (showOnlyFailures && assertion.pass)
return;
log(kleur_1.default.gray(` ${assertion.description} ${assertion.pass ? successSymbol : failureSymbol}`));
!assertion.pass && printFailedAssertionDiag(assertion);
});
test.error && printError(test.error);
log('');
}));
}
function printError(serializedError) {
log(hr);
log((0, serialize_error_1.deserializeError)(serializedError));
log(hr);
}
function printFailedAssertionDiag(assertion) {
if (!assertion.diagnostic && !assertion.stack)
return;
log(hr);
assertion.diagnostic && log(assertion.diagnostic);
assertion.stack && log(kleur_1.default.grey(filterStackTrace(assertion.stack)));
log(hr);
}
function printSummary(finalResults) {
const successRate = finalResults.numSuccessfulTests / finalResults.numTests;
const assertionSuccessRate = finalResults.numSuccessfulAssertions / finalResults.numAssertions;
const numFilesWithNoTests = finalResults.filesWithNoTests.length;
if (assertionSuccessRate === 1) {
log(kleur_1.default.bold().green(`${successSymbol} ${finalResults.numSuccessfulAssertions}/${finalResults.numAssertions} assertions passed`));
}
else {
log(kleur_1.default.bold().red(`${failureSymbol} ${finalResults.numSuccessfulAssertions}/${finalResults.numAssertions} assertions passed`));
}
if (successRate === 1) {
log(kleur_1.default.bold().green(`${successSymbol} ${finalResults.numSuccessfulTests}/${finalResults.numTests} tests passed`));
}
else {
log(kleur_1.default.bold().red(`${failureSymbol} ${finalResults.numSuccessfulTests}/${finalResults.numTests} tests passed`));
}
numFilesWithNoTests && log(noTestErrorTpl(finalResults.filesWithNoTests));
}
function filterStackTrace(stack) {
const ignoreRegex = [
/at Generator.next \(<anonymous>\)/,
/at new Promise \(<anonymous>\)/,
/assertions\/index.[ts|js]{2}/,
/\/kizu\/[src|dist]{3,4}\/test.[ts|js]{2}/,
].reduce((combined, exp) => (new RegExp(`${combined.source}|${exp.source}`)), new RegExp('a^'));
return stack.split('\n').reduce((acc, line) => (!ignoreRegex.test(line) ? acc.concat([line]) : acc), []).join('\n');
}
//# sourceMappingURL=output.js.map