// Copyright 2016 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 benchName(bench, setup) {
  var name = bench.name;
  if (setup) name += "/" + setup.name;
  return name;
}

function slowBenchName(bench, setup) {
  return benchName(bench, setup) + " (Slow)";
}

function slow(setupFunction) {
  return () => {
    setupFunction();
    // Trigger RegExp slow paths.
    const regExpExec = re.exec;
    re.exec = (str) => regExpExec.call(re, str);
  };
}

function createHaystack() {
  let s = "abCdefgz";
  for (let i = 0; i < 3; i++) s += s;
  return s;
}

function createBenchmarkSuite(name) {
  return new BenchmarkSuite(
    name, [1000],
    benchmarks.map(([bench, setup]) =>
        new Benchmark(benchName(bench, setup), false, false, 100000, bench,
                      setup)));
}

function createSlowBenchmarkSuite(name) {
  return new BenchmarkSuite(
    "Slow" + name, [1000],
    benchmarks.map(([bench, setup]) =>
        new Benchmark(slowBenchName(bench, setup), false, false, 0, bench,
                      slow(setup))));
}
