simple-squiggle

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

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