// Copyright 2018 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

(() => {

function Internalize(s) {
  return Object.keys({[s]:0})[0];
}

const string = Internalize('a'.repeat(100));
let pattern;
let result;

const setupString = () => pattern = '.';
const setupRegExp = () => pattern = /./g;
const setupZeroWidth = () => pattern = /(?:)/g;
const setupZeroWidthUnicode = () => pattern = /(?:)/gu;

function benchIteratorCreation() {
  result = string.matchAll(pattern);
}

function benchBuiltin() {
  for (const match of string.matchAll(pattern)) {
    result = match[0];
  }
}

function benchManualString() {
  let regexp = new RegExp(pattern, 'g');
  let match;
  while ((match = regexp.exec(string)) !== null) {
    result = match[0];
  }
}

function benchManualRegExp() {
  let match;
  while ((match = pattern.exec(string)) !== null) {
    result = match[0];
  }
}

// Iterator Creation
new BenchmarkSuite('StringMatchAllBuiltinRegExpIteratorCreation', [20], [
  new Benchmark('StringMatchAllBuiltinRegExpIteratorCreation', false, false, 0, benchIteratorCreation, setupRegExp)
]);
new BenchmarkSuite('StringMatchAllBuiltinStringIteratorCreation', [20], [
  new Benchmark('StringMatchAllBuiltinStringIteratorCreation', false, false, 0, benchIteratorCreation, setupString)
]);

// String
new BenchmarkSuite('StringMatchAllBuiltinString', [20], [
  new Benchmark('StringMatchAllBuiltinString', false, false, 0, benchBuiltin, setupString)
]);
new BenchmarkSuite('StringMatchAllManualString', [20], [
  new Benchmark('StringMatchAllManualString', false, false, 0, benchManualString, setupString)
]);

// RegExp
new BenchmarkSuite('StringMatchAllBuiltinRegExp', [20], [
  new Benchmark('StringMatchAllBuiltinRegExp', false, false, 0, benchBuiltin, setupRegExp)
]);
new BenchmarkSuite('StringMatchAllManualRegExp', [20], [
  new Benchmark('StringMatchAllManualRegExp', false, false, 0, benchManualRegExp, setupRegExp)
]);

// Zero width
new BenchmarkSuite('StringMatchAllBuiltinZeroWidth', [20], [
  new Benchmark('StringMatchAllBuiltinZeroWidth', false, false, 0, benchBuiltin, setupZeroWidth)
]);
new BenchmarkSuite('StringMatchAllBuiltinZeroWidthUnicode', [20], [
  new Benchmark('StringMatchAllBuiltinZeroWidthUnicode', false, false, 0, benchBuiltin, setupZeroWidthUnicode)
]);

})();