UNPKG

1.8 kBJavaScriptView Raw
1"use strict";
2
3var arbitraryBless = require("./arbitraryBless.js");
4var generator = require("./generator.js");
5var utils = require("./utils.js");
6var shrink = require("./shrink.js");
7
8/**
9 - `generator.record(gen: { key: generator a... }): generator { key: a... }`
10*/
11function 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 - `shrink.record(shrs: { key: shrink a... }): shrink { key: a... }`
26*/
27function 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
47function 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
70module.exports = {
71 generator: generatorRecord,
72 arbitrary: arbitraryRecord,
73 shrink: shrinkRecord,
74};