1 | 'use strict';
|
2 |
|
3 | var all = require('../src/all'),
|
4 | assert = require('chai').assert;
|
5 |
|
6 | describe('all', function() {
|
7 | var TRUE_PREDICATE = function() {
|
8 | return true;
|
9 | },
|
10 | FALSE_PREDICATE = function() {
|
11 | return false;
|
12 | };
|
13 |
|
14 | it('returns a function', function() {
|
15 | assert.ok(all(TRUE_PREDICATE, FALSE_PREDICATE) instanceof Function);
|
16 | });
|
17 |
|
18 | it('throws error if not every predicate is a function', function() {
|
19 | assert.throws(function() {
|
20 | all(TRUE_PREDICATE, 'definitely not a function');
|
21 | });
|
22 | });
|
23 |
|
24 | it('throws error if zero or only one predicate provided', function() {
|
25 | assert.throws(function() {
|
26 | all();
|
27 | }, Error, 'need to provide at least two predicates');
|
28 |
|
29 | assert.throws(function() {
|
30 | all(TRUE_PREDICATE);
|
31 | }, Error, 'need to provide at least two predicates');
|
32 |
|
33 | assert.doesNotThrow(function() {
|
34 | all(TRUE_PREDICATE, FALSE_PREDICATE);
|
35 | });
|
36 | });
|
37 |
|
38 | it('calls predicates in order', function() {
|
39 | var counter = 0;
|
40 | all(function() {
|
41 | assert.strictEqual(counter, 0);
|
42 | counter++;
|
43 | return true;
|
44 | }, function() {
|
45 | assert.strictEqual(counter, 1);
|
46 | counter++;
|
47 | return true;
|
48 | }, function() {
|
49 | assert.strictEqual(counter, 2);
|
50 | counter++;
|
51 | return true;
|
52 | })('value');
|
53 | assert.strictEqual(counter, 3, 'Not all predicates have been called');
|
54 | });
|
55 |
|
56 | it('calls predicates with correct context and arguments', function() {
|
57 | var args = [1, 2, 3, 4],
|
58 | context = {example: 'context'},
|
59 | predicate = function(arg1, arg2, arg3, arg4, arg5) {
|
60 | assert.strictEqual(context, this);
|
61 | assert.strictEqual(arg1, 1);
|
62 | assert.strictEqual(arg2, 2);
|
63 | assert.strictEqual(arg3, 3);
|
64 | assert.strictEqual(arg4, 4);
|
65 | assert.strictEqual(arg5, undefined);
|
66 | return false;
|
67 | },
|
68 | testPredicate = all(predicate, predicate, predicate, predicate);
|
69 |
|
70 | assert.ok(!testPredicate.apply(context, args));
|
71 | });
|
72 |
|
73 | it('checks whether all predicates are satisfied', function() {
|
74 | assert.ok(all(TRUE_PREDICATE, TRUE_PREDICATE, TRUE_PREDICATE)('value'));
|
75 | assert.ok(all(TRUE_PREDICATE, FALSE_PREDICATE)('value') === false);
|
76 | });
|
77 |
|
78 | it('does not call all predicates if one of them has not been satisfied earlier', function() {
|
79 | assert.ok(all(FALSE_PREDICATE, function() {
|
80 | throw new Error('Last predicate should not be called');
|
81 | })('value') === false);
|
82 | });
|
83 | });
|