Comparing version 0.4.0-alpha7 to 0.4.0-alpha8
"use strict"; | ||
var assert = require("assert"); | ||
var arbitrary = require("./arbitrary.js"); | ||
@@ -8,2 +9,4 @@ var shrink = require("./shrink.js"); | ||
var generator = require("./generator.js"); | ||
var utils = require("./utils.js"); | ||
var random = require("./random.js"); | ||
@@ -93,2 +96,36 @@ /** | ||
/** | ||
#### oneof (gs : array (generator any)...) : generator any | ||
Randomly uses one of the given generators. | ||
*/ | ||
function oneof() { | ||
assert(arguments.length !== 0, "oneof: at least one parameter expected"); | ||
// TODO: write this in more functional way | ||
var arbs = []; | ||
var append = function (a) { | ||
arbs.push(generator.force(a).arbitrary); | ||
}; | ||
for (var i = 0; i < arguments.length; i++) { | ||
var arg = arguments[i]; | ||
if (utils.isArray(arg)) { | ||
arg.forEach(append); | ||
} else { | ||
append(arg); | ||
} | ||
} | ||
return { | ||
arbitrary: function (size) { | ||
var idx = random(0, arbs.length - 1); | ||
var arb = arbs[idx]; | ||
return arb(size); | ||
}, | ||
// TODO: make shrink | ||
shrink: shrink.noop, | ||
show: show.def, | ||
}; | ||
} | ||
/** | ||
#### record (spec : {a: generator...}) : generator (record {a: generator...}) | ||
@@ -112,4 +149,10 @@ | ||
}, | ||
// TODO: implement shrink for record (~ equivalent to tuple shrink) | ||
shrink: shrink.noop, | ||
shrink: function (value) { | ||
// TODO: use mapValues | ||
var shrinkSpec = {}; | ||
Object.keys(forcedSpec).forEach(function (k) { | ||
shrinkSpec[k] = forcedSpec[k].shrink; | ||
}); | ||
return shrink.record(shrinkSpec, value); | ||
}, | ||
show: function (m) { | ||
@@ -127,3 +170,4 @@ return "{" + Object.keys(m).map(function (k) { | ||
map: map, | ||
oneof: oneof, | ||
record: record, | ||
}; |
/** | ||
# JSVerify | ||
<img src="https://raw.githubusercontent.com/phadej/jsverify/master/jsverify-300.png" align="right" height="100" /> | ||
> Property based checking. | ||
@@ -317,2 +319,3 @@ | ||
map: composite.map, | ||
oneof: composite.oneof, | ||
record: composite.record, | ||
@@ -324,2 +327,7 @@ fn: fn.fn, | ||
// compile | ||
compile: function (str) { | ||
return typify.parseTypify(environment, str); | ||
}, | ||
// internal utility lib | ||
@@ -326,0 +334,0 @@ _: { |
@@ -8,4 +8,2 @@ "use strict"; | ||
var show = require("./show.js"); | ||
var generator = require("./generator.js"); | ||
var utils = require("./utils.js"); | ||
@@ -133,37 +131,2 @@ /** | ||
/** | ||
#### oneof (gs : array (generator any)...) : generator any | ||
Randomly uses one of the given generators. | ||
*/ | ||
// TODO: move to composite | ||
function oneof() { | ||
assert(arguments.length !== 0, "oneof: at least one parameter expected"); | ||
// TODO: write this in more functional way | ||
var arbs = []; | ||
var append = function (a) { | ||
arbs.push(generator.force(a).arbitrary); | ||
}; | ||
for (var i = 0; i < arguments.length; i++) { | ||
var arg = arguments[i]; | ||
if (utils.isArray(arg)) { | ||
arg.forEach(append); | ||
} else { | ||
append(arg); | ||
} | ||
} | ||
return { | ||
arbitrary: function (size) { | ||
var idx = random(0, arbs.length - 1); | ||
var arb = arbs[idx]; | ||
return arb(size); | ||
}, | ||
// TODO: make shrink | ||
shrink: shrink.noop, | ||
show: show.def, | ||
}; | ||
} | ||
/** | ||
#### char : generator char | ||
@@ -282,4 +245,3 @@ | ||
elements: elements, | ||
oneof: oneof, | ||
bool: bool, | ||
}; |
@@ -29,2 +29,18 @@ "use strict"; | ||
function shrinkRecord(shrinksRecord, record) { | ||
var keys = Object.keys(record); | ||
var values = keys.map(function (k) { return record[k]; }); | ||
var shrinks = keys.map(function (k) { return shrinksRecord[k]; }); | ||
var shrinked = shrinkTuple(shrinks, values); | ||
return shrinked.map(function (s) { | ||
var result = {}; | ||
keys.forEach(function (k, i) { | ||
result[k] = s[i]; | ||
}); | ||
return result; | ||
}); | ||
} | ||
function shrinkArray(shrink, arr) { | ||
@@ -48,2 +64,3 @@ if (arr.length === 0) { | ||
array: shrinkArray, | ||
record: shrinkRecord, | ||
}; |
@@ -53,2 +53,16 @@ "use strict"; | ||
function compileDisjunction(env, type) { | ||
var args = compileTypeArray(env, type.args); | ||
return composite.oneof(args); | ||
} | ||
function compileRecord(env, type) { | ||
// TODO: use mapValues | ||
var spec = {}; | ||
Object.keys(type.fields).forEach(function (key) { | ||
spec[key] = compileType(env, type.fields[key]); | ||
}); | ||
return composite.record(spec); | ||
} | ||
compileType = function compileType(env, type) { | ||
@@ -60,2 +74,4 @@ switch (type.type) { | ||
case "brackets": return compileBrackets(env, type); | ||
case "disjunction": return compileDisjunction(env, type); | ||
case "record": return compileRecord(env, type); | ||
default: throw new Error("Unsupported typify ast type: " + type.type); | ||
@@ -62,0 +78,0 @@ } |
{ | ||
"name": "jsverify", | ||
"description": "Property-based testing for JavaScript.", | ||
"version": "0.4.0-alpha7", | ||
"version": "0.4.0-alpha8", | ||
"homepage": "https://github.com/phadej/jsverify", | ||
@@ -6,0 +6,0 @@ "author": { |
# JSVerify | ||
<img src="https://raw.githubusercontent.com/phadej/jsverify/master/jsverify-300.png" align="right" height="100" /> | ||
> Property based checking. | ||
@@ -159,7 +161,2 @@ | ||
#### oneof (gs : array (generator any)...) : generator any | ||
Randomly uses one of the given generators. | ||
#### char : generator char | ||
@@ -202,2 +199,7 @@ | ||
#### oneof (gs : array (generator any)...) : generator any | ||
Randomly uses one of the given generators. | ||
#### record (spec : {a: generator...}) : generator (record {a: generator...}) | ||
@@ -290,2 +292,5 @@ | ||
- 0.4.0-alpha8 oneof & record -dsl support | ||
- also `jsc.compile` | ||
- record is shrinkable! | ||
- 0.4.0-alpha7 oneof & record | ||
@@ -292,0 +297,0 @@ - *oneof* and *record* generator combinators ([@fson](https://github.com/fson)) |
117585
22
3389
385