Skip to content

Commit 5a3623a

Browse files
committed
assert: validate required arguments
This validates most `assert` functions to verify that the required arguments are indeed passed to the function. PR-URL: #26641 Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Rich Trott <[email protected]> Reviewed-By: Sam Roberts <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Matteo Collina <[email protected]>
1 parent ab3f7af commit 5a3623a

File tree

3 files changed

+77
-18
lines changed

3 files changed

+77
-18
lines changed

.eslintrc.js

-16
Original file line numberDiff line numberDiff line change
@@ -210,22 +210,6 @@ module.exports = {
210210
selector: 'ThrowStatement > CallExpression[callee.name=/Error$/]',
211211
message: 'Use `new` keyword when throwing an `Error`.',
212212
},
213-
{
214-
selector: "CallExpression[callee.property.name='notDeepStrictEqual'][arguments.length<2]",
215-
message: 'assert.notDeepStrictEqual() must be invoked with at least two arguments.',
216-
},
217-
{
218-
selector: "CallExpression[callee.property.name='deepStrictEqual'][arguments.length<2]",
219-
message: 'assert.deepStrictEqual() must be invoked with at least two arguments.',
220-
},
221-
{
222-
selector: "CallExpression[callee.property.name='notStrictEqual'][arguments.length<2]",
223-
message: 'assert.notStrictEqual() must be invoked with at least two arguments.',
224-
},
225-
{
226-
selector: "CallExpression[callee.property.name='strictEqual'][arguments.length<2]",
227-
message: 'assert.strictEqual() must be invoked with at least two arguments.',
228-
},
229213
{
230214
selector: "CallExpression[callee.property.name='notDeepStrictEqual'][arguments.0.type='Literal']:not([arguments.1.type='Literal']):not([arguments.1.type='ObjectExpression']):not([arguments.1.type='ArrayExpression']):not([arguments.1.type='UnaryExpression'])",
231215
message: 'The first argument should be the `actual`, not the `expected` value.',

lib/assert.js

+26-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ const { codes: {
2525
ERR_AMBIGUOUS_ARGUMENT,
2626
ERR_INVALID_ARG_TYPE,
2727
ERR_INVALID_ARG_VALUE,
28-
ERR_INVALID_RETURN_VALUE
28+
ERR_INVALID_RETURN_VALUE,
29+
ERR_MISSING_ARGS
2930
} } = require('internal/errors');
3031
const AssertionError = require('internal/assert/assertion_error');
3132
const { openSync, closeSync, readSync } = require('fs');
@@ -351,6 +352,9 @@ assert.ok = ok;
351352
// The equality assertion tests shallow, coercive equality with ==.
352353
/* eslint-disable no-restricted-properties */
353354
assert.equal = function equal(actual, expected, message) {
355+
if (arguments.length < 2) {
356+
throw new ERR_MISSING_ARGS('actual', 'expected');
357+
}
354358
// eslint-disable-next-line eqeqeq
355359
if (actual != expected) {
356360
innerFail({
@@ -366,6 +370,9 @@ assert.equal = function equal(actual, expected, message) {
366370
// The non-equality assertion tests for whether two objects are not
367371
// equal with !=.
368372
assert.notEqual = function notEqual(actual, expected, message) {
373+
if (arguments.length < 2) {
374+
throw new ERR_MISSING_ARGS('actual', 'expected');
375+
}
369376
// eslint-disable-next-line eqeqeq
370377
if (actual == expected) {
371378
innerFail({
@@ -380,6 +387,9 @@ assert.notEqual = function notEqual(actual, expected, message) {
380387

381388
// The equivalence assertion tests a deep equality relation.
382389
assert.deepEqual = function deepEqual(actual, expected, message) {
390+
if (arguments.length < 2) {
391+
throw new ERR_MISSING_ARGS('actual', 'expected');
392+
}
383393
if (isDeepEqual === undefined) lazyLoadComparison();
384394
if (!isDeepEqual(actual, expected)) {
385395
innerFail({
@@ -394,6 +404,9 @@ assert.deepEqual = function deepEqual(actual, expected, message) {
394404

395405
// The non-equivalence assertion tests for any deep inequality.
396406
assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
407+
if (arguments.length < 2) {
408+
throw new ERR_MISSING_ARGS('actual', 'expected');
409+
}
397410
if (isDeepEqual === undefined) lazyLoadComparison();
398411
if (isDeepEqual(actual, expected)) {
399412
innerFail({
@@ -408,6 +421,9 @@ assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
408421
/* eslint-enable */
409422

410423
assert.deepStrictEqual = function deepStrictEqual(actual, expected, message) {
424+
if (arguments.length < 2) {
425+
throw new ERR_MISSING_ARGS('actual', 'expected');
426+
}
411427
if (isDeepEqual === undefined) lazyLoadComparison();
412428
if (!isDeepStrictEqual(actual, expected)) {
413429
innerFail({
@@ -422,6 +438,9 @@ assert.deepStrictEqual = function deepStrictEqual(actual, expected, message) {
422438

423439
assert.notDeepStrictEqual = notDeepStrictEqual;
424440
function notDeepStrictEqual(actual, expected, message) {
441+
if (arguments.length < 2) {
442+
throw new ERR_MISSING_ARGS('actual', 'expected');
443+
}
425444
if (isDeepEqual === undefined) lazyLoadComparison();
426445
if (isDeepStrictEqual(actual, expected)) {
427446
innerFail({
@@ -435,6 +454,9 @@ function notDeepStrictEqual(actual, expected, message) {
435454
}
436455

437456
assert.strictEqual = function strictEqual(actual, expected, message) {
457+
if (arguments.length < 2) {
458+
throw new ERR_MISSING_ARGS('actual', 'expected');
459+
}
438460
if (!Object.is(actual, expected)) {
439461
innerFail({
440462
actual,
@@ -447,6 +469,9 @@ assert.strictEqual = function strictEqual(actual, expected, message) {
447469
};
448470

449471
assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
472+
if (arguments.length < 2) {
473+
throw new ERR_MISSING_ARGS('actual', 'expected');
474+
}
450475
if (Object.is(actual, expected)) {
451476
innerFail({
452477
actual,

test/parallel/test-assert.js

+51-1
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,7 @@ assert.throws(
560560
'- undefined',
561561
].join('\n');
562562
assert.throws(
563-
() => assert.deepEqual([1, 2, 1]),
563+
() => assert.deepEqual([1, 2, 1], undefined),
564564
{ message });
565565

566566
message = [
@@ -1147,3 +1147,53 @@ assert.throws(
11471147
}
11481148
assert(threw);
11491149
}
1150+
1151+
assert.throws(
1152+
() => a.equal(1),
1153+
{ code: 'ERR_MISSING_ARGS' }
1154+
);
1155+
1156+
assert.throws(
1157+
() => a.deepEqual(/a/),
1158+
{ code: 'ERR_MISSING_ARGS' }
1159+
);
1160+
1161+
assert.throws(
1162+
() => a.notEqual(null),
1163+
{ code: 'ERR_MISSING_ARGS' }
1164+
);
1165+
1166+
assert.throws(
1167+
() => a.notDeepEqual('test'),
1168+
{ code: 'ERR_MISSING_ARGS' }
1169+
);
1170+
1171+
assert.throws(
1172+
() => a.strictEqual({}),
1173+
{ code: 'ERR_MISSING_ARGS' }
1174+
);
1175+
1176+
assert.throws(
1177+
() => a.deepStrictEqual(Symbol()),
1178+
{ code: 'ERR_MISSING_ARGS' }
1179+
);
1180+
1181+
assert.throws(
1182+
() => a.notStrictEqual(5n),
1183+
{ code: 'ERR_MISSING_ARGS' }
1184+
);
1185+
1186+
assert.throws(
1187+
() => a.notDeepStrictEqual(undefined),
1188+
{ code: 'ERR_MISSING_ARGS' }
1189+
);
1190+
1191+
assert.throws(
1192+
() => a.strictEqual(),
1193+
{ code: 'ERR_MISSING_ARGS' }
1194+
);
1195+
1196+
assert.throws(
1197+
() => a.deepStrictEqual(),
1198+
{ code: 'ERR_MISSING_ARGS' }
1199+
);

0 commit comments

Comments
 (0)