UNPKG

@fast-check/jest

Version:

Property based testing for Jest based on fast-check

64 lines (63 loc) 2.6 kB
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; }