simple-squiggle

A restricted subset of Squiggle
Log | Files | Refs | README

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 });