UNPKG

fast-check

Version:

Property based testing framework for JavaScript (like QuickCheck)

64 lines (63 loc) 3.37 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.double = double; const ArrayInt64_1 = require("./_internals/helpers/ArrayInt64"); const ArrayInt64Arbitrary_1 = require("./_internals/ArrayInt64Arbitrary"); const DoubleHelpers_1 = require("./_internals/helpers/DoubleHelpers"); const DoubleOnlyHelpers_1 = require("./_internals/helpers/DoubleOnlyHelpers"); 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 (0, DoubleHelpers_1.doubleToIndex)(d); } function unmapperDoubleToIndex(value) { if (typeof value !== 'number') throw new Error('Unsupported type'); return (0, DoubleHelpers_1.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 ? (0, ArrayInt64_1.add64)(minIndexRaw, ArrayInt64_1.Unit64) : minIndexRaw; const maxIndexRaw = safeDoubleToIndex(max, 'max'); const maxIndex = maxExcluded ? (0, ArrayInt64_1.substract64)(maxIndexRaw, ArrayInt64_1.Unit64) : maxIndexRaw; if ((0, ArrayInt64_1.isStrictlySmaller64)(maxIndex, minIndex)) { throw new Error('fc.double constraints.min must be smaller or equal to constraints.max'); } if (noNaN) { return (0, ArrayInt64Arbitrary_1.arrayInt64)(minIndex, maxIndex).map(DoubleHelpers_1.indexToDouble, unmapperDoubleToIndex); } const positiveMaxIdx = (0, ArrayInt64_1.isStrictlyPositive64)(maxIndex); const minIndexWithNaN = positiveMaxIdx ? minIndex : (0, ArrayInt64_1.substract64)(minIndex, ArrayInt64_1.Unit64); const maxIndexWithNaN = positiveMaxIdx ? (0, ArrayInt64_1.add64)(maxIndex, ArrayInt64_1.Unit64) : maxIndex; return (0, ArrayInt64Arbitrary_1.arrayInt64)(minIndexWithNaN, maxIndexWithNaN).map((index) => { if ((0, ArrayInt64_1.isStrictlySmaller64)(maxIndex, index) || (0, ArrayInt64_1.isStrictlySmaller64)(index, minIndex)) return safeNaN; else return (0, DoubleHelpers_1.indexToDouble)(index); }, (value) => { if (typeof value !== 'number') throw new Error('Unsupported type'); if (safeNumberIsNaN(value)) return !(0, ArrayInt64_1.isEqual64)(maxIndex, maxIndexWithNaN) ? maxIndexWithNaN : minIndexWithNaN; return (0, DoubleHelpers_1.doubleToIndex)(value); }); } function double(constraints = {}) { if (!constraints.noInteger) { return anyDouble(constraints); } return anyDouble((0, DoubleOnlyHelpers_1.refineConstraintsForDoubleOnly)(constraints)) .map(DoubleOnlyHelpers_1.doubleOnlyMapper, DoubleOnlyHelpers_1.doubleOnlyUnmapper) .filter(numberIsNotInteger); }