1 | const test = require('tape');
|
2 | const {
|
3 | cloneWithout,
|
4 | purge,
|
5 | extract,
|
6 | get,
|
7 | filterProperties,
|
8 | filterPropertiesOnValues,
|
9 | performGetOnProperties,
|
10 | } = require('./object');
|
11 |
|
12 | const { assign } = Object;
|
13 |
|
14 | const sourceObject = () => ({
|
15 | foo: 'FOO',
|
16 | bar: 'BAR',
|
17 | quux: 'QUUX',
|
18 | });
|
19 |
|
20 |
|
21 | test('cloneWithout()', assert => {
|
22 | {
|
23 | const actual = cloneWithout(sourceObject(), 'foo');
|
24 | const expected = {
|
25 | bar: 'BAR',
|
26 | quux: 'QUUX',
|
27 | };
|
28 | const message = 'can clone an object with one excluded property';
|
29 |
|
30 | assert.deepEqual(actual, expected, message);
|
31 | }
|
32 | {
|
33 | const actual = cloneWithout(sourceObject(), 'foo', 'quux');
|
34 | const expected = {
|
35 | bar: 'BAR',
|
36 | };
|
37 | const message = 'can clone an object with multiple excluded properties';
|
38 |
|
39 | assert.deepEqual(actual, expected, message);
|
40 | }
|
41 | assert.end();
|
42 | });
|
43 |
|
44 |
|
45 | test('purge()', assert => {
|
46 | const clone = assign({}, sourceObject());
|
47 | const actual = purge('foo', clone, 'quux');
|
48 | const expected = {
|
49 | bar: 'BAR',
|
50 | };
|
51 |
|
52 | const message =
|
53 | 'accepts its arguments in any order and returns an object without the supplied properties';
|
54 |
|
55 | assert.deepEqual(actual, expected, message);
|
56 | assert.end();
|
57 | });
|
58 |
|
59 |
|
60 | test('extract()', assert => {
|
61 | {
|
62 | const actual = extract('bar', sourceObject());
|
63 | const expected = [
|
64 | 'BAR',
|
65 | {
|
66 | foo: 'FOO',
|
67 | quux: 'QUUX',
|
68 | },
|
69 | ];
|
70 |
|
71 | const message =
|
72 | 'can extract a single property with the key as first argument';
|
73 |
|
74 | assert.deepEqual(actual, expected, message);
|
75 | }
|
76 | {
|
77 | const actual = extract(sourceObject(), 'bar');
|
78 | const expected = [
|
79 | {
|
80 | foo: 'FOO',
|
81 | quux: 'QUUX',
|
82 | },
|
83 | 'BAR',
|
84 | ];
|
85 |
|
86 | const message =
|
87 | 'an extract a single property with the key as last argument';
|
88 |
|
89 | assert.deepEqual(actual, expected, message);
|
90 | }
|
91 | {
|
92 | const actual = extract('quux', sourceObject(), 'foo');
|
93 | const expected = [
|
94 | 'QUUX',
|
95 | {
|
96 | bar: 'BAR',
|
97 | },
|
98 | 'FOO',
|
99 | ];
|
100 |
|
101 | const message = 'can extract multiple properties in any argument order';
|
102 |
|
103 | assert.deepEqual(actual, expected, message);
|
104 | }
|
105 | {
|
106 | const func = () => {
|
107 | extract('foo', 'bar');
|
108 | };
|
109 |
|
110 | const message = 'throws if no argument is an object';
|
111 | assert.throws(func, null, message);
|
112 | }
|
113 | {
|
114 | const func = () => {
|
115 | extract('quux', sourceObject(), 'foo', sourceObject());
|
116 | };
|
117 |
|
118 | const message = 'throws if more than one argument is an object';
|
119 | assert.throws(func, null, message);
|
120 | }
|
121 |
|
122 | assert.end();
|
123 | });
|
124 |
|
125 |
|
126 | test('get()', assert => {
|
127 | {
|
128 | const actual = get(sourceObject(), 'foo');
|
129 | const expected = 'FOO';
|
130 |
|
131 | const message = 'returns the value of an object property';
|
132 |
|
133 | assert.deepEqual(actual, expected, message);
|
134 | }
|
135 | {
|
136 | const object = {
|
137 | foo: {
|
138 | bar: 'quux',
|
139 | },
|
140 | };
|
141 | const actual = get(object, 'foo.bar');
|
142 | const expected = 'quux';
|
143 |
|
144 | const message = 'returns the value of a deep object property';
|
145 |
|
146 | assert.deepEqual(actual, expected, message);
|
147 | }
|
148 | {
|
149 | const object = {
|
150 | foo: {
|
151 | bar: 'quux',
|
152 | },
|
153 | };
|
154 | const actual = get(object, 'foo[bar]');
|
155 | const expected = 'quux';
|
156 |
|
157 | const message = 'supports bracket property accessors';
|
158 |
|
159 | assert.deepEqual(actual, expected, message);
|
160 | }
|
161 | {
|
162 | const object = {};
|
163 | const actual = get(object, 'nil');
|
164 | let expected;
|
165 |
|
166 | const message =
|
167 | 'returns `undefined` for an object property that does not exist';
|
168 |
|
169 | assert.deepEqual(actual, expected, message);
|
170 | }
|
171 | {
|
172 | const object = {};
|
173 | const actual = get(object, 'foo.bar');
|
174 | let expected;
|
175 |
|
176 | const message =
|
177 | 'returns `undefined` for a deep object property that does not exist';
|
178 |
|
179 | assert.deepEqual(actual, expected, message);
|
180 | }
|
181 |
|
182 | assert.end();
|
183 | });
|
184 |
|
185 | // performGetOnProperties
|
186 | test('performGetOnProperties()', assert => {
|
187 | const getters = {
|
188 | one: 'one',
|
189 | two: 'two.second',
|
190 | three: 'three.third.tripple',
|
191 | };
|
192 | const object = {
|
193 | one: 'first',
|
194 | two: {
|
195 | second: 'double',
|
196 | },
|
197 | three: {
|
198 | third: {
|
199 | tripple: 'trio',
|
200 | },
|
201 | },
|
202 | };
|
203 | const actual = performGetOnProperties(object, getters);
|
204 | const expected = {
|
205 | one: 'first',
|
206 | two: 'double',
|
207 | three: 'trio',
|
208 | };
|
209 | const message = 'can perform a get on all the properties';
|
210 |
|
211 | assert.deepEqual(actual, expected, message);
|
212 | assert.end();
|
213 | });
|
214 |
|
215 |
|
216 | test('filterProperties()', assert => {
|
217 | {
|
218 | const clone = assign({}, sourceObject());
|
219 | const actual = filterProperties(clone, 'foo', 'bar');
|
220 | const expected = {
|
221 | foo: 'FOO',
|
222 | bar: 'BAR',
|
223 | };
|
224 | const message = 'returns the object with only the given properties';
|
225 |
|
226 | assert.deepEqual(actual, expected, message);
|
227 | }
|
228 | {
|
229 | const clone = assign({}, sourceObject());
|
230 | const actual = filterProperties(clone, 'foo', 'bar', 'mismatch');
|
231 | const expected = {
|
232 | foo: 'FOO',
|
233 | bar: 'BAR',
|
234 | };
|
235 | const message =
|
236 | 'returns the object with only the given properties ignoring non-matching properties';
|
237 |
|
238 | assert.deepEqual(actual, expected, message);
|
239 | }
|
240 | {
|
241 | const clone = assign({}, sourceObject());
|
242 | const actual = filterProperties(clone, 'mismatch', 'different');
|
243 | const expected = {};
|
244 | const message =
|
245 | 'and returns an empty object when none of the properties match';
|
246 |
|
247 | assert.deepEqual(actual, expected, message);
|
248 | }
|
249 |
|
250 | assert.end();
|
251 | });
|
252 |
|
253 |
|
254 | test('filterPropertiesOnValues()', assert => {
|
255 | {
|
256 | const clone = assign({}, sourceObject());
|
257 | const actual = filterPropertiesOnValues(clone, value => value !== 'FOO');
|
258 | const expected = {
|
259 | bar: 'BAR',
|
260 | quux: 'QUUX',
|
261 | };
|
262 | const message =
|
263 | 'and returns an object without the values for which the given function does not return true';
|
264 |
|
265 | assert.deepEqual(actual, expected, message);
|
266 | }
|
267 | {
|
268 | const clone = assign({}, sourceObject());
|
269 | const actual = filterPropertiesOnValues(
|
270 | clone,
|
271 | value => value !== 'mismatch'
|
272 | );
|
273 | const expected = {
|
274 | foo: 'FOO',
|
275 | bar: 'BAR',
|
276 | quux: 'QUUX',
|
277 | };
|
278 | const message =
|
279 | 'and returns an object without the values for which the given function does not return true';
|
280 |
|
281 | assert.deepEqual(actual, expected, message);
|
282 | }
|
283 |
|
284 | assert.end();
|
285 | });
|