odin-js-fundamentals-part-4/node_modules/object.entries/test/tests.js

83 lines
2.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'use strict';
var keys = require('object-keys');
var map = require('array.prototype.map');
var define = require('define-properties');
var hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';
module.exports = function (entries, t) {
var a = {};
var b = {};
var c = {};
var obj = { a: a, b: b, c: c };
t.deepEqual(entries(obj), [['a', a], ['b', b], ['c', c]], 'basic support');
t.deepEqual(entries({ a: a, b: a, c: c }), [['a', a], ['b', a], ['c', c]], 'duplicate entries are included');
t.test('entries are in the same order as keys', function (st) {
var object = { a: a, b: b };
object[0] = 3;
object.c = c;
object[1] = 4;
delete object[0];
var objKeys = keys(object);
var objEntries = map(objKeys, function (key) {
return [key, object[key]];
});
st.deepEqual(entries(object), objEntries, 'entries match key order');
st.end();
});
t.test('non-enumerable properties are omitted', { skip: !Object.defineProperty }, function (st) {
var object = { a: a, b: b };
Object.defineProperty(object, 'c', { enumerable: false, value: c });
st.deepEqual(entries(object), [['a', a], ['b', b]], 'non-enumerable propertys value is omitted');
st.end();
});
t.test('inherited properties are omitted', function (st) {
var F = function G() {};
F.prototype.a = a;
var f = new F();
f.b = b;
st.deepEqual(entries(f), [['b', b]], 'only own properties are included');
st.end();
});
t.test('Symbol properties are omitted', { skip: !hasSymbols }, function (st) {
var object = { a: a, b: b, c: c };
var enumSym = Symbol('enum');
var nonEnumSym = Symbol('non enum');
object[enumSym] = enumSym;
object.d = enumSym;
Object.defineProperty(object, nonEnumSym, { enumerable: false, value: nonEnumSym });
st.deepEqual(entries(object), [['a', a], ['b', b], ['c', c], ['d', enumSym]], 'symbol properties are omitted');
st.end();
});
t.test('not-yet-visited keys deleted on [[Get]] must not show up in output', { skip: !define.supportsDescriptors }, function (st) {
var o = { a: 1, b: 2, c: 3 };
Object.defineProperty(o, 'a', {
get: function () {
delete this.b;
return 1;
}
});
st.deepEqual(entries(o), [['a', 1], ['c', 3]], 'when "b" is deleted prior to being visited, it should not show up');
st.end();
});
t.test('not-yet-visited keys made non-enumerable on [[Get]] must not show up in output', { skip: !define.supportsDescriptors }, function (st) {
var o = { a: 'A', b: 'B' };
Object.defineProperty(o, 'a', {
get: function () {
Object.defineProperty(o, 'b', { enumerable: false });
return 'A';
}
});
st.deepEqual(entries(o), [['a', 'A']], 'when "b" is made non-enumerable prior to being visited, it should not show up');
st.end();
});
};