From f61a10eef52c054cfdb46a005f23e34575afb3b6 Mon Sep 17 00:00:00 2001 From: cjihrig Date: Fri, 30 Jan 2015 10:25:32 -0500 Subject: [PATCH] assert: use util.inspect() to create error messages Currently, JSON.stringify() is used to create error messages on failed assertions. This causes an error when stringifying objects with circular references. This commit switches out JSON.stringify() for util.inspect(), which can handle circular references. --- lib/assert.js | 17 ++--------------- test/parallel/test-assert.js | 31 ++++++++++++++++++------------- 2 files changed, 20 insertions(+), 28 deletions(-) diff --git a/lib/assert.js b/lib/assert.js index aa3f0a3c831591..a13cc503163c33 100644 --- a/lib/assert.js +++ b/lib/assert.js @@ -58,19 +58,6 @@ assert.AssertionError = function AssertionError(options) { // assert.AssertionError instanceof Error util.inherits(assert.AssertionError, Error); -function replacer(key, value) { - if (util.isUndefined(value)) { - return '' + value; - } - if (util.isNumber(value) && !isFinite(value)) { - return value.toString(); - } - if (util.isFunction(value) || util.isRegExp(value)) { - return value.toString(); - } - return value; -} - function truncate(s, n) { if (util.isString(s)) { return s.length < n ? s : s.slice(0, n); @@ -80,9 +67,9 @@ function truncate(s, n) { } function getMessage(self) { - return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' + + return truncate(util.inspect(self.actual), 128) + ' ' + self.operator + ' ' + - truncate(JSON.stringify(self.expected, replacer), 128); + truncate(util.inspect(self.expected), 128); } // At present only the three keys mentioned above are used and diff --git a/test/parallel/test-assert.js b/test/parallel/test-assert.js index 5d5e70ea7ecbc1..044dfbaca50112 100644 --- a/test/parallel/test-assert.js +++ b/test/parallel/test-assert.js @@ -249,36 +249,41 @@ a.throws(makeBlock(a.deepEqual, args, [])); assert.ok(gotError); -// #217 +var circular = {y: 1}; +circular.x = circular; + function testAssertionMessage(actual, expected) { try { assert.equal(actual, ''); } catch (e) { assert.equal(e.toString(), - ['AssertionError:', expected, '==', '""'].join(' ')); + ['AssertionError:', expected, '==', '\'\''].join(' ')); assert.ok(e.generatedMessage, "Message not marked as generated"); } } -testAssertionMessage(undefined, '"undefined"'); + +testAssertionMessage(undefined, 'undefined'); testAssertionMessage(null, 'null'); testAssertionMessage(true, 'true'); testAssertionMessage(false, 'false'); testAssertionMessage(0, '0'); testAssertionMessage(100, '100'); -testAssertionMessage(NaN, '"NaN"'); -testAssertionMessage(Infinity, '"Infinity"'); -testAssertionMessage(-Infinity, '"-Infinity"'); +testAssertionMessage(NaN, 'NaN'); +testAssertionMessage(Infinity, 'Infinity'); +testAssertionMessage(-Infinity, '-Infinity'); testAssertionMessage('', '""'); -testAssertionMessage('foo', '"foo"'); +testAssertionMessage('foo', '\'foo\''); testAssertionMessage([], '[]'); -testAssertionMessage([1, 2, 3], '[1,2,3]'); -testAssertionMessage(/a/, '"/a/"'); -testAssertionMessage(/abc/gim, '"/abc/gim"'); -testAssertionMessage(function f() {}, '"function f() {}"'); +testAssertionMessage([1, 2, 3], '[ 1, 2, 3 ]'); +testAssertionMessage(/a/, '/a/'); +testAssertionMessage(/abc/gim, '/abc/gim'); +testAssertionMessage(function f() {}, '[Function: f]'); +testAssertionMessage(function () {}, '[Function]'); testAssertionMessage({}, '{}'); -testAssertionMessage({a: undefined, b: null}, '{"a":"undefined","b":null}'); +testAssertionMessage(circular, '{ y: 1, x: [Circular] }'); +testAssertionMessage({a: undefined, b: null}, '{ a: undefined, b: null }'); testAssertionMessage({a: NaN, b: Infinity, c: -Infinity}, - '{"a":"NaN","b":"Infinity","c":"-Infinity"}'); + '{ a: NaN, b: Infinity, c: -Infinity }'); // #2893 try {