-
-
Notifications
You must be signed in to change notification settings - Fork 26
/
test.js
133 lines (102 loc) · 2.68 KB
/
test.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
const test = require('ava');
const mergeDescriptors = require('./index.js');
const source = {
name: 'John',
surname: 'Doe',
};
Object.defineProperty(source, 'fullName', {
get() {
return `${this.name} ${this.surname}`;
},
});
test('should copy property descriptors from source to destination', t => {
const destination = {};
const source = {};
Object.defineProperty(source, 'name', {
value: 'AA',
});
t.false(Object.hasOwn(destination, 'name'));
mergeDescriptors(destination, source);
t.true(Object.hasOwn(destination, 'name'));
t.deepEqual(Object.getOwnPropertyDescriptor(destination, 'name'), {
value: 'AA',
writable: false,
enumerable: false,
configurable: false,
});
});
test('should redefine when configurable', t => {
const destination = {};
const source = {};
Object.defineProperty(destination, 'name', {
configurable: true,
value: 'AA',
});
Object.defineProperty(source, 'name', {
value: 'fido',
});
t.is(Object.getOwnPropertyDescriptor(destination, 'name').value, 'AA');
t.is(Object.getOwnPropertyDescriptor(source, 'name').value, 'fido');
mergeDescriptors(destination, source);
t.is(Object.getOwnPropertyDescriptor(destination, 'name').value, 'fido');
});
test('should error when non-configurable', t => {
const destination = {};
const source = {};
Object.defineProperty(destination, 'name', {
configurable: false,
value: 'AA',
});
Object.defineProperty(source, 'name', {
value: 'fido',
});
t.throws(() => {
mergeDescriptors(destination, source);
}, {
message: /Cannot redefine property: name/,
});
});
test('should skip when overwrite is false', t => {
const destination = {};
const source = {};
Object.defineProperty(destination, 'name', {
configurable: true,
value: 'AA',
});
Object.defineProperty(source, 'name', {
value: 'fido',
});
mergeDescriptors(destination, source, false);
t.is(Object.getOwnPropertyDescriptor(destination, 'name').value, 'AA');
});
test('should correctly copy getters and setters', t => {
const destination = {};
const source = {
get name() {
return 'John';
},
set name(value) {
this._name = value;
},
};
mergeDescriptors(destination, source);
t.is(destination.name, 'John');
destination.name = 'Jane';
t.is(destination._name, 'Jane');
});
test('should merge multiple properties', t => {
const destination = {age: 30};
const source = {name: 'John', surname: 'Doe'};
mergeDescriptors(destination, source);
t.deepEqual(destination, {name: 'John', surname: 'Doe', age: 30});
});
test('should handle nested objects', t => {
const destination = {};
const source = {
nested: {
value: 42,
},
};
mergeDescriptors(destination, source);
t.is(destination.nested.value, 42);
});