UNPKG

fast-check

Version:

Property based testing framework for JavaScript (like QuickCheck)

75 lines (74 loc) 2.3 kB
import { Shrinkable } from './Shrinkable.js'; export class Arbitrary { filter(refinement) { const arb = this; const refinementOnShrinkable = (s) => { return refinement(s.value); }; return new (class extends Arbitrary { generate(mrng) { let g = arb.generate(mrng); while (!refinementOnShrinkable(g)) { g = arb.generate(mrng); } return g.filter(refinement); } withBias(freq) { return arb.withBias(freq).filter(refinement); } })(); } map(mapper) { const arb = this; return new (class extends Arbitrary { generate(mrng) { return arb.generate(mrng).map(mapper); } withBias(freq) { return arb.withBias(freq).map(mapper); } })(); } static shrinkChain(mrng, src, dst, fmapper) { return new Shrinkable(dst.value, () => src .shrink() .map((v) => Arbitrary.shrinkChain(mrng.clone(), v, fmapper(v.value).generate(mrng.clone()), fmapper)) .join(dst.shrink())); } chain(fmapper) { const arb = this; return new (class extends Arbitrary { generate(mrng) { const clonedMrng = mrng.clone(); const src = arb.generate(mrng); const dst = fmapper(src.value).generate(mrng); return Arbitrary.shrinkChain(clonedMrng, src, dst, fmapper); } withBias(freq) { return arb.withBias(freq).chain((t) => fmapper(t).withBias(freq)); } })(); } noShrink() { const arb = this; return new (class extends Arbitrary { generate(mrng) { return new Shrinkable(arb.generate(mrng).value); } withBias(freq) { return arb.withBias(freq).noShrink(); } })(); } withBias(_freq) { return this; } noBias() { const arb = this; return new (class extends Arbitrary { generate(mrng) { return arb.generate(mrng); } })(); } }