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

const input = {
  a: 1,
  b: 2,
  c: 3,
  ['d']: 4,
  1: 5
};


// ----------------------------------------------------------------------------
// Benchmark: Babel
// ----------------------------------------------------------------------------

function _extends(target) {
  for (var i = 1; i < arguments.length; i++) {
    var source = arguments[i];
    for (var key in source) {
      if (Object.prototype.hasOwnProperty.call(source, key)) {
        target[key] = source[key];
      }
    }
  }
  return target;
};

function Babel() {
  const result = _extends({}, input);
  if (Object.keys(result).length != 5) throw 666;
}

function BabelAndOverwrite() {
  const result = _extends({}, input, {a: 6});
  if (Object.keys(result).length != 5) throw 666;
}

// ----------------------------------------------------------------------------
// Benchmark: Object.assign
// ----------------------------------------------------------------------------


function ObjectAssign() {
  const result = Object.assign({}, input);
  if (Object.keys(result).length != 5) throw 666;
}

function ObjectAssignAndOverwrite() {
  const result = Object.assign({}, input, {a : 6});
  if (Object.keys(result).length != 5) throw 666;
}


// ----------------------------------------------------------------------------
// Benchmark: Object.assign
// ----------------------------------------------------------------------------


function ObjectSpread() {
  const result = { ...input };
  if (Object.keys(result).length != 5) throw 666;
}

function ObjectSpreadAndOverwrite() {
  const result = { ...input, a: 6 };
  if (Object.keys(result).length != 5) throw 666;
}

// ----------------------------------------------------------------------------
// Setup and Run
// ----------------------------------------------------------------------------

load('../base.js');

var success = true;

function PrintResult(name, result) {
  print(name + '-ObjectLiteralSpread(Score): ' + result);
}

function PrintError(name, error) {
  PrintResult(name, error);
  success = false;
}

function CreateBenchmark(name, f) {
  new BenchmarkSuite(name, [100], [ new Benchmark(name, false, false, 0, f) ]);
}

CreateBenchmark('Babel', Babel);
CreateBenchmark('BabelAndOverwrite', BabelAndOverwrite);
CreateBenchmark('ObjectAssign', ObjectAssign);
CreateBenchmark('ObjectAssignAndOverwrite', ObjectAssignAndOverwrite);
CreateBenchmark('ObjectSpread', ObjectSpread);
CreateBenchmark('ObjectSpreadAndOverwrite', ObjectSpreadAndOverwrite);

BenchmarkSuite.config.doWarmup = undefined;
BenchmarkSuite.config.doDeterministic = undefined;
BenchmarkSuite.RunSuites({NotifyResult: PrintResult, NotifyError: PrintError});
