diff --git a/lib/assert.js b/lib/assert.js index 8965ff159..26c4301ce 100644 --- a/lib/assert.js +++ b/lib/assert.js @@ -120,3 +120,5 @@ 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/babel.js b/lib/babel.js index 0ce80fb0c..bbf9e51fc 100644 --- a/lib/babel.js +++ b/lib/babel.js @@ -1,13 +1,19 @@ 'use strict'; var resolveFrom = require('resolve-from'); +var createEspowerPlugin = require('babel-plugin-espower/create'); var hasGenerators = parseInt(process.version.slice(1), 10) > 0; var options = { only: /(test|test\-.+|test\/.+)\.js$/, blacklist: hasGenerators ? ['regenerator'] : [], - optional: hasGenerators ? ['asyncToGenerator'] : [] + optional: hasGenerators ? ['asyncToGenerator'] : [], + plugins: [ + createEspowerPlugin(require('babel-core'), { + patterns: require('./enhance-assert').PATTERNS + }) + ] }; try { diff --git a/lib/enhance-assert.js b/lib/enhance-assert.js new file mode 100644 index 000000000..11999474c --- /dev/null +++ b/lib/enhance-assert.js @@ -0,0 +1,34 @@ +module.exports = enhanceAssert; + +module.exports.PATTERNS = [ + 't.ok(value, [message])', + 't.notOk(value, [message])', + 't.true(value, [message])', + 't.false(value, [message])', + 't.is(value, expected, [message])', + 't.not(value, expected, [message])', + 't.same(value, expected, [message])', + 't.notSame(value, expected, [message])', + 't.regexTest(regex, contents, [message])' +]; + +function enhanceAssert(assert) { + var empower = require('empower'); + var powerAssertFormatter = require('power-assert-formatter'); + var powerAssertRenderers = require('power-assert-renderers'); + + empower(assert, + powerAssertFormatter({ + renderers: [ + powerAssertRenderers.AssertionRenderer, + powerAssertRenderers.SuccinctRenderer + ] + }), + { + destructive: true, + modifyMessageOnRethrow: true, + saveContextOnRethrow: false, + patterns: module.exports.PATTERNS + } + ); +} diff --git a/lib/test.js b/lib/test.js index 86fca8588..9abb77c74 100644 --- a/lib/test.js +++ b/lib/test.js @@ -70,6 +70,11 @@ Object.keys(assert).forEach(function (el) { }; }); +// 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'); diff --git a/package.json b/package.json index 146639f2a..45ebfcf79 100644 --- a/package.json +++ b/package.json @@ -62,10 +62,12 @@ "arr-flatten": "^1.0.1", "ava-init": "^0.1.0", "babel-core": "^5.8.23", + "babel-plugin-espower": "^1.0.0", "bluebird": "^2.9.34", "chalk": "^1.0.0", "co": "^4.6.0", "core-assert": "^0.1.0", + "empower": "^1.0.2", "figures": "^1.4.0", "fn-name": "^2.0.0", "globby": "^3.0.1", @@ -73,6 +75,8 @@ "meow": "^3.3.0", "object-assign": "^4.0.1", "plur": "^2.0.0", + "power-assert-formatter": "^1.1.0", + "power-assert-renderers": "^0.1.0", "pretty-ms": "^2.0.0", "resolve-from": "^1.0.0", "set-immediate-shim": "^1.0.1", diff --git a/test/fixture/power-assert.js b/test/fixture/power-assert.js new file mode 100644 index 000000000..02b974c5f --- /dev/null +++ b/test/fixture/power-assert.js @@ -0,0 +1,8 @@ +import test from '../../'; + +test(t => { + const a = 'foo'; + + t.ok(a === 'bar'); + t.end(); +}); diff --git a/test/test.js b/test/test.js index 907cadd5e..51ce50bc8 100644 --- a/test/test.js +++ b/test/test.js @@ -837,3 +837,16 @@ test('fail-fast mode', function (t) { t.end(); }); }); + +test('power-assert support', function (t) { + t.plan(2); + + execCli('fixture/power-assert.js', function (err, stdout, stderr) { + t.ok(err); + + // t.ok(a === 'bar') + // | + // "foo" + t.true((/t\.ok\(a === 'bar'\)\s*\n\s+\|\s*\n\s+"foo"/m).test(stderr)); + }); +});