Skip to content

Commit e3b4e62

Browse files
authored
Merge pull request #104 from power-assert-js/assert-strict-mode
feat: support "Strict mode"
2 parents c4e49c5 + 41b3fea commit e3b4e62

File tree

3 files changed

+110
-6
lines changed

3 files changed

+110
-6
lines changed

index.js

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ var baseAssert = require('assert');
1313
var _deepEqual = require('universal-deep-strict-equal');
1414
var empower = require('empower');
1515
var formatter = require('power-assert-formatter');
16-
var extend = require('xtend');
16+
var assign = require('xtend/mutable');
1717
var define = require('define-properties');
1818
var empowerOptions = {
1919
modifyMessageOnRethrow: true,
@@ -37,12 +37,27 @@ if (typeof baseAssert.notDeepStrictEqual !== 'function') {
3737

3838
function customize (customOptions) {
3939
var options = customOptions || {};
40-
var poweredAssert = empower(
41-
baseAssert,
42-
formatter(options.output),
43-
extend(empowerOptions, options.assertion)
44-
);
40+
var applyEmpower = function (fn) {
41+
return empower(
42+
fn,
43+
formatter(options.output),
44+
assign({}, empowerOptions, options.assertion)
45+
);
46+
};
47+
var poweredAssert = applyEmpower(baseAssert);
4548
poweredAssert.customize = customize;
49+
if (typeof baseAssert.strict === 'function') {
50+
poweredAssert.strict = applyEmpower(baseAssert.strict);
51+
} else {
52+
var strict = applyEmpower(baseAssert);
53+
poweredAssert.strict = assign(strict, {
54+
equal: strict.strictEqual,
55+
deepEqual: strict.deepStrictEqual,
56+
notEqual: strict.notStrictEqual,
57+
notDeepEqual: strict.notDeepStrictEqual
58+
});
59+
}
60+
poweredAssert.strict.strict = poweredAssert.strict;
4661
return poweredAssert;
4762
}
4863

karma.conf.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ module.exports = function (config) {
1212
{ pattern: 'espowered_tests/tobe_instrumented/assertion.js', watched: true, served: true, included: true },
1313
{ pattern: 'espowered_tests/tobe_instrumented/assertion.es6.js', watched: true, served: true, included: true },
1414
{ pattern: 'espowered_tests/tobe_instrumented/customization.js', watched: true, served: true, included: true },
15+
{ pattern: 'espowered_tests/tobe_instrumented/strict_mode.js', watched: true, served: true, included: true },
1516
{ pattern: 'espowered_tests/not_tobe_instrumented/not_instrumented.js', watched: true, served: true, included: true },
1617
{ pattern: 'espowered_tests/tobe_instrumented/modules.js', watched: true, served: true, included: true }
1718
],

test/tobe_instrumented/strict_mode.js

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
if (typeof window === 'undefined') {
2+
var expect = require('expect.js');
3+
var assert = require('../..');
4+
}
5+
6+
describe('strict mode support', function () {
7+
8+
var legacyModeAssert = assert;
9+
10+
beforeEach(function () {
11+
assert = assert.strict;
12+
});
13+
afterEach(function () {
14+
assert = legacyModeAssert;
15+
});
16+
17+
function expectPowerAssertMessage (body, expectedLines) {
18+
try {
19+
body();
20+
expect().fail("AssertionError should be thrown");
21+
} catch (e) {
22+
if (e.message === 'AssertionError should be thrown') {
23+
throw e;
24+
}
25+
expect(e.message.split('\n').slice(2, -1)).to.eql(expectedLines);
26+
}
27+
};
28+
29+
it('`strict` mode assert should also have `strict` property', function () {
30+
expect(typeof assert.strict).to.equal('function');
31+
});
32+
33+
it('`strict` property of strict mode assert should also be an empowered one', function () {
34+
// `_empowered` is a hidden property to determine whether target function is already empowered or not.
35+
expect(assert.strict._empowered).to.equal(true);
36+
});
37+
38+
it('`strict` mode assert should also be a function', function () {
39+
var foo = 'foo', bar = 8;
40+
expectPowerAssertMessage(function () {
41+
assert(foo === bar);
42+
}, [
43+
' assert(foo === bar)',
44+
' | | | ',
45+
' | | 8 ',
46+
' | false ',
47+
' "foo" ',
48+
' ',
49+
' [number] bar',
50+
' => 8',
51+
' [string] foo',
52+
' => "foo"'
53+
]);
54+
});
55+
56+
it('equal becomes strictEqual', function () {
57+
var three = 3, threeInStr = '3';
58+
expectPowerAssertMessage(function () {
59+
assert.equal(three, threeInStr);
60+
},[
61+
' assert.equal(three, threeInStr)',
62+
' | | ',
63+
' 3 "3" '
64+
]);
65+
});
66+
67+
it('deepEqual becomes deepStrictEqual', function () {
68+
var three = 3, threeInStr = '3';
69+
expectPowerAssertMessage(function () {
70+
assert.deepEqual({a: three}, {a: threeInStr});
71+
},[
72+
' assert.deepEqual({ a: three }, { a: threeInStr })',
73+
' | | | | ',
74+
' | | | "3" ',
75+
' | 3 Object{a:"3"} ',
76+
' Object{a:3} '
77+
]);
78+
});
79+
80+
it('structural compatibility between strict mode and legacy mode', function () {
81+
var legacyModeProps = Object.keys(legacyModeAssert);
82+
expect(legacyModeProps.length).to.be.above(0);
83+
legacyModeProps.every(function (name) {
84+
expect(assert).to.have.property(name);
85+
expect(typeof assert[name]).to.be.equal(typeof legacyModeAssert[name]);
86+
});
87+
});
88+
});

0 commit comments

Comments
 (0)