Skip to content

Commit 2eb8889

Browse files
committed
assert: handle cause when cutting off stack frames
1 parent 4c72dda commit 2eb8889

File tree

3 files changed

+38
-7
lines changed

3 files changed

+38
-7
lines changed

lib/internal/assert/assertion_error.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,15 @@ const kMaxShortLength = 12;
4848
function copyError(source) {
4949
const target = ObjectAssign({ __proto__: ObjectGetPrototypeOf(source) }, source);
5050
ObjectDefineProperty(target, 'message', { __proto__: null, value: source.message });
51+
if (source.cause !== undefined) {
52+
let cause = source.cause;
53+
54+
if (cause instanceof Error) {
55+
cause = copyError(cause);
56+
}
57+
58+
ObjectDefineProperty(target, 'cause', { __proto__: null, value: cause });
59+
}
5160
return target;
5261
}
5362

@@ -82,8 +91,9 @@ function createErrDiff(actual, expected, operator, message = '') {
8291
let end = '';
8392
let skipped = false;
8493
const actualInspected = inspectValue(actual);
94+
const expectedInspected = inspectValue(expected);
8595
const actualLines = StringPrototypeSplit(actualInspected, '\n');
86-
const expectedLines = StringPrototypeSplit(inspectValue(expected), '\n');
96+
const expectedLines = StringPrototypeSplit(expectedInspected, '\n');
8797

8898
let i = 0;
8999
let indicator = '';
@@ -360,6 +370,7 @@ class AssertionError extends Error {
360370
expected = copyError(expected);
361371
}
362372

373+
363374
if (operator === 'deepStrictEqual' || operator === 'strictEqual') {
364375
super(createErrDiff(actual, expected, operator));
365376
} else if (operator === 'notDeepStrictEqual' ||
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
'use strict';
2+
require('../common');
3+
const assert = require('assert');
4+
const { test } = require('node:test');
5+
6+
const defaultStartMessage = 'Expected values to be strictly deep-equal:\n' +
7+
'+ actual - expected\n' +
8+
'\n';
9+
10+
test('Handle error causes', () => {
11+
assert.throws(() => {
12+
assert.deepStrictEqual(new Error('a', { cause: new Error('x') }), new Error('a', { cause: new Error('y') }));
13+
}, { message: defaultStartMessage + ' [Error: a] {\n' +
14+
'+ [cause]: [Error: x]\n' +
15+
'- [cause]: [Error: y]\n' +
16+
' }' });
17+
18+
assert.throws(() => {
19+
assert.deepStrictEqual(new Error('a'), new Error('a', { cause: new Error('y') }));
20+
}, { message: defaultStartMessage + '+ [Error: a]\n' +
21+
'- [Error: a] {\n' +
22+
'- [cause]: [Error: y]\n' +
23+
'- }' });
24+
25+
assert.notDeepStrictEqual(new Error('a', { cause: new Error('x') }), new Error('a', { cause: new Error('y') }));
26+
});

test/parallel/test-assert-deep.js

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -611,12 +611,6 @@ test('Handle different error messages', () => {
611611
assertNotDeepOrStrict(err1, {}, AssertionError);
612612
});
613613

614-
test.only('Handle error causes', () => {
615-
// This should fail as in assert.notEqual(1, 1) (?)
616-
assert.notEqual(new Error("a"), new Error("b", { cause: new Error("y") }));
617-
assert.deepStrictEqual(new Error("a"), new Error("a", { cause: new Error("y") }))
618-
});
619-
620614
test('Handle NaN', () => {
621615
assertDeepAndStrictEqual(NaN, NaN);
622616
assertDeepAndStrictEqual({ a: NaN }, { a: NaN });

0 commit comments

Comments
 (0)