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 <rtrott@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Michaël Zasso <targos@protonmail.com> Reviewed-By: Voltrex <mohammadkeyvanzade94@gmail.com>
1 parent 74c0464 commit 23fc205

42 files changed

Lines changed: 111 additions & 107 deletions

Some content is hidden

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

‎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
constplainESMURL=createURL('text/javascript',body);
1616
constns=awaitimport(plainESMURL);
1717
assert.deepStrictEqual(Object.keys(ns),['default']);
18-
assert.deepStrictEqual(ns.default.a,'aaa');
18+
assert.strictEqual(ns.default.a,'aaa');
1919
constimporterOfURL=createURL(
2020
'text/javascript',
2121
`export {default as default} from ${JSON.stringify(plainESMURL)}`
@@ -35,41 +35,41 @@ function createBase64URL(mime, body) {
3535
constplainESMURL=createURL('text/javascript',body);
3636
constns=awaitimport(plainESMURL);
3737
assert.deepStrictEqual(Object.keys(ns),['default']);
38-
assert.deepStrictEqual(ns.default,plainESMURL);
38+
assert.strictEqual(ns.default,plainESMURL);
3939
}
4040
{
4141
constbody='export default import.meta.url;';
4242
constplainESMURL=createURL('text/javascript;charset=UTF-8',body);
4343
constns=awaitimport(plainESMURL);
4444
assert.deepStrictEqual(Object.keys(ns),['default']);
45-
assert.deepStrictEqual(ns.default,plainESMURL);
45+
assert.strictEqual(ns.default,plainESMURL);
4646
}
4747
{
4848
constbody='export default import.meta.url;';
4949
constplainESMURL=createURL('text/javascript;charset="UTF-8"',body);
5050
constns=awaitimport(plainESMURL);
5151
assert.deepStrictEqual(Object.keys(ns),['default']);
52-
assert.deepStrictEqual(ns.default,plainESMURL);
52+
assert.strictEqual(ns.default,plainESMURL);
5353
}
5454
{
5555
constbody='export default import.meta.url;';
5656
constplainESMURL=createURL('text/javascript;;a=a;b=b;;',body);
5757
constns=awaitimport(plainESMURL);
5858
assert.deepStrictEqual(Object.keys(ns),['default']);
59-
assert.deepStrictEqual(ns.default,plainESMURL);
59+
assert.strictEqual(ns.default,plainESMURL);
6060
}
6161
{
6262
constns=awaitimport('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
constns=awaitimport(`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
awaitassert.rejects(async()=>
@@ -84,14 +84,14 @@ function createBase64URL(mime, body) {
8484
constplainESMURL=createURL('application/json',body);
8585
constns=awaitimport(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
constbody='{"default": 2}';
9191
constplainESMURL=createURL('application/json',body);
9292
constns=awaitimport(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
constbody='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(newNumber(0),test.toObject(0));
119119
assert.deepStrictEqual(newNumber(Number.NaN),test.toObject(Number.NaN));
120120
assert.deepStrictEqual(newObject(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
letthrew=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
consth=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
consth=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(newDynamicError());
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
constfileHandle=awaitopen(filePath,'w+',0o444);
2020
// File created with r--r--r-- 444
2121
conststatsBeforeMod=fs.statSync(filePath);
22-
assert.deepStrictEqual(statsBeforeMod.mode&0o444,0o444);
22+
assert.strictEqual(statsBeforeMod.mode&0o444,0o444);
2323

2424
letexpectedAccess;
2525
constnewPermissions=0o765;

0 commit comments

Comments
 (0)