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

View File

@@ -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('<getter>');
} 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;

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() {
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 })');

View File

@@ -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('<getter>');
} 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;

View File

@@ -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';