1 | "use strict";
|
2 |
|
3 | var arbitraryBless = require("./arbitraryBless.js");
|
4 | var generator = require("./generator.js");
|
5 | var utils = require("./utils.js");
|
6 | var shrink = require("./shrink.js");
|
7 |
|
8 |
|
9 |
|
10 |
|
11 | function generatorRecord(spec) {
|
12 | var keys = Object.keys(spec);
|
13 | var result = generator.bless(function (size) {
|
14 | var res = {};
|
15 | keys.forEach(function (k) {
|
16 | res[k] = spec[k](size);
|
17 | });
|
18 | return res;
|
19 | });
|
20 |
|
21 | return utils.curried2(result, arguments);
|
22 | }
|
23 |
|
24 |
|
25 |
|
26 |
|
27 | function shrinkRecord(shrinksRecord) {
|
28 | var keys = Object.keys(shrinksRecord);
|
29 | var shrinks = keys.map(function (k) { return shrinksRecord[k]; });
|
30 |
|
31 | var result = shrink.bless(function (rec) {
|
32 | var values = keys.map(function (k) { return rec[k]; });
|
33 | var shrinked = shrink.tuple(shrinks, values);
|
34 |
|
35 | return shrinked.map(function (s) {
|
36 | var res = {};
|
37 | keys.forEach(function (k, i) {
|
38 | res[k] = s[i];
|
39 | });
|
40 | return res;
|
41 | });
|
42 | });
|
43 |
|
44 | return utils.curried2(result, arguments);
|
45 | }
|
46 |
|
47 | function arbitraryRecord(spec) {
|
48 | var generatorSpec = {};
|
49 | var shrinkSpec = {};
|
50 | var showSpec = {};
|
51 |
|
52 | Object.keys(spec).forEach(function (k) {
|
53 | var arb = utils.force(spec[k]);
|
54 | generatorSpec[k] = arb.generator;
|
55 | shrinkSpec[k] = arb.shrink;
|
56 | showSpec[k] = arb.show;
|
57 | });
|
58 |
|
59 | return arbitraryBless({
|
60 | generator: generatorRecord(generatorSpec),
|
61 | shrink: shrinkRecord(shrinkSpec),
|
62 | show: function (m) {
|
63 | return "{" + Object.keys(m).map(function (k) {
|
64 | return k + ": " + showSpec[k](m[k]);
|
65 | }).join(", ") + "}";
|
66 | }
|
67 | });
|
68 | }
|
69 |
|
70 | module.exports = {
|
71 | generator: generatorRecord,
|
72 | arbitrary: arbitraryRecord,
|
73 | shrink: shrinkRecord,
|
74 | };
|