1 | "use strict";
|
2 |
|
3 | var assert = require("assert");
|
4 |
|
5 | var arbitraryBless = require("./arbitraryBless.js");
|
6 | var dict = require("./dict.js");
|
7 | var generator = require("./generator.js");
|
8 | var primitive = require("./primitive.js");
|
9 | var show = require("./show.js");
|
10 | var shrink = require("./shrink.js");
|
11 | var string = require("./string.js");
|
12 | var utils = require("./utils.js");
|
13 |
|
14 | var nullArb = primitive.constant(null);
|
15 |
|
16 | var generateInteger = primitive.integer.generator;
|
17 | var generateNumber = primitive.number.generator;
|
18 | var generateBool = primitive.bool.generator;
|
19 | var generateString = string.string.generator;
|
20 | var generateNull = nullArb.generator;
|
21 |
|
22 | var generateJson = generator.recursive(
|
23 | generator.oneof([
|
24 | generateInteger,
|
25 | generateNumber,
|
26 | generateBool,
|
27 | generateString,
|
28 | generateNull,
|
29 | ]),
|
30 | function (gen) {
|
31 | return generator.oneof([generator.array(gen), dict.generator(gen)]);
|
32 | });
|
33 |
|
34 |
|
35 | var shrinkDictJson;
|
36 | var shrinkJson;
|
37 |
|
38 | function shrinkRecJson(json) {
|
39 | if (Array.isArray(json)) {
|
40 | return shrink.array(shrinkJson, json);
|
41 | } else {
|
42 | return shrinkDictJson(json);
|
43 | }
|
44 | }
|
45 |
|
46 | shrinkJson = shrink.bless(function (json) {
|
47 | assert(typeof json !== "function");
|
48 |
|
49 | if (json === null) {
|
50 | return nullArb.shrink(json);
|
51 | }
|
52 |
|
53 | switch (typeof json) {
|
54 | case "boolean": return primitive.bool.shrink(json);
|
55 | case "number": return primitive.number.shrink(json);
|
56 | case "string": return string.string.shrink(json);
|
57 | default: return shrinkRecJson(json);
|
58 | }
|
59 | });
|
60 |
|
61 | shrinkDictJson = (function () {
|
62 | var pairShrink = shrink.pair(string.string.shrink, shrinkJson);
|
63 | var arrayShrink = shrink.array(pairShrink);
|
64 |
|
65 | return arrayShrink.smap(utils.pairArrayToDict, utils.dictToPairArray);
|
66 | }());
|
67 |
|
68 | var json = arbitraryBless({
|
69 | generator: generateJson,
|
70 | shrink: shrinkJson,
|
71 | show: show.def,
|
72 | });
|
73 |
|
74 | module.exports = {
|
75 | json: json,
|
76 | };
|