diff --git a/lib/reporters/tap.js b/lib/reporters/tap.js index 5ef8a23e3..8340ba1ae 100644 --- a/lib/reporters/tap.js +++ b/lib/reporters/tap.js @@ -1,8 +1,6 @@ 'use strict'; -const format = require('util').format; -const indentString = require('indent-string'); +const supertap = require('supertap'); const stripAnsi = require('strip-ansi'); -const yaml = require('js-yaml'); function dumpError(error, includeMessage) { const obj = Object.assign({}, error.object); @@ -32,7 +30,7 @@ function dumpError(error, includeMessage) { obj.at = error.stack.split('\n')[0]; } - return ` ---\n${indentString(yaml.safeDump(obj).trim(), 4)}\n ...`; + return obj; } class TapReporter { @@ -41,79 +39,42 @@ class TapReporter { } start() { - return 'TAP version 13'; + return supertap.start(); } test(test) { - const output = []; - - let directive = ''; - const passed = test.todo ? 'not ok' : 'ok'; - - if (test.todo) { - directive = '# TODO'; - } else if (test.skip) { - directive = '# SKIP'; - } - - const title = stripAnsi(test.title); - - const appendLogs = () => { - if (test.logs) { - test.logs.forEach(log => { - const logLines = indentString(log, 4); - const logLinesWithLeadingFigure = logLines.replace( - /^ {4}/, - ' * ' - ); - - output.push(logLinesWithLeadingFigure); - }); - } - }; - - output.push(`# ${title}`); - - if (test.error) { - output.push(format('not ok %d - %s', ++this.i, title)); - appendLogs(); - output.push(dumpError(test.error, true)); - } else { - output.push(format('%s %d - %s %s', passed, ++this.i, title, directive).trim()); - appendLogs(); - } - - return output.join('\n'); + return supertap.test(test.title, { + passed: !test.error, + index: ++this.i, + todo: test.todo, + skip: test.skip, + comment: test.logs, + error: test.error ? dumpError(test.error, true) : null + }); } unhandledError(err) { - const output = [ - `# ${err.message}`, - format('not ok %d - %s', ++this.i, err.message) - ]; + let error; + // AvaErrors don't have stack traces if (err.type !== 'exception' || err.name !== 'AvaError') { - output.push(dumpError(err, false)); + error = dumpError(err, false); } - return output.join('\n'); + return supertap.test(err.message, { + passed: false, + index: ++this.i, + error + }); } finish(runStatus) { - const output = [ - '', - '1..' + (runStatus.passCount + runStatus.failCount + runStatus.skipCount), - '# tests ' + (runStatus.passCount + runStatus.failCount + runStatus.skipCount), - '# pass ' + runStatus.passCount - ]; - - if (runStatus.skipCount > 0) { - output.push(`# skip ${runStatus.skipCount}`); - } - - output.push('# fail ' + (runStatus.failCount + runStatus.rejectionCount + runStatus.exceptionCount), ''); - - return output.join('\n'); + return supertap.finish({ + passed: runStatus.passCount, + failed: runStatus.failCount, + skipped: runStatus.skipCount, + crashed: runStatus.rejectionCount + runStatus.exceptionCount + }); } write(str) { diff --git a/package-lock.json b/package-lock.json index fdf162928..0f14c1612 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2287,7 +2287,8 @@ "esprima": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true }, "espurify": { "version": "1.7.0", @@ -3881,6 +3882,7 @@ "version": "3.8.4", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.8.4.tgz", "integrity": "sha1-UgtFZPhlc7qWZir4Woyvp7S1pvY=", + "dev": true, "requires": { "argparse": "1.0.9", "esprima": "3.1.3" @@ -5897,6 +5899,11 @@ "semver": "5.4.1" } }, + "serialize-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", + "integrity": "sha1-ULZ51WNc34Rme9yOWa9OW4HV9go=" + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -6174,6 +6181,39 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, + "supertap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supertap/-/supertap-1.0.0.tgz", + "integrity": "sha512-HZJ3geIMPgVwKk2VsmO5YHqnnJYl6bV5A9JW2uzqV43WmpgliNEYbuvukfor7URpaqpxuw3CfZ3ONdVbZjCgIA==", + "requires": { + "arrify": "1.0.1", + "indent-string": "3.2.0", + "js-yaml": "3.10.0", + "serialize-error": "2.1.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" + }, + "js-yaml": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", + "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "requires": { + "argparse": "1.0.9", + "esprima": "4.0.0" + } + } + } + }, "supports-color": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.0.0.tgz", diff --git a/package.json b/package.json index ffc722117..c0f1fced8 100644 --- a/package.json +++ b/package.json @@ -111,7 +111,6 @@ "is-obj": "^1.0.0", "is-observable": "^1.0.0", "is-promise": "^2.1.0", - "js-yaml": "^3.8.2", "last-line-stream": "^1.0.0", "lodash.clonedeepwith": "^4.5.0", "lodash.debounce": "^4.0.3", @@ -139,6 +138,7 @@ "stack-utils": "^1.0.1", "strip-ansi": "^4.0.0", "strip-bom-buf": "^1.0.0", + "supertap": "^1.0.0", "supports-color": "^5.0.0", "time-require": "^0.1.2", "trim-off-newlines": "^1.0.1",