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

// Flags: --ignition --trace-ignition-dispatches

assertEquals(typeof getIgnitionDispatchCounters, "function");

var old_dispatch_counters = getIgnitionDispatchCounters();

// Check that old_dispatch_counters is a non-empty object of objects, such that
// the value of each property in the inner objects is a number.

assertEquals(typeof old_dispatch_counters, "object");
assertTrue(Object.getOwnPropertyNames(old_dispatch_counters).length > 0);
for (var source_bytecode in old_dispatch_counters) {
  var counters_row = old_dispatch_counters[source_bytecode];
  assertEquals(typeof counters_row, "object");
  for (var counter in counters_row) {
    assertEquals(typeof counters_row[counter], "number");
  }
}

// Do something
function f(x) { return x*x; }
f(42);

var new_dispatch_counters = getIgnitionDispatchCounters();

var old_source_bytecodes = Object.getOwnPropertyNames(old_dispatch_counters);
var new_source_bytecodes = Object.getOwnPropertyNames(new_dispatch_counters);
var common_source_bytecodes = new_source_bytecodes.filter(function (name) {
  return old_source_bytecodes.indexOf(name) > -1;
});

// Check that the keys on the outer objects are the same
assertEquals(common_source_bytecodes, old_source_bytecodes);
assertEquals(common_source_bytecodes, new_source_bytecodes);

common_source_bytecodes.forEach(function (source_bytecode) {
  var new_counters_row = new_dispatch_counters[source_bytecode];
  var old_counters_row = old_dispatch_counters[source_bytecode];

  var old_destination_bytecodes = Object.getOwnPropertyNames(old_counters_row);
  var new_destination_bytecodes = Object.getOwnPropertyNames(new_counters_row);

  // Check that all the keys in old_ are in new_ too
  old_destination_bytecodes.forEach(function (name) {
    assertTrue(new_destination_bytecodes.indexOf(name) > -1);
  });

  // Check that for each source-destination pair, the counter has either
  // appeared (was undefined before calling f()), is unchanged, or incremented.
  new_destination_bytecodes.forEach(function (destination_bytecode) {
    var new_counter = new_counters_row[destination_bytecode];
    var old_counter = old_counters_row[destination_bytecode];
    assertTrue(typeof new_counter === "number");
    if (typeof old_counter === "number") {
      assertTrue(new_counter >= old_counter);
    }
  });
});
