<!DOCTYPE html>
<!--
Copyright (c) 2015 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->

<link rel="import" href="/tracing/model/attribute.html">
<link rel="import" href="/tracing/model/container_memory_dump.html">
<link rel="import" href="/tracing/model/memory_allocator_dump.html">

<script>
'use strict';

tr.b.unittest.testSuite(function() {
  var ContainerMemoryDump = tr.model.ContainerMemoryDump;
  var MemoryAllocatorDump = tr.model.MemoryAllocatorDump;
  var MemoryAllocatorDumpLink = tr.model.MemoryAllocatorDumpLink;
  var ScalarAttribute = tr.model.ScalarAttribute;

  function newChildDump(parentDump, name) {
    var childDump = new MemoryAllocatorDump(
        parentDump.containerMemoryDump, parentDump.fullName + '/' + name);
    childDump.parent = parentDump;
    parentDump.children.push(childDump);
    return childDump;
  }

  test('memoryAllocatorDump_instantiate', function() {
    var containerDump = new ContainerMemoryDump(42);
    containerDump.containerName = 'super dump';
    var dump = new MemoryAllocatorDump(containerDump, 'v8/objects/object7');

    assert.equal(dump.name, 'object7');
    assert.equal(dump.fullName, 'v8/objects/object7');
    assert.strictEqual(dump.containerMemoryDump, containerDump);
    assert.equal(dump.quantifiedName, '\'v8/objects/object7\' in super dump');
  });

  test('memoryAllocatorDumps_aggregateAttributes', function() {
    var md = new ContainerMemoryDump(42);

    var oilpanDump = new MemoryAllocatorDump(md, 'oilpan');
    oilpanDump.addAttribute('objects_count', new ScalarAttribute('objects', 7));

    var oilpanBucket1Dump = newChildDump(oilpanDump, 'bucket1');
    oilpanBucket1Dump.addAttribute('size',
        new ScalarAttribute('bytes', 512));
    oilpanBucket1Dump.addAttribute('objects_count',
        new ScalarAttribute('objects', 3));
    oilpanBucket1Dump.addAttribute('inner_size',
        new ScalarAttribute('bytes', 256));

    var oilpanBucket2Dump = newChildDump(oilpanDump, 'bucket2');

    var oilpanBucket2StringsDump = newChildDump(oilpanBucket2Dump, 'strings');
    oilpanBucket2StringsDump.addAttribute('size',
        new ScalarAttribute('bytes', 512));
    oilpanBucket2StringsDump.addAttribute('objects_count',
        new ScalarAttribute('objects', 4));
    oilpanBucket2StringsDump.addAttribute('inner_size',
        new ScalarAttribute('bytes', 512));

    oilpanDump.aggregateAttributes();

    // oilpan has *some* attributes aggregated.
    assert.equal(oilpanDump.attributes['objects_count'].value, 7);
    assert.equal(oilpanDump.attributes['inner_size'].value, 768);
    assert.equal(oilpanDump.attributes['size'].value, 1024);

    // oilpan/bucket2 has *all* attributes aggregated.
    assert.equal(oilpanBucket2Dump.attributes['objects_count'].value,
        4);
    assert.equal(oilpanBucket2Dump.attributes['inner_size'].value, 512);
    assert.equal(oilpanBucket2Dump.attributes['size'].value, 512);

    // oilpan/bucket2/strings has *no* attributes aggregated.
    assert.equal(oilpanBucket2StringsDump.attributes[
        'objects_count'].value, 4);
    assert.equal(oilpanBucket2StringsDump.attributes['inner_size'].value, 512);
    assert.equal(oilpanBucket2StringsDump.attributes['size'].value, 512);
  });

  test('memoryAllocatorDumps_isDescendantOf', function() {
    var md = new ContainerMemoryDump(42);

    var v8Dump = new MemoryAllocatorDump(md, 'v8');
    var v8HeapsDump = newChildDump(v8Dump, 'heaps');
    var v8ObjectsDump = newChildDump(v8Dump, 'objects');
    var v8Object1Dump = newChildDump(v8ObjectsDump, 'obj1');
    var v8Object2Dump = newChildDump(v8ObjectsDump, 'obj2');

    var oilpanDump = new MemoryAllocatorDump(md, 'oilpan');

    assert.isTrue(v8Dump.isDescendantOf(v8Dump));
    assert.isTrue(v8HeapsDump.isDescendantOf(v8Dump));
    assert.isTrue(v8ObjectsDump.isDescendantOf(v8Dump));
    assert.isTrue(v8Object1Dump.isDescendantOf(v8Dump));
    assert.isTrue(v8Object2Dump.isDescendantOf(v8Dump));
    assert.isTrue(v8ObjectsDump.isDescendantOf(v8ObjectsDump));
    assert.isTrue(v8Object1Dump.isDescendantOf(v8ObjectsDump));
    assert.isTrue(v8Object2Dump.isDescendantOf(v8ObjectsDump));
    assert.isTrue(oilpanDump.isDescendantOf(oilpanDump));

    assert.isFalse(v8Dump.isDescendantOf(oilpanDump));
    assert.isFalse(v8Dump.isDescendantOf(v8HeapsDump));
    assert.isFalse(v8Dump.isDescendantOf(v8ObjectsDump));
    assert.isFalse(v8Dump.isDescendantOf(v8Object1Dump));
    assert.isFalse(v8Dump.isDescendantOf(v8Object2Dump));
    assert.isFalse(v8Object1Dump.isDescendantOf(v8Object2Dump));
    assert.isFalse(v8Object2Dump.isDescendantOf(v8Object1Dump));
  });

  test('memoryAllocatorDumpLink_instantiate', function() {
    var d1 = new MemoryAllocatorDump('v8/isolate1');
    var d2 = new MemoryAllocatorDump('oilpan/document1');
    var link = new MemoryAllocatorDumpLink(d1, d2, 3);

    assert.strictEqual(link.source, d1);
    assert.strictEqual(link.target, d2);
    assert.strictEqual(link.importance, 3);
  });
});
</script>
