assert: do not repeat .throws() code

This refactors some code for less duplication.

PR-URL: https://github.com/nodejs/node/pull/28263
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
Ruben Bridgewater 2019-06-14 16:29:25 +02:00
parent d47b6786c9
commit 5700cd17dd
No known key found for this signature in database
GPG Key ID: F07496B3EB3C1762

View File

@ -563,6 +563,7 @@ function compareExceptionKey(actual, expected, key, message, keys, fn) {
function expectedException(actual, expected, message, fn) {
let generatedMessage = false;
let throwError = false;
if (typeof expected !== 'function') {
// Handle regular expressions.
@ -576,20 +577,9 @@ function expectedException(actual, expected, message, fn) {
message = 'The input did not match the regular expression ' +
`${inspect(expected)}. Input:\n\n${inspect(str)}\n`;
}
const err = new AssertionError({
actual,
expected,
message,
operator: fn.name,
stackStartFn: fn
});
err.generatedMessage = generatedMessage;
throw err;
}
throwError = true;
// Handle primitives properly.
if (typeof actual !== 'object' || actual === null) {
} else if (typeof actual !== 'object' || actual === null) {
const err = new AssertionError({
actual,
expected,
@ -599,12 +589,11 @@ function expectedException(actual, expected, message, fn) {
});
err.operator = fn.name;
throw err;
}
} else {
// Handle validation objects.
const keys = Object.keys(expected);
// Special handle errors to make sure the name and the message are compared
// as well.
// Special handle errors to make sure the name and the message are
// compared as well.
if (expected instanceof Error) {
keys.push('name', 'message');
} else if (keys.length === 0) {
@ -622,13 +611,11 @@ function expectedException(actual, expected, message, fn) {
}
return;
}
// Guard instanceof against arrow functions as they don't have a prototype.
// Check for matching Error classes.
if (expected.prototype !== undefined && actual instanceof expected) {
} else if (expected.prototype !== undefined && actual instanceof expected) {
return;
}
if (ObjectPrototype.isPrototypeOf(Error, expected)) {
} else if (ObjectPrototype.isPrototypeOf(Error, expected)) {
if (!message) {
generatedMessage = true;
message = 'The error is expected to be an instance of ' +
@ -639,26 +626,22 @@ function expectedException(actual, expected, message, fn) {
message += `"${inspect(actual, { depth: -1 })}"`;
}
}
const err = new AssertionError({
actual,
expected,
message,
operator: fn.name,
stackStartFn: fn
});
err.generatedMessage = generatedMessage;
throw err;
}
throwError = true;
} else {
// Check validation functions return value.
const res = expected.call({}, actual);
if (res !== true) {
if (!message) {
generatedMessage = true;
const name = expected.name ? `"${expected.name}" ` : '';
message = `The ${name}validation function is expected to return "true".` +
` Received ${inspect(res)}`;
message = `The ${name}validation function is expected to return` +
` "true". Received ${inspect(res)}`;
}
throwError = true;
}
}
if (throwError) {
const err = new AssertionError({
actual,
expected,