UNPKG

3.52 kBJavaScriptView Raw
1'use strict';
2
3var isProperty = require('../src/property'),
4 assert = require('chai').assert;
5
6describe('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 // Covers #21
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