fast-check-io-ts
Version:
io-ts codec to fast-check arbitrary mapping
66 lines (65 loc) • 2.64 kB
JavaScript
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;
;