1 | 'use strict';
|
2 |
|
3 | var any = require('../src/any'),
|
4 | assert = require('chai').assert;
|
5 |
|
6 | describe('any', 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(any(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 | any(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 | any();
|
27 | }, Error, 'need to provide at least two predicates');
|
28 |
|
29 | assert.throws(function() {
|
30 | any(TRUE_PREDICATE);
|
31 | }, Error, 'need to provide at least two predicates');
|
32 |
|
33 | assert.doesNotThrow(function() {
|
34 | any(TRUE_PREDICATE, FALSE_PREDICATE);
|
35 | });
|
36 | });
|
37 |
|
38 | it('calls predicates in order', function() {
|
39 | var counter = 0;
|
40 | any(function() {
|
41 | assert.strictEqual(counter, 0);
|
42 | counter++;
|
43 | }, function() {
|
44 | assert.strictEqual(counter, 1);
|
45 | counter++;
|
46 | }, function() {
|
47 | assert.strictEqual(counter, 2);
|
48 | counter++;
|
49 | })('value');
|
50 | assert.strictEqual(counter, 3, 'Not all predicates have been called');
|
51 | });
|
52 |
|
53 | it('calls predicates with correct context and arguments', function() {
|
54 | var args = [1, 2, 3, 4],
|
55 | context = {example: 'context'},
|
56 | predicate = function(arg1, arg2, arg3, arg4, arg5) {
|
57 | assert.strictEqual(context, this);
|
58 | assert.strictEqual(arg1, 1);
|
59 | assert.strictEqual(arg2, 2);
|
60 | assert.strictEqual(arg3, 3);
|
61 | assert.strictEqual(arg4, 4);
|
62 | assert.strictEqual(arg5, undefined);
|
63 | return false;
|
64 | },
|
65 | testPredicate = any(predicate, predicate, predicate, predicate);
|
66 |
|
67 | assert.ok(!testPredicate.apply(context, args));
|
68 | });
|
69 |
|
70 | it('checks whether at least one predicate has been satisfied', function() {
|
71 | assert.ok(any(FALSE_PREDICATE, TRUE_PREDICATE, FALSE_PREDICATE)('value'));
|
72 | assert.ok(any(FALSE_PREDICATE, FALSE_PREDICATE)('value') === false);
|
73 | });
|
74 |
|
75 | it('does not call all predicates if one of them has been satisfied earlier', function() {
|
76 | assert.ok(any(TRUE_PREDICATE, function() {
|
77 | throw new Error('Last predicate should not be called');
|
78 | })('value'));
|
79 | });
|
80 | });
|