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

<script>
'use strict';

tr.b.unittest.testSuite(function() {
  var Cpu = tr.model.Cpu;
  var CpuTrack = tr.ui.tracks.CpuTrack;
  var Slice = tr.model.Slice;
  var StackFrame = tr.model.StackFrame;
  var Sample = tr.model.Sample;
  var Thread = tr.model.Thread;
  var Viewport = tr.ui.TimelineViewport;

  test('basicCpu', function() {
    var cpu = new Cpu({}, 7);
    cpu.slices = [
      new Slice('', 'a', 0, 1, {}, 1),
      new Slice('', 'b', 1, 2.1, {}, 4.8)
    ];
    cpu.updateBounds();

    var testEl = document.createElement('div');
    var viewport = new Viewport(testEl);

    var drawingContainer = new tr.ui.tracks.DrawingContainer(viewport);

    var track = new CpuTrack(viewport);
    drawingContainer.appendChild(track);

    track.heading = 'CPU ' + cpu.cpuNumber;
    track.cpu = cpu;
    var dt = new tr.ui.TimelineDisplayTransform();
    dt.xSetWorldBounds(0, 11.1, track.clientWidth);
    track.viewport.setDisplayTransformImmediately(dt);
  });


  test('withSamples', function() {
    var model = new tr.Model();
    var thread;
    var cpu;
    model.importTraces([], false, false, function() {
      cpu = model.kernel.getOrCreateCpu(1);
      thread = model.getOrCreateProcess(1).getOrCreateThread(2);

      var fA = model.addStackFrame(new StackFrame(
          undefined, 1, 'cat', 'a', 7));
      var fAB = model.addStackFrame(new StackFrame(
          fA, 2, 'cat', 'b', 7));
      var fABC = model.addStackFrame(new StackFrame(
          fAB, 3, 'cat', 'c', 7));
      var fAD = model.addStackFrame(new StackFrame(
          fA, 4, 'cat', 'd', 7));

      model.samples.push(new Sample(undefined, thread, 'instructions_retired',
                                    10, fABC, 10));
      model.samples.push(new Sample(undefined, thread, 'instructions_retired',
                                    20, fAB, 10));
      model.samples.push(new Sample(undefined, thread, 'instructions_retired',
                                    30, fAB, 10));
      model.samples.push(new Sample(undefined, thread, 'instructions_retired',
                                    40, fAD, 10));

      model.samples.push(new Sample(undefined, thread, 'page_fault',
                                    25, fAB, 10));
      model.samples.push(new Sample(undefined, thread, 'page_fault',
                                    35, fAD, 10));
    });

    var testEl = document.createElement('div');
    var viewport = new Viewport(testEl);

    var drawingContainer = new tr.ui.tracks.DrawingContainer(viewport);

    var track = new CpuTrack(viewport);
    drawingContainer.appendChild(track);

    track.heading = 'CPU ' + cpu.cpuNumber;
    track.cpu = cpu;
    var dt = new tr.ui.TimelineDisplayTransform();
    dt.xSetWorldBounds(0, 11.1, track.clientWidth);
    track.viewport.setDisplayTransformImmediately(dt);
  });
});
</script>

