diff --git a/cexps.js b/cexps.js index 8a41373..f996a65 100644 --- a/cexps.js +++ b/cexps.js @@ -102,7 +102,7 @@ var lessoreq = Primop("<="); var greatthan = Primop(">"); var greatoreq = Primop(">="); var bang = Primop("!"); -var subscript = Protoype("subscript"); +var subscript = Primop("subscript"); var ordof = Primop("ordof"); var assign = Primop(":="); var unboxedassign = Primop("unboxedassign"); diff --git a/closure_conversion.js b/closure_conversion.js index d8efe07..34a26d4 100644 --- a/closure_conversion.js +++ b/closure_conversion.js @@ -147,8 +147,6 @@ function test(src) { console.log(JSON.stringify(closure_convert_all(ast), null, 4)); } -test("(lambda a -> (+ a b c))"); - module.export = { test : test, closureConvert : closure_convert_all diff --git a/test.js b/test.js index 38d7b1a..7c254ac 100755 --- a/test.js +++ b/test.js @@ -1,4 +1,76 @@ #! /usr/bin/node var parser = require("./parse.js"); +var cexps = require("./cexps.js"); +var closures = require("./closure_conversion.js"); +var desugar = require("./desugar.js"); +var environments = require("./environments.js"); +var errors = require("./errors.js"); +var tokens = require("./tokenize.js"); +var tools = require("./tools.js"); +var typecheck = require("./typecheck.js"); +var _ = require("underscore"); + var qc = require("quickcheck"); +var assert = require("assert"); + + +/* my own generators */ +function arbArray(gen) { + return qc.arbArray(gen); +} + + +function arbPair(gen) { + return function() { + return [gen(), gen()]; + }; +} + +function arbArrayofPairs() { + return arbArray(function() { + return arbArray(arbPair(qc.arbString)); + }); +} + +function arbPairs() { + return arbArray(arbPair(qc.arbString)); +} + + +/* Tests for misc tools */ +function emptyProp(xs) { + return (tools.empty(xs) === tools.empty(xs) && + ((tools.empty(xs) === true) || + (tools.empty(xs) === false))); +} + + +function dictProp(pairs) { + var dict = tools.dict(pairs); + return _.map(pairs, + function(pair) { + dict[pair[0]] === pair[1]; + }); +} + +function extendProp(pair) { + if (pair.length < 2) { + // empty lists or lists with one item are undefined + // so just return true because extend can't handle them + return true; + } + var x = _.first(pair); + var y = _.first(_.rest(pair)); + var extended = tools.extend(x,y); + return x.length + y.length === extended.length; +} + +function toolsTests() { + assert.equal(true, tools.empty([])); + assert.equal(true, qc.forAll(dictProp, arbArrayofPairs)); + assert.equal(true, qc.forAll(extendProp, arbPairs)); +} + + +toolsTests(); diff --git a/tools.js b/tools.js index bccb8b1..a20f399 100644 --- a/tools.js +++ b/tools.js @@ -41,21 +41,10 @@ function dict(pairs) { return o; } -function flatten(xs) { - if (!(xs instanceof Array)) { - return xs; - } - if (xs.every(function (x) { - return !(x instanceof Array); - })) { - return xs; - } - return [].concat.apply([], xs); -} - function extend(xs, ys) { - xs.push.apply(xs, ys); - return xs; + var result = _.clone(xs); + result.push.apply(result, ys); + return result; } RegExp.escape= function(s) {