// Copyright (C) 2017 Mathias Bynens. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- description: | Collection of functions used to assert the correctness of RegExp objects. defines: [buildString, testPropertyEscapes, matchValidator] ---*/ function buildString({ loneCodePoints, ranges }) { const CHUNK_SIZE = 10000; let result = Reflect.apply(String.fromCodePoint, null, loneCodePoints); for (let i = 0; i < ranges.length; i++) { const range = ranges[i]; const start = range[0]; const end = range[1]; const codePoints = []; for (let length = 0, codePoint = start; codePoint <= end; codePoint++) { codePoints[length++] = codePoint; if (length === CHUNK_SIZE) { result += Reflect.apply(String.fromCodePoint, null, codePoints); codePoints.length = length = 0; } } result += Reflect.apply(String.fromCodePoint, null, codePoints); } return result; } function testPropertyEscapes(regex, string, expression) { if (!regex.test(string)) { for (const symbol of string) { const hex = symbol .codePointAt(0) .toString(16) .toUpperCase() .padStart(6, "0"); assert( regex.test(symbol), `\`${ expression }\` should match U+${ hex } (\`${ symbol }\`)` ); } } } // Returns a function that will validate RegExp match result // // Example: // // var validate = matchValidator(['b'], 1, 'abc'); // validate(/b/.exec('abc')); // function matchValidator(expectedEntries, expectedIndex, expectedInput) { return function(match) { assert.compareArray(match, expectedEntries, 'Match entries'); assert.sameValue(match.index, expectedIndex, 'Match index'); assert.sameValue(match.input, expectedInput, 'Match input'); } }