summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/message/assert_throws_stack.out2
-rw-r--r--test/message/error_exit.out6
-rw-r--r--test/parallel/test-assert-checktag.js38
-rw-r--r--test/parallel/test-assert-deep.js205
-rw-r--r--test/parallel/test-assert.js82
-rw-r--r--test/pseudo-tty/test-assert-colors.js2
6 files changed, 234 insertions, 101 deletions
diff --git a/test/message/assert_throws_stack.out b/test/message/assert_throws_stack.out
index 71d06a461e..62a25a6367 100644
--- a/test/message/assert_throws_stack.out
+++ b/test/message/assert_throws_stack.out
@@ -2,7 +2,7 @@ assert.js:*
throw new AssertionError(obj);
^
-AssertionError [ERR_ASSERTION]: Input A expected to deepStrictEqual input B:
+AssertionError [ERR_ASSERTION]: Input A expected to strictly deep-equal input B:
+ expected - actual
- Comparison {}
diff --git a/test/message/error_exit.out b/test/message/error_exit.out
index e7bcb05065..1935c18979 100644
--- a/test/message/error_exit.out
+++ b/test/message/error_exit.out
@@ -3,7 +3,11 @@ assert.js:*
throw new AssertionError(obj);
^
-AssertionError [ERR_ASSERTION]: 1 strictEqual 2
+AssertionError [ERR_ASSERTION]: Input A expected to strictly equal input B:
++ expected - actual
+
+- 1
++ 2
at Object.<anonymous> (*test*message*error_exit.js:*:*)
at Module._compile (internal/modules/cjs/loader.js:*:*)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:*:*)
diff --git a/test/parallel/test-assert-checktag.js b/test/parallel/test-assert-checktag.js
index 632bfa03c6..38ebaa1a14 100644
--- a/test/parallel/test-assert-checktag.js
+++ b/test/parallel/test-assert-checktag.js
@@ -1,24 +1,6 @@
'use strict';
-const common = require('../common');
+require('../common');
const assert = require('assert');
-const util = require('util');
-
-// Template tag function turning an error message into a RegExp
-// for assert.throws()
-function re(literals, ...values) {
- let result = literals[0];
- const escapeRE = /[\\^$.*+?()[\]{}|=!<>:-]/g;
- for (const [i, value] of values.entries()) {
- const str = util.inspect(value);
- // Need to escape special characters.
- result += str.replace(escapeRE, '\\$&');
- result += literals[i + 1];
- }
- return common.expectsError({
- code: 'ERR_ASSERTION',
- message: new RegExp(`^${result}$`)
- });
-}
// Turn off no-restricted-properties because we are testing deepEqual!
/* eslint-disable no-restricted-properties */
@@ -35,10 +17,20 @@ function re(literals, ...values) {
// For deepStrictEqual we check the runtime type,
// then reveal the fakeness of the fake date
- assert.throws(() => assert.deepStrictEqual(date, fake),
- re`${date} deepStrictEqual Date {}`);
- assert.throws(() => assert.deepStrictEqual(fake, date),
- re`Date {} deepStrictEqual ${date}`);
+ assert.throws(
+ () => assert.deepStrictEqual(date, fake),
+ {
+ message: 'Input A expected to strictly deep-equal input B:\n' +
+ '+ expected - actual\n\n- 2016-01-01T00:00:00.000Z\n+ Date {}'
+ }
+ );
+ assert.throws(
+ () => assert.deepStrictEqual(fake, date),
+ {
+ message: 'Input A expected to strictly deep-equal input B:\n' +
+ '+ expected - actual\n\n- Date {}\n+ 2016-01-01T00:00:00.000Z'
+ }
+ );
}
{ // At the moment global has its own type tag
diff --git a/test/parallel/test-assert-deep.js b/test/parallel/test-assert-deep.js
index 129967ac95..4fa091ef2a 100644
--- a/test/parallel/test-assert-deep.js
+++ b/test/parallel/test-assert-deep.js
@@ -4,6 +4,8 @@ const common = require('../common');
const assert = require('assert');
const util = require('util');
const { AssertionError } = assert;
+const defaultMsgStart = 'Input A expected to strictly deep-equal input B:\n' +
+ '+ expected - actual';
// Template tag function turning an error message into a RegExp
// for assert.throws()
@@ -32,24 +34,45 @@ function re(literals, ...values) {
const arr = new Uint8Array([120, 121, 122, 10]);
const buf = Buffer.from(arr);
// They have different [[Prototype]]
-assert.throws(() => assert.deepStrictEqual(arr, buf),
- re`${arr} deepStrictEqual ${buf}`);
+assert.throws(
+ () => assert.deepStrictEqual(arr, buf),
+ {
+ code: 'ERR_ASSERTION',
+ message: `${defaultMsgStart} ... Lines skipped\n\n` +
+ '- Uint8Array [\n' +
+ '+ Buffer [Uint8Array] [\n 120,\n...\n 10\n ]'
+ }
+);
assert.deepEqual(arr, buf);
{
const buf2 = Buffer.from(arr);
buf2.prop = 1;
- assert.throws(() => assert.deepStrictEqual(buf2, buf),
- re`${buf2} deepStrictEqual ${buf}`);
+ assert.throws(
+ () => assert.deepStrictEqual(buf2, buf),
+ {
+ code: 'ERR_ASSERTION',
+ message: `${defaultMsgStart}\n\n` +
+ ' Buffer [Uint8Array] [\n 120,\n 121,\n 122,\n' +
+ '- 10,\n- prop: 1\n+ 10\n ]'
+ }
+ );
assert.deepEqual(buf2, buf);
}
{
const arr2 = new Uint8Array([120, 121, 122, 10]);
arr2.prop = 5;
- assert.throws(() => assert.deepStrictEqual(arr, arr2),
- re`${arr} deepStrictEqual ${arr2}`);
+ assert.throws(
+ () => assert.deepStrictEqual(arr, arr2),
+ {
+ code: 'ERR_ASSERTION',
+ message: `${defaultMsgStart}\n\n` +
+ ' Uint8Array [\n 120,\n 121,\n 122,\n' +
+ '- 10\n+ 10,\n+ prop: 5\n ]'
+ }
+ );
assert.deepEqual(arr, arr2);
}
@@ -68,10 +91,24 @@ const date2 = new MyDate('2016');
// but deepStrictEqual checks own properties
assert.deepEqual(date, date2);
assert.deepEqual(date2, date);
-assert.throws(() => assert.deepStrictEqual(date, date2),
- re`${date} deepStrictEqual ${date2}`);
-assert.throws(() => assert.deepStrictEqual(date2, date),
- re`${date2} deepStrictEqual ${date}`);
+assert.throws(
+ () => assert.deepStrictEqual(date, date2),
+ {
+ code: 'ERR_ASSERTION',
+ message: `${defaultMsgStart}\n\n` +
+ '- 2016-01-01T00:00:00.000Z\n+ 2016-01-01T00:00:00.000Z {\n' +
+ "+ '0': '1'\n+ }"
+ }
+);
+assert.throws(
+ () => assert.deepStrictEqual(date2, date),
+ {
+ code: 'ERR_ASSERTION',
+ message: `${defaultMsgStart}\n\n` +
+ '- 2016-01-01T00:00:00.000Z {\n' +
+ "- '0': '1'\n- }\n+ 2016-01-01T00:00:00.000Z"
+ }
+);
class MyRegExp extends RegExp {
constructor(...args) {
@@ -86,8 +123,14 @@ const re2 = new MyRegExp('test');
// deepEqual returns true as long as the regexp-specific properties
// are the same, but deepStrictEqual checks all properties
assert.deepEqual(re1, re2);
-assert.throws(() => assert.deepStrictEqual(re1, re2),
- re`${re1} deepStrictEqual ${re2}`);
+assert.throws(
+ () => assert.deepStrictEqual(re1, re2),
+ {
+ code: 'ERR_ASSERTION',
+ message: `${defaultMsgStart}\n\n` +
+ "- /test/\n+ /test/ {\n+ '0': '1'\n+ }"
+ }
+);
// For these weird cases, deepEqual should pass (at least for now),
// but deepStrictEqual should throw.
@@ -115,8 +158,10 @@ assert.throws(() => assert.deepStrictEqual(re1, re2),
for (const b of similar) {
if (a !== b) {
assert.deepEqual(a, b);
- assert.throws(() => assert.deepStrictEqual(a, b),
- re`${a} deepStrictEqual ${b}`);
+ assert.throws(
+ () => assert.deepStrictEqual(a, b),
+ { code: 'ERR_ASSERTION' }
+ );
}
}
}
@@ -139,22 +184,30 @@ function assertDeepAndStrictEqual(a, b) {
function assertNotDeepOrStrict(a, b, err) {
assert.throws(() => assert.deepEqual(a, b), err || re`${a} deepEqual ${b}`);
- assert.throws(() => assert.deepStrictEqual(a, b), err ||
- re`${a} deepStrictEqual ${b}`);
+ assert.throws(
+ () => assert.deepStrictEqual(a, b),
+ err || { code: 'ERR_ASSERTION' }
+ );
assert.throws(() => assert.deepEqual(b, a), err || re`${b} deepEqual ${a}`);
- assert.throws(() => assert.deepStrictEqual(b, a), err ||
- re`${b} deepStrictEqual ${a}`);
+ assert.throws(
+ () => assert.deepStrictEqual(b, a),
+ err || { code: 'ERR_ASSERTION' }
+ );
}
function assertOnlyDeepEqual(a, b, err) {
assert.deepEqual(a, b);
- assert.throws(() => assert.deepStrictEqual(a, b), err ||
- re`${a} deepStrictEqual ${b}`);
+ assert.throws(
+ () => assert.deepStrictEqual(a, b),
+ err || { code: 'ERR_ASSERTION' }
+ );
assert.deepEqual(b, a);
- assert.throws(() => assert.deepStrictEqual(b, a), err ||
- re`${b} deepStrictEqual ${a}`);
+ assert.throws(
+ () => assert.deepStrictEqual(b, a),
+ err || { code: 'ERR_ASSERTION' }
+ );
}
// es6 Maps and Sets
@@ -352,7 +405,8 @@ assertOnlyDeepEqual(
assertDeepAndStrictEqual(b, c);
}
-// GH-7178. Ensure reflexivity of deepEqual with `arguments` objects.
+// https://github.com/nodejs/node-v0.x-archive/pull/7178
+// Ensure reflexivity of deepEqual with `arguments` objects.
{
const args = (function() { return arguments; })();
assertNotDeepOrStrict([], args);
@@ -434,8 +488,14 @@ assertOnlyDeepEqual(
const map1 = new Map([[1, 1]]);
const map2 = new Map([[1, '1']]);
assert.deepEqual(map1, map2);
- assert.throws(() => assert.deepStrictEqual(map1, map2),
- re`${map1} deepStrictEqual ${map2}`);
+ assert.throws(
+ () => assert.deepStrictEqual(map1, map2),
+ {
+ code: 'ERR_ASSERTION',
+ message: `${defaultMsgStart}\n\n` +
+ " Map {\n- 1 => 1\n+ 1 => '1'\n }"
+ }
+ );
}
{
@@ -682,8 +742,11 @@ assert.throws(
assert.throws(
() => assert.notDeepStrictEqual(new Date(2000, 3, 14), new Date(2000, 3, 14)),
- AssertionError,
- 'notDeepStrictEqual(new Date(2000, 3, 14), new Date(2000, 3, 14))'
+ {
+ name: 'AssertionError [ERR_ASSERTION]',
+ message: 'Identical input passed to notDeepStrictEqual: ' +
+ util.inspect(new Date(2000, 3, 14))
+ }
);
assert.notDeepStrictEqual(new Date(), new Date(2000, 3, 14));
@@ -698,35 +761,35 @@ assert.throws(
{
code: 'ERR_ASSERTION',
name: 'AssertionError [ERR_ASSERTION]',
- message: '/ab/ deepStrictEqual /a/'
+ message: `${defaultMsgStart}\n\n- /ab/\n+ /a/`
});
assert.throws(
() => assert.deepStrictEqual(/a/g, /a/),
{
code: 'ERR_ASSERTION',
name: 'AssertionError [ERR_ASSERTION]',
- message: '/a/g deepStrictEqual /a/'
+ message: `${defaultMsgStart}\n\n- /a/g\n+ /a/`
});
assert.throws(
() => assert.deepStrictEqual(/a/i, /a/),
{
code: 'ERR_ASSERTION',
name: 'AssertionError [ERR_ASSERTION]',
- message: '/a/i deepStrictEqual /a/'
+ message: `${defaultMsgStart}\n\n- /a/i\n+ /a/`
});
assert.throws(
() => assert.deepStrictEqual(/a/m, /a/),
{
code: 'ERR_ASSERTION',
name: 'AssertionError [ERR_ASSERTION]',
- message: '/a/m deepStrictEqual /a/'
+ message: `${defaultMsgStart}\n\n- /a/m\n+ /a/`
});
assert.throws(
() => assert.deepStrictEqual(/a/igm, /a/im),
{
code: 'ERR_ASSERTION',
name: 'AssertionError [ERR_ASSERTION]',
- message: '/a/gim deepStrictEqual /a/im'
+ message: `${defaultMsgStart}\n\n- /a/gim\n+ /a/im`
});
{
@@ -735,17 +798,15 @@ assert.throws(
assert.deepStrictEqual(re1, /a/);
}
-assert.throws(() => assert.deepStrictEqual(4, '4'),
- AssertionError,
- 'deepStrictEqual(4, \'4\')');
-
-assert.throws(() => assert.deepStrictEqual(true, 1),
- AssertionError,
- 'deepStrictEqual(true, 1)');
+assert.throws(
+ () => assert.deepStrictEqual(4, '4'),
+ { message: `${defaultMsgStart}\n\n- 4\n+ '4'` }
+);
-assert.throws(() => assert.deepStrictEqual(4, '5'),
- AssertionError,
- 'deepStrictEqual(4, \'5\')');
+assert.throws(
+ () => assert.deepStrictEqual(true, 1),
+ { message: `${defaultMsgStart}\n\n- true\n+ 1` }
+);
// Having the same number of owned properties && the same set of keys.
assert.deepStrictEqual({ a: 4 }, { a: 4 });
@@ -754,20 +815,22 @@ assert.throws(() => assert.deepStrictEqual([4], ['4']),
{
code: 'ERR_ASSERTION',
name: 'AssertionError [ERR_ASSERTION]',
- message: "[ 4 ] deepStrictEqual [ '4' ]"
- });
-assert.throws(() => assert.deepStrictEqual({ a: 4 }, { a: 4, b: true }),
- {
- code: 'ERR_ASSERTION',
- name: 'AssertionError [ERR_ASSERTION]',
- message: '{ a: 4 } deepStrictEqual { a: 4, b: true }'
- });
-assert.throws(() => assert.deepStrictEqual(['a'], { 0: 'a' }),
- {
- code: 'ERR_ASSERTION',
- name: 'AssertionError [ERR_ASSERTION]',
- message: "[ 'a' ] deepStrictEqual { '0': 'a' }"
+ message: `${defaultMsgStart}\n\n [\n- 4\n+ '4'\n ]`
});
+assert.throws(
+ () => assert.deepStrictEqual({ a: 4 }, { a: 4, b: true }),
+ {
+ code: 'ERR_ASSERTION',
+ name: 'AssertionError [ERR_ASSERTION]',
+ message: `${defaultMsgStart}\n\n {\n- a: 4\n+ a: 4,\n+ b: true\n }`
+ });
+assert.throws(
+ () => assert.deepStrictEqual(['a'], { 0: 'a' }),
+ {
+ code: 'ERR_ASSERTION',
+ name: 'AssertionError [ERR_ASSERTION]',
+ message: `${defaultMsgStart}\n\n- [\n- 'a'\n- ]\n+ {\n+ '0': 'a'\n+ }`
+ });
/* eslint-enable */
@@ -826,3 +889,35 @@ assert.throws(() => assert.deepStrictEqual(new String('a'), { 0: 'a' }),
assert.throws(() => assert.deepStrictEqual(new Number(1), {}), AssertionError);
assert.throws(() => assert.deepStrictEqual(new Boolean(true), {}),
AssertionError);
+
+// Check extra properties on errors.
+{
+ const a = new TypeError('foo');
+ const b = new TypeError('foo');
+ a.foo = 'bar';
+ b.foo = 'baz';
+
+ assert.throws(
+ () => assert.deepStrictEqual(a, b),
+ {
+ message: `${defaultMsgStart}\n\n` +
+ ' [TypeError: foo] {\n- foo: \'bar\'\n+ foo: \'baz\'\n }'
+ }
+ );
+}
+
+// Check proxies.
+{
+ // TODO(BridgeAR): Check if it would not be better to detect proxies instead
+ // of just using the proxy value.
+ const arrProxy = new Proxy([1, 2], {});
+ assert.deepStrictEqual(arrProxy, [1, 2]);
+ const tmp = util.inspect.defaultOptions;
+ util.inspect.defaultOptions = { showProxy: true };
+ assert.throws(
+ () => assert.deepStrictEqual(arrProxy, [1, 2, 3]),
+ { message: `${defaultMsgStart}\n\n` +
+ ' [\n 1,\n- 2\n+ 2,\n+ 3\n ]' }
+ );
+ util.inspect.defaultOptions = tmp;
+}
diff --git a/test/parallel/test-assert.js b/test/parallel/test-assert.js
index 478945156e..b871cd7265 100644
--- a/test/parallel/test-assert.js
+++ b/test/parallel/test-assert.js
@@ -34,7 +34,7 @@ const { writeFileSync, unlinkSync } = require('fs');
const { inspect } = require('util');
const a = assert;
-const start = 'Input A expected to deepStrictEqual input B:';
+const start = 'Input A expected to strictly deep-equal input B:';
const actExp = '+ expected - actual';
assert.ok(a.AssertionError.prototype instanceof Error,
@@ -67,8 +67,21 @@ assert.throws(() => a.strictEqual(2, '2'),
assert.throws(() => a.strictEqual(null, undefined),
a.AssertionError, 'strictEqual(null, undefined)');
-assert.throws(() => a.notStrictEqual(2, 2),
- a.AssertionError, 'notStrictEqual(2, 2)');
+assert.throws(
+ () => a.notStrictEqual(2, 2),
+ {
+ message: 'Identical input passed to notStrictEqual: 2',
+ name: 'AssertionError [ERR_ASSERTION]'
+ }
+);
+
+assert.throws(
+ () => a.notStrictEqual('a '.repeat(30), 'a '.repeat(30)),
+ {
+ message: `Identical input passed to notStrictEqual: '${'a '.repeat(30)}'`,
+ name: 'AssertionError [ERR_ASSERTION]'
+ }
+);
a.notStrictEqual(2, '2');
@@ -245,8 +258,11 @@ function testAssertionMessage(actual, expected) {
try {
assert.strictEqual(actual, '');
} catch (e) {
- assert.strictEqual(e.message,
- [expected, 'strictEqual', '\'\''].join(' '));
+ assert.strictEqual(
+ e.message,
+ 'Input A expected to strictly equal input B:\n+ expected - actual\n\n' +
+ `- ${expected}\n+ ''`
+ );
assert.ok(e.generatedMessage, 'Message not marked as generated');
}
}
@@ -263,29 +279,34 @@ testAssertionMessage(-Infinity, '-Infinity');
testAssertionMessage('', '""');
testAssertionMessage('foo', '\'foo\'');
testAssertionMessage([], '[]');
-testAssertionMessage([1, 2, 3], '[ 1, 2, 3 ]');
+testAssertionMessage([1, 2, 3], '[\n- 1,\n- 2,\n- 3\n- ]');
testAssertionMessage(/a/, '/a/');
testAssertionMessage(/abc/gim, '/abc/gim');
testAssertionMessage(function f() {}, '[Function: f]');
testAssertionMessage(function() {}, '[Function]');
testAssertionMessage({}, '{}');
-testAssertionMessage(circular, '{ y: 1, x: [Circular] }');
-testAssertionMessage({ a: undefined, b: null }, '{ a: undefined, b: null }');
+testAssertionMessage(circular, '{\n- y: 1,\n- x: [Circular]\n- }');
+testAssertionMessage({ a: undefined, b: null },
+ '{\n- a: undefined,\n- b: null\n- }');
testAssertionMessage({ a: NaN, b: Infinity, c: -Infinity },
- '{ a: NaN, b: Infinity, c: -Infinity }');
+ '{\n- a: NaN,\n- b: Infinity,\n- c: -Infinity\n- }');
// https://github.com/nodejs/node-v0.x-archive/issues/5292
try {
assert.strictEqual(1, 2);
} catch (e) {
- assert.strictEqual(e.message.split('\n')[0], '1 strictEqual 2');
+ assert.strictEqual(
+ e.message,
+ 'Input A expected to strictly equal input B:\n' +
+ '+ expected - actual\n\n- 1\n+ 2'
+ );
assert.ok(e.generatedMessage, 'Message not marked as generated');
}
try {
assert.strictEqual(1, 2, 'oh no');
} catch (e) {
- assert.strictEqual(e.message.split('\n')[0], 'oh no');
+ assert.strictEqual(e.message, 'oh no');
assert.strictEqual(e.generatedMessage, false,
'Message incorrectly marked as generated');
}
@@ -361,10 +382,11 @@ assert.throws(() => { throw new Error(); }, (err) => err instanceof Error);
// Long values should be truncated for display.
assert.throws(() => {
assert.strictEqual('A'.repeat(1000), '');
-}, common.expectsError({
+}, {
code: 'ERR_ASSERTION',
- message: /^'A{124}\.\.\. strictEqual ''$/
-}));
+ message: 'Input A expected to strictly equal input B:\n' +
+ `+ expected - actual\n\n- '${'A'.repeat(1000)}'\n+ ''`
+});
{
// Bad args to AssertionError constructor should throw TypeError.
@@ -381,12 +403,13 @@ assert.throws(() => {
});
}
-common.expectsError(
+assert.throws(
() => assert.strictEqual(new Error('foo'), new Error('foobar')),
{
code: 'ERR_ASSERTION',
- type: assert.AssertionError,
- message: /^'Error: foo' strictEqual 'Error: foobar'$/
+ name: 'AssertionError [ERR_ASSERTION]',
+ message: 'Input A expected to strictly equal input B:\n' +
+ '+ expected - actual\n\n- [Error: foo]\n+ [Error: foobar]'
}
);
@@ -576,14 +599,15 @@ common.expectsError(
});
// notDeepEqual tests
- message = 'Identical input passed to notDeepStrictEqual:\n[\n 1\n]';
+ message = 'Identical input passed to notDeepStrictEqual:\n\n' +
+ ' [\n 1\n ]\n';
assert.throws(
() => assert.notDeepEqual([1], [1]),
{ message });
message = 'Identical input passed to notDeepStrictEqual:' +
- `\n[${'\n 1,'.repeat(18)}\n...`;
- const data = Array(21).fill(1);
+ `\n\n [${'\n 1,'.repeat(25)}\n ...\n`;
+ const data = Array(31).fill(1);
assert.throws(
() => assert.notDeepEqual(data, data),
{ message });
@@ -873,3 +897,21 @@ assert.throws(
// Should not throw.
// eslint-disable-next-line no-restricted-syntax, no-throw-literal
assert.throws(() => { throw null; }, 'foo');
+
+assert.throws(
+ () => assert.strictEqual([], []),
+ {
+ message: 'Input object identical but not reference equal:\n\n []\n'
+ }
+);
+
+{
+ const args = (function() { return arguments; })('a');
+ assert.throws(
+ () => assert.strictEqual(args, { 0: 'a' }),
+ {
+ message: 'Input A expected to strictly equal input B:\n+ expected' +
+ " - actual\n\n- [Arguments] {\n+ {\n '0': 'a'\n }"
+ }
+ );
+}
diff --git a/test/pseudo-tty/test-assert-colors.js b/test/pseudo-tty/test-assert-colors.js
index 7c5845bdaa..39bee740d2 100644
--- a/test/pseudo-tty/test-assert-colors.js
+++ b/test/pseudo-tty/test-assert-colors.js
@@ -7,7 +7,7 @@ try {
process.env.COLORTERM = '1';
assert.deepStrictEqual([1, 2], [2, 2]);
} catch (err) {
- const expected = 'Input A expected to deepStrictEqual input B:\n' +
+ const expected = 'Input A expected to strictly deep-equal input B:\n' +
'\u001b[32m+ expected\u001b[39m \u001b[31m- actual\u001b[39m\n\n' +
' [\n' +
'\u001b[31m-\u001b[39m 1,\n' +