diff --git a/lib/assert.js b/lib/assert.js index ae328c4e3ac31a..092208c8c8e825 100644 --- a/lib/assert.js +++ b/lib/assert.js @@ -38,22 +38,26 @@ const assert = module.exports = ok; // both the actual and expected values to the assertion error for // display purposes. -function innerFail(actual, expected, message, operator, stackStartFunction) { - throw new errors.AssertionError({ - message, - actual, - expected, - operator, - stackStartFunction - }); +function innerFail(obj) { + throw new errors.AssertionError(obj); } -function fail(actual, expected, message, operator, stackStartFunction) { - if (arguments.length === 1) +function fail(actual, expected, message, operator, stackStartFn) { + const argsLen = arguments.length; + + if (argsLen === 1) { message = actual; - if (arguments.length === 2) + } else if (argsLen === 2) { operator = '!='; - innerFail(actual, expected, message, operator, stackStartFunction || fail); + } + + innerFail({ + actual, + expected, + message, + operator, + stackStartFn: stackStartFn || fail + }); } assert.fail = fail; @@ -67,7 +71,15 @@ assert.AssertionError = errors.AssertionError; // Pure assertion tests whether a value is truthy, as determined // by !!value. function ok(value, message) { - if (!value) innerFail(value, true, message, '==', ok); + if (!value) { + innerFail({ + actual: value, + expected: true, + message, + operator: '==', + stackStartFn: ok + }); + } } assert.ok = ok; @@ -75,7 +87,15 @@ assert.ok = ok; /* eslint-disable no-restricted-properties */ assert.equal = function equal(actual, expected, message) { // eslint-disable-next-line eqeqeq - if (actual != expected) innerFail(actual, expected, message, '==', equal); + if (actual != expected) { + innerFail({ + actual, + expected, + message, + operator: '==', + stackStartFn: equal + }); + } }; // The non-equality assertion tests for whether two objects are not @@ -83,21 +103,39 @@ assert.equal = function equal(actual, expected, message) { assert.notEqual = function notEqual(actual, expected, message) { // eslint-disable-next-line eqeqeq if (actual == expected) { - innerFail(actual, expected, message, '!=', notEqual); + innerFail({ + actual, + expected, + message, + operator: '!=', + stackStartFn: notEqual + }); } }; // The equivalence assertion tests a deep equality relation. assert.deepEqual = function deepEqual(actual, expected, message) { if (!innerDeepEqual(actual, expected, false)) { - innerFail(actual, expected, message, 'deepEqual', deepEqual); + innerFail({ + actual, + expected, + message, + operator: 'deepEqual', + stackStartFn: deepEqual + }); } }; /* eslint-enable */ assert.deepStrictEqual = function deepStrictEqual(actual, expected, message) { if (!innerDeepEqual(actual, expected, true)) { - innerFail(actual, expected, message, 'deepStrictEqual', deepStrictEqual); + innerFail({ + actual, + expected, + message, + operator: 'deepStrictEqual', + stackStartFn: deepStrictEqual + }); } }; @@ -572,22 +610,39 @@ function objEquiv(a, b, strict, keys, memos) { // The non-equivalence assertion tests for any deep inequality. assert.notDeepEqual = function notDeepEqual(actual, expected, message) { if (innerDeepEqual(actual, expected, false)) { - innerFail(actual, expected, message, 'notDeepEqual', notDeepEqual); + innerFail({ + actual, + expected, + message, + operator: 'notDeepEqual', + stackStartFn: notDeepEqual + }); } }; assert.notDeepStrictEqual = notDeepStrictEqual; function notDeepStrictEqual(actual, expected, message) { if (innerDeepEqual(actual, expected, true)) { - innerFail(actual, expected, message, 'notDeepStrictEqual', - notDeepStrictEqual); + innerFail({ + actual, + expected, + message, + operator: 'notDeepStrictEqual', + stackStartFn: notDeepStrictEqual + }); } } // The strict equality assertion tests strict equality, as determined by ===. assert.strictEqual = function strictEqual(actual, expected, message) { if (actual !== expected) { - innerFail(actual, expected, message, '===', strictEqual); + innerFail({ + actual, + expected, + message, + operator: '===', + stackStartFn: strictEqual + }); } }; @@ -595,7 +650,13 @@ assert.strictEqual = function strictEqual(actual, expected, message) { // determined by !==. assert.notStrictEqual = function notStrictEqual(actual, expected, message) { if (actual === expected) { - innerFail(actual, expected, message, '!==', notStrictEqual); + innerFail({ + actual, + expected, + message, + operator: '!==', + stackStartFn: notStrictEqual + }); } }; @@ -643,7 +704,13 @@ function innerThrows(shouldThrow, block, expected, message) { details += ` (${expected.name})`; } details += message ? `: ${message}` : '.'; - fail(actual, expected, `Missing expected exception${details}`, 'throws'); + innerFail({ + actual, + expected, + operator: 'throws', + message: `Missing expected exception${details}`, + stackStartFn: innerThrows + }); } if (expected && expectedException(actual, expected) === false) { throw actual; @@ -651,10 +718,13 @@ function innerThrows(shouldThrow, block, expected, message) { } else if (actual !== undefined) { if (!expected || expectedException(actual, expected)) { details = message ? `: ${message}` : '.'; - fail(actual, - expected, - `Got unwanted exception${details}`, - 'doesNotThrow'); + innerFail({ + actual, + expected, + operator: 'doesNotThrow', + message: `Got unwanted exception${details}`, + stackStartFn: innerThrows + }); } throw actual; } diff --git a/lib/internal/errors.js b/lib/internal/errors.js index 48062b6d3d40fd..e878766f680605 100644 --- a/lib/internal/errors.js +++ b/lib/internal/errors.js @@ -80,7 +80,7 @@ class AssertionError extends Error { if (typeof options !== 'object' || options === null) { throw new exports.TypeError('ERR_INVALID_ARG_TYPE', 'options', 'object'); } - var { actual, expected, message, operator, stackStartFunction } = options; + var { actual, expected, message, operator, stackStartFn } = options; if (message) { super(message); } else { @@ -99,7 +99,7 @@ class AssertionError extends Error { this.actual = actual; this.expected = expected; this.operator = operator; - Error.captureStackTrace(this, stackStartFunction); + Error.captureStackTrace(this, stackStartFn); } } diff --git a/test/message/error_exit.out b/test/message/error_exit.out index d6fbded760106b..c2dfc6a9f910ca 100644 --- a/test/message/error_exit.out +++ b/test/message/error_exit.out @@ -1,6 +1,6 @@ Exiting with code=1 assert.js:* - throw new errors.AssertionError({ + throw new errors.AssertionError(obj); ^ AssertionError [ERR_ASSERTION]: 1 === 2 diff --git a/test/parallel/test-assert.js b/test/parallel/test-assert.js index 71ee19f2e2fddb..2d5b38d0dceb02 100644 --- a/test/parallel/test-assert.js +++ b/test/parallel/test-assert.js @@ -721,3 +721,12 @@ common.expectsError( /* eslint-enable no-restricted-properties */ assert(7); } + +common.expectsError( + () => assert.ok(null), + { + code: 'ERR_ASSERTION', + type: assert.AssertionError, + message: 'null == true' + } +);