1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5'use strict';
6
7base.require('tracing.test_utils');
8base.require('tracing.timeline_track_view');
9
10base.unittest.testSuite('tracing.tracks.counter_track', function() {
11  var Counter = tracing.trace_model.Counter;
12  var Viewport = tracing.TimelineViewport;
13  var CounterTrack = tracing.tracks.CounterTrack;
14
15  var runTest = function(timestamps, samples, testFn) {
16    var testEl = document.createElement('div');
17    this.addHTMLOutput(testEl);
18
19    var ctr = new Counter(undefined, 'foo', '', 'foo');
20    var n = samples.length;
21
22    for (var i = 0; i < n; ++i) {
23      ctr.addSeries(new tracing.trace_model.CounterSeries('value' + i,
24          tracing.getStringColorId('value' + i)));
25    }
26
27    for (var i = 0; i < samples.length; ++i) {
28      for (var k = 0; k < timestamps.length; ++k) {
29        ctr.series[i].addSample(timestamps[k], samples[i][k]);
30      }
31    }
32
33    ctr.updateBounds();
34
35    var viewport = new Viewport(testEl);
36
37    var drawingContainer = new tracing.tracks.DrawingContainer(viewport);
38    testEl.appendChild(drawingContainer);
39
40    var track = new CounterTrack(viewport);
41    drawingContainer.appendChild(track);
42
43    // Force the container to update sizes so the test can use coordinates that
44    // make sense. This has to be after the adding of the track as we need to
45    // use the track header to figure out our positioning.
46    drawingContainer.updateCanvasSizeIfNeeded_();
47
48    var pixelRatio = window.devicePixelRatio || 1;
49
50    track.heading = ctr.name;
51    track.counter = ctr;
52    track.viewport.xSetWorldBounds(0, 10, track.clientWidth * pixelRatio);
53
54    testFn(ctr, drawingContainer, track);
55  };
56
57  test('instantiate', function() {
58    var ctr = new Counter(undefined, 'testBasicCounter', '',
59        'testBasicCounter');
60    ctr.addSeries(new tracing.trace_model.CounterSeries('value1',
61        tracing.getStringColorId('testBasicCounter.value1')));
62    ctr.addSeries(new tracing.trace_model.CounterSeries('value2',
63        tracing.getStringColorId('testBasicCounter.value2')));
64
65    var timestamps = [0, 1, 2, 3, 4, 5, 6, 7];
66    var samples = [[0, 3, 1, 2, 3, 1, 3, 3.1],
67                   [5, 3, 1, 1.1, 0, 7, 0, 0.5]];
68    for (var i = 0; i < samples.length; ++i) {
69      for (var k = 0; k < timestamps.length; ++k) {
70        ctr.series[i].addSample(timestamps[k], samples[i][k]);
71      }
72    }
73
74    ctr.updateBounds();
75
76    var div = document.createElement('div');
77    this.addHTMLOutput(div);
78
79    var viewport = new Viewport(div);
80
81    var drawingContainer = new tracing.tracks.DrawingContainer(viewport);
82    div.appendChild(drawingContainer);
83    drawingContainer.invalidate();
84
85    var track = new CounterTrack(viewport);
86    drawingContainer.appendChild(track);
87
88    track.heading = ctr.name;
89    track.counter = ctr;
90    track.viewport.xSetWorldBounds(0, 7.7, track.clientWidth);
91  });
92
93  test('basicCounterXPointPicking', function() {
94    var timestamps = [0, 1, 2, 3, 4, 5, 6, 7];
95    var samples = [[0, 3, 1, 2, 3, 1, 3, 3.1],
96                   [5, 3, 1, 1.1, 0, 7, 0, 0.5]];
97
98    runTest.call(this, timestamps, samples, function(ctr, container, track) {
99      var clientRect = track.getBoundingClientRect();
100      var y75 = clientRect.top + (0.75 * clientRect.height);
101
102      // In bounds.
103      var sel = new tracing.Selection();
104      var x = 0.15 * clientRect.width;
105      track.addIntersectingItemsInRangeToSelection(x, x + 1, y75, y75 + 1, sel);
106
107      assertEquals(1, sel.length);
108      assertEquals(track, sel[0].track);
109      assertEquals(ctr, sel[0].counter);
110      assertEquals(1, sel[0].sampleIndex);
111
112      // Outside bounds.
113      sel = new tracing.Selection();
114      var x = -0.5 * clientRect.width;
115      track.addIntersectingItemsInRangeToSelection(x, x + 1, y75, y75 + 1, sel);
116      assertEquals(0, sel.length);
117
118      sel = new tracing.Selection();
119      var x = 0.8 * clientRect.width;
120      track.addIntersectingItemsInRangeToSelection(x, x + 1, y75, y75 + 1, sel);
121      assertEquals(0, sel.length);
122    });
123  });
124});
125