/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

/**
 * Tests if allocations data received from the performance actor is properly
 * converted to something that follows the same structure as the samples data
 * received from the profiler.
 */

add_task(function() {
  const {
    getProfileThreadFromAllocations,
  } = require("devtools/shared/performance/recording-utils");
  const output = getProfileThreadFromAllocations(TEST_DATA);
  equal(
    JSON.stringify(output),
    JSON.stringify(EXPECTED_OUTPUT),
    "The output is correct."
  );
});

var TEST_DATA = {
  sites: [0, 0, 1, 2, 3],
  timestamps: [50, 100, 150, 200, 250],
  sizes: [0, 0, 100, 200, 300],
  frames: [
    null,
    {
      source: "A",
      line: 1,
      column: 2,
      functionDisplayName: "x",
      parent: 0,
    },
    {
      source: "B",
      line: 3,
      column: 4,
      functionDisplayName: "y",
      parent: 1,
    },
    {
      source: "C",
      line: 5,
      column: 6,
      functionDisplayName: null,
      parent: 2,
    },
  ],
};

var EXPECTED_OUTPUT = {
  name: "allocations",
  samples: {
    schema: {
      stack: 0,
      time: 1,
      size: 2,
    },
    data: [[1, 150, 100], [2, 200, 200], [3, 250, 300]],
  },
  stackTable: {
    schema: {
      prefix: 0,
      frame: 1,
    },
    data: [
      null,

      // x (A:1:2)
      [null, 1],

      // x (A:1:2) > y (B:3:4)
      [1, 2],

      // x (A:1:2) > y (B:3:4) > C:5:6
      [2, 3],
    ],
  },
  frameTable: {
    schema: {
      location: 0,
      implementation: 1,
      optimizations: 2,
      line: 3,
      category: 4,
    },
    data: [null, [0], [1], [2]],
  },
  stringTable: ["x (A:1:2)", "y (B:3:4)", "C:5:6"],
};
