Skip to content

Commit 301844e

Browse files
aduh95ruyadorno
authored andcommitted
assert: differentiate cases where cause is undefined or missing
PR-URL: #55738 Reviewed-By: LiviaMedeiros <livia@cirno.name> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de> Reviewed-By: Chengzhong Wu <legendecas@gmail.com> Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
1 parent 89ccd3e commit 301844e

3 files changed

Lines changed: 52 additions & 5 deletions

File tree

‎lib/internal/assert/assertion_error.js‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const {
99
ObjectAssign,
1010
ObjectDefineProperty,
1111
ObjectGetPrototypeOf,
12+
ObjectPrototypeHasOwnProperty,
1213
String,
1314
StringPrototypeRepeat,
1415
StringPrototypeSlice,
@@ -49,8 +50,8 @@ function copyError(source) {
4950
__proto__: null,
5051
value: source.message,
5152
});
52-
if(source.cause!==undefined){
53-
letcause=source.cause;
53+
if(ObjectPrototypeHasOwnProperty(source,'cause')){
54+
let{cause }=source;
5455

5556
if(isError(cause)){
5657
cause=copyError(cause);

‎lib/internal/util/comparisons.js‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ const {
2727

2828
const{ compare }=internalBinding('buffer');
2929
constassert=require('internal/assert');
30+
const{ isError }=require('internal/util');
3031
consttypes=require('internal/util/types');
3132
const{
3233
isAnyArrayBuffer,
@@ -232,10 +233,10 @@ function innerDeepEqual(val1, val2, strict, memos) {
232233
if(!isAnyArrayBuffer(val2)||!areEqualArrayBuffers(val1,val2)){
233234
returnfalse;
234235
}
235-
}elseif(isNativeError(val1)||val1instanceofError){
236+
}elseif(isError(val1)){
236237
// Do not compare the stack as it might differ even though the error itself
237238
// is otherwise identical.
238-
if(!isNativeError(val2)&&!(val2instanceofError)){
239+
if(!isError(val2)){
239240
returnfalse;
240241
}
241242

@@ -249,7 +250,9 @@ function innerDeepEqual(val1, val2, strict, memos) {
249250
(name1Enumerable!==ObjectPrototypePropertyIsEnumerable(val2,'name')||
250251
(!name1Enumerable&&val1.name!==val2.name))||
251252
(cause1Enumerable!==ObjectPrototypePropertyIsEnumerable(val2,'cause')||
252-
(!cause1Enumerable&&!innerDeepEqual(val1.cause,val2.cause,strict,memos)))||
253+
(!cause1Enumerable&&(
254+
ObjectPrototypeHasOwnProperty(val1,'cause')!==ObjectPrototypeHasOwnProperty(val2,'cause')||
255+
!innerDeepEqual(val1.cause,val2.cause,strict,memos))))||
253256
(errors1Enumerable!==ObjectPrototypePropertyIsEnumerable(val2,'errors')||
254257
(!errors1Enumerable&&!innerDeepEqual(val1.errors,val2.errors,strict,memos)))){
255258
returnfalse;

‎test/parallel/test-assert-deep-with-error.js‎

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,26 @@ const defaultStartMessage = 'Expected values to be strictly deep-equal:\n' +
88
'\n';
99

1010
test('Handle error causes',()=>{
11+
assert.deepStrictEqual(newError('a',{cause: newError('x')}),newError('a',{cause: newError('x')}));
12+
assert.deepStrictEqual(
13+
newError('a',{cause: newRangeError('x')}),
14+
newError('a',{cause: newRangeError('x')}),
15+
);
16+
1117
assert.throws(()=>{
1218
assert.deepStrictEqual(newError('a',{cause: newError('x')}),newError('a',{cause: newError('y')}));
1319
},{message: defaultStartMessage+' [Error: a] {\n'+
1420
'+ [cause]: [Error: x]\n'+
1521
'- [cause]: [Error: y]\n'+
1622
' }\n'});
1723

24+
assert.throws(()=>{
25+
assert.deepStrictEqual(newError('a',{cause: newError('x')}),newError('a',{cause: newTypeError('x')}));
26+
},{message: defaultStartMessage+' [Error: a] {\n'+
27+
'+ [cause]: [Error: x]\n'+
28+
'- [cause]: [TypeError: x]\n'+
29+
' }\n'});
30+
1831
assert.throws(()=>{
1932
assert.deepStrictEqual(newError('a'),newError('a',{cause: newError('y')}));
2033
},{message: defaultStartMessage+'+ [Error: a]\n'+
@@ -37,3 +50,33 @@ test('Handle error causes', () => {
3750
newError('a',{cause: {prop: 'a different value'}})
3851
);
3952
});
53+
54+
test('Handle undefined causes',()=>{
55+
assert.deepStrictEqual(newError('a',{cause: undefined}),newError('a',{cause: undefined}));
56+
57+
assert.notDeepStrictEqual(newError('a',{cause: 'undefined'}),newError('a',{cause: undefined}));
58+
assert.notDeepStrictEqual(newError('a',{cause: undefined}),newError('a'));
59+
assert.notDeepStrictEqual(newError('a'),newError('a',{cause: undefined}));
60+
61+
assert.throws(()=>{
62+
assert.deepStrictEqual(newError('a'),newError('a',{cause: undefined}));
63+
},{message: defaultStartMessage+
64+
'+ [Error: a]\n'+
65+
'- [Error: a] {\n'+
66+
'- [cause]: undefined\n'+
67+
'- }\n'});
68+
69+
assert.throws(()=>{
70+
assert.deepStrictEqual(newError('a',{cause: undefined}),newError('a'));
71+
},{message: defaultStartMessage+
72+
'+ [Error: a] {\n'+
73+
'+ [cause]: undefined\n'+
74+
'+ }\n'+
75+
'- [Error: a]\n'});
76+
assert.throws(()=>{
77+
assert.deepStrictEqual(newError('a',{cause: undefined}),newError('a',{cause: 'undefined'}));
78+
},{message: defaultStartMessage+' [Error: a] {\n'+
79+
'+ [cause]: undefined\n'+
80+
'- [cause]: \'undefined\'\n'+
81+
' }\n'});
82+
});

0 commit comments

Comments
 (0)