diff --git a/lib/jasmine-core/jasmine.js b/lib/jasmine-core/jasmine.js index 1d0be920..e132b963 100644 --- a/lib/jasmine-core/jasmine.js +++ b/lib/jasmine-core/jasmine.js @@ -5540,12 +5540,12 @@ getJasmineRequireObj().MatchersUtil = function(j$) { } // Deep compare objects. - var aKeys = keys(a, className == '[object Array]'), + var aKeys = MatchersUtil.keys(a, className == '[object Array]'), key; size = aKeys.length; // Ensure that both objects contain the same number of properties before comparing deep equality. - if (keys(b, className == '[object Array]').length !== size) { + if (MatchersUtil.keys(b, className == '[object Array]').length !== size) { diffBuilder.recordMismatch( objectKeysAreDifferentFormatter.bind(null, this.pp) ); @@ -5581,7 +5581,7 @@ getJasmineRequireObj().MatchersUtil = function(j$) { return result; }; - function keys(obj, isArray) { + MatchersUtil.keys = function(obj, isArray) { var allKeys = (function(o) { var keys = []; for (var key in o) { @@ -5609,7 +5609,7 @@ getJasmineRequireObj().MatchersUtil = function(j$) { } return extraKeys; - } + }; function isFunction(obj) { return typeof obj === 'function'; @@ -7643,7 +7643,7 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) { }; SinglePrettyPrintRun.prototype.iterateObject = function(obj, fn) { - var objKeys = keys(obj, j$.isArray_(obj)); + var objKeys = j$.MatchersUtil.keys(obj, j$.isArray_(obj)); var isGetter = function isGetter(prop) {}; if (obj.__lookupGetter__) { @@ -7838,8 +7838,14 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) { property, isGetter ) { - this.append(property); + if (typeof property === 'symbol') { + this.append(property.toString()); + } else { + this.append(property); + } + this.append(': '); + if (isGetter) { this.append(''); } else { @@ -7881,37 +7887,6 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) { MaxCharsReachedError.prototype = new Error(); - function keys(obj, isArray) { - var allKeys = Object.keys - ? Object.keys(obj) - : (function(o) { - var keys = []; - for (var key in o) { - if (j$.util.has(o, key)) { - keys.push(key); - } - } - return keys; - })(obj); - - if (!isArray) { - return allKeys; - } - - if (allKeys.length === 0) { - return allKeys; - } - - var extraKeys = []; - for (var i = 0; i < allKeys.length; i++) { - if (!/^[0-9]+$/.test(allKeys[i])) { - extraKeys.push(allKeys[i]); - } - } - - return extraKeys; - } - function customFormat(value, customObjectFormatters) { var i, result; diff --git a/spec/core/PrettyPrintSpec.js b/spec/core/PrettyPrintSpec.js index 8d75c440..6d5046ab 100644 --- a/spec/core/PrettyPrintSpec.js +++ b/spec/core/PrettyPrintSpec.js @@ -84,6 +84,11 @@ describe('PrettyPrinter', function() { ); }); + it('includes symbols', function() { + const pp = jasmineUnderTest.makePrettyPrinter(); + expect(pp([1, Symbol('foo'), 2])).toEqual('[ 1, Symbol(foo), 2 ]'); + }); + it('should truncate arrays that are longer than jasmineUnderTest.MAX_PRETTY_PRINT_ARRAY_LENGTH', function() { const originalMaxLength = jasmineUnderTest.MAX_PRETTY_PRINT_ARRAY_LENGTH; const array = [1, 2, 3]; @@ -163,6 +168,25 @@ describe('PrettyPrinter', function() { ); }); + it('includes symbol keys in objects', function() { + const pp = jasmineUnderTest.makePrettyPrinter(); + const obj = {}; + obj[Symbol('foo')] = 'bar'; + expect(pp(obj)).toEqual("Object({ Symbol(foo): 'bar' })"); + }); + + it('stringifies string and symbol keys differently', function() { + const pp = jasmineUnderTest.makePrettyPrinter(); + const symObj = {}; + const strObj = {}; + const k = 'foo'; + const v = 'bar'; + symObj[Symbol(k)] = v; + strObj[k] = v; + + expect(pp(symObj)).not.toEqual(pp(strObj)); + }); + it('should stringify objects that almost look like DOM nodes', function() { const pp = jasmineUnderTest.makePrettyPrinter(); expect(pp({ nodeType: 1 })).toEqual('Object({ nodeType: 1 })'); diff --git a/src/core/PrettyPrinter.js b/src/core/PrettyPrinter.js index 1903b469..81494813 100644 --- a/src/core/PrettyPrinter.js +++ b/src/core/PrettyPrinter.js @@ -106,7 +106,7 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) { }; SinglePrettyPrintRun.prototype.iterateObject = function(obj, fn) { - var objKeys = keys(obj, j$.isArray_(obj)); + var objKeys = j$.MatchersUtil.keys(obj, j$.isArray_(obj)); var isGetter = function isGetter(prop) {}; if (obj.__lookupGetter__) { @@ -301,8 +301,14 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) { property, isGetter ) { - this.append(property); + if (typeof property === 'symbol') { + this.append(property.toString()); + } else { + this.append(property); + } + this.append(': '); + if (isGetter) { this.append(''); } else { @@ -344,37 +350,6 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) { MaxCharsReachedError.prototype = new Error(); - function keys(obj, isArray) { - var allKeys = Object.keys - ? Object.keys(obj) - : (function(o) { - var keys = []; - for (var key in o) { - if (j$.util.has(o, key)) { - keys.push(key); - } - } - return keys; - })(obj); - - if (!isArray) { - return allKeys; - } - - if (allKeys.length === 0) { - return allKeys; - } - - var extraKeys = []; - for (var i = 0; i < allKeys.length; i++) { - if (!/^[0-9]+$/.test(allKeys[i])) { - extraKeys.push(allKeys[i]); - } - } - - return extraKeys; - } - function customFormat(value, customObjectFormatters) { var i, result; diff --git a/src/core/matchers/matchersUtil.js b/src/core/matchers/matchersUtil.js index c6f297f2..774c7d9b 100644 --- a/src/core/matchers/matchersUtil.js +++ b/src/core/matchers/matchersUtil.js @@ -483,12 +483,12 @@ getJasmineRequireObj().MatchersUtil = function(j$) { } // Deep compare objects. - var aKeys = keys(a, className == '[object Array]'), + var aKeys = MatchersUtil.keys(a, className == '[object Array]'), key; size = aKeys.length; // Ensure that both objects contain the same number of properties before comparing deep equality. - if (keys(b, className == '[object Array]').length !== size) { + if (MatchersUtil.keys(b, className == '[object Array]').length !== size) { diffBuilder.recordMismatch( objectKeysAreDifferentFormatter.bind(null, this.pp) ); @@ -524,7 +524,7 @@ getJasmineRequireObj().MatchersUtil = function(j$) { return result; }; - function keys(obj, isArray) { + MatchersUtil.keys = function(obj, isArray) { var allKeys = (function(o) { var keys = []; for (var key in o) { @@ -552,7 +552,7 @@ getJasmineRequireObj().MatchersUtil = function(j$) { } return extraKeys; - } + }; function isFunction(obj) { return typeof obj === 'function';