any_type.test.js (7873B)
1 var assert = require('assert'); 2 var typed = require('../typed-function'); 3 4 describe('any type', function () { 5 6 it('should compose a function with one any type argument', function() { 7 var fn = typed({ 8 'any': function (value) { 9 return 'any:' + value; 10 }, 11 'string': function (value) { 12 return 'string:' + value; 13 }, 14 'boolean': function (value) { 15 return 'boolean:' + value; 16 } 17 }); 18 19 assert(fn.signatures instanceof Object); 20 assert.strictEqual(Object.keys(fn.signatures).length, 3); 21 assert.equal(fn(2), 'any:2'); 22 assert.equal(fn([1,2,3]), 'any:1,2,3'); 23 assert.equal(fn('foo'), 'string:foo'); 24 assert.equal(fn(false), 'boolean:false'); 25 }); 26 27 it('should compose a function with multiple any type arguments (1)', function() { 28 var fn = typed({ 29 'any,boolean': function () { 30 return 'any,boolean'; 31 }, 32 'any,string': function () { 33 return 'any,string'; 34 } 35 }); 36 37 assert(fn.signatures instanceof Object); 38 assert.strictEqual(Object.keys(fn.signatures).length, 2); 39 assert.equal(fn([],true), 'any,boolean'); 40 assert.equal(fn(2,'foo'), 'any,string'); 41 assert.throws(function () {fn([], new Date())}, /TypeError: Unexpected type of argument in function unnamed \(expected: string or boolean, actual: Date, index: 1\)/); 42 assert.throws(function () {fn(2, 2)}, /TypeError: Unexpected type of argument in function unnamed \(expected: string or boolean, actual: number, index: 1\)/); 43 assert.throws(function () {fn(2)}, /TypeError: Too few arguments in function unnamed \(expected: string or boolean, index: 1\)/); 44 }); 45 46 it('should compose a function with multiple any type arguments (2)', function() { 47 var fn = typed({ 48 'any,boolean': function () { 49 return 'any,boolean'; 50 }, 51 'any,number': function () { 52 return 'any,number'; 53 }, 54 'string,any': function () { 55 return 'string,any'; 56 } 57 }); 58 59 assert(fn.signatures instanceof Object); 60 assert.strictEqual(Object.keys(fn.signatures).length, 3); 61 assert.equal(fn([],true), 'any,boolean'); 62 assert.equal(fn([],2), 'any,number'); 63 assert.equal(fn('foo', 2), 'string,any'); 64 assert.throws(function () {fn([], new Date())}, /TypeError: Unexpected type of argument in function unnamed \(expected: number or boolean, actual: Date, index: 1\)/); 65 assert.throws(function () {fn([], 'foo')}, /TypeError: Unexpected type of argument in function unnamed \(expected: number or boolean, actual: string, index: 1\)/) 66 }); 67 68 it('should compose a function with multiple any type arguments (3)', function() { 69 var fn = typed({ 70 'string,any': function () { 71 return 'string,any'; 72 }, 73 'any': function () { 74 return 'any'; 75 } 76 }); 77 78 assert(fn.signatures instanceof Object); 79 assert.deepEqual(Object.keys(fn.signatures), ['string,any', 'any']); 80 assert.equal(fn('foo', 2), 'string,any'); 81 assert.equal(fn([]), 'any'); 82 assert.equal(fn('foo'), 'any'); 83 assert.throws(function () {fn()}, /TypeError: Too few arguments in function unnamed \(expected: any, index: 0\)/); 84 assert.throws(function () {fn([], 'foo')}, /TypeError: Too many arguments in function unnamed \(expected: 1, actual: 2\)/); 85 assert.throws(function () {fn('foo', 4, [])}, /TypeError: Too many arguments in function unnamed \(expected: 2, actual: 3\)/); 86 }); 87 88 it('should compose a function with multiple any type arguments (4)', function() { 89 var fn = typed('fn1', { 90 'number,number': function () { 91 return 'number,number'; 92 }, 93 'any,string': function () { 94 return 'any,string'; 95 } 96 }); 97 98 assert(fn.signatures instanceof Object); 99 assert.strictEqual(Object.keys(fn.signatures).length, 2); 100 assert.equal(fn(2, 2), 'number,number'); 101 assert.equal(fn(2, 'foo'), 'any,string'); 102 assert.throws(function () {fn('foo')}, /TypeError: Too few arguments in function fn1 \(expected: string, index: 1\)/); 103 assert.throws(function () {fn(1,2,3)}, /TypeError: Too many arguments in function fn1 \(expected: 2, actual: 3\)/); 104 }); 105 106 it('should compose a function with multiple any type arguments (5)', function() { 107 var fn = typed({ 108 'string,string': function () { 109 return 'string,string'; 110 }, 111 'any': function () { 112 return 'any'; 113 } 114 }); 115 116 assert(fn.signatures instanceof Object); 117 assert.strictEqual(Object.keys(fn.signatures).length, 2); 118 assert.equal(fn('foo', 'bar'), 'string,string'); 119 assert.equal(fn([]), 'any'); 120 assert.equal(fn('foo'), 'any'); 121 assert.throws(function () {fn('foo', 'bar', 5)}, /TypeError: Too many arguments in function unnamed \(expected: 2, actual: 3\)/); 122 assert.throws(function () {fn('foo', 2, 5)}, /TypeError: Unexpected type of argument in function unnamed \(expected: string, actual: number, index: 1\)/); 123 assert.throws(function () {fn('foo', 'bar', 5)}, /TypeError: Too many arguments in function unnamed \(expected: 2, actual: 3\)/); 124 }); 125 126 it('var arg any type arguments should only handle unmatched types', function() { 127 var fn = typed({ 128 'Array,string': function () { 129 return 'Array,string'; 130 }, 131 '...': function () { 132 return 'any'; 133 } 134 }); 135 136 assert.equal(fn([], 'foo'), 'Array,string'); 137 assert.equal(fn([], 'foo', 'bar'), 'any'); 138 assert.equal(fn('string'), 'any'); 139 assert.equal(fn(2), 'any'); 140 assert.equal(fn(2,3,4), 'any'); 141 assert.equal(fn([]), 'any'); 142 assert.throws(function () {fn()}, /TypeError: Too few arguments in function unnamed \(expected: any, index: 0\)/); 143 }); 144 145 it('multiple use of any', function() { 146 var fn = typed({ 147 'number,number': function () { 148 return 'numbers'; 149 }, 150 'any,any': function () { 151 return 'any'; 152 } 153 }); 154 155 assert(fn.signatures instanceof Object); 156 assert.strictEqual(Object.keys(fn.signatures).length, 2); 157 assert.equal(fn('a','b'), 'any'); 158 assert.equal(fn(1,1), 'numbers'); 159 assert.equal(fn(1,'b'), 'any'); 160 assert.equal(fn('a',1), 'any'); 161 }); 162 163 it('use one any in combination with vararg', function() { 164 var fn = typed({ 165 'number': function () { 166 return 'numbers'; 167 }, 168 'any,...any': function () { 169 return 'any'; 170 } 171 }); 172 173 assert(fn.signatures instanceof Object); 174 assert.strictEqual(Object.keys(fn.signatures).length, 2); 175 assert.equal(fn('a','b'), 'any'); 176 assert.equal(fn(1), 'numbers'); 177 assert.equal(fn(1,'b'), 'any'); 178 assert.equal(fn('a',2), 'any'); 179 assert.equal(fn(1,2), 'any'); 180 assert.equal(fn(1,2,3), 'any'); 181 }); 182 183 it('use multi-layered any in combination with vararg', function() { 184 var fn = typed({ 185 'number,number': function () { 186 return 'numbers'; 187 }, 188 'any,any,...any': function () { 189 return 'any'; 190 } 191 }); 192 193 assert(fn.signatures instanceof Object); 194 assert.strictEqual(Object.keys(fn.signatures).length, 2); 195 assert.equal(fn('a','b','c'), 'any'); 196 assert.equal(fn(1,2), 'numbers'); 197 assert.equal(fn(1,'b',2), 'any'); 198 assert.equal(fn('a',2,3), 'any'); 199 assert.equal(fn(1,2,3), 'any'); 200 }); 201 202 it('should permit multi-layered use of any', function() { 203 var fn = typed({ 204 'any,any': function () { 205 return 'two'; 206 }, 207 'number,number,string': function () { 208 return 'three'; 209 } 210 }); 211 212 assert(fn.signatures instanceof Object); 213 assert.strictEqual(Object.keys(fn.signatures).length, 2); 214 assert.equal(fn('a','b'), 'two'); 215 assert.equal(fn(1,1), 'two'); 216 assert.equal(fn(1,1,'a'), 'three'); 217 assert.throws(function () {fn(1,1,1)}, /TypeError: Unexpected type of argument in function unnamed \(expected: string, actual: number, index: 2\)/); 218 }); 219 220 });