1 | 'use strict';
|
2 |
|
3 | var isProperty = require('../src/property'),
|
4 | assert = require('chai').assert;
|
5 |
|
6 | describe('property', function() {
|
7 | var PREDICATE = function(value) {
|
8 | return value === 2;
|
9 | },
|
10 | PROPERTY = 'propertyName';
|
11 |
|
12 | it('requires predicates to be a function', function() {
|
13 | assert.throws(function() {
|
14 | isProperty(PROPERTY, 'test');
|
15 | }, TypeError, /Predicate is not a function/i);
|
16 | });
|
17 |
|
18 | it('requires at least 2 arguments', function() {
|
19 | assert.throws(function() {
|
20 | isProperty(PROPERTY);
|
21 | }, Error, /Too few arguments/);
|
22 | });
|
23 |
|
24 | it('returns a predicate if 2 arguments provided', function() {
|
25 | assert.ok(isProperty(PROPERTY, PREDICATE) instanceof Function);
|
26 | });
|
27 |
|
28 | it('automatically fails if provided value is not an object', function() {
|
29 | var NOT_AN_OBJECT = 'test',
|
30 | NOT_AN_OBJECT_2 = undefined,
|
31 | PREDICATE = function() {
|
32 | assert.fail('Predicate should not be called since given value is not an object');
|
33 | };
|
34 |
|
35 | assert.ok(isProperty(PROPERTY, PREDICATE, NOT_AN_OBJECT) === false);
|
36 | assert.ok(isProperty(PROPERTY, PREDICATE)(NOT_AN_OBJECT) === false);
|
37 |
|
38 |
|
39 | assert.ok(isProperty(PROPERTY, PREDICATE, NOT_AN_OBJECT_2) === false);
|
40 | assert.ok(isProperty(PROPERTY, PREDICATE)(NOT_AN_OBJECT_2) === false);
|
41 | });
|
42 |
|
43 | it('calls predicate in the same context', function() {
|
44 | var callCounter = 0,
|
45 | CONTEXT = {custom: 'context'},
|
46 | PREDICATE = function() {
|
47 | assert.deepEqual(this, CONTEXT);
|
48 | callCounter++;
|
49 | return true;
|
50 | };
|
51 |
|
52 | assert.ok(isProperty.call(CONTEXT, PROPERTY, PREDICATE, {}));
|
53 | assert.ok(isProperty(PROPERTY, PREDICATE).call(CONTEXT, {}));
|
54 |
|
55 | assert.strictEqual(callCounter, 2, 'Predicate has not been called 2 times');
|
56 | });
|
57 |
|
58 | it('calls predicate with additional arguments', function() {
|
59 | var callCounter = 0,
|
60 | ARG_1 = 'custom argument 1',
|
61 | ARG_2 = {custom: 'object'},
|
62 | PREDICATE = function(value, arg1, arg2) {
|
63 | assert.strictEqual(arg1, ARG_1);
|
64 | assert.strictEqual(arg2, ARG_2);
|
65 | callCounter++;
|
66 | return true;
|
67 | };
|
68 |
|
69 | assert.ok(isProperty(PROPERTY, PREDICATE, {}, ARG_1, ARG_2));
|
70 | assert.ok(isProperty(PROPERTY, PREDICATE)({}, ARG_1, ARG_2));
|
71 |
|
72 | assert.strictEqual(callCounter, 2, 'Predicate has not been called 2 times');
|
73 | });
|
74 |
|
75 |
|
76 | it('checks whether a property value satisfies given predicate', function() {
|
77 | var VALID_OBJECT = {},
|
78 | VALID_OBJECT2 = Object.create(null);
|
79 | VALID_OBJECT[PROPERTY] = 2;
|
80 | VALID_OBJECT2[PROPERTY] = 2;
|
81 |
|
82 | var INVALID_OBJECT = {},
|
83 | INVALID_OBJECT2 = {};
|
84 | INVALID_OBJECT2[PROPERTY] = '2';
|
85 |
|
86 | assert.ok(isProperty(PROPERTY, PREDICATE, VALID_OBJECT));
|
87 | assert.ok(isProperty(PROPERTY, PREDICATE)(VALID_OBJECT));
|
88 |
|
89 | assert.ok(isProperty(PROPERTY, PREDICATE, VALID_OBJECT2));
|
90 | assert.ok(isProperty(PROPERTY, PREDICATE)(VALID_OBJECT2));
|
91 |
|
92 | assert.ok(isProperty(PROPERTY, PREDICATE, INVALID_OBJECT) === false);
|
93 | assert.ok(isProperty(PROPERTY, PREDICATE)(INVALID_OBJECT) === false);
|
94 |
|
95 | assert.ok(isProperty(PROPERTY, PREDICATE, INVALID_OBJECT2) === false);
|
96 | assert.ok(isProperty(PROPERTY, PREDICATE)(INVALID_OBJECT2) === false);
|
97 | });
|
98 | }); |
\ | No newline at end of file |