From 0fe471885ca225218d2e38b34e98e1dba2a334ca Mon Sep 17 00:00:00 2001 From: lucasfcosta Date: Sun, 31 Jan 2016 15:44:17 -0200 Subject: [PATCH 1/3] Change accepts a function as object --- lib/chai/core/assertions.js | 21 +++++++++++++++------ lib/chai/interface/assert.js | 18 ++++++++++++++---- test/assert.js | 7 ++++++- test/expect.js | 7 ++++++- test/should.js | 8 +++++++- 5 files changed, 48 insertions(+), 13 deletions(-) diff --git a/lib/chai/core/assertions.js b/lib/chai/core/assertions.js index d6b9f3444..f5803a340 100644 --- a/lib/chai/core/assertions.js +++ b/lib/chai/core/assertions.js @@ -1635,7 +1635,7 @@ module.exports = function (chai, _) { * @alias changes * @alias Change * @param {String} object - * @param {String} property name + * @param {String} property name _optional_ * @param {String} message _optional_ * @namespace BDD * @api public @@ -1644,16 +1644,25 @@ module.exports = function (chai, _) { function assertChanges (object, prop, msg) { if (msg) flag(this, 'message', msg); var fn = flag(this, 'object'); - new Assertion(object, msg).to.have.property(prop); new Assertion(fn).is.a('function'); - var initial = object[prop]; + if (!prop) { + new Assertion(object).is.a('function'); + var initial = object(); + } else { + new Assertion(object, msg).to.have.property(prop); + initial = object[prop]; + } + fn(); + var final = prop === undefined ? object() : object[prop]; + var msgObj = prop === undefined ? initial : '.' + prop; + this.assert( - initial !== object[prop] - , 'expected .' + prop + ' to change' - , 'expected .' + prop + ' to not change' + initial !== final + , 'expected ' + msgObj + ' to change' + , 'expected ' + msgObj + ' to not change' ); } diff --git a/lib/chai/interface/assert.js b/lib/chai/interface/assert.js index 5099ea1d0..7cd428782 100644 --- a/lib/chai/interface/assert.js +++ b/lib/chai/interface/assert.js @@ -1354,14 +1354,19 @@ module.exports = function (chai, util) { * * @name changes * @param {Function} modifier function - * @param {Object} object - * @param {String} property name + * @param {Object} object or getter function + * @param {String} property name _optional_ * @param {String} message _optional_ * @namespace Assert * @api public */ assert.changes = function (fn, obj, prop, msg) { + if (arguments.length === 3 && typeof obj === 'function') { + msg = prop + prop = null; + } + new Assertion(fn, msg).to.change(obj, prop); } @@ -1376,14 +1381,19 @@ module.exports = function (chai, util) { * * @name doesNotChange * @param {Function} modifier function - * @param {Object} object - * @param {String} property name + * @param {Object} object or getter function + * @param {String} property name _optional_ * @param {String} message _optional_ * @namespace Assert * @api public */ assert.doesNotChange = function (fn, obj, prop, msg) { + if (arguments.length === 3 && typeof obj === 'function') { + msg = prop; + prop = null; + } + new Assertion(fn, msg).to.not.change(obj, prop); } diff --git a/test/assert.js b/test/assert.js index 2432d64c2..1e88717f0 100644 --- a/test/assert.js +++ b/test/assert.js @@ -873,13 +873,18 @@ describe('assert', function () { it('change', function() { var obj = { value: 10, str: 'foo' }, + laughs = ['lol', 'haha'], fn = function() { obj.value += 5 }, bangFn = function() { obj.str += '!' }, - smFn = function() { 'foo' + 'bar' }; + smFn = function() { 'foo' + 'bar' }, + addFn = function() { laughs.push('hue') }, + getFn = function() { return laughs.length }; assert.changes(fn, obj, 'value'); assert.doesNotChange(smFn, obj, 'value'); assert.changes(bangFn, obj, 'str'); + assert.changes(addFn, getFn); + assert.doesNotChange(smFn, getFn); }); it('increase, decrease', function() { diff --git a/test/expect.js b/test/expect.js index 79068e444..7c3d38d80 100644 --- a/test/expect.js +++ b/test/expect.js @@ -1121,14 +1121,19 @@ describe('expect', function () { it('change', function() { var obj = { value: 10, str: 'foo' }, + heroes = ['spiderman', 'superman'], fn = function() { obj.value += 5 }, sameFn = function() { 'foo' + 'bar' }, - bangFn = function() { obj.str += '!' }; + bangFn = function() { obj.str += '!' }, + batFn = function() { heroes.push('batman') }, + lenFn = function() { return heroes.length }; expect(fn).to.change(obj, 'value'); expect(sameFn).to.not.change(obj, 'value'); expect(sameFn).to.not.change(obj, 'str'); expect(bangFn).to.change(obj, 'str'); + expect(batFn).to.change(lenFn); + expect(sameFn).to.not.change(lenFn); }); it('increase, decrease', function() { diff --git a/test/should.js b/test/should.js index 0fde10b9d..dbe12760e 100644 --- a/test/should.js +++ b/test/should.js @@ -950,15 +950,21 @@ describe('should', function() { it('change', function() { var obj = { value: 10, str: 'foo' }, + fruits = ['apple', 'pear'], fn = function() { obj.value += 5 }, sameFn = function() { obj.value += 0 }, decFn = function() { obj.value -= 3 }, - bangFn = function() { obj.str += '!' }; + bangFn = function() { obj.str += '!' }, + nanaFn = function() { fruits.push('banana') }, + lenFn = function() { return fruits.length }, + noFn = function() { return null }; fn.should.change(obj, 'value'); sameFn.should.not.change(obj, 'value'); sameFn.should.not.change(obj, 'str'); bangFn.should.change(obj, 'str'); + nanaFn.should.change(lenFn); + noFn.should.not.change(lenFn); }); it('increase, decrease', function() { From f158523321db467c9b0172020d2a11366fdf5be9 Mon Sep 17 00:00:00 2001 From: lucasfcosta Date: Mon, 1 Feb 2016 20:01:54 -0200 Subject: [PATCH 2/3] Increases and Decreases assertions accepting function for value --- lib/chai/core/assertions.js | 43 +++++++++++++++++++++++++++--------- lib/chai/interface/assert.js | 36 +++++++++++++++++++++++------- test/assert.js | 10 +++++++++ test/expect.js | 13 +++++++++++ test/should.js | 13 +++++++++++ 5 files changed, 96 insertions(+), 19 deletions(-) diff --git a/lib/chai/core/assertions.js b/lib/chai/core/assertions.js index f5803a340..330dc03e4 100644 --- a/lib/chai/core/assertions.js +++ b/lib/chai/core/assertions.js @@ -1646,9 +1646,10 @@ module.exports = function (chai, _) { var fn = flag(this, 'object'); new Assertion(fn).is.a('function'); + var initial; if (!prop) { new Assertion(object).is.a('function'); - var initial = object(); + initial = object(); } else { new Assertion(object, msg).to.have.property(prop); initial = object[prop]; @@ -1691,16 +1692,26 @@ module.exports = function (chai, _) { function assertIncreases (object, prop, msg) { if (msg) flag(this, 'message', msg); var fn = flag(this, 'object'); - new Assertion(object, msg).to.have.property(prop); new Assertion(fn).is.a('function'); - var initial = object[prop]; + var initial; + if (!prop) { + new Assertion(object).is.a('function'); + initial = object(); + } else { + new Assertion(object, msg).to.have.property(prop); + initial = object[prop]; + } + fn(); + var final = prop === undefined ? object() : object[prop]; + var msgObj = prop === undefined ? initial : '.' + prop; + this.assert( - object[prop] - initial > 0 - , 'expected .' + prop + ' to increase' - , 'expected .' + prop + ' to not increase' + final - initial > 0 + , 'expected ' + msgObj + ' to increase' + , 'expected ' + msgObj + ' to not increase' ); } @@ -1729,16 +1740,26 @@ module.exports = function (chai, _) { function assertDecreases (object, prop, msg) { if (msg) flag(this, 'message', msg); var fn = flag(this, 'object'); - new Assertion(object, msg).to.have.property(prop); new Assertion(fn).is.a('function'); - var initial = object[prop]; + var initial; + if (!prop) { + new Assertion(object).is.a('function'); + initial = object(); + } else { + new Assertion(object, msg).to.have.property(prop); + initial = object[prop]; + } + fn(); + var final = prop === undefined ? object() : object[prop]; + var msgObj = prop === undefined ? initial : '.' + prop; + this.assert( - object[prop] - initial < 0 - , 'expected .' + prop + ' to decrease' - , 'expected .' + prop + ' to not decrease' + final - initial < 0 + , 'expected ' + msgObj + ' to decrease' + , 'expected ' + msgObj + ' to not decrease' ); } diff --git a/lib/chai/interface/assert.js b/lib/chai/interface/assert.js index 7cd428782..0d1107d89 100644 --- a/lib/chai/interface/assert.js +++ b/lib/chai/interface/assert.js @@ -1408,14 +1408,19 @@ module.exports = function (chai, util) { * * @name increases * @param {Function} modifier function - * @param {Object} object - * @param {String} property name + * @param {Object} object or getter function + * @param {String} property name _optional_ * @param {String} message _optional_ * @namespace Assert * @api public */ assert.increases = function (fn, obj, prop, msg) { + if (arguments.length === 3 && typeof obj === 'function') { + msg = prop; + prop = null; + } + new Assertion(fn, msg).to.increase(obj, prop); } @@ -1430,14 +1435,19 @@ module.exports = function (chai, util) { * * @name doesNotIncrease * @param {Function} modifier function - * @param {Object} object - * @param {String} property name + * @param {Object} object or getter function + * @param {String} property name _optional_ * @param {String} message _optional_ * @namespace Assert * @api public */ assert.doesNotIncrease = function (fn, obj, prop, msg) { + if (arguments.length === 3 && typeof obj === 'function') { + msg = prop; + prop = null; + } + new Assertion(fn, msg).to.not.increase(obj, prop); } @@ -1452,14 +1462,19 @@ module.exports = function (chai, util) { * * @name decreases * @param {Function} modifier function - * @param {Object} object - * @param {String} property name + * @param {Object} object or getter function + * @param {String} property name _optional_ * @param {String} message _optional_ * @namespace Assert * @api public */ assert.decreases = function (fn, obj, prop, msg) { + if (arguments.length === 3 && typeof obj === 'function') { + msg = prop; + prop = null; + } + new Assertion(fn, msg).to.decrease(obj, prop); } @@ -1474,14 +1489,19 @@ module.exports = function (chai, util) { * * @name doesNotDecrease * @param {Function} modifier function - * @param {Object} object - * @param {String} property name + * @param {Object} object or getter function + * @param {String} property name _optional_ * @param {String} message _optional_ * @namespace Assert * @api public */ assert.doesNotDecrease = function (fn, obj, prop, msg) { + if (arguments.length === 3 && typeof obj === 'function') { + msg = prop; + prop = null; + } + new Assertion(fn, msg).to.not.decrease(obj, prop); } diff --git a/test/assert.js b/test/assert.js index 1e88717f0..f5c5a61f2 100644 --- a/test/assert.js +++ b/test/assert.js @@ -889,6 +889,10 @@ describe('assert', function () { it('increase, decrease', function() { var obj = { value: 10 }, + arr = ['one', 'two'], + pFn = function() { arr.push('three') }, + popFn = function() { arr.pop() }, + lenFn = function() { return arr.length }, incFn = function() { obj.value += 2 }, decFn = function() { obj.value -= 3 }, smFn = function() { obj.value += 0 }; @@ -898,6 +902,12 @@ describe('assert', function () { assert.increases(incFn, obj, 'value'); assert.doesNotIncrease(smFn, obj, 'value'); + + assert.decreases(popFn, lenFn); + assert.doesNotDecrease(pFn, lenFn); + + assert.increases(pFn, lenFn); + assert.doesNotIncrease(popFn, lenFn); }); it('isExtensible / extensible', function() { diff --git a/test/expect.js b/test/expect.js index 7c3d38d80..df4d142be 100644 --- a/test/expect.js +++ b/test/expect.js @@ -1138,6 +1138,11 @@ describe('expect', function () { it('increase, decrease', function() { var obj = { value: 10 }, + arr = ['one', 'two'], + pFn = function() { arr.push('three') }, + popFn = function() { arr.pop() }, + nFn = function() { return null }, + lenFn = function() { return arr.length }, incFn = function() { obj.value += 2 }, decFn = function() { obj.value -= 3 }, smFn = function() { obj.value += 0 }; @@ -1149,6 +1154,14 @@ describe('expect', function () { expect(smFn).to.not.decrease(obj, 'value'); expect(incFn).to.not.decrease(obj, 'value'); expect(decFn).to.decrease(obj, 'value'); + + expect(popFn).to.not.increase(lenFn); + expect(nFn).to.not.increase(lenFn); + expect(pFn).to.increase(lenFn); + + expect(popFn).to.decrease(lenFn); + expect(nFn).to.not.decrease(lenFn); + expect(pFn).to.not.decrease(lenFn); }); it('extensible', function() { diff --git a/test/should.js b/test/should.js index dbe12760e..b3cb65da8 100644 --- a/test/should.js +++ b/test/should.js @@ -969,6 +969,11 @@ describe('should', function() { it('increase, decrease', function() { var obj = { value: 10 }, + arr = ['one', 'two'], + pFn = function() { arr.push('three') }, + popFn = function() { arr.pop() }, + lenFn = function() { return arr.length }, + nFn = function() { return null }, incFn = function() { obj.value += 2 }, decFn = function() { obj.value -= 3 }, smFn = function() { obj.value += 0 }; @@ -980,6 +985,14 @@ describe('should', function() { smFn.should.not.decrease(obj, 'value'); incFn.should.not.decrease(obj, 'value'); decFn.should.decrease(obj, 'value'); + + nFn.should.not.increase(lenFn); + popFn.should.not.increase(lenFn); + pFn.should.increase(lenFn); + + nFn.should.not.decrease(lenFn); + pFn.should.not.decrease(lenFn); + popFn.should.decrease(lenFn); }); it('extensible', function() { From e778cee15d95392c1c2f2a4ed3892d2e46fe518e Mon Sep 17 00:00:00 2001 From: lucasfcosta Date: Mon, 1 Feb 2016 20:08:51 -0200 Subject: [PATCH 3/3] Code style fixes related to function for value on inc, dec and changes --- lib/chai/interface/assert.js | 2 +- test/assert.js | 10 +++++----- test/should.js | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/chai/interface/assert.js b/lib/chai/interface/assert.js index 0d1107d89..415264571 100644 --- a/lib/chai/interface/assert.js +++ b/lib/chai/interface/assert.js @@ -1363,7 +1363,7 @@ module.exports = function (chai, util) { assert.changes = function (fn, obj, prop, msg) { if (arguments.length === 3 && typeof obj === 'function') { - msg = prop + msg = prop; prop = null; } diff --git a/test/assert.js b/test/assert.js index f5c5a61f2..29b98fb5e 100644 --- a/test/assert.js +++ b/test/assert.js @@ -873,18 +873,18 @@ describe('assert', function () { it('change', function() { var obj = { value: 10, str: 'foo' }, - laughs = ['lol', 'haha'], + heroes = ['spiderman', 'superman'], fn = function() { obj.value += 5 }, bangFn = function() { obj.str += '!' }, smFn = function() { 'foo' + 'bar' }, - addFn = function() { laughs.push('hue') }, - getFn = function() { return laughs.length }; + batFn = function() { heroes.push('batman') }, + lenFn = function() { return heroes.length }; assert.changes(fn, obj, 'value'); assert.doesNotChange(smFn, obj, 'value'); assert.changes(bangFn, obj, 'str'); - assert.changes(addFn, getFn); - assert.doesNotChange(smFn, getFn); + assert.changes(batFn, lenFn); + assert.doesNotChange(smFn, lenFn); }); it('increase, decrease', function() { diff --git a/test/should.js b/test/should.js index b3cb65da8..ced29651d 100644 --- a/test/should.js +++ b/test/should.js @@ -950,20 +950,20 @@ describe('should', function() { it('change', function() { var obj = { value: 10, str: 'foo' }, - fruits = ['apple', 'pear'], + heroes = ['spiderman', 'superman'], fn = function() { obj.value += 5 }, sameFn = function() { obj.value += 0 }, decFn = function() { obj.value -= 3 }, bangFn = function() { obj.str += '!' }, - nanaFn = function() { fruits.push('banana') }, - lenFn = function() { return fruits.length }, + batFn = function() { heroes.push('batman') }, + lenFn = function() { return heroes.length }, noFn = function() { return null }; fn.should.change(obj, 'value'); sameFn.should.not.change(obj, 'value'); sameFn.should.not.change(obj, 'str'); bangFn.should.change(obj, 'str'); - nanaFn.should.change(lenFn); + batFn.should.change(lenFn); noFn.should.not.change(lenFn); });