1 |
3a515b92
|
cagy
|
'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('foo') === 'symbol';
|
19 |
|
|
|
20 |
|
|
test('defineProperties', function (dt) {
|
21 |
|
|
dt.test('with descriptor support', { skip: !descriptorsSupported }, function (t) {
|
22 |
|
|
var getDescriptor = function (value) {
|
23 |
|
|
return {
|
24 |
|
|
configurable: true,
|
25 |
|
|
enumerable: false,
|
26 |
|
|
value: value,
|
27 |
|
|
writable: true
|
28 |
|
|
};
|
29 |
|
|
};
|
30 |
|
|
|
31 |
|
|
var obj = {
|
32 |
|
|
a: 1,
|
33 |
|
|
b: 2,
|
34 |
|
|
c: 3
|
35 |
|
|
};
|
36 |
|
|
t.deepEqual(keys(obj), ['a', 'b', 'c'], 'all literal-set keys start enumerable');
|
37 |
|
|
define(obj, {
|
38 |
|
|
b: 3,
|
39 |
|
|
c: 4,
|
40 |
|
|
d: 5
|
41 |
|
|
});
|
42 |
|
|
t.deepEqual(obj, {
|
43 |
|
|
a: 1,
|
44 |
|
|
b: 2,
|
45 |
|
|
c: 3
|
46 |
|
|
}, 'existing properties were not overridden');
|
47 |
|
|
t.deepEqual(Object.getOwnPropertyDescriptor(obj, 'd'), getDescriptor(5), 'new property "d" was added and is not enumerable');
|
48 |
|
|
t.deepEqual(['a', 'b', 'c'], keys(obj), 'new keys are not enumerable');
|
49 |
|
|
|
50 |
|
|
define(obj, {
|
51 |
|
|
a: 2,
|
52 |
|
|
b: 3,
|
53 |
|
|
c: 4
|
54 |
|
|
}, {
|
55 |
|
|
a: function () { return true; },
|
56 |
|
|
b: function () { return false; }
|
57 |
|
|
});
|
58 |
|
|
t.deepEqual(obj, {
|
59 |
|
|
b: 2,
|
60 |
|
|
c: 3
|
61 |
|
|
}, 'properties only overriden when predicate exists and returns true');
|
62 |
|
|
t.deepEqual(Object.getOwnPropertyDescriptor(obj, 'd'), getDescriptor(5), 'existing property "d" remained and is not enumerable');
|
63 |
|
|
t.deepEqual(Object.getOwnPropertyDescriptor(obj, 'a'), getDescriptor(2), 'existing property "a" was overridden and is not enumerable');
|
64 |
|
|
t.deepEqual(['b', 'c'], keys(obj), 'overridden keys are not enumerable');
|
65 |
|
|
|
66 |
|
|
t.end();
|
67 |
|
|
});
|
68 |
|
|
|
69 |
|
|
dt.test('without descriptor support', { skip: descriptorsSupported }, function (t) {
|
70 |
|
|
var obj = {
|
71 |
|
|
a: 1,
|
72 |
|
|
b: 2,
|
73 |
|
|
c: 3
|
74 |
|
|
};
|
75 |
|
|
define(obj, {
|
76 |
|
|
b: 3,
|
77 |
|
|
c: 4,
|
78 |
|
|
d: 5
|
79 |
|
|
});
|
80 |
|
|
t.deepEqual(obj, {
|
81 |
|
|
a: 1,
|
82 |
|
|
b: 2,
|
83 |
|
|
c: 3,
|
84 |
|
|
d: 5
|
85 |
|
|
}, 'existing properties were not overridden, new properties were added');
|
86 |
|
|
|
87 |
|
|
define(obj, {
|
88 |
|
|
a: 2,
|
89 |
|
|
b: 3,
|
90 |
|
|
c: 4
|
91 |
|
|
}, {
|
92 |
|
|
a: function () { return true; },
|
93 |
|
|
b: function () { return false; }
|
94 |
|
|
});
|
95 |
|
|
t.deepEqual(obj, {
|
96 |
|
|
a: 2,
|
97 |
|
|
b: 2,
|
98 |
|
|
c: 3,
|
99 |
|
|
d: 5
|
100 |
|
|
}, 'properties only overriden when predicate exists and returns true');
|
101 |
|
|
|
102 |
|
|
t.end();
|
103 |
|
|
});
|
104 |
|
|
|
105 |
|
|
dt.end();
|
106 |
|
|
});
|
107 |
|
|
|
108 |
|
|
test('symbols', { skip: !hasSymbols }, function (t) {
|
109 |
|
|
var sym = Symbol('foo');
|
110 |
|
|
var obj = {};
|
111 |
|
|
var aValue = {};
|
112 |
|
|
var bValue = {};
|
113 |
|
|
var properties = { a: aValue };
|
114 |
|
|
properties[sym] = bValue;
|
115 |
|
|
|
116 |
|
|
define(obj, properties);
|
117 |
|
|
|
118 |
|
|
t.deepEqual(Object.keys(obj), [], 'object has no enumerable keys');
|
119 |
|
|
t.deepEqual(Object.getOwnPropertyNames(obj), ['a'], 'object has non-enumerable "a" key');
|
120 |
|
|
t.deepEqual(Object.getOwnPropertySymbols(obj), [sym], 'object has non-enumerable symbol key');
|
121 |
|
|
t.equal(obj.a, aValue, 'string keyed value is defined');
|
122 |
|
|
t.equal(obj[sym], bValue, 'symbol keyed value is defined');
|
123 |
|
|
|
124 |
|
|
t.end();
|
125 |
|
|
});
|