// Copyright 2014 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.

new BenchmarkSuite('StringRepeat', [10], [
  new Benchmark('StringRepeat', false, false, 0,
    Repeat, RepeatSetup, RepeatTearDown),
]);

new BenchmarkSuite('StringStartsWith', [10], [
  new Benchmark('StringStartsWith', false, false, 0,
    StartsWith, WithSetup, WithTearDown),
]);

new BenchmarkSuite('StringEndsWith', [10], [
  new Benchmark('StringEndsWith', false, false, 0,
    EndsWith, WithSetup, WithTearDown),
]);

new BenchmarkSuite('StringIncludes', [10], [
  new Benchmark('StringIncludes', false, false, 0,
    Includes, IncludesSetup, WithTearDown),
]);

new BenchmarkSuite('StringFromCodePoint', [10000], [
  new Benchmark('StringFromCodePoint', false, false, 0,
    FromCodePoint, FromCodePointSetup, FromCodePointTearDown),
]);

new BenchmarkSuite('StringCodePointAt', [1000], [
  new Benchmark('StringCodePointAt', false, false, 0,
    CodePointAt, CodePointAtSetup, CodePointAtTearDown),
]);

new BenchmarkSuite('StringCodePointAtSum', [100000], [
  new Benchmark('StringCodePointAtSum', false, true, 3,
    CodePointAtSum, CodePointAtSumSetup),
]);


var result;

var stringRepeatSource = "abc";

function RepeatSetup() {
  result = undefined;
}

function Repeat() {
  result = stringRepeatSource.repeat(500);
}

function RepeatTearDown() {
  var expected = "";
  for (var i = 0; i < 1000; i++) {
    expected += stringRepeatSource;
  }
  return result === expected;
}


var str;
var substr;

function WithSetup() {
  str = "abc".repeat(500);
  substr = "abc".repeat(200);
  result = undefined;
}

function WithTearDown() {
  return !!result;
}

function StartsWith() {
  result = str.startsWith(substr);
}

function EndsWith() {
  result = str.endsWith(substr);
}

function IncludesSetup() {
  str = "def".repeat(100) + "abc".repeat(100) + "qqq".repeat(100);
  substr = "abc".repeat(100);
}

function Includes() {
  result = str.includes(substr);
}

var MAX_CODE_POINT = 0xFFFFF;
const K = 1024;

function FromCodePointSetup() {
  result = new Array((MAX_CODE_POINT + 1) / K);
}

function FromCodePoint() {
  for (var i = 0; i <= MAX_CODE_POINT; i += K) {
    result[i] = String.fromCodePoint(i);
  }
}

function FromCodePointTearDown() {
  for (var i = 0; i <= MAX_CODE_POINT; i += K) {
    if (i !== result[i].codePointAt(0)) return false;
  }
  return true;
}


var allCodePoints;

function CodePointAtSetup() {
  allCodePoints = new Array((MAX_CODE_POINT + 1) / K);
  for (var i = 0; i <= MAX_CODE_POINT; i += K) {
    allCodePoints = String.fromCodePoint(i);
  }
  result = undefined;
}

function CodePointAt() {
  result = 0;
  for (var i = 0; i <= MAX_CODE_POINT; i += K) {
    result += allCodePoints.codePointAt(i);
  }
}

function CodePointAtTearDown() {
  return result === (MAX_CODE_POINT / K) * ((MAX_CODE_POINT / K) + 1) / 2;
}

var payload;

function CodePointAtSumSetup() {
  payload = "abcdefghijklmnopqrstuvwxyz";
  for(var j = 0; j < 16; ++j) payload += payload;
}

function CodePointAtSum() {
  var c = 0;
  for(j=payload.length-1; j >=0; --j) c+=payload.charCodeAt(j);
  return c;
}