<!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/task.html">
<link rel="import" href="/core/test_utils.html">
<link rel="import" href="/core/timeline_track_view.html">
<link rel="import" href="/extras/importer/trace_event_importer.html">

<script>
'use strict';

tv.b.unittest.testSuite(function() {
  var Selection = tv.c.Selection;
  var SelectionState = tv.c.trace_model.SelectionState;
  var Task = tv.b.Task;

  test('instantiate', function() {
    var model = new tv.c.TraceModel();
    var num_threads = 500;
    model.importTraces([], false, false, function() {
      var p100 = model.getOrCreateProcess(100);
      for (var i = 0; i < num_threads; i++) {
        var t = p100.getOrCreateThread(101 + i);
        if (i % 2 == 0) {
          t.sliceGroup.beginSlice('cat', 'a', 100);
          t.sliceGroup.endSlice(110);
        } else {
          t.sliceGroup.beginSlice('cat', 'b', 50);
          t.sliceGroup.endSlice(120);
        }
      }
    });

    var timeline = new tv.c.TimelineTrackView();
    timeline.model = model;
    timeline.focusElement = timeline;
    timeline.tabIndex = 0;
    timeline.style.maxHeight = '600px';
    this.addHTMLOutput(timeline);
  });

  test('addAllEventsMatchingFilterToSelectionAsTask', function() {
    var model = new tv.c.TraceModel();
    var p1 = model.getOrCreateProcess(1);
    var t1 = p1.getOrCreateThread(1);

    t1.sliceGroup.pushSlice(
        new tv.c.trace_model.ThreadSlice('', 'a', 0, 1, {}, 3));
    t1.sliceGroup.pushSlice(
        new tv.c.trace_model.ThreadSlice('', 'b', 0, 1.1, {}, 2.8));

    var t1asg = t1.asyncSliceGroup;
    t1asg.slices.push(
        tv.c.test_utils.newAsyncSliceNamed('a', 0, 1, t1, t1));
    t1asg.slices.push(
        tv.c.test_utils.newAsyncSliceNamed('b', 1, 2, t1, t1));

    var timeline = new tv.c.TimelineTrackView();
    timeline.model = model;

    var expected = [t1asg.slices[0],
                    t1.sliceGroup.slices[0]];
    var result = new tv.c.Selection();
    var filterTask = timeline.addAllEventsMatchingFilterToSelectionAsTask(
        new tv.c.TitleOrCategoryFilter('a'), result);
    Task.RunSynchronously(filterTask);
    assert.equal(result.length, 2);
    assert.equal(result[0], expected[0]);
    assert.equal(result[1], expected[1]);

    var expected = [t1asg.slices[1],
                    t1.sliceGroup.slices[1]];
    var result = new tv.c.Selection();
    var filterTask = timeline.addAllEventsMatchingFilterToSelectionAsTask(
        new tv.c.TitleOrCategoryFilter('b'), result);
    Task.RunSynchronously(filterTask);
    assert.equal(result.length, 2);
    assert.equal(result[0], expected[0]);
    assert.equal(result[1], expected[1]);
  });

  test('emptyThreadsDeleted', function() {
    var model = new tv.c.TraceModel();
    var p1 = model.getOrCreateProcess(1);
    var t1 = p1.getOrCreateThread(1);

    var timeline = new tv.c.TimelineTrackView();
    timeline.model = model;

    assert.isFalse(timeline.hasVisibleContent);
  });

  test('filteredCounters', function() {
    var model = new tv.c.TraceModel();
    var c1 = model.kernel.getOrCreateCpu(0);
    c1.getOrCreateCounter('', 'b');

    var p1 = model.getOrCreateProcess(1);
    var ctr = p1.getOrCreateCounter('', 'a');
    var series = new tv.c.trace_model.CounterSeries('a', 0);
    series.addCounterSample(0, 1);
    ctr.addSeries(series);

    var timeline = new tv.c.TimelineTrackView();
    timeline.model = model;

    assert.isTrue(timeline.hasVisibleContent);
  });

  test('filteredCpus', function() {
    var model = new tv.c.TraceModel();
    var c1 = model.kernel.getOrCreateCpu(1);
    c1.getOrCreateCounter('', 'a');

    var timeline = new tv.c.TimelineTrackView();
    timeline.model = model;

    assert.isTrue(timeline.hasVisibleContent);
  });

  test('filteredProcesses', function() {
    var model = new tv.c.TraceModel();
    var p1 = model.getOrCreateProcess(1);
    p1.getOrCreateCounter('', 'a');

    var timeline = new tv.c.TimelineTrackView();
    timeline.model = model;

    assert.isTrue(timeline.hasVisibleContent);
  });

  test('filteredThreads', function() {
    var model = new tv.c.TraceModel();
    var p1 = model.getOrCreateProcess(1);
    var t1 = p1.getOrCreateThread(2);
    t1.sliceGroup.pushSlice(tv.c.test_utils.newSlice(0, 1));

    var timeline = new tv.c.TimelineTrackView();
    timeline.model = model;

    assert.isTrue(timeline.hasVisibleContent);
  });

  test('interestRange', function() {
    var events = [
      {name: 'a', args: {}, pid: 52, ts: 520, cat: 'foo', tid: 53, ph: 'B'},
      {name: 'b', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'B'},
      {name: 'c', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'B'},
      {name: 'c', args: {}, pid: 52, ts: 629, cat: 'foo', tid: 53, ph: 'E'},
      {name: 'b', args: {}, pid: 52, ts: 631, cat: 'foo', tid: 53, ph: 'E'},
      {name: 'a', args: {}, pid: 52, ts: 634, cat: 'foo', tid: 53, ph: 'E'}
    ];
    var model = new tv.c.TraceModel(events);
    var trackView = new tv.c.TimelineTrackView();
    trackView.model = model;
    this.addHTMLOutput(trackView);

    var slice = model.processes[52].threads[53].sliceGroup.slices[2];
    trackView.viewport.interestRange.setMinAndMax(slice.start, slice.end);
  });

  test('emptyInterestRange', function() {
    var events = [
      {name: 'a', args: {}, pid: 52, ts: 520, cat: 'foo', tid: 53, ph: 'B'},
      {name: 'b', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'B'},
      {name: 'c', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'B'},
      {name: 'c', args: {}, pid: 52, ts: 629, cat: 'foo', tid: 53, ph: 'E'},
      {name: 'b', args: {}, pid: 52, ts: 631, cat: 'foo', tid: 53, ph: 'E'},
      {name: 'a', args: {}, pid: 52, ts: 634, cat: 'foo', tid: 53, ph: 'E'}
    ];
    var model = new tv.c.TraceModel(events);
    var trackView = new tv.c.TimelineTrackView();
    trackView.model = model;
    this.addHTMLOutput(trackView);
    trackView.viewport.interestRange.reset();
  });


  test('thinnestInterestRange', function() {
    var events = [
      {name: 'a', args: {}, pid: 52, ts: 520, cat: 'foo', tid: 53, ph: 'B'},
      {name: 'b', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'B'},
      {name: 'c', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'B'},
      {name: 'c', args: {}, pid: 52, ts: 629, cat: 'foo', tid: 53, ph: 'E'},
      {name: 'b', args: {}, pid: 52, ts: 631, cat: 'foo', tid: 53, ph: 'E'},
      {name: 'a', args: {}, pid: 52, ts: 634, cat: 'foo', tid: 53, ph: 'E'}
    ];
    var model = new tv.c.TraceModel(events);
    var trackView = new tv.c.TimelineTrackView();
    trackView.model = model;
    this.addHTMLOutput(trackView);
    trackView.viewport.interestRange.reset();

    var slice = model.processes[52].threads[53].sliceGroup.slices[2];
    trackView.viewport.interestRange.setMinAndMax(slice.start, slice.start);
  });
});
</script>
