UNPKG

fast-check-io-ts

Version:

io-ts codec to fast-check arbitrary mapping

66 lines (65 loc) 2.64 kB
"use strict"; var __spreadArrays = (this && this.__spreadArrays) || function () { for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; return r; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getArbitrary = void 0; var fc = require("fast-check"); var Record_1 = require("fp-ts/lib/Record"); function getProps(codec) { switch (codec._tag) { case 'InterfaceType': case 'PartialType': return codec.props; case 'ExactType': return getProps(codec.type); } } var objectTypes = ['ExactType', 'InterfaceType', 'PartialType']; function getArbitrary(codec) { var type = codec; switch (type._tag) { case 'UnknownType': return fc.anything(); case 'UndefinedType': case 'VoidType': return fc.constant(undefined); case 'NullType': return fc.constant(null); case 'StringType': return fc.string(); case 'NumberType': return fc.float(); case 'BooleanType': return fc.boolean(); case 'KeyofType': return fc.oneof.apply(fc, Record_1.keys(type.keys).map(fc.constant)); case 'LiteralType': return fc.constant(type.value); case 'ArrayType': return fc.array(getArbitrary(type.type)); case 'DictionaryType': return fc.dictionary(getArbitrary(type.domain), getArbitrary(type.codomain)); case 'InterfaceType': case 'PartialType': case 'ExactType': return fc.record(Record_1.record.map(getProps(type), getArbitrary)); case 'TupleType': return fc.tuple.apply(fc, type.types.map(getArbitrary)); case 'UnionType': return fc.oneof.apply(fc, type.types.map(getArbitrary)); case 'IntersectionType': var isObjectIntersection = objectTypes.includes(type.types[0]._tag); return isObjectIntersection ? fc.tuple.apply(fc, type.types.map(function (t) { return getArbitrary(t); })).map(function (values) { return Object.assign.apply(Object, __spreadArrays([{}], values)); }) .filter(type.is) : fc.oneof.apply(fc, type.types.map(function (t) { return getArbitrary(t); })).filter(type.is); case 'RefinementType': return getArbitrary(type.type).filter(type.predicate); } } exports.getArbitrary = getArbitrary;