compose.test.js (3473B)
1 var assert = require('assert'); 2 var typed = require('../typed-function'); 3 4 describe('compose', function () { 5 6 it('should create a composed function with multiple types per argument', function() { 7 var fn = typed({ 8 'string | number, boolean': function () {return 'A';}, 9 'boolean, boolean | number': function () {return 'B';}, 10 'string': function () {return 'C';} 11 }); 12 13 assert.equal(fn('str', false), 'A'); 14 assert.equal(fn(2, true), 'A'); 15 assert.equal(fn(false, true), 'B'); 16 assert.equal(fn(false, 2), 'B'); 17 assert.equal(fn('str'), 'C'); 18 // FIXME: should return correct error message 19 assert.throws(function () {fn()}, /TypeError: Too few arguments in function unnamed \(expected: number or string or boolean, index: 0\)/); 20 assert.throws(function () {fn(1,2,3)}, /TypeError: Unexpected type of argument in function unnamed \(expected: boolean, actual: number, index: 1\)/); 21 assert.throws(function () {fn('str', 2)}, /TypeError: Unexpected type of argument in function unnamed \(expected: boolean, actual: number, index: 1\)/); 22 assert.throws(function () {fn(true, 'str')},/TypeError: Unexpected type of argument in function unnamed \(expected: number or boolean, actual: string, index: 1\)/); 23 assert.throws(function () {fn(2, 3)}, /TypeError: Unexpected type of argument in function unnamed \(expected: boolean, actual: number, index: 1\)/); 24 assert.throws(function () {fn(2, 'str')}, /TypeError: Unexpected type of argument in function unnamed \(expected: boolean, actual: string, index: 1\)/); 25 }); 26 27 // TODO: test whether the constructor throws errors when providing wrong arguments to typed(...) 28 29 it('should compose a function with one argument', function() { 30 var signatures = { 31 'number': function (value) { 32 return 'number:' + value; 33 }, 34 'string': function (value) { 35 return 'string:' + value; 36 }, 37 'boolean': function (value) { 38 return 'boolean:' + value; 39 } 40 }; 41 var fn = typed(signatures); 42 43 assert.equal(fn(2), 'number:2'); 44 assert.equal(fn('foo'), 'string:foo'); 45 assert.equal(fn(false), 'boolean:false'); 46 assert(fn.signatures instanceof Object); 47 assert.strictEqual(Object.keys(fn.signatures).length, 3); 48 assert.strictEqual(fn.signatures['number'], signatures['number']); 49 assert.strictEqual(fn.signatures['string'], signatures['string']); 50 assert.strictEqual(fn.signatures['boolean'], signatures['boolean']); 51 }); 52 53 it('should compose a function with multiple arguments', function() { 54 var signatures = { 55 'number': function (value) { 56 return 'number:' + value; 57 }, 58 'string': function (value) { 59 return 'string:' + value; 60 }, 61 'number, boolean': function (a, b) { // mind space after the comma, should be normalized by composer 62 return 'number,boolean:' + a + ',' + b; 63 } 64 }; 65 var fn = typed(signatures); 66 67 assert.equal(fn(2), 'number:2'); 68 assert.equal(fn('foo'), 'string:foo'); 69 assert.equal(fn(2, false), 'number,boolean:2,false'); 70 assert(fn.signatures instanceof Object); 71 assert.strictEqual(Object.keys(fn.signatures).length, 3); 72 assert.strictEqual(fn.signatures['number'], signatures['number']); 73 assert.strictEqual(fn.signatures['string'], signatures['string']); 74 assert.strictEqual(fn.signatures['number,boolean'], signatures['number, boolean']); 75 }); 76 77 });