UNPKG

fast-check

Version:

Property based testing framework for JavaScript (like QuickCheck)

44 lines (43 loc) 1.92 kB
import { Arbitrary } from '../../check/arbitrary/definition/Arbitrary.js'; import { Value } from '../../check/arbitrary/definition/Value.js'; import { cloneMethod } from '../../check/symbols.js'; import { Stream } from '../../stream/Stream.js'; import { safeJoin, safePush } from '../../utils/globals.js'; import { asyncStringify, asyncToStringMethod, stringify, toStringMethod } from '../../utils/stringify.js'; const safeObjectDefineProperties = Object.defineProperties; function prettyPrint(seenValuesStrings) { return `Stream(${safeJoin(seenValuesStrings, ',')}…)`; } export class StreamArbitrary extends Arbitrary { constructor(arb) { super(); this.arb = arb; } generate(mrng, biasFactor) { const appliedBiasFactor = biasFactor !== undefined && mrng.nextInt(1, biasFactor) === 1 ? biasFactor : undefined; const enrichedProducer = () => { const seenValues = []; const g = function* (arb, clonedMrng) { while (true) { const value = arb.generate(clonedMrng, appliedBiasFactor).value; safePush(seenValues, value); yield value; } }; const s = new Stream(g(this.arb, mrng.clone())); return safeObjectDefineProperties(s, { toString: { value: () => prettyPrint(seenValues.map(stringify)) }, [toStringMethod]: { value: () => prettyPrint(seenValues.map(stringify)) }, [asyncToStringMethod]: { value: async () => prettyPrint(await Promise.all(seenValues.map(asyncStringify))) }, [cloneMethod]: { value: enrichedProducer, enumerable: true }, }); }; return new Value(enrichedProducer(), undefined); } canShrinkWithoutContext(value) { return false; } shrink(_value, _context) { return Stream.nil(); } }