Skip to content

Commit 23fc205

Browse files
tniessendanielleadams
authored andcommitted
test: avoid deep comparisons with literals
Comparing any value to any non-RegExp literal or undefined using strictEqual (or notStrictEqual) passes if and only if deepStrictEqual (or notDeepStrictEqual, respectively) passes. Unnecessarily using deep comparisons adds confusion. This patch adds an ESLint rule that forbids the use of deepStrictEqual and notDeepStrictEqual when the expected value (i.e., the second argument) is a non-RegExp literal or undefined. For reference, an ESTree literal is defined as follows. extend interface Literal <: Expression { type: "Literal"; value: string | boolean | null | number | RegExp | bigint; } The value `undefined` is an `Identifier` with `name: 'undefined'`. PR-URL: #40634 Backport-PR-URL: #42021 Reviewed-By: Rich Trott <[email protected]> Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: Ruben Bridgewater <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Michaël Zasso <[email protected]> Reviewed-By: Voltrex <[email protected]>
1 parent 74c0464 commit 23fc205

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+111
-107
lines changed

test/.eslintrc.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ rules:
1313
no-restricted-syntax:
1414
# Config copied from .eslintrc.js
1515
- error
16+
- selector: "CallExpression:matches([callee.name='deepStrictEqual'], [callee.property.name='deepStrictEqual']):matches([arguments.1.type='Literal']:not([arguments.1.regex]), [arguments.1.type='Identifier'][arguments.1.name='undefined'])"
17+
message: "Use strictEqual instead of deepStrictEqual for literals or undefined."
18+
- selector: "CallExpression:matches([callee.name='notDeepStrictEqual'], [callee.property.name='notDeepStrictEqual']):matches([arguments.1.type='Literal']:not([arguments.1.regex]), [arguments.1.type='Identifier'][arguments.1.name='undefined'])"
19+
message: "Use notStrictEqual instead of notDeepStrictEqual for literals or undefined."
1620
- selector: "CallExpression:matches([callee.name='deepStrictEqual'], [callee.property.name='deepStrictEqual'])[arguments.2.type='Literal']"
1721
message: "Do not use a literal for the third argument of assert.deepStrictEqual()"
1822
- selector: "CallExpression:matches([callee.name='doesNotThrow'], [callee.property.name='doesNotThrow'])"

test/es-module/test-esm-data-urls.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ function createBase64URL(mime, body) {
1515
const plainESMURL = createURL('text/javascript', body);
1616
const ns = await import(plainESMURL);
1717
assert.deepStrictEqual(Object.keys(ns), ['default']);
18-
assert.deepStrictEqual(ns.default.a, 'aaa');
18+
assert.strictEqual(ns.default.a, 'aaa');
1919
const importerOfURL = createURL(
2020
'text/javascript',
2121
`export {default as default} from ${JSON.stringify(plainESMURL)}`
@@ -35,41 +35,41 @@ function createBase64URL(mime, body) {
3535
const plainESMURL = createURL('text/javascript', body);
3636
const ns = await import(plainESMURL);
3737
assert.deepStrictEqual(Object.keys(ns), ['default']);
38-
assert.deepStrictEqual(ns.default, plainESMURL);
38+
assert.strictEqual(ns.default, plainESMURL);
3939
}
4040
{
4141
const body = 'export default import.meta.url;';
4242
const plainESMURL = createURL('text/javascript;charset=UTF-8', body);
4343
const ns = await import(plainESMURL);
4444
assert.deepStrictEqual(Object.keys(ns), ['default']);
45-
assert.deepStrictEqual(ns.default, plainESMURL);
45+
assert.strictEqual(ns.default, plainESMURL);
4646
}
4747
{
4848
const body = 'export default import.meta.url;';
4949
const plainESMURL = createURL('text/javascript;charset="UTF-8"', body);
5050
const ns = await import(plainESMURL);
5151
assert.deepStrictEqual(Object.keys(ns), ['default']);
52-
assert.deepStrictEqual(ns.default, plainESMURL);
52+
assert.strictEqual(ns.default, plainESMURL);
5353
}
5454
{
5555
const body = 'export default import.meta.url;';
5656
const plainESMURL = createURL('text/javascript;;a=a;b=b;;', body);
5757
const ns = await import(plainESMURL);
5858
assert.deepStrictEqual(Object.keys(ns), ['default']);
59-
assert.deepStrictEqual(ns.default, plainESMURL);
59+
assert.strictEqual(ns.default, plainESMURL);
6060
}
6161
{
6262
const ns = await import('data:application/json;foo="test,"this"',
6363
{ assert: { type: 'json' } });
6464
assert.deepStrictEqual(Object.keys(ns), ['default']);
65-
assert.deepStrictEqual(ns.default, 'this');
65+
assert.strictEqual(ns.default, 'this');
6666
}
6767
{
6868
const ns = await import(`data:application/json;foo=${
6969
encodeURIComponent('test,')
7070
},0`, { assert: { type: 'json' } });
7171
assert.deepStrictEqual(Object.keys(ns), ['default']);
72-
assert.deepStrictEqual(ns.default, 0);
72+
assert.strictEqual(ns.default, 0);
7373
}
7474
{
7575
await assert.rejects(async () =>
@@ -84,14 +84,14 @@ function createBase64URL(mime, body) {
8484
const plainESMURL = createURL('application/json', body);
8585
const ns = await import(plainESMURL, { assert: { type: 'json' } });
8686
assert.deepStrictEqual(Object.keys(ns), ['default']);
87-
assert.deepStrictEqual(ns.default.x, 1);
87+
assert.strictEqual(ns.default.x, 1);
8888
}
8989
{
9090
const body = '{"default": 2}';
9191
const plainESMURL = createURL('application/json', body);
9292
const ns = await import(plainESMURL, { assert: { type: 'json' } });
9393
assert.deepStrictEqual(Object.keys(ns), ['default']);
94-
assert.deepStrictEqual(ns.default.default, 2);
94+
assert.strictEqual(ns.default.default, 2);
9595
}
9696
{
9797
const body = 'null';

test/js-native-api/test_conversions/test.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,10 @@ assert.deepStrictEqual(new String(''), test.toObject(''));
118118
assert.deepStrictEqual(new Number(0), test.toObject(0));
119119
assert.deepStrictEqual(new Number(Number.NaN), test.toObject(Number.NaN));
120120
assert.deepStrictEqual(new Object(testSym), test.toObject(testSym));
121-
assert.notDeepStrictEqual(test.toObject(false), false);
122-
assert.notDeepStrictEqual(test.toObject(true), true);
123-
assert.notDeepStrictEqual(test.toObject(''), '');
124-
assert.notDeepStrictEqual(test.toObject(0), 0);
121+
assert.notStrictEqual(test.toObject(false), false);
122+
assert.notStrictEqual(test.toObject(true), true);
123+
assert.notStrictEqual(test.toObject(''), '');
124+
assert.notStrictEqual(test.toObject(0), 0);
125125
assert.ok(!Number.isNaN(test.toObject(Number.NaN)));
126126

127127
assert.strictEqual(test.toString(''), '');

test/parallel/test-assert-deep.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -858,11 +858,13 @@ assert.throws(
858858
}
859859

860860
assert.throws(
861+
// eslint-disable-next-line no-restricted-syntax
861862
() => assert.deepStrictEqual(4, '4'),
862863
{ message: `${defaultMsgStart}\n4 !== '4'\n` }
863864
);
864865

865866
assert.throws(
867+
// eslint-disable-next-line no-restricted-syntax
866868
() => assert.deepStrictEqual(true, 1),
867869
{ message: `${defaultMsgStart}\ntrue !== 1\n` }
868870
);

test/parallel/test-assert.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1243,6 +1243,7 @@ assert.throws(
12431243
{
12441244
let threw = false;
12451245
try {
1246+
// eslint-disable-next-line no-restricted-syntax
12461247
assert.deepStrictEqual(Array(100).fill(1), 'foobar');
12471248
} catch (err) {
12481249
threw = true;

test/parallel/test-crypto-hmac.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -422,8 +422,8 @@ assert.strictEqual(
422422
}
423423
{
424424
const h = crypto.createHmac('sha1', 'key').update('data');
425-
assert.deepStrictEqual(h.digest('latin1'), expected);
426-
assert.deepStrictEqual(h.digest('latin1'), '');
425+
assert.strictEqual(h.digest('latin1'), expected);
426+
assert.strictEqual(h.digest('latin1'), '');
427427
}
428428
}
429429

@@ -440,8 +440,8 @@ assert.strictEqual(
440440
}
441441
{
442442
const h = crypto.createHmac('sha1', 'key');
443-
assert.deepStrictEqual(h.digest('latin1'), expected);
444-
assert.deepStrictEqual(h.digest('latin1'), '');
443+
assert.strictEqual(h.digest('latin1'), expected);
444+
assert.strictEqual(h.digest('latin1'), '');
445445
}
446446
}
447447

test/parallel/test-dns-lookup.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ dns.lookup('127.0.0.1', {
137137
family: 4,
138138
all: false
139139
}, common.mustSucceed((result, addressType) => {
140-
assert.deepStrictEqual(result, '127.0.0.1');
140+
assert.strictEqual(result, '127.0.0.1');
141141
assert.strictEqual(addressType, 4);
142142
}));
143143

test/parallel/test-dns.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -337,10 +337,10 @@ assert.throws(() => {
337337

338338
{
339339
dns.resolveMx('foo.onion', function(err) {
340-
assert.deepStrictEqual(err.code, 'ENOTFOUND');
341-
assert.deepStrictEqual(err.syscall, 'queryMx');
342-
assert.deepStrictEqual(err.hostname, 'foo.onion');
343-
assert.deepStrictEqual(err.message, 'queryMx ENOTFOUND foo.onion');
340+
assert.strictEqual(err.code, 'ENOTFOUND');
341+
assert.strictEqual(err.syscall, 'queryMx');
342+
assert.strictEqual(err.hostname, 'foo.onion');
343+
assert.strictEqual(err.message, 'queryMx ENOTFOUND foo.onion');
344344
});
345345
}
346346

test/parallel/test-error-serdes.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,5 +64,5 @@ assert.strictEqual(cycle(Function), '[Function: Function]');
6464
}
6565

6666
serializeError(new DynamicError());
67-
assert.deepStrictEqual(called, true);
67+
assert.strictEqual(called, true);
6868
}

test/parallel/test-fs-promises-file-handle-chmod.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ async function validateFilePermission() {
1919
const fileHandle = await open(filePath, 'w+', 0o444);
2020
// File created with r--r--r-- 444
2121
const statsBeforeMod = fs.statSync(filePath);
22-
assert.deepStrictEqual(statsBeforeMod.mode & 0o444, 0o444);
22+
assert.strictEqual(statsBeforeMod.mode & 0o444, 0o444);
2323

2424
let expectedAccess;
2525
const newPermissions = 0o765;

0 commit comments

Comments
 (0)