From 6a930f615ec798f8e4c9ca7f74e58502bdaf056d Mon Sep 17 00:00:00 2001 From: James Talmage Date: Sun, 13 Dec 2015 02:43:57 -0500 Subject: [PATCH 1/3] use empower-core and render assertions on the main thread. --- api.js | 9 +++++ lib/assert.js | 2 -- lib/enhance-assert.js | 48 ++++++++++++++++++-------- lib/test.js | 66 ++++++++++++++++++++---------------- package.json | 1 + test/api.js | 21 ++++++++++++ test/fixture/power-assert.js | 8 ++++- 7 files changed, 108 insertions(+), 47 deletions(-) diff --git a/api.js b/api.js index 797fe2dfe..d147ddb75 100644 --- a/api.js +++ b/api.js @@ -70,12 +70,21 @@ Api.prototype._handleStats = function (stats) { this.testCount += stats.testCount; }; +var formatter = require('./lib/enhance-assert').formatter(); + Api.prototype._handleTest = function (test) { test.title = this._prefixTitle(test.file) + test.title; var isError = test.error.message; if (isError) { + if (test.error.powerAssertContext) { + var message = formatter(test.error.powerAssertContext); + if (test.error.originalMessage) { + message = test.error.originalMessage + ' ' + message; + } + test.error.message = message; + } this.errors.push(test); } else { test.error = null; diff --git a/lib/assert.js b/lib/assert.js index 2ea331eec..f89373ee1 100644 --- a/lib/assert.js +++ b/lib/assert.js @@ -120,5 +120,3 @@ x.regexTest = function (regex, contents, msg) { x.ifError = x.error = function (err, msg) { test(!err, create(err, 'Error', '!==', msg, x.ifError)); }; - -require('./enhance-assert')(x); diff --git a/lib/enhance-assert.js b/lib/enhance-assert.js index 11999474c..56acc504a 100644 --- a/lib/enhance-assert.js +++ b/lib/enhance-assert.js @@ -1,4 +1,5 @@ module.exports = enhanceAssert; +module.exports.formatter = formatter; module.exports.PATTERNS = [ 't.ok(value, [message])', @@ -12,23 +13,40 @@ module.exports.PATTERNS = [ 't.regexTest(regex, contents, [message])' ]; -function enhanceAssert(assert) { - var empower = require('empower'); - var powerAssertFormatter = require('power-assert-formatter'); - var powerAssertRenderers = require('power-assert-renderers'); +module.exports.NON_ENHANCED_PATTERNS = [ + 't.pass([message])', + 't.fail([message])', + 't.throws(fn, [message])', + 't.doesNotThrow(fn, [message])', + 't.ifError(error, [message])' +]; - empower(assert, - powerAssertFormatter({ - renderers: [ - powerAssertRenderers.AssertionRenderer, - powerAssertRenderers.SuccinctRenderer - ] - }), +function enhanceAssert(opts) { + var empower = require('@jamestalmage/empower-core'); + var enhanced = empower( + opts.assert, { - destructive: true, - modifyMessageOnRethrow: true, - saveContextOnRethrow: false, - patterns: module.exports.PATTERNS + destructive: false, + onError: opts.onError, + onSuccess: opts.onSuccess, + patterns: module.exports.PATTERNS, + additionalMethods: module.exports.NON_ENHANCED_PATTERNS } ); + + enhanced.AssertionError = opts.assert.AssertionError; + + return enhanced; +} + +function formatter() { + var powerAssertFormatter = require('power-assert-formatter'); + var powerAssertRenderers = require('power-assert-renderers'); + + return powerAssertFormatter({ + renderers: [ + powerAssertRenderers.AssertionRenderer, + powerAssertRenderers.SuccinctRenderer + ] + }); } diff --git a/lib/test.js b/lib/test.js index 02cbd1533..d349f81bf 100644 --- a/lib/test.js +++ b/lib/test.js @@ -8,6 +8,7 @@ var observableToPromise = require('observable-to-promise'); var isPromise = require('is-promise'); var isObservable = require('is-observable'); var assert = require('./assert'); +var enhanceAssert = require('./enhance-assert'); var globals = require('./globals'); function Test(title, fn) { @@ -61,11 +62,6 @@ Test.prototype._setAssertError = function (err) { this.assertError = err; }; -// Workaround for power-assert -// `t` must be capturable for decorated assert output -Test.prototype._capt = assert._capt; -Test.prototype._expr = assert._expr; - Test.prototype.plan = function (count) { if (typeof count !== 'number') { throw new TypeError('Expected a number'); @@ -208,9 +204,7 @@ Test.prototype._publicApi = function () { [ 'assertCount', 'title', - 'end', - '_capt', - '_expr' + 'end' ] .forEach(function (name) { Object.defineProperty(api, name, { @@ -239,31 +233,45 @@ Test.prototype._publicApi = function () { self._assert(); } + function onAssertionEvent(event) { + if (event.type === 'error') { + event.error.powerAssertContext = event.powerAssertContext; + event.error.originalMessage = event.originalMessage; + self._setAssertError(event.error); + self._assert(); + return null; + } + + var fn = observableToPromise(event.returnValue); + + if (isPromise(fn)) { + return Promise.resolve(fn) + .catch(function (err) { + self._setAssertError(err); + }) + .finally(function () { + self._assert(); + }); + } + + self._assert(); + return null; + } + + var enhanced = enhanceAssert({ + assert: assert, + onSuccess: onAssertionEvent, + onError: onAssertionEvent + }); + // Patched assert methods: increase assert count and store errors. Object.keys(assert).forEach(function (el) { api.skip[el] = skipFn; - api[el] = function () { - try { - var fn = assert[el].apply(assert, arguments); - - fn = observableToPromise(fn); - - if (isPromise(fn)) { - return Promise.resolve(fn) - .catch(function (err) { - self._setAssertError(err); - }) - .finally(function () { - self._assert(); - }); - } - } catch (err) { - self._setAssertError(err); - } - - self._assert(); - }; + api[el] = enhanced[el].bind(enhanced); }); + api._capt = enhanced._capt.bind(enhanced); + api._expr = enhanced._expr.bind(enhanced); + return api; }; diff --git a/package.json b/package.json index 04c8b884a..f0a6cb7dd 100644 --- a/package.json +++ b/package.json @@ -77,6 +77,7 @@ "observables" ], "dependencies": { + "@jamestalmage/empower-core": "^0.1.1", "arr-flatten": "^1.0.1", "arrify": "^1.0.0", "ava-init": "^0.1.0", diff --git a/test/api.js b/test/api.js index f1733ef7f..c854d07ed 100644 --- a/test/api.js +++ b/test/api.js @@ -270,3 +270,24 @@ test('Node.js-style --require CLI argument', function (t) { t.is(api.passCount, 1); }); }); + +test('power-assert support', function (t) { + t.plan(3); + + var api = new Api([path.join(__dirname, 'fixture/power-assert.js')]); + + api.run() + .then(function () { + t.ok(api.errors[0].error.powerAssertContext); + + t.match( + api.errors[0].error.message, + /t\.ok\(a === 'bar'\)\s*\n\s+\|\s*\n\s+"foo"/m + ); + + t.match( + api.errors[1].error.message, + /with message\s+t\.ok\(a === 'foo', 'with message'\)\s*\n\s+\|\s*\n\s+"bar"/m + ); + }); +}); diff --git a/test/fixture/power-assert.js b/test/fixture/power-assert.js index 5f09cf642..d0cc3ade6 100644 --- a/test/fixture/power-assert.js +++ b/test/fixture/power-assert.js @@ -1,7 +1,13 @@ import test from '../../'; -test(t => { +test.serial(t => { const a = 'foo'; t.ok(a === 'bar'); }); + +test.serial(t => { + const a = 'bar'; + + t.ok(a === 'foo', 'with message'); +}); From 792db12b5921b19037d7fe2ee04460a705f25cb1 Mon Sep 17 00:00:00 2001 From: James Talmage Date: Sun, 13 Dec 2015 03:57:25 -0500 Subject: [PATCH 2/3] update to new empower-core api --- api.js | 3 +-- lib/enhance-assert.js | 2 +- lib/test.js | 3 ++- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/api.js b/api.js index d147ddb75..71a78e9ee 100644 --- a/api.js +++ b/api.js @@ -9,6 +9,7 @@ var figures = require('figures'); var globby = require('globby'); var chalk = require('chalk'); var fork = require('./lib/fork'); +var formatter = require('./lib/enhance-assert').formatter(); function Api(files, options) { if (!(this instanceof Api)) { @@ -70,8 +71,6 @@ Api.prototype._handleStats = function (stats) { this.testCount += stats.testCount; }; -var formatter = require('./lib/enhance-assert').formatter(); - Api.prototype._handleTest = function (test) { test.title = this._prefixTitle(test.file) + test.title; diff --git a/lib/enhance-assert.js b/lib/enhance-assert.js index 56acc504a..eae56f977 100644 --- a/lib/enhance-assert.js +++ b/lib/enhance-assert.js @@ -30,7 +30,7 @@ function enhanceAssert(opts) { onError: opts.onError, onSuccess: opts.onSuccess, patterns: module.exports.PATTERNS, - additionalMethods: module.exports.NON_ENHANCED_PATTERNS + wrapOnlyPatterns: module.exports.NON_ENHANCED_PATTERNS } ); diff --git a/lib/test.js b/lib/test.js index d349f81bf..0cb9aea8b 100644 --- a/lib/test.js +++ b/lib/test.js @@ -234,7 +234,7 @@ Test.prototype._publicApi = function () { } function onAssertionEvent(event) { - if (event.type === 'error') { + if (event.assertionThrew) { event.error.powerAssertContext = event.powerAssertContext; event.error.originalMessage = event.originalMessage; self._setAssertError(event.error); @@ -247,6 +247,7 @@ Test.prototype._publicApi = function () { if (isPromise(fn)) { return Promise.resolve(fn) .catch(function (err) { + err.originalMessage = event.originalMessage; self._setAssertError(err); }) .finally(function () { From 2539a1bd258bd34b1027a421a20485eb88d3f3e9 Mon Sep 17 00:00:00 2001 From: James Talmage Date: Sun, 13 Dec 2015 13:52:53 -0500 Subject: [PATCH 3/3] bump empower-core --- lib/enhance-assert.js | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/enhance-assert.js b/lib/enhance-assert.js index eae56f977..6518c9ecc 100644 --- a/lib/enhance-assert.js +++ b/lib/enhance-assert.js @@ -22,7 +22,7 @@ module.exports.NON_ENHANCED_PATTERNS = [ ]; function enhanceAssert(opts) { - var empower = require('@jamestalmage/empower-core'); + var empower = require('empower-core'); var enhanced = empower( opts.assert, { diff --git a/package.json b/package.json index f0a6cb7dd..5e9225245 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,6 @@ "observables" ], "dependencies": { - "@jamestalmage/empower-core": "^0.1.1", "arr-flatten": "^1.0.1", "arrify": "^1.0.0", "ava-init": "^0.1.0", @@ -91,6 +90,7 @@ "debug": "^2.2.0", "deeper": "^2.1.0", "empower": "^1.1.0", + "empower-core": "^0.2.0", "figures": "^1.4.0", "fn-name": "^2.0.0", "globby": "^4.0.0",