<!DOCTYPE html>
<!--
Copyright (c) 2013 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/event_set.html">
<link rel="import" href="/tracing/model/model.html">
<link rel="import" href="/tracing/ui/analysis/multi_event_summary_table.html">
<link rel="import" href="/tracing/ui/base/deep_utils.html">

<script>
'use strict';

tr.b.unittest.testSuite(function() {
  var Model = tr.Model;
  var EventSet = tr.model.EventSet;
  var newSliceEx = tr.c.TestUtils.newSliceEx;

  test('basicNoCpu', function() {
    var model = new Model();
    var thread = model.getOrCreateProcess(1).getOrCreateThread(2);
    var tsg = thread.sliceGroup;
    tsg.pushSlice(newSliceEx({title: 'a', start: 0, duration: 0.5}));
    tsg.pushSlice(newSliceEx({title: 'b', start: 1, duration: 0.5}));
    tsg.pushSlice(newSliceEx({title: 'b', start: 2, duration: 0.5}));
    tsg.createSubSlices();

    var threadTrack = {};
    threadTrack.thread = thread;

    var selection = new EventSet(tsg.slices);

    var viewEl = document.createElement('tr-ui-a-multi-event-summary-table');
    viewEl.configure({
      showTotals: true,
      eventsHaveDuration: true,
      eventsByTitle: selection.getEventsOrganizedByTitle()
    });
    this.addHTMLOutput(viewEl);
  });

  test('basicWithCpu', function() {
    var model = new Model();
    var thread = model.getOrCreateProcess(1).getOrCreateThread(2);
    var tsg = thread.sliceGroup;
    tsg.pushSlice(newSliceEx({title: 'a', start: 0, end: 3,
                              cpuStart: 0, cpuEnd: 3}));
    tsg.pushSlice(newSliceEx({title: 'b', start: 1, end: 2,
                              cpuStart: 1, cpuEnd: 1.75}));
    tsg.pushSlice(newSliceEx({title: 'b', start: 4, end: 5,
                              cpuStart: 3, cpuEnd: 3.75}));
    tsg.createSubSlices();

    var threadTrack = {};
    threadTrack.thread = thread;

    var selection = new EventSet(tsg.slices);

    var viewEl = document.createElement('tr-ui-a-multi-event-summary-table');
    viewEl.configure({
      showTotals: true,
      eventsHaveDuration: true,
      eventsByTitle: selection.getEventsOrganizedByTitle()
    });
    this.addHTMLOutput(viewEl);
  });

  test('noSelfTimeNoSubRows', function() {
    var model = new Model();

    var fe1 = new tr.model.FlowEvent('cat', 1234, 'title', 7, 10, {});
    var fe2 = new tr.model.FlowEvent('cat', 1234, 'title', 8, 20, {});

    // Make reading some properties an explosion, as a way to ensure that they
    // aren't read. Note that 'duration' is read since it is used by the
    // EventSet to get the range.
    var failProp = {
      get: function() {
        throw new Error('Should not be called');
      }
    };
    Object.defineProperty(fe1, 'subRows', failProp);
    Object.defineProperty(fe2, 'subRows', failProp);

    Object.defineProperty(fe1, 'selfTime', failProp);
    Object.defineProperty(fe2, 'selfTime', failProp);

    model.flowEvents.push(fe1);
    model.flowEvents.push(fe2);

    var selection = new EventSet([fe1, fe2]);

    var viewEl = document.createElement('tr-ui-a-multi-event-summary-table');
    viewEl.configure({
      showTotals: true,
      eventsHaveDuration: false,
      eventsHaveSubRows: false,
      eventsByTitle: selection.getEventsOrganizedByTitle()
    });
    this.addHTMLOutput(viewEl);
  });

  // TODO(nduca): Tooltippish stuff.
});
</script>
