Comparing version 0.4.6 to 0.5.0-beta.1
@@ -0,1 +1,2 @@ | ||
/* @flow weak */ | ||
"use strict"; | ||
@@ -65,6 +66,3 @@ | ||
return { | ||
generator: generator.bless(function (size) { | ||
return [a.generator(size), b.generator(size)]; | ||
}), | ||
generator: generator.tuple([a.generator, b.generator]), | ||
shrink: shrink.tuple([a.shrink, b.shrink]), | ||
@@ -71,0 +69,0 @@ show: show.def, |
@@ -0,1 +1,2 @@ | ||
/* @flow weak */ | ||
"use strict"; | ||
@@ -2,0 +3,0 @@ |
@@ -0,1 +1,2 @@ | ||
/* @flow weak */ | ||
"use strict"; | ||
@@ -2,0 +3,0 @@ |
@@ -0,1 +1,2 @@ | ||
/* @flow weak */ | ||
"use strict"; | ||
@@ -2,0 +3,0 @@ |
@@ -0,1 +1,2 @@ | ||
/* @flow weak */ | ||
"use strict"; | ||
@@ -2,0 +3,0 @@ |
@@ -0,4 +1,6 @@ | ||
/* @flow weak */ | ||
"use strict"; | ||
var random = require("./random.js"); | ||
var utils = require("./utils.js"); | ||
@@ -11,16 +13,16 @@ /** | ||
/* eslint-disable no-use-before-define */ | ||
function generatorProtoMap(generator) { | ||
return function (f) { | ||
return generatorBless(function (size) { | ||
return f(generator(size)); | ||
}); | ||
}; | ||
function generatorProtoMap(f) { | ||
/* jshint validthis:true */ | ||
var generator = this; | ||
return generatorBless(function (size) { | ||
return f(generator(size)); | ||
}); | ||
} | ||
function generatorProtoFlatMap(generator) { | ||
return function (f) { | ||
return generatorBless(function (size) { | ||
return f(generator(size))(size); | ||
}); | ||
}; | ||
function generatorProtoFlatMap(f) { | ||
/* jshint validthis:true */ | ||
var generator = this; | ||
return generatorBless(function (size) { | ||
return f(generator(size))(size); | ||
}); | ||
} | ||
@@ -30,4 +32,4 @@ /* eslint-enable no-use-before-define */ | ||
function generatorBless(generator) { | ||
generator.map = generatorProtoMap(generator); | ||
generator.flatmap = generatorProtoFlatMap(generator); | ||
generator.map = generatorProtoMap; | ||
generator.flatmap = generatorProtoFlatMap; | ||
return generator; | ||
@@ -51,4 +53,20 @@ } | ||
/** | ||
- `generator.array(gen: Gen a, size: nat): gen (array a)` | ||
- `generator.tuple(gens: (gen a, gen b...), size: nat): gen (a, b...)` | ||
*/ | ||
function generateTuple(gens) { | ||
var len = gens.length; | ||
var result = generatorBless(function (size) { | ||
var r = []; | ||
for (var i = 0; i < len; i++) { | ||
r[i] = gens[i](size); | ||
} | ||
return r; | ||
}); | ||
return utils.curried2(result, arguments); | ||
} | ||
/** | ||
- `generator.array(gen: gen a, size: nat): gen (array a)` | ||
*/ | ||
function generateArray(gen) { | ||
@@ -64,7 +82,3 @@ var result = generatorBless(function (size) { | ||
if (arguments.length === 2) { | ||
return result(arguments[1]); | ||
} else { | ||
return result; | ||
} | ||
return utils.curried2(result, arguments); | ||
} | ||
@@ -85,17 +99,16 @@ | ||
if (arguments.length === 2) { | ||
return result(arguments[1]); | ||
} else { | ||
return result; | ||
} | ||
return utils.curried2(result, arguments); | ||
} | ||
/** | ||
- `generator.char: gen char` | ||
*/ | ||
var generateChar = generatorBless(function generateChar(/* size */) { | ||
return String.fromCharCode(random(0, 0xff)); | ||
}); | ||
/** | ||
- `generator.string(size: nat): gen string` | ||
*/ | ||
function generateString(size) { | ||
return generateArray(function () { | ||
return String.fromCharCode(random(0, 0xff)); | ||
}, size).join(""); | ||
} | ||
var generateString = generateArray(generateChar).map(utils.charArrayToString); | ||
@@ -105,9 +118,17 @@ /** | ||
*/ | ||
function generateNEString(size) { | ||
return generateNEArray(function () { | ||
return String.fromCharCode(random(0, 0xff)); | ||
}, size).join(""); | ||
} | ||
var generateNEString = generateNEArray(generateChar).map(utils.charArrayToString); | ||
/** | ||
- `generator.asciichar: gen char` | ||
*/ | ||
var generateAsciiChar = generatorBless(function generateAsciiChar(/* size */) { | ||
return String.fromCharCode(random(0x20, 0x7e)); | ||
}); | ||
/** | ||
- `generator.asciistring(size: nat): gen string` | ||
*/ | ||
var generateAsciiString = generateArray(generateAsciiChar).map(utils.charArrayToString); | ||
/** | ||
- `generator.map(gen: gen a, size: nat): gen (map a)` | ||
@@ -125,7 +146,3 @@ */ | ||
if (arguments.length === 2) { | ||
return result(arguments[1]); | ||
} else { | ||
return result; | ||
} | ||
return utils.curried2(result, arguments); | ||
} | ||
@@ -143,7 +160,3 @@ | ||
if (arguments.length === 2) { | ||
return result(arguments[1]); | ||
} else { | ||
return result; | ||
} | ||
return utils.curried2(result, arguments); | ||
} | ||
@@ -208,6 +221,10 @@ | ||
module.exports = { | ||
tuple: generateTuple, | ||
array: generateArray, | ||
nearray: generateNEArray, | ||
char: generateChar, | ||
string: generateString, | ||
nestring: generateNEString, | ||
asciichar: generateAsciiChar, | ||
asciistring: generateAsciiString, | ||
map: generateMap, | ||
@@ -214,0 +231,0 @@ json: generateJson, |
@@ -0,1 +1,2 @@ | ||
/* @flow weak */ | ||
/** | ||
@@ -6,3 +7,3 @@ # JSVerify | ||
> Property based checking. | ||
> Property based checking. Like QuickCheck. | ||
@@ -134,3 +135,3 @@ [![Build Status](https://secure.travis-ci.org/jsverify/jsverify.svg?branch=master)](http://travis-ci.org/jsverify/jsverify) | ||
}; | ||
return transform ? transform(res) : res; | ||
return transform(res); | ||
} else { | ||
@@ -178,3 +179,2 @@ return shrinkPPrime; | ||
assert(Array.isArray(x), "generators results should be always tuple"); | ||
shrinks = shrinks || 0; | ||
@@ -202,3 +202,3 @@ return functor.bind(property, x, function (r, exc) { | ||
return shrinkResult(gens, x, test, size, shrinks, exc); | ||
return shrinkResult(gens, x, test, size, shrinks, exc, utils.identity); | ||
}); | ||
@@ -209,3 +209,3 @@ } | ||
var x = gens.map(function (arb) { return arb.generator(size); }); | ||
var r = test(size, x); | ||
var r = test(size, x, 0); | ||
return r; | ||
@@ -212,0 +212,0 @@ }; |
@@ -0,1 +1,2 @@ | ||
/* @flow weak */ | ||
"use strict"; | ||
@@ -21,2 +22,26 @@ | ||
function numeric(impl) { | ||
return function (minsize, maxsize) { | ||
if (arguments.length === 2) { | ||
var arb = impl(maxsize - minsize); | ||
var to = function to(x) { | ||
return Math.abs(x) + minsize; | ||
}; | ||
var from = function from(x) { | ||
return x - minsize; | ||
}; | ||
return { | ||
generator: arb.generator.map(to), | ||
shrink: arb.shrink.isomap(to, from), | ||
show: show.def, | ||
}; | ||
} else if (arguments.length === 1) { | ||
return impl(minsize /* as minsize */); | ||
} else { | ||
return impl(); | ||
} | ||
}; | ||
} | ||
/** | ||
@@ -29,21 +54,3 @@ - `integer: arbitrary integer` | ||
*/ | ||
function integer(minsize, maxsize) { | ||
if (arguments.length === 2) { | ||
var arb = integer(maxsize - minsize); | ||
var to = function to(x) { | ||
return Math.abs(x) + minsize; | ||
}; | ||
var from = function from(x) { | ||
return x - minsize; | ||
}; | ||
return { | ||
generator: arb.generator.map(to), | ||
shrink: arb.shrink.isomap(to, from), | ||
show: show.def, | ||
}; | ||
} else if (arguments.length === 1) { | ||
maxsize = minsize; | ||
} | ||
var integer = numeric(function integer(maxsize) { | ||
return { | ||
@@ -74,3 +81,3 @@ generator: generator.bless(function (size) { | ||
}; | ||
} | ||
}); | ||
@@ -115,21 +122,3 @@ extendWithDefault(integer); | ||
*/ | ||
function number(minsize, maxsize) { | ||
if (arguments.length === 2) { | ||
var arb = number(maxsize - minsize); | ||
var to = function to(x) { | ||
return Math.abs(x) + minsize; | ||
}; | ||
var from = function from(x) { | ||
return x - minsize; | ||
}; | ||
return { | ||
generator: arb.generator.map(to), | ||
shrink: arb.shrink.isomap(to, from), | ||
show: show.def, | ||
}; | ||
} else if (arguments.length === 1) { | ||
maxsize = minsize; | ||
} | ||
var number = numeric(function number(maxsize) { | ||
return { | ||
@@ -149,3 +138,3 @@ generator: generator.bless(function (size) { | ||
}; | ||
} | ||
}); | ||
@@ -173,3 +162,3 @@ extendWithDefault(number); | ||
/** | ||
- `bool: generator bool` | ||
- `bool: arbitrary bool` | ||
@@ -191,3 +180,3 @@ Booleans, `true` or `false`. | ||
/** | ||
- `datetime: generator datetime` | ||
- `datetime: arbitrary datetime` | ||
@@ -236,3 +225,3 @@ Random datetime | ||
/** | ||
- `elements(args: array a): generator a` | ||
- `elements(args: array a): arbitrary a` | ||
@@ -262,15 +251,10 @@ Random element of `args` array. | ||
function natToChar(n) { | ||
return String.fromCharCode(n); | ||
} | ||
/** | ||
- `char: generator char` | ||
- `char: arbitrary char` | ||
Single character | ||
*/ | ||
var natChar = nat(0x1ff); | ||
var char = { | ||
generator: natChar.generator.map(natToChar), | ||
generator: generator.char, | ||
shrink: shrink.noop, | ||
@@ -280,15 +264,9 @@ show: show.def, | ||
function natToAsciiChar(n) { | ||
return String.fromCharCode(n + 0x20); | ||
} | ||
/** | ||
- `asciichar: generator char` | ||
- `asciichar: arbitrary char` | ||
Single ascii character (0x20-0x7e inclusive, no DEL) | ||
*/ | ||
var natAsciiChar = nat(0x77 - 0x20); | ||
var asciichar = { | ||
generator: natAsciiChar.generator.map(natToAsciiChar), | ||
generator: generator.asciichar, | ||
shrink: shrink.noop, | ||
@@ -298,12 +276,4 @@ show: show.def, | ||
function arrayToString(arr) { | ||
return arr.join(""); | ||
} | ||
function stringToArray(str) { | ||
return str.split(""); | ||
} | ||
/** | ||
- `string: generator string` | ||
- `string: arbitrary string` | ||
*/ | ||
@@ -313,3 +283,3 @@ function string() { | ||
generator: generator.string, | ||
shrink: shrink.array(char.shrink).isomap(arrayToString, stringToArray), | ||
shrink: shrink.array(char.shrink).isomap(utils.charArrayToString, utils.stringToCharArray), | ||
show: show.def, | ||
@@ -328,3 +298,3 @@ }; | ||
generator: generator.nestring, | ||
shrink: shrink.nearray(asciichar.shrink).isomap(arrayToString, stringToArray), | ||
shrink: shrink.nearray(asciichar.shrink).isomap(utils.charArrayToString, utils.stringToCharArray), | ||
show: show.def, | ||
@@ -334,9 +304,7 @@ }; | ||
/** | ||
- `asciistring: generator string` | ||
- `asciistring: arbitrary string` | ||
*/ | ||
var asciistring = { | ||
generator: generator.bless(function (size) { | ||
return generator.array(asciichar.generator, size).join(""); | ||
}), | ||
shrink: shrink.array(asciichar.shrink).isomap(arrayToString, stringToArray), | ||
generator: generator.asciistring, | ||
shrink: shrink.array(asciichar.shrink).isomap(utils.charArrayToString, utils.stringToCharArray), | ||
show: show.def, | ||
@@ -346,7 +314,7 @@ }; | ||
/** | ||
- `json: generator json` | ||
- `json: arbitrary json` | ||
JavaScript Objects: boolean, number, string, array of `json` values or object with `json` values. | ||
- `value: generator json` | ||
- `value: arbitrary json` | ||
*/ | ||
@@ -353,0 +321,0 @@ var json = { |
@@ -0,1 +1,2 @@ | ||
/* @flow weak */ | ||
"use strict"; | ||
@@ -2,0 +3,0 @@ |
@@ -0,1 +1,2 @@ | ||
/* @flow weak */ | ||
"use strict"; | ||
@@ -2,0 +3,0 @@ |
@@ -0,4 +1,6 @@ | ||
/* @flow weak */ | ||
"use strict"; | ||
var assert = require("assert"); | ||
var utils = require("./utils.js"); | ||
@@ -11,8 +13,8 @@ /** | ||
/* eslint-disable no-use-before-define */ | ||
function shrinkProtoIsoMap(shrink) { | ||
return function (f, g) { | ||
return shrinkBless(function (value) { | ||
return shrink(g(value)).map(f); | ||
}); | ||
}; | ||
function shrinkProtoIsoMap(f, g) { | ||
/* jshint validthis:true */ | ||
var shrink = this; | ||
return shrinkBless(function (value) { | ||
return shrink(g(value)).map(f); | ||
}); | ||
} | ||
@@ -22,3 +24,3 @@ /* eslint-enable no-use-before-define */ | ||
function shrinkBless(shrink) { | ||
shrink.isomap = shrinkProtoIsoMap(shrink); | ||
shrink.isomap = shrinkProtoIsoMap; | ||
return shrink; | ||
@@ -58,59 +60,37 @@ } | ||
if (arguments.length === 2) { | ||
return result(arguments[1]); | ||
} else { | ||
return result; | ||
} | ||
return utils.curried2(result, arguments); | ||
} | ||
/** | ||
- `shrink.array(shrink: a -> array a, x: array a): array (array a)` | ||
*/ | ||
function shrinkArray(shrink) { | ||
var result = shrinkBless(function (arr) { | ||
if (arr.length === 0) { | ||
return []; | ||
} else { | ||
var x = arr[0]; | ||
var xs = arr.slice(1); | ||
function shrinkArrayWithMinimumSize(size) { | ||
function shrinkArrayImpl(shrink) { | ||
var result = shrinkBless(function (arr) { | ||
if (arr.length <= size) { | ||
return []; | ||
} else { | ||
var x = arr[0]; | ||
var xs = arr.slice(1); | ||
return [xs].concat( | ||
shrink(x).map(function (xp) { return [xp].concat(xs); }), | ||
shrinkArray(shrink, xs).map(function (xsp) { return [x].concat(xsp); }) | ||
); | ||
} | ||
}); | ||
return [xs].concat( | ||
shrink(x).map(function (xp) { return [xp].concat(xs); }), | ||
shrinkArrayImpl(shrink, xs).map(function (xsp) { return [x].concat(xsp); }) | ||
); | ||
} | ||
}); | ||
if (arguments.length === 2) { | ||
return result(arguments[1]); | ||
} else { | ||
return result; | ||
return utils.curried2(result, arguments); | ||
} | ||
return shrinkArrayImpl; | ||
} | ||
/** | ||
- `shrink.array(shrink: a -> array a, x: array a): array (array a)` | ||
*/ | ||
var shrinkArray = shrinkArrayWithMinimumSize(0); | ||
/** | ||
- `shrink.nearray(shrink: a -> nearray a, x: nearray a): array (nearray a)` | ||
*/ | ||
function shrinkNEArray(shrink) { | ||
var result = shrinkBless(function (arr) { | ||
if (arr.length <= 1) { | ||
return []; | ||
} else { | ||
var x = arr[0]; | ||
var xs = arr.slice(1); | ||
var shrinkNEArray = shrinkArrayWithMinimumSize(1); | ||
return [xs].concat( | ||
shrink(x).map(function (xp) { return [xp].concat(xs); }), | ||
shrinkArray(shrink, xs).map(function (xsp) { return [x].concat(xsp); }) | ||
); | ||
} | ||
}); | ||
if (arguments.length === 2) { | ||
return result(arguments[1]); | ||
} else { | ||
return result; | ||
} | ||
} | ||
/** | ||
@@ -136,7 +116,3 @@ - `shrink.record(shrinks: { key: a -> string... }, x: { key: a... }): array { key: a... }` | ||
if (arguments.length === 2) { | ||
return result(arguments[1]); | ||
} else { | ||
return result; | ||
} | ||
return utils.curried2(result, arguments); | ||
} | ||
@@ -143,0 +119,0 @@ |
@@ -0,1 +1,2 @@ | ||
/* @flow weak */ | ||
"use strict"; | ||
@@ -2,0 +3,0 @@ |
@@ -0,1 +1,2 @@ | ||
/* @flow weak */ | ||
"use strict"; | ||
@@ -2,0 +3,0 @@ |
@@ -0,1 +1,2 @@ | ||
/* @flow weak */ | ||
"use strict"; | ||
@@ -54,2 +55,6 @@ | ||
function identity(x) { | ||
return x; | ||
} | ||
function pluck(arr, key) { | ||
@@ -90,2 +95,18 @@ return arr.map(function (e) { | ||
function curried2(result, args) { | ||
if (args.length === 2) { | ||
return result(args[1]); | ||
} else { | ||
return result; | ||
} | ||
} | ||
function charArrayToString(arr) { | ||
return arr.join(""); | ||
} | ||
function stringToCharArray(str) { | ||
return str.split(""); | ||
} | ||
module.exports = { | ||
@@ -95,2 +116,3 @@ isArray: isArray, | ||
isEqual: isEqual, | ||
identity: identity, | ||
pluck: pluck, | ||
@@ -100,2 +122,5 @@ force: force, | ||
div2: div2, | ||
curried2: curried2, | ||
charArrayToString: charArrayToString, | ||
stringToCharArray: stringToCharArray, | ||
}; |
{ | ||
"name": "jsverify", | ||
"description": "Property-based testing for JavaScript.", | ||
"version": "0.4.6", | ||
"version": "0.5.0-beta.1", | ||
"homepage": "http://jsverify.github.io/", | ||
@@ -32,5 +32,5 @@ "author": { | ||
"devDependencies": { | ||
"browserify": "~6.3.2", | ||
"browserify": "~7.0.3", | ||
"chai": "^1.10.0", | ||
"david": "^5.0.0", | ||
"david": "^6.0.1", | ||
"eslint": "^0.10.0", | ||
@@ -37,0 +37,0 @@ "esprima": "~1.2.2", |
@@ -5,3 +5,3 @@ # JSVerify | ||
> Property based checking. | ||
> Property based checking. Like QuickCheck. | ||
@@ -212,3 +212,3 @@ [![Build Status](https://secure.travis-ci.org/jsverify/jsverify.svg?branch=master)](http://travis-ci.org/jsverify/jsverify) | ||
- `bool: generator bool` | ||
- `bool: arbitrary bool` | ||
@@ -218,3 +218,3 @@ Booleans, `true` or `false`. | ||
- `datetime: generator datetime` | ||
- `datetime: arbitrary datetime` | ||
@@ -224,3 +224,3 @@ Random datetime | ||
- `elements(args: array a): generator a` | ||
- `elements(args: array a): arbitrary a` | ||
@@ -230,3 +230,3 @@ Random element of `args` array. | ||
- `char: generator char` | ||
- `char: arbitrary char` | ||
@@ -236,3 +236,3 @@ Single character | ||
- `asciichar: generator char` | ||
- `asciichar: arbitrary char` | ||
@@ -242,3 +242,3 @@ Single ascii character (0x20-0x7e inclusive, no DEL) | ||
- `string: generator string` | ||
- `string: arbitrary string` | ||
@@ -251,10 +251,10 @@ | ||
- `asciistring: generator string` | ||
- `asciistring: arbitrary string` | ||
- `json: generator json` | ||
- `json: arbitrary json` | ||
JavaScript Objects: boolean, number, string, array of `json` values or object with `json` values. | ||
- `value: generator json` | ||
- `value: arbitrary json` | ||
@@ -320,8 +320,14 @@ | ||
- `generator.array(gen: Gen a, size: nat): gen (array a)` | ||
- `generator.tuple(gens: (gen a, gen b...), size: nat): gen (a, b...)` | ||
- `generator.array(gen: gen a, size: nat): gen (array a)` | ||
- `generator.nearray(gen: Gen a, size: nat): gen (array a)` | ||
- `generator.char: gen char` | ||
- `generator.string(size: nat): gen string` | ||
@@ -333,2 +339,8 @@ | ||
- `generator.asciichar: gen char` | ||
- `generator.asciistring(size: nat): gen string` | ||
- `generator.map(gen: gen a, size: nat): gen (map a)` | ||
@@ -442,10 +454,14 @@ | ||
- **0.4.6** — *2014-11-30* better shrinks & recursive | ||
- **0.5.0-beta.1**; — *2014-12-20* — Almost there! | ||
- `bless` don't close over (uses `this`) | ||
- Cleanup generator module | ||
- Other code cleanup here and there | ||
- **0.4.6** — *2014-11-30* — better shrinks & recursive | ||
- Implemented shrinks: [#51](https://github.com/jsverify/jsverify/issues/51) | ||
- `jsc.generator.recursive`: [#37](https://github.com/jsverify/jsverify/issues/37) | ||
- array, nearray & map generators return a bit smaller results (*log2* of size) | ||
- **0.4.5** — *2014-11-22* stuff | ||
- **0.4.5** — *2014-11-22* — stuff | ||
- `generator.combine` & `.flatmap` | ||
- `nat`, `integer`, `number` & and `string` act as objects too | ||
- **0.4.4** — *2014-11-22* new generators | ||
- **0.4.4** — *2014-11-22* — new generators | ||
- New generators: `nearray`, `nestring` | ||
@@ -455,3 +471,3 @@ - `generator.constant` | ||
- `jsc.sampler` | ||
- **0.4.3** — *2014-11-08* jsc.property | ||
- **0.4.3** — *2014-11-08* — jsc.property | ||
- Now you can write your bdd specs without any boilerplate | ||
@@ -467,3 +483,3 @@ - support for nat-litearls in dsl [#36](https://github.com/jsverify/jsverify/issues/36) | ||
- Falsy generator [#42](https://github.com/jsverify/jsverify/issues/42) | ||
- **0.4.2** — *2014-11-03* User environments for DSL | ||
- **0.4.2** — *2014-11-03* — User environments for DSL | ||
- User environments for DSL | ||
@@ -473,3 +489,3 @@ - Generator prototype `map`, and shrink prototype `isomap` | ||
- **0.4.1** Move to own organization in GitHub | ||
- **0.4.0** *2014-10-27* typify-dsl & more arbitraries. | ||
- **0.4.0** — *2014-10-27* — typify-dsl & more arbitraries. | ||
Changes from **0.3.6**: | ||
@@ -552,2 +568,3 @@ - DSL for `forall` and `suchthat` | ||
- [gencheck](https://github.com/graue/gentest) | ||
- [node-quickcheck](https://github.com/mcandre/node-quickcheck) | ||
@@ -554,0 +571,0 @@ ### Others |
Sorry, the diff of this file is too big to display
157017
23
4539
586