Comparing version 0.5.3 to 0.6.0-alpha.1
## Release History | ||
- **0.6.0-alpha.1** — *2015-04-22* — Preview | ||
- Using lazy sequences for shrink results | ||
- *Breaking changes:* | ||
- `jsc.map` renamed to `jsc.dict` | ||
- `jsc.value` removed, use `jsc.json` | ||
- `jsc.string()` removed, use `jsc.string` | ||
- `shrink.isomap` renamed to `shrink.smap` | ||
- **0.5.3** — *2015-04-21* — More algebra | ||
@@ -4,0 +11,0 @@ - `unit` and `either` arbitraries |
/* @flow weak */ | ||
"use strict"; | ||
var arbitraryAssert = require("./arbitraryAssert.js"); | ||
var arbitraryBless = require("./arbitraryBless.js"); | ||
var array = require("./array.js"); | ||
var assert = require("assert"); | ||
var generator = require("./generator.js"); | ||
var primitive = require("./primitive.js"); | ||
var pair = require("./pair.js"); | ||
var dict = require("./dict.js"); | ||
var json = require("./json.js"); | ||
var show = require("./show.js"); | ||
@@ -31,25 +35,3 @@ var shrink = require("./shrink.js"); | ||
function arrayImpl(flavour) { | ||
return function array(arb) { | ||
arb = utils.force(arb || primitive.json); | ||
return arbitraryBless({ | ||
generator: generator[flavour](arb.generator), | ||
shrink: shrink[flavour](arb.shrink), | ||
show: show.array(arb.show), | ||
}); | ||
}; | ||
} | ||
/** | ||
- `array(arb: arbitrary a): arbitrary (array a)` | ||
*/ | ||
var array = arrayImpl("array"); | ||
/** | ||
- `nearray(arb: arbitrary a): arbitrary (array a)` | ||
*/ | ||
var nearray = arrayImpl("nearray"); | ||
/** | ||
- `unit: arbitrary ()` | ||
@@ -67,5 +49,8 @@ */ | ||
function either(a, b) { | ||
a = utils.force(a || primitive.json); | ||
b = utils.force(b || primitive.json); | ||
a = utils.force(a || json.json); | ||
b = utils.force(b || json.json); | ||
arbitraryAssert(a); | ||
arbitraryAssert(b); | ||
return arbitraryBless({ | ||
@@ -83,11 +68,4 @@ generator: generator.either(a.generator, b.generator), | ||
*/ | ||
function pair(a, b) { | ||
a = utils.force(a || primitive.json); | ||
b = utils.force(b || primitive.json); | ||
return arbitraryBless({ | ||
generator: generator.pair(a.generator, b.generator), | ||
shrink: shrink.pair(a.shrink, b.shrink), | ||
show: show.pair(a.show, b.show), | ||
}); | ||
function pairArb(a, b) { | ||
return pair.pair(a || json.json, b || json.json); | ||
} | ||
@@ -108,37 +86,30 @@ | ||
/** | ||
- `map(arb: arbitrary a): arbitrary (map a)` | ||
- `dict(arb: arbitrary a): arbitrary (dict a)` | ||
Generates a JavaScript object with properties of type `A`. | ||
*/ | ||
function fromArray(arrayOfPairs) { | ||
var res = {}; | ||
arrayOfPairs.forEach(function (p) { | ||
res[p[0]] = p[1]; | ||
}); | ||
return res; | ||
function dictArb(arb) { | ||
return dict.dict(arb || json.json); | ||
} | ||
function toArray(m) { | ||
var res = []; | ||
Object.keys(m).forEach(function (k) { | ||
res.push([k, m[k]]); | ||
}); | ||
return res; | ||
/** | ||
- `array(arb: arbitrary a): arbitrary (array a)` | ||
*/ | ||
function arrayArb(arb) { | ||
return array.array(arb || json.json); | ||
} | ||
function makeMapShow(elShow) { | ||
return function (m) { | ||
return "{" + Object.keys(m).map(function (k) { | ||
return k + ": " + elShow(m[k]); | ||
}).join(", ") + "}"; | ||
}; | ||
/** | ||
- `nearray(arb: arbitrary a): arbitrary (array a)` | ||
*/ | ||
function nearrayArb(arb) { | ||
return array.nearray(arb || json.json); | ||
} | ||
function map(arb) { | ||
arb = utils.force(arb || primitive.json); | ||
var pairArbitrary = pair(primitive.string(), arb); | ||
var arrayArbitrary = array(pairArbitrary); | ||
/** | ||
- `json: arbitrary json` | ||
return arrayArbitrary.smap(fromArray, toArray, makeMapShow(arb.show)); | ||
} | ||
JavaScript Objects: boolean, number, string, array of `json` values or object with `json` values. | ||
*/ | ||
var jsonArb = json.json; | ||
@@ -213,11 +184,12 @@ /** | ||
nonshrink: nonshrink, | ||
pair: pair, | ||
pair: pairArb, | ||
either: either, | ||
unit: unit, | ||
dict: dictArb, | ||
json: jsonArb, | ||
nearray: nearrayArb, | ||
array: arrayArb, | ||
tuple: tuple, | ||
array: array, | ||
nearray: nearray, | ||
map: map, | ||
oneof: oneof, | ||
record: record, | ||
}; |
@@ -16,3 +16,3 @@ "use strict"; | ||
generator: arb.generator.map(f), | ||
shrink: arb.shrink.isomap(f, g), | ||
shrink: arb.shrink.smap(f, g), | ||
show: newShow || show.def | ||
@@ -19,0 +19,0 @@ }); |
@@ -7,11 +7,13 @@ /* @flow weak */ | ||
var primitive = require("./primitive.js"); | ||
var string = require("./string.js"); | ||
var utils = require("./utils.js"); | ||
var environment = utils.merge(primitive, { | ||
var environment = utils.merge(primitive, string, { | ||
pair: arbitrary.pair, | ||
unit: arbitrary.unit, | ||
either: arbitrary.either, | ||
dict: arbitrary.dict, | ||
array: arbitrary.array, | ||
nearray: arbitrary.nearray, | ||
map: arbitrary.map, | ||
json: arbitrary.json, | ||
fn: fn.fn, | ||
@@ -18,0 +20,0 @@ fun: fn.fn, |
/* @flow weak */ | ||
"use strict"; | ||
var arbitraryBless = require("./arbitraryBless.js"); | ||
var FMap = require("./finitemap.js"); | ||
var primitive = require("./primitive.js"); | ||
var json = require("./json.js"); | ||
var shrink = require("./shrink.js"); | ||
@@ -15,5 +16,5 @@ var utils = require("./utils.js"); | ||
function fn(arb) { | ||
arb = utils.force(arb || primitive.json); | ||
arb = utils.force(arb || json.json); | ||
return { | ||
return arbitraryBless({ | ||
generator: function (size) { | ||
@@ -41,3 +42,3 @@ var m = new FMap(); | ||
} | ||
}; | ||
}); | ||
} | ||
@@ -44,0 +45,0 @@ |
/* @flow weak */ | ||
"use strict"; | ||
var assert = require("assert"); | ||
var random = require("./random.js"); | ||
@@ -32,2 +33,3 @@ var either = require("./either.js"); | ||
var generator = this; | ||
generatorAssert(generator); | ||
return generatorBless(function (size) { | ||
@@ -41,2 +43,3 @@ return f(generator(size)); | ||
var generator = this; | ||
generatorAssert(generator); | ||
return generatorBless(function (size) { | ||
@@ -48,2 +51,8 @@ return f(generator(size))(size); | ||
function generatorAssert(generator) { | ||
assert(typeof generator === "function", "generator should be a function"); | ||
assert(typeof generator.map === "function", "generator.map should be a function"); | ||
assert(typeof generator.flatmap === "function", "generator.flatmap should be a function"); | ||
} | ||
/** | ||
@@ -63,3 +72,3 @@ - `generator.bless(f: nat -> a): generator a` | ||
- `.isomap(f: a -> generator b): generator b` | ||
- `.flatmap(f: a -> generator b): generator b` | ||
@@ -103,6 +112,11 @@ Monadic bind for generators. | ||
function generateOneof(generators) { | ||
// TODO: generator | ||
generators.forEach(function (gen) { | ||
assert(typeof gen === "function"); | ||
}); | ||
var result = generatorBless(function (size) { | ||
var idx = random(0, generators.length - 1); | ||
var arb = generators[idx]; | ||
return arb(size); | ||
var gen = generators[idx]; | ||
return gen(size); | ||
}); | ||
@@ -167,5 +181,5 @@ | ||
*/ | ||
function generateUnit() { | ||
var generateUnit = generatorBless(function () { | ||
return []; | ||
} | ||
}); | ||
@@ -221,67 +235,19 @@ /** | ||
/** | ||
- `generator.char: generator char` | ||
- `generator.dict(gen: generator a): generator (dict a)` | ||
*/ | ||
var generateChar = generatorBless(function generateChar(/* size */) { | ||
return String.fromCharCode(random(0, 0xff)); | ||
}); | ||
function generateDict(gen) { | ||
// Circular dependency :( | ||
var string = require("./string.js"); | ||
/** | ||
- `generator.string: generator string` | ||
*/ | ||
var generateString = generateArray(generateChar).map(utils.charArrayToString); | ||
var pairGen = generatePair(string.string.generator, gen); | ||
var arrayGen = generateArray(pairGen); | ||
var result = arrayGen.map(utils.pairArrayToDict); | ||
/** | ||
- `generator.nestring: generator string` | ||
*/ | ||
var generateNEString = generateNEArray(generateChar).map(utils.charArrayToString); | ||
/** | ||
- `generator.asciichar: generator char` | ||
*/ | ||
var generateAsciiChar = generatorBless(function generateAsciiChar(/* size */) { | ||
return String.fromCharCode(random(0x20, 0x7e)); | ||
}); | ||
/** | ||
- `generator.asciistring: generator string` | ||
*/ | ||
var generateAsciiString = generateArray(generateAsciiChar).map(utils.charArrayToString); | ||
/** | ||
- `generator.map(gen: generator a): generator (map a)` | ||
*/ | ||
function generateMap(gen) { | ||
var result = generatorBless(function (size) { | ||
var objsize = random(0, logsize(size)); | ||
var obj = {}; | ||
for (var i = 0; i < objsize; i++) { | ||
obj[generateString(size)] = gen(size); | ||
} | ||
return obj; | ||
}); | ||
return utils.curried2(result, arguments); | ||
} | ||
/** | ||
- `generator.json: generator json` | ||
*/ | ||
var generateInteger = generatorBless(function (size) { | ||
return random(-size, size); | ||
}); | ||
function generateJson(size) { | ||
return require("./json.js").json.generator(size); | ||
} | ||
var generateNumber = generatorBless(function (size) { | ||
return random.number(-size, size); | ||
}); | ||
var generateBool = generatorBless(function () { | ||
return random(0, 1) === 0; | ||
}); | ||
var generateJson = generatorRecursive( | ||
generateOneof([generateInteger, generateNumber, generateBool, generateString]), | ||
function (gen) { | ||
return generateOneof([generateArray(gen), generateMap(gen)]); | ||
}); | ||
module.exports = { | ||
@@ -294,8 +260,3 @@ pair: generatePair, | ||
nearray: generateNEArray, | ||
char: generateChar, | ||
string: generateString, | ||
nestring: generateNEString, | ||
asciichar: generateAsciiChar, | ||
asciistring: generateAsciiString, | ||
map: generateMap, | ||
dict: generateDict, | ||
json: generateJson, | ||
@@ -302,0 +263,0 @@ oneof: generateOneof, |
@@ -95,2 +95,3 @@ /* @flow weak */ | ||
var assert = require("assert"); | ||
var lazyseq = require("lazy-seq"); | ||
@@ -108,2 +109,3 @@ var arbitrary = require("./arbitrary.js"); | ||
var shrink = require("./shrink.js"); | ||
var string = require("./string.js"); | ||
var suchthat = require("./suchthat.js"); | ||
@@ -117,13 +119,18 @@ var typify = require("./typify.js"); | ||
function shrinkResult(gens, x, test, size, shrinks, exc, transform) { | ||
var shrinked = shrink.tuple(utils.pluck(gens, "shrink"), x); | ||
var shrinkP = shrinked.reduce(function (res, y) { | ||
function shrinkResult(arbs, x, test, size, shrinksN, exc, transform) { | ||
assert(arbs.length === x.length, "shrinkResult: arbs and x has to be of same size"); | ||
assert(typeof size === "number", "shrinkResult: size should be number"); | ||
assert(typeof shrinksN === "number", "shrinkResult: shrinkN should be number"); | ||
var shrinks = utils.pluck(arbs, "shrink"); | ||
var shows = utils.pluck(arbs, "show"); | ||
var shrinked = shrink.tuple(shrinks, x); | ||
var shrinkP = lazyseq.fold(shrinked, true, function (res, y) { | ||
return functor.map(res, function (resPrime) { | ||
if (resPrime !== true) { | ||
return resPrime; | ||
} | ||
return test(size, y, shrinks + 1); | ||
var t = test(size, resPrime, shrinksN + 1); | ||
return t !== true ? t : y(); | ||
}); | ||
}, true); | ||
}); | ||
@@ -134,4 +141,4 @@ return functor.map(shrinkP, function (shrinkPPrime) { | ||
counterexample: x, | ||
counterexamplestr: show.tuple(utils.pluck(gens, "show"), x), | ||
shrinks: shrinks, | ||
counterexamplestr: show.tuple(shows, x), | ||
shrinks: shrinksN, | ||
exc: exc, | ||
@@ -422,3 +429,2 @@ }; | ||
suchthat: suchthat.suchthat, | ||
value: primitive.json, | ||
@@ -447,2 +453,3 @@ // either | ||
/* primitives */ | ||
// TODO: refactor | ||
var k; | ||
@@ -455,2 +462,5 @@ for (k in primitive) { | ||
} | ||
for (k in string) { | ||
jsc[k] = string[k]; | ||
} | ||
@@ -457,0 +467,0 @@ module.exports = jsc; |
/* @flow weak */ | ||
"use strict"; | ||
var arbitraryBless = require("./arbitraryBless"); | ||
var assert = require("assert"); | ||
@@ -20,2 +21,3 @@ var generator = require("./generator.js"); | ||
arb.show = def.show; | ||
arb.smap = def.smap; | ||
} | ||
@@ -26,3 +28,3 @@ | ||
if (arguments.length === 2) { | ||
var arb = impl(maxsize - minsize); | ||
var arb = arbitraryBless(impl(maxsize - minsize)); | ||
var to = function to(x) { | ||
@@ -35,11 +37,7 @@ return Math.abs(x) + minsize; | ||
return { | ||
generator: arb.generator.map(to), | ||
shrink: arb.shrink.isomap(to, from), | ||
show: show.def, | ||
}; | ||
return arb.smap(to, from); | ||
} else if (arguments.length === 1) { | ||
return impl(minsize /* as minsize */); | ||
return arbitraryBless(impl(minsize /* as minsize */)); | ||
} else { | ||
return impl(); | ||
return arbitraryBless(impl()); | ||
} | ||
@@ -93,3 +91,3 @@ }; | ||
function nat(maxsize) { | ||
return { | ||
return arbitraryBless({ | ||
generator: generator.bless(function (size) { | ||
@@ -111,3 +109,3 @@ size = maxsize || size; | ||
show: show.def, | ||
}; | ||
}); | ||
} | ||
@@ -166,3 +164,3 @@ | ||
*/ | ||
var bool = { | ||
var bool = arbitraryBless({ | ||
generator: generator.bless(function (/* size */) { | ||
@@ -177,3 +175,3 @@ var i = random(0, 1); | ||
show: show.def, | ||
}; | ||
}); | ||
@@ -203,7 +201,3 @@ /** | ||
return { | ||
generator: arb.generator.map(toDate), | ||
shrink: arb.shrink.isomap(toDate, fromDate), | ||
show: show.def, | ||
}; | ||
return arb.smap(toDate, fromDate); | ||
} else { | ||
@@ -215,7 +209,7 @@ toDate = function toDate(x) { | ||
return { | ||
return arbitraryBless({ | ||
generator: arb.generator.map(toDate), | ||
shrink: shrink.noop, | ||
show: show.def, | ||
}; | ||
}); | ||
} | ||
@@ -234,3 +228,3 @@ } | ||
return { | ||
return arbitraryBless({ | ||
generator: generator.bless(function (/* size */) { | ||
@@ -250,77 +244,6 @@ var i = random(0, args.length - 1); | ||
show: show.def, | ||
}; | ||
}); | ||
} | ||
/** | ||
- `char: arbitrary char` | ||
Single character | ||
*/ | ||
var char = { | ||
generator: generator.char, | ||
shrink: shrink.noop, | ||
show: show.def, | ||
}; | ||
/** | ||
- `asciichar: arbitrary char` | ||
Single ascii character (0x20-0x7e inclusive, no DEL) | ||
*/ | ||
var asciichar = { | ||
generator: generator.asciichar, | ||
shrink: shrink.noop, | ||
show: show.def, | ||
}; | ||
/** | ||
- `string: arbitrary string` | ||
*/ | ||
function string() { | ||
return { | ||
generator: generator.string, | ||
shrink: shrink.array(char.shrink).isomap(utils.charArrayToString, utils.stringToCharArray), | ||
show: show.def, | ||
}; | ||
} | ||
extendWithDefault(string); | ||
/** | ||
- `notEmptyString: arbitrary string` | ||
Generates strings which are not empty. | ||
*/ | ||
var nestring = { | ||
generator: generator.nestring, | ||
shrink: shrink.nearray(asciichar.shrink).isomap(utils.charArrayToString, utils.stringToCharArray), | ||
show: show.def, | ||
}; | ||
/** | ||
- `asciistring: arbitrary string` | ||
*/ | ||
var asciistring = { | ||
generator: generator.asciistring, | ||
shrink: shrink.array(asciichar.shrink).isomap(utils.charArrayToString, utils.stringToCharArray), | ||
show: show.def, | ||
}; | ||
/** | ||
- `json: arbitrary json` | ||
JavaScript Objects: boolean, number, string, array of `json` values or object with `json` values. | ||
- `value: arbitrary json` | ||
*/ | ||
var json = { | ||
generator: generator.json, | ||
shrink: shrink.noop, | ||
show: function (v) { | ||
return JSON.stringify(v); | ||
}, | ||
}; | ||
/** | ||
- `falsy: arbitrary *` | ||
@@ -349,7 +272,7 @@ | ||
function constant(x) { | ||
return { | ||
return arbitraryBless({ | ||
generator: generator.constant(x), | ||
shrink: shrink.noop, | ||
show: show.def | ||
}; | ||
}); | ||
} | ||
@@ -367,7 +290,2 @@ | ||
number: number, | ||
json: json, | ||
char: char, | ||
string: string, | ||
asciichar: asciichar, | ||
asciistring: asciistring, | ||
elements: elements, | ||
@@ -377,4 +295,3 @@ bool: bool, | ||
constant: constant, | ||
nestring: nestring, | ||
datetime: datetime, | ||
}; |
@@ -6,2 +6,3 @@ /* @flow weak */ | ||
var either = require("./either.js"); | ||
var lazyseq = require("lazy-seq"); | ||
var utils = require("./utils.js"); | ||
@@ -36,5 +37,5 @@ | ||
Bless function with `.isomap` property. | ||
Bless function with `.smap` property. | ||
- `.isomap(f: a -> b, g: b -> a): shrink b` | ||
- `.smap(f: a -> b, g: b -> a): shrink b` | ||
@@ -44,3 +45,3 @@ Transform `shrink a` into `shrink b`. For example: | ||
```js | ||
positiveIntegersShrink = nat.shrink.isomap( | ||
positiveIntegersShrink = nat.shrink.smap( | ||
function (x) { return x + 1; }, | ||
@@ -51,3 +52,3 @@ function (x) { return x - 1; }); | ||
function shrinkBless(shrink) { | ||
shrink.isomap = shrinkProtoIsoMap; | ||
shrink.smap = shrinkProtoIsoMap; | ||
return shrink; | ||
@@ -80,7 +81,12 @@ } | ||
var pairB = shrinkedB.map(function (bp) { | ||
return [a, bp]; | ||
if (Array.isArray(pairA)) { | ||
pairA = lazyseq.fromArray(pairA); | ||
} | ||
return pairA.append(function () { | ||
var pairB = shrinkedB.map(function (bp) { | ||
return [a, bp]; | ||
}); | ||
return pairB; | ||
}); | ||
return pairA.concat(pairB); | ||
}); | ||
@@ -132,7 +138,7 @@ | ||
if (n + 1 === shrinks.length) { | ||
return shrinks[n].isomap(toSingleton, fromSingleton); | ||
return shrinks[n].smap(toSingleton, fromSingleton); | ||
} else { | ||
var shrinkA = shrinks[0]; | ||
var shrinkB = shrinkTupleImpl(shrinks, n + 1); | ||
return shrinkPair(shrinkA, shrinkB).isomap(toHList, fromHList); | ||
return shrinkPair(shrinkA, shrinkB).smap(toHList, fromHList); | ||
} | ||
@@ -153,4 +159,5 @@ } | ||
var result = shrinkBless(function (arr) { | ||
assert(Array.isArray(arr), "shrinkArrayImpl() expects array, got: " + arr); | ||
if (arr.length <= size) { | ||
return []; | ||
return lazyseq.nil; | ||
} else { | ||
@@ -160,6 +167,5 @@ var x = arr[0]; | ||
return [xs].concat( | ||
shrink(x).map(function (xp) { return [xp].concat(xs); }), | ||
shrinkArrayImpl(shrink, xs).map(function (xsp) { return [x].concat(xsp); }) | ||
); | ||
return lazyseq.cons(xs, lazyseq.nil) | ||
.append(shrink(x).map(function (xp) { return [xp].concat(xs); })) | ||
.append(shrinkArrayImpl(shrink, xs).map(function (xsp) { return [x].concat(xsp); })); | ||
} | ||
@@ -166,0 +172,0 @@ }); |
@@ -21,2 +21,3 @@ /* @flow weak */ | ||
var arbitrary = require("./arbitrary.js"); | ||
var array = require("./array.js"); | ||
var fn = require("./fn.js"); | ||
@@ -52,3 +53,3 @@ var typifyParser = require("typify-parser"); | ||
var arg = compileType(env, type.arg); | ||
return arbitrary.array(arg); | ||
return array.array(arg); | ||
} | ||
@@ -55,0 +56,0 @@ |
@@ -75,14 +75,18 @@ /* @flow weak */ | ||
/** | ||
- `utils.merge(x: obj, y: obj): obj` | ||
- `utils.merge(x... : obj): obj` | ||
Merge two objects, a bit like `_.extend({}, x, y)`. | ||
*/ | ||
function merge(x, y) { | ||
function merge() { | ||
var res = {}; | ||
Object.keys(x).forEach(function (k) { | ||
res[k] = x[k]; | ||
}); | ||
Object.keys(y).forEach(function (k) { | ||
res[k] = y[k]; | ||
}); | ||
for (var i = 0; i < arguments.length; i++) { | ||
var arg = arguments[i]; | ||
var keys = Object.keys(arg); | ||
for (var j = 0; j < keys.length; j++) { | ||
var key = keys[j]; | ||
res[key] = arg[key]; | ||
} | ||
} | ||
return res; | ||
@@ -117,2 +121,18 @@ } | ||
function pairArrayToDict(arrayOfPairs) { | ||
var res = {}; | ||
arrayOfPairs.forEach(function (p) { | ||
res[p[0]] = p[1]; | ||
}); | ||
return res; | ||
} | ||
function dictToPairArray(m) { | ||
var res = []; | ||
Object.keys(m).forEach(function (k) { | ||
res.push([k, m[k]]); | ||
}); | ||
return res; | ||
} | ||
module.exports = { | ||
@@ -131,2 +151,4 @@ isArray: isArray, | ||
stringToCharArray: stringToCharArray, | ||
pairArrayToDict: pairArrayToDict, | ||
dictToPairArray: dictToPairArray, | ||
}; |
{ | ||
"name": "jsverify", | ||
"description": "Property-based testing for JavaScript.", | ||
"version": "0.5.3", | ||
"version": "0.6.0-alpha.1", | ||
"homepage": "http://jsverify.github.io/", | ||
@@ -64,2 +64,3 @@ "author": { | ||
"dependencies": { | ||
"lazy-seq": "~0.1.0", | ||
"rc4": "~0.1.2", | ||
@@ -66,0 +67,0 @@ "typify-parser": "0.0.1" |
@@ -224,24 +224,2 @@ # JSVerify | ||
- `char: arbitrary char` | ||
Single character | ||
- `asciichar: arbitrary char` | ||
Single ascii character (0x20-0x7e inclusive, no DEL) | ||
- `string: arbitrary string` | ||
- `notEmptyString: arbitrary string` | ||
Generates strings which are not empty. | ||
- `asciistring: arbitrary string` | ||
- `json: arbitrary json` | ||
JavaScript Objects: boolean, number, string, array of `json` values or object with `json` values. | ||
- `value: arbitrary json` | ||
- `falsy: arbitrary *` | ||
@@ -261,6 +239,2 @@ | ||
- `array(arb: arbitrary a): arbitrary (array a)` | ||
- `nearray(arb: arbitrary a): arbitrary (array a)` | ||
- `unit: arbitrary ()` | ||
@@ -276,6 +250,14 @@ | ||
- `map(arb: arbitrary a): arbitrary (map a)` | ||
- `dict(arb: arbitrary a): arbitrary (dict a)` | ||
Generates a JavaScript object with properties of type `A`. | ||
- `array(arb: arbitrary a): arbitrary (array a)` | ||
- `nearray(arb: arbitrary a): arbitrary (array a)` | ||
- `json: arbitrary json` | ||
JavaScript Objects: boolean, number, string, array of `json` values or object with `json` values. | ||
- `oneof(gs : array (arbitrary a)...) : arbitrary a` | ||
@@ -322,3 +304,3 @@ | ||
- `.isomap(f: a -> generator b): generator b` | ||
- `.flatmap(f: a -> generator b): generator b` | ||
@@ -349,16 +331,4 @@ Monadic bind for generators. | ||
- `generator.char: generator char` | ||
- `generator.dict(gen: generator a): generator (dict a)` | ||
- `generator.string: generator string` | ||
- `generator.nestring: generator string` | ||
- `generator.asciichar: generator char` | ||
- `generator.asciistring: generator string` | ||
- `generator.map(gen: generator a): generator (map a)` | ||
- `generator.json: generator json` | ||
### Shrink functions | ||
@@ -377,5 +347,5 @@ | ||
Bless function with `.isomap` property. | ||
Bless function with `.smap` property. | ||
- `.isomap(f: a -> b, g: b -> a): shrink b` | ||
- `.smap(f: a -> b, g: b -> a): shrink b` | ||
@@ -385,3 +355,3 @@ Transform `shrink a` into `shrink b`. For example: | ||
```js | ||
positiveIntegersShrink = nat.shrink.isomap( | ||
positiveIntegersShrink = nat.shrink.smap( | ||
function (x) { return x + 1; }, | ||
@@ -478,3 +448,3 @@ function (x) { return x - 1; }); | ||
- `utils.merge(x: obj, y: obj): obj` | ||
- `utils.merge(x... : obj): obj` | ||
@@ -491,2 +461,9 @@ Merge two objects, a bit like `_.extend({}, x, y)`. | ||
- **0.6.0-alpha.1** — *2015-04-22* — Preview | ||
- Using lazy sequences for shrink results | ||
- *Breaking changes:* | ||
- `jsc.map` renamed to `jsc.dict` | ||
- `jsc.value` removed, use `jsc.json` | ||
- `jsc.string()` removed, use `jsc.string` | ||
- `shrink.isomap` renamed to `shrink.smap` | ||
- **0.5.3** — *2015-04-21* — More algebra | ||
@@ -493,0 +470,0 @@ - `unit` and `either` arbitraries |
Sorry, the diff of this file is too big to display
188393
32
5271
3
616
+ Addedlazy-seq@~0.1.0
+ Addedlazy-seq@0.1.0(transitive)