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

<script>
'use strict';

tr.b.unittest.testSuite(function() {
  var Model = tr.Model;
  var Thread = tr.model.Thread;
  var Selection = tr.c.Selection;
  var newSliceEx = tr.c.test_utils.newSliceEx;

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

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

    var selection = new Selection(tsg.slices);

    var viewEl = document.createElement('tr-c-a-multi-event-details-table');
    viewEl.selection = selection;
    this.addHTMLOutput(viewEl);

    var table = viewEl.$.table;
    var cmpResult = table.tableColumns[0].cmp(sA, sB);
    assert.equal(cmpResult, 1);
  });

  test('withCpuTime', 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: 'a', start: 1, end: 2,
                              cpuStart: 1, cpuEnd: 1.75}));
    tsg.pushSlice(newSliceEx({title: 'a', start: 4, end: 5,
                              cpuStart: 3, cpuEnd: 3.75}));
    tsg.createSubSlices();

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

    var selection = new Selection(tsg.slices);

    var viewEl = document.createElement('tr-c-a-multi-event-details-table');
    viewEl.selection = selection;
    this.addHTMLOutput(viewEl);
  });

  test('withoutCpuTime', 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}));
    tsg.pushSlice(newSliceEx({title: 'a', start: 1, end: 2}));
    tsg.pushSlice(newSliceEx({title: 'a', start: 4, end: 5}));
    tsg.createSubSlices();

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

    var selection = new Selection(tsg.slices);

    var viewEl = document.createElement('tr-c-a-multi-event-details-table');
    viewEl.selection = selection;
    this.addHTMLOutput(viewEl);
  });


  test('withFewerThanFourArgs', 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,
                              args: {value1: 3, value2: 'x', value3: 1}}));
    tsg.pushSlice(newSliceEx({title: 'b', start: 1, end: 2,
                              args: {value1: 3.1, value2: 'y', value3: 2}}));
    tsg.pushSlice(newSliceEx({title: 'b', start: 4, end: 5,
                              args: {value1: 3.2, value2: 'z', value3: 'x'}}));
    tsg.createSubSlices();

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

    var selection = new Selection(tsg.slices);

    var viewEl = document.createElement('tr-c-a-multi-event-details-table');
    viewEl.selection = selection;
    this.addHTMLOutput(viewEl);
  });

  test('withExtraArgs', 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,
                              args: {value1: 3, value2: 'x', value3: 1,
                                     value4: 4, value5: 5, value6: 6}}));
    tsg.pushSlice(newSliceEx({title: 'b', start: 1, end: 2,
                              args: {value1: 3.1, value2: 'y', value3: 2,
                                     value4: 4, value5: 5, value6: 6}}));
    tsg.pushSlice(newSliceEx({title: 'b', start: 4, end: 5,
                              args: {value1: 3.2, value2: 'z', value3: 'x',
                                     value4: 4, value5: 'whoops', value6: 6}}));
    tsg.createSubSlices();

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

    var selection = new Selection(tsg.slices);

    var viewEl = document.createElement('tr-c-a-multi-event-details-table');
    viewEl.selection = selection;
    this.addHTMLOutput(viewEl);
  });

  test('noDuration', 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.
    var failProp = {
      get: function() {
        throw new Error('Should not be called');
      }
    };
    Object.defineProperty(fe1, 'duration', failProp);
    Object.defineProperty(fe2, 'duration', failProp);

    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 Selection([fe1, fe2]);

    var viewEl = document.createElement('tr-c-a-multi-event-details-table');
    viewEl.eventsHaveDuration = false;
    viewEl.selection = selection;
    this.addHTMLOutput(viewEl);
  });
});
</script>
