UNPKG

fast-check

Version:

Property based testing framework for JavaScript (like QuickCheck)

57 lines (56 loc) 2.83 kB
import { array } from './array.js'; import { getOrCreateLowerAlphaArbitrary, getOrCreateLowerAlphaNumericArbitrary, } from './_internals/builders/CharacterRangeArbitraryBuilder.js'; import { option } from './option.js'; import { string } from './string.js'; import { tuple } from './tuple.js'; import { filterInvalidSubdomainLabel } from './_internals/helpers/InvalidSubdomainLabelFiIter.js'; import { resolveSize, relativeSizeToSize } from './_internals/helpers/MaxLengthFromMinLength.js'; import { adapter } from './_internals/AdapterArbitrary.js'; import { safeJoin, safeSlice, safeSplit, safeSubstring } from '../utils/globals.js'; function toSubdomainLabelMapper([f, d]) { return d === null ? f : `${f}${d[0]}${d[1]}`; } function toSubdomainLabelUnmapper(value) { if (typeof value !== 'string' || value.length === 0) { throw new Error('Unsupported'); } if (value.length === 1) { return [value[0], null]; } return [value[0], [safeSubstring(value, 1, value.length - 1), value[value.length - 1]]]; } function subdomainLabel(size) { const alphaNumericArb = getOrCreateLowerAlphaNumericArbitrary(''); const alphaNumericHyphenArb = getOrCreateLowerAlphaNumericArbitrary('-'); return tuple(alphaNumericArb, option(tuple(string({ unit: alphaNumericHyphenArb, size, maxLength: 61 }), alphaNumericArb))) .map(toSubdomainLabelMapper, toSubdomainLabelUnmapper) .filter(filterInvalidSubdomainLabel); } function labelsMapper(elements) { return `${safeJoin(elements[0], '.')}.${elements[1]}`; } function labelsUnmapper(value) { if (typeof value !== 'string') { throw new Error('Unsupported type'); } const lastDotIndex = value.lastIndexOf('.'); return [safeSplit(safeSubstring(value, 0, lastDotIndex), '.'), safeSubstring(value, lastDotIndex + 1)]; } function labelsAdapter(labels) { const [subDomains, suffix] = labels; let lengthNotIncludingIndex = suffix.length; for (let index = 0; index !== subDomains.length; ++index) { lengthNotIncludingIndex += 1 + subDomains[index].length; if (lengthNotIncludingIndex > 255) { return { adapted: true, value: [safeSlice(subDomains, 0, index), suffix] }; } } return { adapted: false, value: labels }; } export function domain(constraints = {}) { const resolvedSize = resolveSize(constraints.size); const resolvedSizeMinusOne = relativeSizeToSize('-1', resolvedSize); const lowerAlphaArb = getOrCreateLowerAlphaArbitrary(); const publicSuffixArb = string({ unit: lowerAlphaArb, minLength: 2, maxLength: 63, size: resolvedSizeMinusOne }); return (adapter(tuple(array(subdomainLabel(resolvedSize), { size: resolvedSizeMinusOne, minLength: 1, maxLength: 127 }), publicSuffixArb), labelsAdapter).map(labelsMapper, labelsUnmapper)); }