UNPKG

node-vitals

Version:

Do more with less. A simple, high-performing, functional JavaScript library.

198 lines (172 loc) 6.01 kB
/** * ----------------------------------------------------------------------------- * VITALS UNIT TESTS: vitals.amend.property * ----------------------------------------------------------------------------- * @section strict * @see [vitals.amend docs](https://github.com/imaginate/vitals/wiki/vitals.amend) * @see [test api](https://github.com/imaginate/vitals/blob/master/test/setup/interface.js) * @see [test helpers](https://github.com/imaginate/vitals/blob/master/test/setup/helpers.js) * * @author Adam Smith <adam@imaginate.life> (https://github.com/imaginate) * @copyright 2017 Adam A Smith <adam@imaginate.life> (https://github.com/imaginate) * * Annotations: * @see [JSDoc3](http://usejsdoc.org) * @see [Closure Compiler JSDoc Syntax](https://developers.google.com/closure/compiler/docs/js-for-compiler) */ method('amend.property', 'amend.prop', function() { should('add prop to obj', function() { test({}, 'a', 1, function() { var obj = vitals.amend.prop({}, 'a', 1); assert( hasEnum(obj, 'a') ); assert( obj.a === 1 ); obj.a = 2; assert( obj.a === 2 ); }); }); should('add prop to obj with valid descriptor', function() { test({}, 'a', '<descriptor>', function() { var desc = freeze({ value: 1, enumerable: false }); var obj = vitals.amend.prop({}, 'a', desc); assert( !hasEnum(obj, 'a') ); assert( obj.a === 1 ); obj.a = 2; assert( obj.a === 2 ); }); test({}, 'a', 1, '<descriptor>', function() { var desc = freeze({ enumerable: false }); var obj = vitals.amend.prop({}, 'a', 1, desc); assert( !hasEnum(obj, 'a') ); assert( obj.a === 1 ); obj.a = 2; assert( obj.a === 2 ); }); }); should('add prop to obj with strong type check', function() { test({}, 'a', 1, 'number', function() { var obj = vitals.amend.prop({}, 'a', 1, 'number'); assert( hasEnum(obj, 'a') ); assert( obj.a === 1 ); obj.a = 2; assert( obj.a === 2 ); assert.throws(function() { obj.a = 'string'; }, validSetErr); assert( obj.a === 2 ); }); test({}, 'a', 1, '<descriptor>', 'number', function() { var desc = freeze({ enumerable: false }); var obj = vitals.amend.prop({}, 'a', 1, desc, 'number'); assert( !hasEnum(obj, 'a') ); assert( obj.a === 1 ); obj.a = 2; assert( obj.a === 2 ); assert.throws(function() { obj.a = 'string'; }, validSetErr); assert( obj.a === 2 ); }); test({}, 'a', '<descriptor>', 'number', function() { var desc = freeze({ value: 1, enumerable: false }); var obj = vitals.amend.prop({}, 'a', desc, 'number'); assert( !hasEnum(obj, 'a') ); assert( obj.a === 1 ); obj.a = 2; assert( obj.a === 2 ); assert.throws(function() { obj.a = 'string'; }, validSetErr); assert( obj.a === 2 ); }); }); should('add prop to obj with valid setter', function() { test({}, 'a', 1, '<setter>', function() { var obj = vitals.amend.prop({}, 'a', 1, setter); assert( hasEnum(obj, 'a') ); assert( obj.a === 1 ); obj.a = 2; assert( obj.a === 3 ); }); test({}, 'a', 1, '<descriptor>', '<setter>', function() { var desc = freeze({ enumerable: false }); var obj = vitals.amend.prop({}, 'a', 1, desc, setter); assert( !hasEnum(obj, 'a') ); assert( obj.a === 1 ); obj.a = 2; assert( obj.a === 3 ); }); test({}, 'a', '<descriptor>', '<setter>', function() { var desc = freeze({ value: 1, enumerable: false }); var obj = vitals.amend.prop({}, 'a', desc, setter); assert( !hasEnum(obj, 'a') ); assert( obj.a === 1 ); obj.a = 2; assert( obj.a === 3 ); }); test({}, 'a', 1, 'number', '<setter>', function() { var obj = vitals.amend.prop({}, 'a', 1, 'number', setter); assert( hasEnum(obj, 'a') ); assert( obj.a === 1 ); obj.a = 2; assert( obj.a === 3 ); assert.throws(function() { obj.a = 'string'; }, validSetErr); assert( obj.a === 3 ); }); test({}, 'a', 1, '<descriptor>', 'number', '<setter>', function() { var desc = freeze({ enumerable: false }); var obj = vitals.amend.prop({}, 'a', 1, desc, 'number', setter); assert( !hasEnum(obj, 'a') ); assert( obj.a === 1 ); obj.a = 2; assert( obj.a === 3 ); assert.throws(function() { obj.a = 'string'; }, validSetErr); assert( obj.a === 3 ); }); test({}, 'a', '<descriptor>', 'number', '<setter>', function() { var desc = freeze({ value: 1, enumerable: false }); var obj = vitals.amend.prop({}, 'a', desc, 'number', setter); assert( !hasEnum(obj, 'a') ); assert( obj.a === 1 ); obj.a = 2; assert( obj.a === 3 ); assert.throws(function() { obj.a = 'string'; }, validSetErr); assert( obj.a === 3 ); }); }); should('throw an error', function() { test({}, function() { assert.throws(function() { vitals.amend({}); }, validTypeErr); }); test({}, 'a', function() { assert.throws(function() { vitals.amend({}, 'a'); }, validErr); }); test('string', 'a', 5, function() { assert.throws(function() { vitals.amend('string', 'a', 5); }, validTypeErr); }); test({}, 5, 5, function() { assert.throws(function() { vitals.amend({}, 5, 5); }, validTypeErr); }); test({}, 'a', 5, 'string', function() { assert.throws(function() { vitals.amend({}, 'a', 5, 'string'); }, validErr); }); test({}, 'a', 5, 'number', {}, function() { assert.throws(function() { vitals.amend({}, 'a', 5, 'number', {}); }, validTypeErr); }); }); }); /** * @private * @param {number} newVal * @param {number=} oldVal * @return {number} */ function setter(newVal, oldVal) { oldVal = oldVal || 1; return newVal + oldVal; }