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

// Flags: --logfile='+' --log --trace-maps --trace-ic --log-code
// Flags: --log-function-events --no-stress-opt

import { Processor } from "../../../tools/system-analyzer/processor.mjs";

// log code start
function doWork() {
  let array = [];
  for (let i = 0; i < 500; i++) {
    doWorkStep(i, array);
  }
  let sum = 0;
  for (let i = 0; i < 500; i++) {
    sum += array[i]["property" + i];
  }
  return sum;
}

function doWorkStep(i, array) {
  const obj = {
    ["property" + i]: i,
  };
  array.push(obj);
  obj.custom1 = 1;
  obj.custom2 = 2;
}

const result = doWork();
 // log code end

const logString = d8.log.getAndStop();
const processor = new Processor();
processor.processString(logString);

const maps = processor.mapTimeline;
const ics = processor.icTimeline;
const scripts = processor.scripts;

(function testResults() {
  assertEquals(result, 124750);
  assertTrue(maps.length > 0);
  assertTrue(ics.length > 0);
  assertTrue(scripts.length > 0);
})();

(function testIcKeys() {
  const keys = new Set();
  ics.forEach(ic => keys.add(ic.key));
  assertTrue(keys.has("custom1"));
  assertTrue(keys.has("custom2"));
  assertTrue(keys.has("push"));
})();
