UNPKG

fast-check

Version:

Property based testing framework for JavaScript (like QuickCheck)

61 lines (60 loc) 2.98 kB
import { add64, isEqual64, isStrictlyPositive64, isStrictlySmaller64, substract64, Unit64, } from './_internals/helpers/ArrayInt64.js'; import { arrayInt64 } from './_internals/ArrayInt64Arbitrary.js'; import { doubleToIndex, indexToDouble } from './_internals/helpers/DoubleHelpers.js'; import { doubleOnlyMapper, doubleOnlyUnmapper, refineConstraintsForDoubleOnly, } from './_internals/helpers/DoubleOnlyHelpers.js'; const safeNumberIsInteger = Number.isInteger; const safeNumberIsNaN = Number.isNaN; const safeNegativeInfinity = Number.NEGATIVE_INFINITY; const safePositiveInfinity = Number.POSITIVE_INFINITY; const safeMaxValue = Number.MAX_VALUE; const safeNaN = Number.NaN; function safeDoubleToIndex(d, constraintsLabel) { if (safeNumberIsNaN(d)) { throw new Error('fc.double constraints.' + constraintsLabel + ' must be a 64-bit float'); } return doubleToIndex(d); } function unmapperDoubleToIndex(value) { if (typeof value !== 'number') throw new Error('Unsupported type'); return doubleToIndex(value); } function numberIsNotInteger(value) { return !safeNumberIsInteger(value); } function anyDouble(constraints) { const { noDefaultInfinity = false, noNaN = false, minExcluded = false, maxExcluded = false, min = noDefaultInfinity ? -safeMaxValue : safeNegativeInfinity, max = noDefaultInfinity ? safeMaxValue : safePositiveInfinity, } = constraints; const minIndexRaw = safeDoubleToIndex(min, 'min'); const minIndex = minExcluded ? add64(minIndexRaw, Unit64) : minIndexRaw; const maxIndexRaw = safeDoubleToIndex(max, 'max'); const maxIndex = maxExcluded ? substract64(maxIndexRaw, Unit64) : maxIndexRaw; if (isStrictlySmaller64(maxIndex, minIndex)) { throw new Error('fc.double constraints.min must be smaller or equal to constraints.max'); } if (noNaN) { return arrayInt64(minIndex, maxIndex).map(indexToDouble, unmapperDoubleToIndex); } const positiveMaxIdx = isStrictlyPositive64(maxIndex); const minIndexWithNaN = positiveMaxIdx ? minIndex : substract64(minIndex, Unit64); const maxIndexWithNaN = positiveMaxIdx ? add64(maxIndex, Unit64) : maxIndex; return arrayInt64(minIndexWithNaN, maxIndexWithNaN).map((index) => { if (isStrictlySmaller64(maxIndex, index) || isStrictlySmaller64(index, minIndex)) return safeNaN; else return indexToDouble(index); }, (value) => { if (typeof value !== 'number') throw new Error('Unsupported type'); if (safeNumberIsNaN(value)) return !isEqual64(maxIndex, maxIndexWithNaN) ? maxIndexWithNaN : minIndexWithNaN; return doubleToIndex(value); }); } export function double(constraints = {}) { if (!constraints.noInteger) { return anyDouble(constraints); } return anyDouble(refineConstraintsForDoubleOnly(constraints)) .map(doubleOnlyMapper, doubleOnlyUnmapper) .filter(numberIsNotInteger); }