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:
parent
a364e7efbd
commit
7cf569a97b
118
lib/assert.js
118
lib/assert.js
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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'
|
||||||
|
}
|
||||||
|
);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user