@fast-check/jest
Version:
Property based testing for Jest based on fast-check
64 lines (63 loc) • 2.6 kB
JavaScript
import { readConfigureGlobal } from 'fast-check';
function wrapProp(prop) {
return (...args) => Promise.resolve(prop(...args));
}
export function buildTestWithPropRunner(testFn, label, arbitraries, prop, params, timeout, jest, fc) {
const customParams = { ...params };
if (customParams.seed === undefined) {
const seedFromGlobals = readConfigureGlobal().seed;
if (seedFromGlobals !== undefined) {
customParams.seed = seedFromGlobals;
}
else {
const seedFromJest = typeof jest.getSeed === 'function' ? jest.getSeed() : undefined;
if (seedFromJest !== undefined) {
customParams.seed = seedFromJest;
}
else {
customParams.seed = Date.now() ^ (Math.random() * 0x100000000);
}
}
}
if (customParams.interruptAfterTimeLimit === undefined) {
customParams.interruptAfterTimeLimit = fc.readConfigureGlobal().interruptAfterTimeLimit;
}
const jestTimeout = timeout !== undefined ? timeout : extractJestGlobalTimeout();
if (jestTimeout !== undefined) {
if (customParams.interruptAfterTimeLimit === undefined) {
customParams.interruptAfterTimeLimit = jestTimeout;
}
else {
customParams.interruptAfterTimeLimit = Math.min(customParams.interruptAfterTimeLimit, jestTimeout);
}
}
else {
console.warn('Unable to get back timeout of Jest, falling back onto Jest for global timeout handling');
}
const promiseProp = wrapProp(prop);
const propertyInstance = fc.asyncProperty(...arbitraries, promiseProp);
testFn(`${label} (with seed=${customParams.seed})`, async () => {
await fc.assert(propertyInstance, customParams);
}, jestTimeout !== undefined
? 0x7fffffff
: undefined);
}
function extractJestGlobalTimeout() {
const jestTimeout = globalThis[Symbol.for('TEST_TIMEOUT_SYMBOL')];
if (typeof jestTimeout === 'number') {
return jestTimeout;
}
const stateSymbolStringValue = String(Symbol('JEST_STATE_SYMBOL'));
for (const key of Object.getOwnPropertySymbols(globalThis)) {
if (String(key) === stateSymbolStringValue) {
const jestState = globalThis[key];
if (jestState !== null && typeof jestState === 'object' && typeof jestState.testTimeout === 'number') {
return jestState.testTimeout;
}
}
}
if (typeof jasmine !== 'undefined') {
return jasmine.DEFAULT_TIMEOUT_INTERVAL;
}
return undefined;
}