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