<!DOCTYPE html>
<!--
Copyright (c) 2014 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/core/test_utils.html">
<link rel="import" href="/tracing/model/model.html">
<link rel="import" href="/tracing/ui/extras/side_panel/time_summary_side_panel.html">

<script>
'use strict';

tr.b.unittest.testSuite(function() {
  function createModel(opt_options) {
    var options = opt_options || {};
    var m = tr.c.TestUtils.newModelWithEvents([], {
      shiftWorldToZero: false,
      pruneContainers: false,
      customizeModelCallback: function(m) {
        if (options.provideSoftwareMeasuredCpuCount)
          m.kernel.softwareMeasuredCpuCount = 2;

        var browserProcess = m.getOrCreateProcess(1);
        var browserMain = browserProcess.getOrCreateThread(2);
        browserMain.name = 'CrBrowserMain';
        browserMain.sliceGroup.beginSlice('cat', 'Task', 0, undefined, 0);
        browserMain.sliceGroup.endSlice(10, 9);
        browserMain.sliceGroup.beginSlice('cat', 'Task', 20, undefined, 10);
        browserMain.sliceGroup.endSlice(30, 20);

        var rendererProcess = m.getOrCreateProcess(4);
        var rendererMain = rendererProcess.getOrCreateThread(5);
        rendererMain.name = 'CrRendererMain';
        rendererMain.sliceGroup.beginSlice('cat', 'Task', 0, undefined, 0);
        rendererMain.sliceGroup.endSlice(30, 25);
        rendererMain.sliceGroup.beginSlice('cat', 'Task', 40, undefined, 40);
        rendererMain.sliceGroup.endSlice(60, 50);
      }
    });
    return m;
  }

  test('group', function() {
    var ts = document.createElement('tr-ui-e-s-time-summary-side-panel');
    var m = createModel();
    var group = ts.generateResultsForGroup(m, 'foo');
    group.appendThreadSlices(m.bounds, m.processes[1].threads[2]);
    assert.equal(group.wallTime, 20);
    assert.equal(group.cpuTime, 19);
  });

  test('trim', function() {
    var groupData = [
      {
        value: 2.854999999999997,
        label: '156959'
      },
      {
        value: 9.948999999999998,
        label: '16131'
      },
      {
        value: 42.314000000000725,
        label: '51511'
      },
      {
        value: 31.06900000000028,
        label: 'AudioOutputDevice'
      },
      {
        value: 1.418,
        label: 'BrowserBlockingWorker2/50951'
      },
      {
        value: 0.044,
        label: 'BrowserBlockingWorker3/50695'
      },
      {
        value: 18.52599999999993,
        label: 'Chrome_ChildIOThread'
      },
      {
        value: 2.888,
        label: 'Chrome_FileThread'
      },
      {
        value: 0.067,
        label: 'Chrome_HistoryThread'
      },
      {
        value: 25.421000000000046,
        label: 'Chrome_IOThread'
      },
      {
        value: 0.019,
        label: 'Chrome_ProcessLauncherThread'
      },
      {
        value: 643.087999999995,
        label: 'Compositor'
      },
      {
        value: 4.049999999999973,
        label: 'CompositorRasterWorker1/22031'
      },
      {
        value: 50.040000000000106,
        label: 'CrBrowserMain'
      },
      {
        value: 1256.5130000000042,
        label: 'CrGpuMain'
      },
      {
        value: 5502.19499999999,
        label: 'CrRendererMain'
      },
      {
        value: 15.552999999999862,
        label: 'FFmpegDemuxer'
      },
      {
        value: 63.706000000001524,
        label: 'Media'
      },
      {
        value: 2.7419999999999987,
        label: 'PowerSaveBlocker'
      },
      {
        value: 0.11500000000000005,
        label: 'Watchdog'
      }
    ];

    var ts = document.createElement('tr-ui-e-s-time-summary-side-panel');

    var groups = [];
    var m = tr.c.TestUtils.newModelWithEvents([], {
      shiftWorldToZero: false,
      pruneContainers: false,
      customizeModelCallback: function(m) {
        var start = 0;
        groupData.forEach(function(groupData) {
          var group = ts.generateResultsForGroup(m, groupData.label);

          var slice = tr.c.TestUtils.newSliceEx(
              {title: groupData.label,
               start: start, duration: groupData.value});
          start += groupData.value;
          group.allSlices.push(slice);
          group.topLevelSlices.push(slice);

          groups.push(group);
        });
      }
    });

    function getValueFromGroup(d) { return d.wallTime; }

    var otherGroup = ts.generateResultsForGroup(m, 'Other');
    var newGroups = ts.trimPieChartData(groups, otherGroup, getValueFromGroup);

    // Visualize the data once its trimmed.
    var ce = document.createElement('tr-ui-e-s-time-summary-side-panel');
    var chart = ce.createPieChartFromResultGroups(
        newGroups, 'Trimmed', getValueFromGroup);
    this.addHTMLOutput(chart);
    chart.setSize(chart.getMinSize());
  });

  test('basicInWallTimeMode', function() {
    var m = createModel();

    var panel = document.createElement('tr-ui-e-s-time-summary-side-panel');
    this.addHTMLOutput(panel);
    panel.model = m;
    panel.groupingUnit = 'Wall time';
    panel.style.border = '1px solid black';
  });

  test('basicInCpuTimeModeButNoCpuData', function() {
    var m = createModel();

    var panel = document.createElement('tr-ui-e-s-time-summary-side-panel');
    this.addHTMLOutput(panel);
    panel.model = m;
    panel.groupingUnit = 'CPU time';
    panel.style.border = '1px solid black';
  });

  test('basicInCpuTimeModeAndCpuData', function() {
    var m = createModel({
      provideSoftwareMeasuredCpuCount: true
    });

    var panel = document.createElement('tr-ui-e-s-time-summary-side-panel');
    this.addHTMLOutput(panel);
    panel.model = m;
    panel.groupingUnit = 'CPU time';
    panel.style.border = '1px solid black';
  });
});
</script>
