MIRROR: javascript for 馃悳's, a tiny runtime with big ambitions
1import { test, testDeep, testThrows, summary } from './helpers.js';
2
3console.log('Object Tests\n');
4
5let obj = { a: 1, b: 2, c: 3 };
6test('object property access', obj.a, 1);
7test('object bracket access', obj['b'], 2);
8test('object property count', Object.keys(obj).length, 3);
9
10obj.d = 4;
11test('add property', obj.d, 4);
12
13obj.a = 10;
14test('modify property', obj.a, 10);
15
16delete obj.d;
17test('delete property', obj.d, undefined);
18
19test('in operator true', 'a' in obj, true);
20test('in operator false', 'z' in obj, false);
21
22testDeep('Object.keys', Object.keys({ x: 1, y: 2 }), ['x', 'y']);
23testDeep('Object.values', Object.values({ x: 1, y: 2 }), [1, 2]);
24testDeep('Object.entries', Object.entries({ x: 1 }), [['x', 1]]);
25
26let merged = Object.assign({}, { a: 1 }, { b: 2 });
27test('Object.assign a', merged.a, 1);
28test('Object.assign b', merged.b, 2);
29
30let nested = { a: { b: { c: 1 } } };
31test('nested access', nested.a.b.c, 1);
32
33let computed = { ['key' + 1]: 'value' };
34test('computed property', computed.key1, 'value');
35
36let short = 'hello';
37let shorthand = { short };
38test('shorthand property', shorthand.short, 'hello');
39
40let methodObj = {
41 value: 42,
42 getValue() {
43 return this.value;
44 }
45};
46test('method shorthand', methodObj.getValue(), 42);
47
48let source = { a: 1, b: 2 };
49let spread = { ...source, c: 3 };
50test('spread a', spread.a, 1);
51test('spread c', spread.c, 3);
52
53let { a, b } = { a: 1, b: 2, c: 3 };
54test('destructuring a', a, 1);
55test('destructuring b', b, 2);
56
57let { x: renamed } = { x: 5 };
58test('destructuring rename', renamed, 5);
59
60let { y = 10 } = {};
61test('destructuring default', y, 10);
62
63test('hasOwnProperty true', { a: 1 }.hasOwnProperty('a'), true);
64test('hasOwnProperty false', { a: 1 }.hasOwnProperty('b'), false);
65
66let frozen = Object.freeze({ a: 1 });
67test('Object.isFrozen', Object.isFrozen(frozen), true);
68
69let sealed = Object.seal({ a: 1 });
70test('Object.isSealed', Object.isSealed(sealed), true);
71
72let proto = { inherited: true };
73let child = Object.create(proto);
74test('Object.create inherits', child.inherited, true);
75
76test('Object.getPrototypeOf', Object.getPrototypeOf([]) === Array.prototype, true);
77
78testDeep(
79 'Object.fromEntries',
80 Object.fromEntries([
81 ['a', 1],
82 ['b', 2]
83 ]),
84 { a: 1, b: 2 }
85);
86
87let descriptorSource = {};
88const descriptorSymbol = Symbol('descriptor');
89Object.defineProperty(descriptorSource, 'hidden', {
90 value: 42,
91 enumerable: false,
92 writable: false,
93 configurable: false
94});
95Object.defineProperty(descriptorSource, 'computed', {
96 get() {
97 return 7;
98 },
99 enumerable: true,
100 configurable: true
101});
102descriptorSource.visible = 'yes';
103descriptorSource[descriptorSymbol] = 'symbol value';
104
105const descriptors = Object.getOwnPropertyDescriptors(descriptorSource);
106test('Object.getOwnPropertyDescriptors exists', typeof Object.getOwnPropertyDescriptors, 'function');
107test('descriptors data value', descriptors.visible.value, 'yes');
108test('descriptors hidden value', descriptors.hidden.value, 42);
109test('descriptors hidden enumerable', descriptors.hidden.enumerable, false);
110test('descriptors hidden writable', descriptors.hidden.writable, false);
111test('descriptors hidden configurable', descriptors.hidden.configurable, false);
112test('descriptors accessor getter', typeof descriptors.computed.get, 'function');
113test('descriptors accessor enumerable', descriptors.computed.enumerable, true);
114test('descriptors symbol value', descriptors[descriptorSymbol].value, 'symbol value');
115
116const arrayDescriptors = Object.getOwnPropertyDescriptors(['item']);
117test('array descriptor index value', arrayDescriptors[0].value, 'item');
118test('array descriptor length value', arrayDescriptors.length.value, 1);
119const proxyUndefinedDescriptor = new Proxy({ a: 1 }, {
120 getOwnPropertyDescriptor() {}
121});
122test('Object.getOwnPropertyDescriptors skips undefined proxy descriptors', Object.getOwnPropertyDescriptors(proxyUndefinedDescriptor).hasOwnProperty('a'), false);
123testThrows('Object.getOwnPropertyDescriptors throws without argument', () => Object.getOwnPropertyDescriptors());
124testThrows('Object.getOwnPropertyDescriptors throws on null', () => Object.getOwnPropertyDescriptors(null));
125test('Object.getOwnPropertyDescriptors boxes number primitive', typeof Object.getOwnPropertyDescriptors(1), 'object');
126
127summary();