Include symbol keys when pretty-printing objects

* Fixes #1966
This commit is contained in:
Steve Gravrock
2022-05-07 10:05:18 -07:00
parent 694375e4ea
commit 270344bd38
4 changed files with 48 additions and 74 deletions
+12 -37
View File
@@ -5540,12 +5540,12 @@ getJasmineRequireObj().MatchersUtil = function(j$) {
} }
// Deep compare objects. // Deep compare objects.
var aKeys = keys(a, className == '[object Array]'), var aKeys = MatchersUtil.keys(a, className == '[object Array]'),
key; key;
size = aKeys.length; size = aKeys.length;
// Ensure that both objects contain the same number of properties before comparing deep equality. // 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( diffBuilder.recordMismatch(
objectKeysAreDifferentFormatter.bind(null, this.pp) objectKeysAreDifferentFormatter.bind(null, this.pp)
); );
@@ -5581,7 +5581,7 @@ getJasmineRequireObj().MatchersUtil = function(j$) {
return result; return result;
}; };
function keys(obj, isArray) { MatchersUtil.keys = function(obj, isArray) {
var allKeys = (function(o) { var allKeys = (function(o) {
var keys = []; var keys = [];
for (var key in o) { for (var key in o) {
@@ -5609,7 +5609,7 @@ getJasmineRequireObj().MatchersUtil = function(j$) {
} }
return extraKeys; return extraKeys;
} };
function isFunction(obj) { function isFunction(obj) {
return typeof obj === 'function'; return typeof obj === 'function';
@@ -7643,7 +7643,7 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) {
}; };
SinglePrettyPrintRun.prototype.iterateObject = function(obj, fn) { 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) {}; var isGetter = function isGetter(prop) {};
if (obj.__lookupGetter__) { if (obj.__lookupGetter__) {
@@ -7838,8 +7838,14 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) {
property, property,
isGetter isGetter
) { ) {
this.append(property); if (typeof property === 'symbol') {
this.append(property.toString());
} else {
this.append(property);
}
this.append(': '); this.append(': ');
if (isGetter) { if (isGetter) {
this.append('<getter>'); this.append('<getter>');
} else { } else {
@@ -7881,37 +7887,6 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) {
MaxCharsReachedError.prototype = new Error(); 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) { function customFormat(value, customObjectFormatters) {
var i, result; var i, result;
+24
View File
@@ -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() { it('should truncate arrays that are longer than jasmineUnderTest.MAX_PRETTY_PRINT_ARRAY_LENGTH', function() {
const originalMaxLength = jasmineUnderTest.MAX_PRETTY_PRINT_ARRAY_LENGTH; const originalMaxLength = jasmineUnderTest.MAX_PRETTY_PRINT_ARRAY_LENGTH;
const array = [1, 2, 3]; 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() { it('should stringify objects that almost look like DOM nodes', function() {
const pp = jasmineUnderTest.makePrettyPrinter(); const pp = jasmineUnderTest.makePrettyPrinter();
expect(pp({ nodeType: 1 })).toEqual('Object({ nodeType: 1 })'); expect(pp({ nodeType: 1 })).toEqual('Object({ nodeType: 1 })');
+8 -33
View File
@@ -106,7 +106,7 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) {
}; };
SinglePrettyPrintRun.prototype.iterateObject = function(obj, fn) { 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) {}; var isGetter = function isGetter(prop) {};
if (obj.__lookupGetter__) { if (obj.__lookupGetter__) {
@@ -301,8 +301,14 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) {
property, property,
isGetter isGetter
) { ) {
this.append(property); if (typeof property === 'symbol') {
this.append(property.toString());
} else {
this.append(property);
}
this.append(': '); this.append(': ');
if (isGetter) { if (isGetter) {
this.append('<getter>'); this.append('<getter>');
} else { } else {
@@ -344,37 +350,6 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) {
MaxCharsReachedError.prototype = new Error(); 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) { function customFormat(value, customObjectFormatters) {
var i, result; var i, result;
+4 -4
View File
@@ -483,12 +483,12 @@ getJasmineRequireObj().MatchersUtil = function(j$) {
} }
// Deep compare objects. // Deep compare objects.
var aKeys = keys(a, className == '[object Array]'), var aKeys = MatchersUtil.keys(a, className == '[object Array]'),
key; key;
size = aKeys.length; size = aKeys.length;
// Ensure that both objects contain the same number of properties before comparing deep equality. // 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( diffBuilder.recordMismatch(
objectKeysAreDifferentFormatter.bind(null, this.pp) objectKeysAreDifferentFormatter.bind(null, this.pp)
); );
@@ -524,7 +524,7 @@ getJasmineRequireObj().MatchersUtil = function(j$) {
return result; return result;
}; };
function keys(obj, isArray) { MatchersUtil.keys = function(obj, isArray) {
var allKeys = (function(o) { var allKeys = (function(o) {
var keys = []; var keys = [];
for (var key in o) { for (var key in o) {
@@ -552,7 +552,7 @@ getJasmineRequireObj().MatchersUtil = function(j$) {
} }
return extraKeys; return extraKeys;
} };
function isFunction(obj) { function isFunction(obj) {
return typeof obj === 'function'; return typeof obj === 'function';