2018-06-25 16:30:11 +02:00
|
|
|
// Copyright (C) 2017 Mathias Bynens. All rights reserved.
|
2017-07-14 17:37:24 +02:00
|
|
|
// 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.
|
2019-09-25 02:22:26 +02:00
|
|
|
defines: [buildString, testPropertyEscapes, matchValidator]
|
2017-07-14 17:37:24 +02:00
|
|
|
---*/
|
|
|
|
|
2021-05-29 01:47:36 +02:00
|
|
|
function buildString(args) {
|
|
|
|
// Use member expressions rather than destructuring `args` for improved
|
|
|
|
// compatibility with engines that only implement assignment patterns
|
|
|
|
// partially or not at all.
|
|
|
|
const loneCodePoints = args.loneCodePoints;
|
|
|
|
const ranges = args.ranges;
|
2017-04-13 17:22:49 +02:00
|
|
|
const CHUNK_SIZE = 10000;
|
2018-08-17 16:48:42 +02:00
|
|
|
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];
|
2017-04-13 17:22:49 +02:00
|
|
|
const codePoints = [];
|
|
|
|
for (let length = 0, codePoint = start; codePoint <= end; codePoint++) {
|
|
|
|
codePoints[length++] = codePoint;
|
|
|
|
if (length === CHUNK_SIZE) {
|
2018-08-17 16:48:42 +02:00
|
|
|
result += Reflect.apply(String.fromCodePoint, null, codePoints);
|
2017-04-13 17:22:49 +02:00
|
|
|
codePoints.length = length = 0;
|
|
|
|
}
|
|
|
|
}
|
2018-08-17 16:48:42 +02:00
|
|
|
result += Reflect.apply(String.fromCodePoint, null, codePoints);
|
2017-04-13 17:22:49 +02:00
|
|
|
}
|
|
|
|
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 }\`)`
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-03-18 04:48:31 +01:00
|
|
|
|
|
|
|
// 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');
|
|
|
|
}
|
|
|
|
}
|