Skip to content

Commit 072ab85

Browse files
jamestalmagesindresorhus
authored andcommitted
Close #330 PR: use empower-core for better assertion tracking and performance.
1 parent 2b6b256 commit 072ab85

File tree

7 files changed

+108
-47
lines changed

7 files changed

+108
-47
lines changed

api.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ var figures = require('figures');
99
var globby = require('globby');
1010
var chalk = require('chalk');
1111
var fork = require('./lib/fork');
12+
var formatter = require('./lib/enhance-assert').formatter();
1213

1314
function Api(files, options) {
1415
if (!(this instanceof Api)) {
@@ -76,6 +77,13 @@ Api.prototype._handleTest = function (test) {
7677
var isError = test.error.message;
7778

7879
if (isError) {
80+
if (test.error.powerAssertContext) {
81+
var message = formatter(test.error.powerAssertContext);
82+
if (test.error.originalMessage) {
83+
message = test.error.originalMessage + ' ' + message;
84+
}
85+
test.error.message = message;
86+
}
7987
this.errors.push(test);
8088
} else {
8189
test.error = null;

lib/assert.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,5 +120,3 @@ x.regexTest = function (regex, contents, msg) {
120120
x.ifError = x.error = function (err, msg) {
121121
test(!err, create(err, 'Error', '!==', msg, x.ifError));
122122
};
123-
124-
require('./enhance-assert')(x);

lib/enhance-assert.js

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
module.exports = enhanceAssert;
2+
module.exports.formatter = formatter;
23

34
module.exports.PATTERNS = [
45
't.ok(value, [message])',
@@ -12,23 +13,40 @@ module.exports.PATTERNS = [
1213
't.regexTest(regex, contents, [message])'
1314
];
1415

15-
function enhanceAssert(assert) {
16-
var empower = require('empower');
17-
var powerAssertFormatter = require('power-assert-formatter');
18-
var powerAssertRenderers = require('power-assert-renderers');
16+
module.exports.NON_ENHANCED_PATTERNS = [
17+
't.pass([message])',
18+
't.fail([message])',
19+
't.throws(fn, [message])',
20+
't.doesNotThrow(fn, [message])',
21+
't.ifError(error, [message])'
22+
];
1923

20-
empower(assert,
21-
powerAssertFormatter({
22-
renderers: [
23-
powerAssertRenderers.AssertionRenderer,
24-
powerAssertRenderers.SuccinctRenderer
25-
]
26-
}),
24+
function enhanceAssert(opts) {
25+
var empower = require('empower-core');
26+
var enhanced = empower(
27+
opts.assert,
2728
{
28-
destructive: true,
29-
modifyMessageOnRethrow: true,
30-
saveContextOnRethrow: false,
31-
patterns: module.exports.PATTERNS
29+
destructive: false,
30+
onError: opts.onError,
31+
onSuccess: opts.onSuccess,
32+
patterns: module.exports.PATTERNS,
33+
wrapOnlyPatterns: module.exports.NON_ENHANCED_PATTERNS
3234
}
3335
);
36+
37+
enhanced.AssertionError = opts.assert.AssertionError;
38+
39+
return enhanced;
40+
}
41+
42+
function formatter() {
43+
var powerAssertFormatter = require('power-assert-formatter');
44+
var powerAssertRenderers = require('power-assert-renderers');
45+
46+
return powerAssertFormatter({
47+
renderers: [
48+
powerAssertRenderers.AssertionRenderer,
49+
powerAssertRenderers.SuccinctRenderer
50+
]
51+
});
3452
}

lib/test.js

Lines changed: 38 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ var observableToPromise = require('observable-to-promise');
88
var isPromise = require('is-promise');
99
var isObservable = require('is-observable');
1010
var assert = require('./assert');
11+
var enhanceAssert = require('./enhance-assert');
1112
var globals = require('./globals');
1213

1314
function Test(title, fn) {
@@ -61,11 +62,6 @@ Test.prototype._setAssertError = function (err) {
6162
this.assertError = err;
6263
};
6364

64-
// Workaround for power-assert
65-
// `t` must be capturable for decorated assert output
66-
Test.prototype._capt = assert._capt;
67-
Test.prototype._expr = assert._expr;
68-
6965
Test.prototype.plan = function (count) {
7066
if (typeof count !== 'number') {
7167
throw new TypeError('Expected a number');
@@ -208,9 +204,7 @@ Test.prototype._publicApi = function () {
208204
[
209205
'assertCount',
210206
'title',
211-
'end',
212-
'_capt',
213-
'_expr'
207+
'end'
214208
]
215209
.forEach(function (name) {
216210
Object.defineProperty(api, name, {
@@ -239,31 +233,46 @@ Test.prototype._publicApi = function () {
239233
self._assert();
240234
}
241235

236+
function onAssertionEvent(event) {
237+
if (event.assertionThrew) {
238+
event.error.powerAssertContext = event.powerAssertContext;
239+
event.error.originalMessage = event.originalMessage;
240+
self._setAssertError(event.error);
241+
self._assert();
242+
return null;
243+
}
244+
245+
var fn = observableToPromise(event.returnValue);
246+
247+
if (isPromise(fn)) {
248+
return Promise.resolve(fn)
249+
.catch(function (err) {
250+
err.originalMessage = event.originalMessage;
251+
self._setAssertError(err);
252+
})
253+
.finally(function () {
254+
self._assert();
255+
});
256+
}
257+
258+
self._assert();
259+
return null;
260+
}
261+
262+
var enhanced = enhanceAssert({
263+
assert: assert,
264+
onSuccess: onAssertionEvent,
265+
onError: onAssertionEvent
266+
});
267+
242268
// Patched assert methods: increase assert count and store errors.
243269
Object.keys(assert).forEach(function (el) {
244270
api.skip[el] = skipFn;
245-
api[el] = function () {
246-
try {
247-
var fn = assert[el].apply(assert, arguments);
248-
249-
fn = observableToPromise(fn);
250-
251-
if (isPromise(fn)) {
252-
return Promise.resolve(fn)
253-
.catch(function (err) {
254-
self._setAssertError(err);
255-
})
256-
.finally(function () {
257-
self._assert();
258-
});
259-
}
260-
} catch (err) {
261-
self._setAssertError(err);
262-
}
263-
264-
self._assert();
265-
};
271+
api[el] = enhanced[el].bind(enhanced);
266272
});
267273

274+
api._capt = enhanced._capt.bind(enhanced);
275+
api._expr = enhanced._expr.bind(enhanced);
276+
268277
return api;
269278
};

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
"debug": "^2.2.0",
9191
"deeper": "^2.1.0",
9292
"empower": "^1.1.0",
93+
"empower-core": "^0.2.0",
9394
"figures": "^1.4.0",
9495
"fn-name": "^2.0.0",
9596
"globby": "^4.0.0",

test/api.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,3 +270,24 @@ test('Node.js-style --require CLI argument', function (t) {
270270
t.is(api.passCount, 1);
271271
});
272272
});
273+
274+
test('power-assert support', function (t) {
275+
t.plan(3);
276+
277+
var api = new Api([path.join(__dirname, 'fixture/power-assert.js')]);
278+
279+
api.run()
280+
.then(function () {
281+
t.ok(api.errors[0].error.powerAssertContext);
282+
283+
t.match(
284+
api.errors[0].error.message,
285+
/t\.ok\(a === 'bar'\)\s*\n\s+\|\s*\n\s+"foo"/m
286+
);
287+
288+
t.match(
289+
api.errors[1].error.message,
290+
/with message\s+t\.ok\(a === 'foo', 'with message'\)\s*\n\s+\|\s*\n\s+"bar"/m
291+
);
292+
});
293+
});

test/fixture/power-assert.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
import test from '../../';
22

3-
test(t => {
3+
test.serial(t => {
44
const a = 'foo';
55

66
t.ok(a === 'bar');
77
});
8+
9+
test.serial(t => {
10+
const a = 'bar';
11+
12+
t.ok(a === 'foo', 'with message');
13+
});

0 commit comments

Comments
 (0)