assert: use object argument in innerFail

Right now it is difficult to know what argument stands for what
property. By refactoring the arguments into a object it is clear
what stands for what.

PR-URL: https://github.com/nodejs/node/pull/17582
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Jon Moss <me@jonathanmoss.me>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Anatoli Papirovski <apapirovski@mac.com>
This commit is contained in:
Ruben Bridgewater 2017-12-09 17:15:19 -02:00
parent a364e7efbd
commit 7cf569a97b
No known key found for this signature in database
GPG Key ID: F07496B3EB3C1762
4 changed files with 104 additions and 29 deletions

View File

@ -36,19 +36,13 @@ const assert = module.exports = ok;
// both the actual and expected values to the assertion error for // both the actual and expected values to the assertion error for
// display purposes. // display purposes.
function innerFail(actual, expected, message, operator, stackStartFunction) { function innerFail(obj) {
if (message instanceof Error) throw message; if (obj.message instanceof Error) throw obj.message;
throw new errors.AssertionError({ throw new errors.AssertionError(obj);
message,
actual,
expected,
operator,
stackStartFunction
});
} }
function fail(actual, expected, message, operator, stackStartFunction) { function fail(actual, expected, message, operator, stackStartFn) {
const argsLen = arguments.length; const argsLen = arguments.length;
if (argsLen === 0) { if (argsLen === 0) {
@ -60,7 +54,13 @@ function fail(actual, expected, message, operator, stackStartFunction) {
operator = '!='; operator = '!=';
} }
innerFail(actual, expected, message, operator, stackStartFunction || fail); innerFail({
actual,
expected,
message,
operator,
stackStartFn: stackStartFn || fail
});
} }
assert.fail = fail; assert.fail = fail;
@ -75,7 +75,15 @@ assert.AssertionError = errors.AssertionError;
// Pure assertion tests whether a value is truthy, as determined // Pure assertion tests whether a value is truthy, as determined
// by !!value. // by !!value.
function ok(value, message) { 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; assert.ok = ok;
@ -83,7 +91,15 @@ assert.ok = ok;
/* eslint-disable no-restricted-properties */ /* eslint-disable no-restricted-properties */
assert.equal = function equal(actual, expected, message) { assert.equal = function equal(actual, expected, message) {
// eslint-disable-next-line eqeqeq // 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 // The non-equality assertion tests for whether two objects are not
@ -91,48 +107,89 @@ assert.equal = function equal(actual, expected, message) {
assert.notEqual = function notEqual(actual, expected, message) { assert.notEqual = function notEqual(actual, expected, message) {
// eslint-disable-next-line eqeqeq // eslint-disable-next-line eqeqeq
if (actual == expected) { if (actual == expected) {
innerFail(actual, expected, message, '!=', notEqual); innerFail({
actual,
expected,
message,
operator: '!=',
stackStartFn: notEqual
});
} }
}; };
// The equivalence assertion tests a deep equality relation. // The equivalence assertion tests a deep equality relation.
assert.deepEqual = function deepEqual(actual, expected, message) { assert.deepEqual = function deepEqual(actual, expected, message) {
if (!isDeepEqual(actual, expected)) { if (!isDeepEqual(actual, expected)) {
innerFail(actual, expected, message, 'deepEqual', deepEqual); innerFail({
actual,
expected,
message,
operator: 'deepEqual',
stackStartFn: deepEqual
});
} }
}; };
// The non-equivalence assertion tests for any deep inequality. // The non-equivalence assertion tests for any deep inequality.
assert.notDeepEqual = function notDeepEqual(actual, expected, message) { assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
if (isDeepEqual(actual, expected)) { if (isDeepEqual(actual, expected)) {
innerFail(actual, expected, message, 'notDeepEqual', notDeepEqual); innerFail({
actual,
expected,
message,
operator: 'notDeepEqual',
stackStartFn: notDeepEqual
});
} }
}; };
/* eslint-enable */ /* eslint-enable */
assert.deepStrictEqual = function deepStrictEqual(actual, expected, message) { assert.deepStrictEqual = function deepStrictEqual(actual, expected, message) {
if (!isDeepStrictEqual(actual, expected)) { if (!isDeepStrictEqual(actual, expected)) {
innerFail(actual, expected, message, 'deepStrictEqual', deepStrictEqual); innerFail({
actual,
expected,
message,
operator: 'deepStrictEqual',
stackStartFn: deepStrictEqual
});
} }
}; };
assert.notDeepStrictEqual = notDeepStrictEqual; assert.notDeepStrictEqual = notDeepStrictEqual;
function notDeepStrictEqual(actual, expected, message) { function notDeepStrictEqual(actual, expected, message) {
if (isDeepStrictEqual(actual, expected)) { if (isDeepStrictEqual(actual, expected)) {
innerFail(actual, expected, message, 'notDeepStrictEqual', innerFail({
notDeepStrictEqual); actual,
expected,
message,
operator: 'notDeepStrictEqual',
stackStartFn: notDeepStrictEqual
});
} }
} }
assert.strictEqual = function strictEqual(actual, expected, message) { assert.strictEqual = function strictEqual(actual, expected, message) {
if (!Object.is(actual, expected)) { if (!Object.is(actual, expected)) {
innerFail(actual, expected, message, 'strictEqual', strictEqual); innerFail({
actual,
expected,
message,
operator: 'strictEqual',
stackStartFn: strictEqual
});
} }
}; };
assert.notStrictEqual = function notStrictEqual(actual, expected, message) { assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
if (Object.is(actual, expected)) { if (Object.is(actual, expected)) {
innerFail(actual, expected, message, 'notStrictEqual', notStrictEqual); innerFail({
actual,
expected,
message,
operator: 'notStrictEqual',
stackStartFn: notStrictEqual
});
} }
}; };
@ -180,7 +237,13 @@ function innerThrows(shouldThrow, block, expected, message) {
details += ` (${expected.name})`; details += ` (${expected.name})`;
} }
details += message ? `: ${message}` : '.'; 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) { if (expected && expectedException(actual, expected) === false) {
throw actual; throw actual;
@ -188,10 +251,13 @@ function innerThrows(shouldThrow, block, expected, message) {
} else if (actual !== undefined) { } else if (actual !== undefined) {
if (!expected || expectedException(actual, expected)) { if (!expected || expectedException(actual, expected)) {
details = message ? `: ${message}` : '.'; details = message ? `: ${message}` : '.';
fail(actual, innerFail({
expected, actual,
`Got unwanted exception${details}\n${actual.message}`, expected,
'doesNotThrow'); operator: 'doesNotThrow',
message: `Got unwanted exception${details}\n${actual.message}`,
stackStartFn: innerThrows
});
} }
throw actual; throw actual;
} }

View File

@ -136,7 +136,7 @@ class AssertionError extends Error {
if (typeof options !== 'object' || options === null) { if (typeof options !== 'object' || options === null) {
throw new exports.TypeError('ERR_INVALID_ARG_TYPE', 'options', 'Object'); 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) { if (message) {
super(message); super(message);
} else { } else {
@ -155,7 +155,7 @@ class AssertionError extends Error {
this.actual = actual; this.actual = actual;
this.expected = expected; this.expected = expected;
this.operator = operator; this.operator = operator;
Error.captureStackTrace(this, stackStartFunction); Error.captureStackTrace(this, stackStartFn);
} }
} }

View File

@ -1,6 +1,6 @@
Exiting with code=1 Exiting with code=1
assert.js:* assert.js:*
throw new errors.AssertionError({ throw new errors.AssertionError(obj);
^ ^
AssertionError [ERR_ASSERTION]: 1 strictEqual 2 AssertionError [ERR_ASSERTION]: 1 strictEqual 2

View File

@ -780,3 +780,12 @@ common.expectsError(
/* eslint-enable no-restricted-properties */ /* eslint-enable no-restricted-properties */
assert(7); assert(7);
} }
common.expectsError(
() => assert.ok(null),
{
code: 'ERR_ASSERTION',
type: assert.AssertionError,
message: 'null == true'
}
);