Use whenever the task mentions property-based, generative or invariant tests in JavaScript or TypeScript (fast-check): fc.assert and fc.property, arbitraries and composite inputs, map, chain and filter, shrinking and seeds, with Jest, Vitest or Mocha. Has a worked example to start from.
95%
Does it follow best practices?
Impact
94%
0.96xAverage score across 3 eval scenarios
Passed
No findings from the security scan
Advanced fast-check for concurrent and stateful systems.
Per fast-check-overview: "Race condition detection for async code."
import { test } from 'vitest';
import fc from 'fast-check';
test('concurrent counter increments are atomic', async () => {
await fc.assert(
fc.asyncProperty(fc.scheduler(), async (s) => {
const counter = new AsyncCounter();
const tasks = [
s.schedule(counter.increment()),
s.schedule(counter.increment()),
s.schedule(counter.increment()),
];
await s.waitAll();
await Promise.all(tasks);
expect(counter.value).toBe(3);
})
);
});fc.scheduler exhaustively explores task interleavings; s.schedule
queues an async operation; s.waitAll() advances. fast-check finds
interleavings that cause the property to fail - the canonical
race-condition catcher.
Per fast-check-overview: "Model-based testing for stateful systems."
class CounterModel {
count = 0;
increment() { this.count++; }
decrement() { this.count--; }
}
const allCommands = [
fc.constant({ run: (c, real) => { c.increment(); real.increment(); expect(real.value).toBe(c.count); } }),
fc.constant({ run: (c, real) => { c.decrement(); real.decrement(); expect(real.value).toBe(c.count); } }),
];
it('counter behaves per model', () => {
fc.assert(
fc.property(fc.commands(allCommands), (cmds) => {
const model = new CounterModel();
const real = new RealCounter();
fc.modelRun(() => ({ model, real }), cmds);
})
);
});fast-check generates random sequences of commands; the model stays in sync with the real implementation; any divergence is a bug in the real implementation.