Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Avatar for KuCalc : devops.
Download
50655 views
1
'use strict';
2
3
var define = require('../');
4
var test = require('tape');
5
var keys = require('object-keys');
6
7
var arePropertyDescriptorsSupported = function () {
8
var obj = { a: 1 };
9
try {
10
Object.defineProperty(obj, 'x', { value: obj });
11
return obj.x === obj;
12
} catch (e) { /* this is IE 8. */
13
return false;
14
}
15
};
16
var descriptorsSupported = !!Object.defineProperty && arePropertyDescriptorsSupported();
17
18
var hasSymbols = typeof Symbol === 'function' && typeof Symbol() === 'symbol';
19
20
test('defineProperties', function (dt) {
21
22
dt.test('with descriptor support', { skip: !descriptorsSupported }, function (t) {
23
var getDescriptor = function (value) {
24
return {
25
configurable: true,
26
enumerable: false,
27
value: value,
28
writable: true
29
};
30
};
31
32
var obj = {
33
a: 1,
34
b: 2,
35
c: 3
36
};
37
t.deepEqual(keys(obj), ['a', 'b', 'c'], 'all literal-set keys start enumerable');
38
define(obj, {
39
b: 3,
40
c: 4,
41
d: 5
42
});
43
t.deepEqual(obj, {
44
a: 1,
45
b: 2,
46
c: 3
47
}, 'existing properties were not overridden');
48
t.deepEqual(Object.getOwnPropertyDescriptor(obj, 'd'), getDescriptor(5), 'new property "d" was added and is not enumerable');
49
t.deepEqual(['a', 'b', 'c'], keys(obj), 'new keys are not enumerable');
50
51
define(obj, {
52
a: 2,
53
b: 3,
54
c: 4
55
}, {
56
a: function () { return true; },
57
b: function () { return false; }
58
});
59
t.deepEqual(obj, {
60
b: 2,
61
c: 3
62
}, 'properties only overriden when predicate exists and returns true');
63
t.deepEqual(Object.getOwnPropertyDescriptor(obj, 'd'), getDescriptor(5), 'existing property "d" remained and is not enumerable');
64
t.deepEqual(Object.getOwnPropertyDescriptor(obj, 'a'), getDescriptor(2), 'existing property "a" was overridden and is not enumerable');
65
t.deepEqual(['b', 'c'], keys(obj), 'overridden keys are not enumerable');
66
67
t.end();
68
});
69
70
dt.test('without descriptor support', { skip: descriptorsSupported }, function (t) {
71
var obj = {
72
a: 1,
73
b: 2,
74
c: 3
75
};
76
define(obj, {
77
b: 3,
78
c: 4,
79
d: 5
80
});
81
t.deepEqual(obj, {
82
a: 1,
83
b: 2,
84
c: 3,
85
d: 5
86
}, 'existing properties were not overridden, new properties were added');
87
88
define(obj, {
89
a: 2,
90
b: 3,
91
c: 4
92
}, {
93
a: function () { return true; },
94
b: function () { return false; }
95
});
96
t.deepEqual(obj, {
97
a: 2,
98
b: 2,
99
c: 3,
100
d: 5
101
}, 'properties only overriden when predicate exists and returns true');
102
103
t.end();
104
});
105
106
dt.end();
107
});
108
109
test('symbols', { skip: !hasSymbols }, function (t) {
110
var sym = Symbol('foo');
111
var obj = {};
112
var aValue = {};
113
var bValue = {};
114
var properties = { a: aValue };
115
properties[sym] = bValue;
116
117
define(obj, properties);
118
119
t.deepEqual(Object.keys(obj), [], 'object has no enumerable keys');
120
t.deepEqual(Object.getOwnPropertyNames(obj), ['a'], 'object has non-enumerable "a" key');
121
t.deepEqual(Object.getOwnPropertySymbols(obj), [sym], 'object has non-enumerable symbol key');
122
t.equal(obj.a, aValue, 'string keyed value is defined');
123
t.equal(obj[sym], bValue, 'symbol keyed value is defined');
124
125
t.end();
126
});
127
128