UNPKG

1.86 kBJavaScriptView Raw
1"use strict";
2
3var assert = require("assert");
4
5var arbitraryBless = require("./arbitraryBless.js");
6var dict = require("./dict.js");
7var generator = require("./generator.js");
8var primitive = require("./primitive.js");
9var show = require("./show.js");
10var shrink = require("./shrink.js");
11var string = require("./string.js");
12var utils = require("./utils.js");
13
14var nullArb = primitive.constant(null);
15
16var generateInteger = primitive.integer.generator;
17var generateNumber = primitive.number.generator;
18var generateBool = primitive.bool.generator;
19var generateString = string.string.generator;
20var generateNull = nullArb.generator;
21
22var 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// Forward declaration
35var shrinkDictJson;
36var shrinkJson;
37
38function shrinkRecJson(json) {
39 if (Array.isArray(json)) {
40 return shrink.array(shrinkJson, json);
41 } else {
42 return shrinkDictJson(json);
43 }
44}
45
46shrinkJson = 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
61shrinkDictJson = (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
68var json = arbitraryBless({
69 generator: generateJson,
70 shrink: shrinkJson,
71 show: show.def,
72});
73
74module.exports = {
75 json: json,
76};