UNPKG

6.29 kBJavaScriptView Raw
1const test = require('tape');
2const {
3 cloneWithout,
4 purge,
5 extract,
6 get,
7 filterProperties,
8 filterPropertiesOnValues,
9 performGetOnProperties,
10} = require('./object');
11
12const { assign } = Object;
13
14const sourceObject = () => ({
15 foo: 'FOO',
16 bar: 'BAR',
17 quux: 'QUUX',
18});
19
20// cloneWithout
21test('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// purge
45test('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// extract
60test('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// get
126test('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
186test('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//filterProperties
216test('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//filterPropertiesOnValues
254test('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});