From 40e29dcbbf33d919f5cc0cbab5fa65a282adb04b 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. PR-URL: https://github.com/iojs/io.js/pull/668 Reviewed-By: Julien Gilli Reviewed-By: Bert Belder Reviewed-By: Chris Dickinson --- 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 aa3f0a3c831..a13cc503163 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 5d5e70ea7ec..044dfbaca50 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 {