1 | 'use strict';
|
2 |
|
3 | var objectOf = require('../src/objectOf'),
|
4 | assert = require('chai').assert;
|
5 |
|
6 | describe('objectOf', function() {
|
7 | var TRUE_PREDICATE = function() {
|
8 | return true;
|
9 | },
|
10 | EXAMPLE_OBJECT = {
|
11 | key0: 0,
|
12 | key1: 1,
|
13 | key2: 2,
|
14 | key3: 3,
|
15 | key4: 4
|
16 | },
|
17 | isNumber = function(property) {
|
18 | return typeof property === 'number';
|
19 | };
|
20 |
|
21 | it('returns a function if only argument provided', function() {
|
22 | assert.ok(objectOf(TRUE_PREDICATE) instanceof Function);
|
23 | });
|
24 |
|
25 | it('throws TypeError if predicate is not a function', function() {
|
26 | assert.throws(function() {
|
27 | objectOf('definitely not a function')('value');
|
28 | });
|
29 | });
|
30 |
|
31 | it('does not call all predicates if one of them has not been satisfied earlier', function() {
|
32 | var counter = 0,
|
33 | testPredicate = objectOf(function(value) {
|
34 | counter++;
|
35 | return value !== 2;
|
36 | });
|
37 |
|
38 | testPredicate(EXAMPLE_OBJECT);
|
39 |
|
40 | assert.strictEqual(3, counter);
|
41 | });
|
42 |
|
43 | it('calls a predicate with the same context and proper arguments', function() {
|
44 | var exampleContext = {
|
45 | some: 'context'
|
46 | },
|
47 | expectedPropertyValues = [0, 1, 2, 3, 4, 0, 1, 2, 3, 4],
|
48 | testPredicate = function() {
|
49 | var expectedPropertyValue = expectedPropertyValues.shift();
|
50 | assert.strictEqual(exampleContext, this);
|
51 | assert.strictEqual(arguments[0], expectedPropertyValue);
|
52 | assert.strictEqual(arguments[1], 1);
|
53 | assert.strictEqual(arguments[2], 2);
|
54 | assert.strictEqual(arguments[3], 3);
|
55 | assert.strictEqual(arguments[4], undefined);
|
56 | return true;
|
57 | };
|
58 |
|
59 | objectOf.call(exampleContext, testPredicate, EXAMPLE_OBJECT, 1, 2, 3);
|
60 | objectOf(testPredicate).call(exampleContext, EXAMPLE_OBJECT, 1, 2, 3);
|
61 | assert.deepEqual(expectedPropertyValues, [], 'Predicate has not been called enough times');
|
62 | });
|
63 |
|
64 | it('checks whether every enumerable property satisfies a predicate', function() {
|
65 | var invalidObject = {
|
66 | key0: 0,
|
67 | key1: 'string'
|
68 | };
|
69 | assert.ok(objectOf(isNumber, EXAMPLE_OBJECT));
|
70 | assert.ok(objectOf(isNumber)(EXAMPLE_OBJECT));
|
71 | assert.ok(objectOf(isNumber, invalidObject) === false);
|
72 | assert.ok(objectOf(isNumber)(invalidObject) === false);
|
73 | });
|
74 | });
|