| // 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'); |
| } |
| } |