72 lines
3.9 KiB
JavaScript
72 lines
3.9 KiB
JavaScript
import { Stream, stream } from '../../stream/Stream.js';
|
|
import { readConfigureGlobal } from './configuration/GlobalParameters.js';
|
|
import { QualifiedParameters } from './configuration/QualifiedParameters.js';
|
|
import { decorateProperty } from './DecorateProperty.js';
|
|
import { RunnerIterator } from './RunnerIterator.js';
|
|
import { SourceValuesIterator } from './SourceValuesIterator.js';
|
|
import { lazyToss, toss } from './Tosser.js';
|
|
import { pathWalk } from './utils/PathWalker.js';
|
|
import { asyncReportRunDetails, reportRunDetails } from './utils/RunDetailsFormatter.js';
|
|
const safeObjectAssign = Object.assign;
|
|
function runIt(property, shrink, sourceValues, verbose, interruptedAsFailure) {
|
|
const isModernProperty = property.runBeforeEach !== undefined && property.runAfterEach !== undefined;
|
|
const runner = new RunnerIterator(sourceValues, shrink, verbose, interruptedAsFailure);
|
|
for (const v of runner) {
|
|
if (isModernProperty) {
|
|
property.runBeforeEach();
|
|
}
|
|
const out = property.run(v, isModernProperty);
|
|
if (isModernProperty) {
|
|
property.runAfterEach();
|
|
}
|
|
runner.handleResult(out);
|
|
}
|
|
return runner.runExecution;
|
|
}
|
|
async function asyncRunIt(property, shrink, sourceValues, verbose, interruptedAsFailure) {
|
|
const isModernProperty = property.runBeforeEach !== undefined && property.runAfterEach !== undefined;
|
|
const runner = new RunnerIterator(sourceValues, shrink, verbose, interruptedAsFailure);
|
|
for (const v of runner) {
|
|
if (isModernProperty) {
|
|
await property.runBeforeEach();
|
|
}
|
|
const out = await property.run(v, isModernProperty);
|
|
if (isModernProperty) {
|
|
await property.runAfterEach();
|
|
}
|
|
runner.handleResult(out);
|
|
}
|
|
return runner.runExecution;
|
|
}
|
|
function check(rawProperty, params) {
|
|
if (rawProperty == null || rawProperty.generate == null)
|
|
throw new Error('Invalid property encountered, please use a valid property');
|
|
if (rawProperty.run == null)
|
|
throw new Error('Invalid property encountered, please use a valid property not an arbitrary');
|
|
const qParams = QualifiedParameters.read(safeObjectAssign(safeObjectAssign({}, readConfigureGlobal()), params));
|
|
if (qParams.reporter !== null && qParams.asyncReporter !== null)
|
|
throw new Error('Invalid parameters encountered, reporter and asyncReporter cannot be specified together');
|
|
if (qParams.asyncReporter !== null && !rawProperty.isAsync())
|
|
throw new Error('Invalid parameters encountered, only asyncProperty can be used when asyncReporter specified');
|
|
const property = decorateProperty(rawProperty, qParams);
|
|
const maxInitialIterations = qParams.path.length === 0 || qParams.path.indexOf(':') === -1 ? qParams.numRuns : -1;
|
|
const maxSkips = qParams.numRuns * qParams.maxSkipsPerRun;
|
|
const shrink = (...args) => property.shrink(...args);
|
|
const initialValues = qParams.path.length === 0
|
|
? toss(property, qParams.seed, qParams.randomType, qParams.examples)
|
|
: pathWalk(qParams.path, stream(lazyToss(property, qParams.seed, qParams.randomType, qParams.examples)), shrink);
|
|
const sourceValues = new SourceValuesIterator(initialValues, maxInitialIterations, maxSkips);
|
|
const finalShrink = !qParams.endOnFailure ? shrink : Stream.nil;
|
|
return property.isAsync()
|
|
? asyncRunIt(property, finalShrink, sourceValues, qParams.verbose, qParams.markInterruptAsFailure).then((e) => e.toRunDetails(qParams.seed, qParams.path, maxSkips, qParams))
|
|
: runIt(property, finalShrink, sourceValues, qParams.verbose, qParams.markInterruptAsFailure).toRunDetails(qParams.seed, qParams.path, maxSkips, qParams);
|
|
}
|
|
function assert(property, params) {
|
|
const out = check(property, params);
|
|
if (property.isAsync())
|
|
return out.then(asyncReportRunDetails);
|
|
else
|
|
reportRunDetails(out);
|
|
}
|
|
export { check, assert };
|