UNPKG

@sugarcube/test

Version:

Test helpers and strategies for SugarCube.

232 lines (191 loc) 6.2 kB
"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;