<!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="/base/deep_utils.html">
<link rel="import" href="/core/analysis/memory_dump_overview_pane.html">
<link rel="import" href="/core/analysis/memory_dump_sub_view_test_utils.html">
<link rel="import" href="/core/test_utils.html">

<script>
'use strict';

tr.b.unittest.testSuite(function() {
  function createProcessMemoryDumps() {
    var gmd = tr.c.analysis.createTestGlobalMemoryDump();
    return tr.b.dictionaryValues(gmd.processMemoryDumps);
  }

  test('instantiate', function() {
    var processMemoryDumps = createProcessMemoryDumps();

    var viewEl = document.createElement('tr-c-a-memory-dump-overview-pane');
    viewEl.processMemoryDumps = processMemoryDumps;
    this.addHTMLOutput(viewEl);

    var table = tr.b.findDeepElementMatching(
        viewEl, 'tr-b-ui-table');

    var rows = table.tableRows;
    var columns = table.tableColumns;
    assert.lengthOf(rows, 3);
    assert.lengthOf(columns, 9);

    var titleColumn = columns[0];
    var totalColumn = columns[1];
    var proportionalColumn = columns[2];
    var privateDirtyColumn = columns[3];
    var swappedColumn = columns[4];
    var mallocColumn = columns[5];
    var v8Column = columns[6];
    var oilpanColumn = columns[7];
    var tracingColumn = columns[8];

    // Check the rows of the table.
    assert.equal(titleColumn.value(rows[0]).label, 'Process 1');
    assert.equal(totalColumn.value(rows[0]).numBytes, 31457280);
    assert.equal(proportionalColumn.value(rows[0]).numBytes, 10485760);
    assert.equal(privateDirtyColumn.value(rows[0]).numBytes, 8388608);
    assert.equal(swappedColumn.value(rows[0]).numBytes, 0);
    assert.equal(mallocColumn.value(rows[0]), '');
    assert.equal(v8Column.value(rows[0]), '');
    assert.equal(oilpanColumn.value(rows[0]), '');
    assert.equal(tracingColumn.value(rows[0]).textContent, '');

    assert.equal(titleColumn.value(rows[1]).label, 'Process 2');
    assert.equal(totalColumn.value(rows[1]).numBytes, 19922944);
    assert.equal(proportionalColumn.value(rows[1]).numBytes, 14680064);
    assert.equal(privateDirtyColumn.value(rows[1]).numBytes, 524288);
    assert.equal(swappedColumn.value(rows[1]).numBytes, 32);
    assert.equal(mallocColumn.value(rows[1]).numBytes, 2097152);
    assert.equal(v8Column.value(rows[1]).numBytes, 5242880);
    assert.equal(oilpanColumn.value(rows[1]), '');
    assert.equal(tracingColumn.value(rows[1]).children[0].numBytes, 1048576);

    assert.equal(titleColumn.value(rows[2]).label, 'Process 3');
    assert.equal(totalColumn.value(rows[2]), '');
    assert.equal(proportionalColumn.value(rows[2]), '');
    assert.equal(privateDirtyColumn.value(rows[2]), '');
    assert.equal(swappedColumn.value(rows[2]), '');
    assert.equal(mallocColumn.value(rows[2]), '');
    assert.equal(v8Column.value(rows[2]).numBytes, 1073741824);
    assert.equal(oilpanColumn.value(rows[2]).numBytes, 2147483648);
    assert.equal(tracingColumn.value(rows[2]).textContent, '');
  });

  test('selection', function() {
    var processMemoryDumps = createProcessMemoryDumps();

    var viewEl = document.createElement('tr-c-a-memory-dump-overview-pane');
    viewEl.processMemoryDumps = processMemoryDumps;
    this.addHTMLOutput(viewEl);

    var didFireSelectedDumpChanged;
    viewEl.addEventListener('selected-memory-cell-changed',
        function(e) {
      didFireSelectedDumpChanged = true;
    });

    var table = tr.b.findDeepElementMatching(
        viewEl, 'tr-b-ui-table');

    // Simulate clicking on the 'oilpan' cell of the second process.
    didFireSelectedDumpChanged = false;
    table.selectedTableRow = table.tableRows[2];
    table.selectedColumnIndex = 7;
    assert.isTrue(didFireSelectedDumpChanged);
    assert.isDefined(viewEl.selectedMemoryCell);
    assert.isDefined(viewEl.selectedMemoryCell.buildDetailsPane);

    // Simulate clicking on the 'Proportional used memory (mmaps)' cell of the
    // second process.
    didFireSelectedDumpChanged = false;
    table.selectedColumnIndex = 2;
    assert.isTrue(didFireSelectedDumpChanged);
    assert.isUndefined(viewEl.selectedMemoryCell);
  });
});
</script>
