<!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_vm_regions_details_pane.html">
<link rel="import" href="/core/test_utils.html">
<link rel="import" href="/model/process_memory_dump.html">

<script>
'use strict';

tr.b.unittest.testSuite(function() {
  var Selection = tr.c.Selection;
  var VMRegion = tr.model.VMRegion;

  function createVMRegions() {
    return [
      VMRegion.fromDict({
        mappedFile: '/lib/chrome.so',
        startAddress: 65536,
        sizeInBytes: 536870912,
        protectionFlags: VMRegion.PROTECTION_FLAG_READ |
            VMRegion.PROTECTION_FLAG_EXECUTE,
        byteStats: {
          proportionalResident: 8192
        }
      }),
      VMRegion.fromDict({
        startAddress: 10995116277760,
        sizeInBytes: 2147483648,
        protectionFlags: VMRegion.PROTECTION_FLAG_READ |
            VMRegion.PROTECTION_FLAG_WRITE,
        byteStats: {
          privateDirtyResident: 0,
          swapped: 0
        }
      }),
      VMRegion.fromDict({
        startAddress: 12094627905536,
        sizeInBytes: 2147483648,
        protectionFlags: VMRegion.PROTECTION_FLAG_READ |
            VMRegion.PROTECTION_FLAG_WRITE,
        byteStats: {
          privateDirtyResident: 0,
          swapped: 0
        }
      })
    ];
  }

  function checkRowValue(row, column, expectedValue) {
    var value = column.value(row);
    if (typeof(expectedValue) === 'number')
      value = value.numBytes;
    assert.equal(value, expectedValue);
  }

  test('instantiate_empty', function() {
    var viewEl = document.createElement(
        'tr-c-a-memory-dump-vm-regions-details-pane');
    this.addHTMLOutput(viewEl);
  });

  test('instantiate_nonEmpty', function() {
    var vmRegions = createVMRegions();

    var viewEl = document.createElement(
        'tr-c-a-memory-dump-vm-regions-details-pane');
    viewEl.vmRegions = vmRegions;
    this.addHTMLOutput(viewEl);

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

    var columns = table.tableColumns;

    assert.lengthOf(columns, 7);
    var titleColumn = columns[0];
    var virtualSizeColumn = columns[1];
    var proportionalResidentColumn = columns[2];
    var privateDirtyResidentColumn = columns[3];
    var swappedColumn = columns[4];
    var startAddressColumn = columns[5];
    var protectionFlagsColumn = columns[6];

    function checkRow(row, expectedTitle, expectedVirtualSize,
        expectedProportionalResident, expectedPrivateDirtyResident,
        expectedSwapped, expectedStartAddress, expectedProtectionFlags,
        expectedSubRowCount) {
      checkRowValue(row, titleColumn, expectedTitle);
      checkRowValue(row, virtualSizeColumn, expectedVirtualSize);
      checkRowValue(
          row, proportionalResidentColumn, expectedProportionalResident);
      checkRowValue(
          row, privateDirtyResidentColumn, expectedPrivateDirtyResident);
      checkRowValue(row, swappedColumn, expectedSwapped);
      checkRowValue(row, startAddressColumn, expectedStartAddress);
      checkRowValue(row, protectionFlagsColumn, expectedProtectionFlags);

      if (expectedSubRowCount === undefined)
        assert.isUndefined(row.subRows);
      else
        assert.lengthOf(row.subRows, expectedSubRowCount);
    }

    // Check the rows of the table.
    var rows = table.tableRows;
    assert.lengthOf(rows, 1);

    var totalRow = rows[0];
    checkRow(totalRow, 'Total', 4831838208, 8192, 0, 0, '', '', 7);

    var androidRow = totalRow.subRows[0];
    checkRow(androidRow, 'Android', '', '', '', '', '', '', 3);

    var javaRuntimeRow = androidRow.subRows[0];
    checkRow(javaRuntimeRow, 'Java runtime', '', '', '', '', '', '', 5);

    var spacesRow = javaRuntimeRow.subRows[0];
    checkRow(spacesRow, 'Spaces', '', '', '', '', '', '', 4);

    var normalRow = spacesRow.subRows[0];
    checkRow(normalRow, 'Normal', '', '', '', '', '', '', 0);

    var filesRow = totalRow.subRows[3];
    checkRow(filesRow, 'Files', 536870912, 8192, '', '', '', '', 7);

    var soRow = filesRow.subRows[0];
    checkRow(soRow, 'so', 536870912, 8192, '', '', '', '', 1);

    var mmapChromeRow = soRow.subRows[0];
    checkRow(mmapChromeRow, '/lib/chrome.so', 536870912, 8192, '', '',
        '0000000000010000', 'r-x', undefined);

    var otherRow = totalRow.subRows[6];
    checkRow(otherRow, 'Other', 4294967296, '', 0, 0, '', '', 2);

    var mmapOther2Row = otherRow.subRows[1];
    checkRow(mmapOther2Row, '', 2147483648, '', 0, 0, '00000b0000000000',
        'rw-', undefined);
  });
});
</script>
