fast-check
Version:
Property based testing framework for JavaScript (like QuickCheck)
38 lines (37 loc) • 1.4 kB
JavaScript
import { Arbitrary } from './definition/Arbitrary.js';
import { Shrinkable } from './definition/Shrinkable.js';
import { nat } from './IntegerArbitrary.js';
class OptionArbitrary extends Arbitrary {
constructor(arb, frequency, nil) {
super();
this.arb = arb;
this.frequency = frequency;
this.nil = nil;
this.isOptionArb = nat(frequency);
}
static extendedShrinkable(s, nil) {
function* g() {
yield new Shrinkable(nil);
}
return new Shrinkable(s.value_, () => s
.shrink()
.map((v) => OptionArbitrary.extendedShrinkable(v, nil))
.join(g()));
}
generate(mrng) {
return this.isOptionArb.generate(mrng).value === 0
? new Shrinkable(this.nil)
: OptionArbitrary.extendedShrinkable(this.arb.generate(mrng), this.nil);
}
withBias(freq) {
return new OptionArbitrary(this.arb.withBias(freq), this.frequency, this.nil);
}
}
function option(arb, constraints) {
if (!constraints)
return new OptionArbitrary(arb, 5, null);
if (typeof constraints === 'number')
return new OptionArbitrary(arb, constraints, null);
return new OptionArbitrary(arb, constraints.freq == null ? 5 : constraints.freq, Object.prototype.hasOwnProperty.call(constraints, 'nil') ? constraints.nil : null);
}
export { option };