@sugarcube/test
Version:
Test helpers and strategies for SugarCube.
232 lines (191 loc) • 6.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.envelope = exports.envelopeArb = exports.data = exports.dataArb = exports.unit = exports.unitArb = exports.queries = exports.queriesArb = exports.queryArb = exports.lists = exports.listsArb = exports.listArb = exports.objArb = exports.keyArb = exports.isValidValue = exports.isValidKey = void 0;
var _fp = require("lodash/fp");
var _jsverify = require("jsverify");
var _core = require("@sugarcube/core");
const trueOrFalse = () => (0, _jsverify.random)(0, 1) === 0;
const isNonEmpty = s => {
if (s === "") return false;
return true;
};
const isValidUnicode = s => {
// Forbid unicode control characters, spaces and line tabulations.
// eslint-disable-next-line no-control-regex
if (/[\u0000-\u0020]/u.test(s)) return false;
if (/[\u007F-\u00A0]/u.test(s)) return false;
return true;
};
const isValidForm = s => {
// Keys don't start with white space
if (/^\s+/.test(s)) return false; // Keys don't end with white space
if (/\s+$/.test(s)) return false; // Disallow certain keys
if (/^-+|_+|\$+/.test(s)) return false;
return true;
};
const isValidKey = (0, _fp.overEvery)([isNonEmpty, isValidUnicode, isValidForm]);
exports.isValidKey = isValidKey;
const isValidValue = (0, _fp.overEvery)([isNonEmpty, isValidUnicode]);
exports.isValidValue = isValidValue;
const keyArb = (0, _jsverify.suchthat)(_jsverify.nestring, isValidKey);
exports.keyArb = keyArb;
const objArb = (0, _jsverify.suchthat)((0, _jsverify.dict)(_jsverify.nestring), o => Object.keys(o).reduce((memo, k) => {
if (!memo) return memo;
return isValidKey(k) && isValidValue(o[k]);
}, true));
exports.objArb = objArb;
const generate = (arb, len) => {
const l = len || (0, _jsverify.random)(0, 5);
let xs = [];
while (xs.length < l) {
xs = (0, _fp.concat)(xs, arb.generator(l));
}
return (0, _fp.take)(l, xs);
};
const randomSpec = () => {
switch ((0, _jsverify.random)(0, 5)) {
case 0:
{
return {
[keyArb.generator(2)]: objArb
};
}
case 1:
{
return {
[keyArb.generator(2)]: (0, _jsverify.array)(_jsverify.string)
};
}
case 2:
{
return {
[keyArb.generator(2)]: (0, _jsverify.record)(randomSpec())
};
}
default:
{
return {
[keyArb.generator(2)]: _jsverify.string
};
}
}
};
const type = (0, _jsverify.elements)(["type1", "type2", "type3"]);
const term = _jsverify.nestring;
/**
* An arbitrary that can be used in `jsverify` based property tests.
* It produces a single object that resembles a list.
*/
const listArb = (0, _jsverify.record)((0, _fp.merge)({
type,
term
}, randomSpec()));
/**
* An arbitrary that can be used in `jsverify` based property tests.
* It produces an array of objects, where each object is a list.
*/
exports.listArb = listArb;
const listsArb = (0, _jsverify.array)(listArb).smap(_core.queries.uniq, _fp.identity);
/**
* Randonly generate a list of lists.
* @param {number} size The number of lists to generate.
* @returns {Array.<Object>} A list of list objects.
*/
exports.listsArb = listsArb;
const lists = size => generate(listsArb, size);
/**
* An arbitrary that can be used in `jsverify` based property tests.
* It produces a single object that resembles a query.
*/
exports.lists = lists;
const queryArb = listArb;
/**
* An arbitrary that can be used in `jsverify` based property tests.
* It produces an array of objects, where each object is a list.
*/
exports.queryArb = queryArb;
const queriesArb = listsArb;
/**
* Randonly generate a list of queries.
* @param {number} size The number of queries to generate.
* @returns {Array.<Object>} A list of queries.
*/
exports.queriesArb = queriesArb;
const queries = size => generate(queriesArb, size);
exports.queries = queries;
const dataUnitSpec = {
field1: _jsverify.nestring,
field2: _jsverify.nestring,
_sc_id_fields: (0, _jsverify.constant)(["field1", "field2"]),
_sc_media: listsArb,
_sc_relations: listsArb,
_sc_downloads: listsArb,
_sc_queries: listsArb,
_sc_locations: listsArb,
_sc_annotations: listsArb,
_sc_markers: (0, _jsverify.array)(_jsverify.string)
};
/**
* An arbitrary that can be used in `jsverify` based property tests.
* It produces a single object that resembles a unit of data.
*/
const unitArb = (0, _jsverify.record)((0, _fp.merge)(dataUnitSpec, randomSpec()));
/**
* Randomly generate a single unit of data.
* @returns {Object} A unit of data.
*/
exports.unitArb = unitArb;
const unit = () => unitArb.generator((0, _jsverify.random)(0, 5));
/**
* An arbitrary that can be used in `jsverify` based property tests.
* It produces an array of objects, where each object is a unit of data.
*/
exports.unit = unit;
const dataArb = (0, _jsverify.array)(unitArb).smap(_core.data.uniq, _fp.identity).smap((0, _fp.map)(x => trueOrFalse() ? (0, _fp.merge)(x, {
_sc_id_hash: _core.data.dataId(x)
}) : x), _fp.identity);
/**
* Randonly generate units of data..
* @param {number} size The number of data units to generate.
* @returns {Array.<Object>} A list of data units.
*/
exports.dataArb = dataArb;
const data = size => generate(dataArb, size);
/**
* An arbitrary that can be used in `jsverify` based property tests.
* It produces an object that is an envelope..
*/
exports.data = data;
const envelopeArb = (0, _jsverify.record)({
data: dataArb,
queries: queriesArb
});
/**
* Randomly generate a envelope with data and queries.
* @param {number} sizeData The number of data units in the envelope.
* @param {number} sizeQueries The number of queries in the envelope.
* @returns {Object} A unit of data.
*/
exports.envelopeArb = envelopeArb;
const envelope = (sizeData, sizeQueries) => ({
data: data(sizeData || (0, _jsverify.random)(0, 5)),
queries: queries(sizeQueries || (0, _jsverify.random)(0, 5))
});
exports.envelope = envelope;
var _default = {
objArb,
queriesArb,
queries,
listArb,
listsArb,
lists,
unitArb,
unit,
dataArb,
data,
envelopeArb,
envelope
};
exports.default = _default;