<!DOCTYPE HTML>
<html>
<!--
Copyright (c) 2012 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.
-->
<head i18n-values="dir:textdirection;">
<title>TimelineView tests</title>
<link rel="stylesheet" href="overlay.css">
<link rel="stylesheet" href="timeline.css">
<link rel="stylesheet" href="timeline_analysis.css">
<link rel="stylesheet" href="timeline_view.css">
<link rel="stylesheet" href="../shared/css/tabs.css">
<script src="http://closure-library.googlecode.com/svn/trunk/closure/goog/base.js"></script>
<script src="../shared/js/cr.js"></script>
<script src="../shared/js/cr/event_target.js"></script>
<script src="../shared/js/cr/ui.js"></script>
<script src="../shared/js/cr/ui/tabs.js"></script>
<script src="overlay.js"></script>
<script src="measuring_stick.js"></script>
<script src="profiling_view.js"></script>
<script src="timeline_analysis.js"></script>
<script src="timeline_view.js"></script>
<script src="timeline_model.js"></script>
<script src="linux_perf_importer.js"></script>
<script src="trace_event_importer.js"></script>
<script src="timeline.js"></script>
<script src="timeline_track.js"></script>
<script src="sorted_array_utils.js"></script>
<script src="fast_rect_renderer.js"></script>
<script src="test_utils.js"></script>
<script>
goog.require('goog.testing.jsunit');
</script>
<style>
.timeline-view {
border: 1px solid black;
margin: 10px;
}
.timeline-find-dialog {
border: 1px solid black;
margin: 10px;
}
</style>
</head>
<body>
<script>
'use strict';
var assertArrayishEquals = test_utils.assertArrayishEquals;
/*
* Just enough of the Timeline to support the tests below.
*/
var FakeTimeline = cr.ui.define('div');
FakeTimeline.prototype = {
__proto__: HTMLDivElement.prototype,
decorate: function() {
this.addAllObjectsMatchingFilterToSelectionReturnValue = [];
this.selection = new tracing.TimelineSelection();
this.keyHelp = "<keyHelp>";
// Put some simple UI in for testing purposes.
var noteEl = document.createElement('div');
noteEl.textContent = "FakeTimeline:";
this.appendChild(noteEl);
this.statusEl_ = document.createElement('div');
this.appendChild(this.statusEl_);
this.refresh_();
},
refresh_: function() {
var status;
if (this.model)
status = "model=set";
else
status = "model=undefined";
this.statusEl_.textContent = status;
},
setSelectionAndMakeVisible: function(selection, zoomAllowed) {
this.selection = selection;
},
addAllObjectsMatchingFilterToSelection: function(filter, selection) {
var n = this.addAllObjectsMatchingFilterToSelectionReturnValue.length;
for (var i = 0; i < n; i++)
selection.push_(
this.addAllObjectsMatchingFilterToSelectionReturnValue[i]);
}
};
/*
* This test just instantiates a TimelineView and adds it to the DOM
* to help with non-unittest UI work.
*/
function testInstantiateTimelineView() {
var events = [
{name: 'a', args: {}, pid: 52, ts: 520, cat: 'foo', tid: 53, ph: 'B'},
{name: 'a', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'E'},
{name: 'b', args: {}, pid: 52, ts: 629, cat: 'foo', tid: 53, ph: 'B'},
{name: 'b', args: {}, pid: 52, ts: 631, cat: 'foo', tid: 53, ph: 'E'},
{name: 'a', args: {}, pid: 52, ts: 640, cat: 'foo', tid: 53, ph: 'B'},
{name: 'a', args: {}, pid: 52, ts: 700, cat: 'foo', tid: 53, ph: 'E'},
{name: 'a', args: {}, pid: 52, ts: 710, cat: 'foo', tid: 53, ph: 'B'},
{name: 'a', args: {}, pid: 52, ts: 740, cat: 'foo', tid: 53, ph: 'E'}
];
var model = new tracing.TimelineModel();
model.importEvents(events);
var view = new tracing.TimelineView();
view.model = model;
view.tabIndex = 0;
view.focusElement = view;
document.body.appendChild(view);
}
/*
* This test just instantiates a FindDialog and adds it to the DOM
* to help with non-unittest UI work.
*/
function testInstantiateTimelineFindControl() {
var ctl = new tracing.TimelineFindControl();
var didFindPrevious = false;
var didFindNext = false;
ctl.controller = {
findNext: function() {
didFindNext = true;
},
findPrevious: function() {
didFindPrevious = true;
},
filterHits: [],
currentHitIndex: 0,
}
document.body.appendChild(ctl);
ctl.querySelector('input').focus();
ctl.querySelector('input').blur();
ctl.querySelector('.find-previous').click();
assertTrue(didFindPrevious);
ctl.querySelector('.find-next').click();
assertTrue(didFindNext);
}
function testFindControllerNoTimeline() {
var controller = new tracing.TimelineFindController();
controller.findNext();
controller.findPrevious();
}
function testFindControllerEmptyHit() {
var timeline = new FakeTimeline();
var controller = new tracing.TimelineFindController();
controller.timeline = timeline;
timeline.selection = new tracing.TimelineSelection();
controller.findNext();
assertArrayishEquals([], timeline.selection);
controller.findPrevious();
assertArrayishEquals([], timeline.selection);
}
function testFindControllerOneHit() {
var timeline = new FakeTimeline();
var controller = new tracing.TimelineFindController();
controller.timeline = timeline;
timeline.addAllObjectsMatchingFilterToSelectionReturnValue = [1];
controller.findNext();
assertArrayishEquals([1], timeline.selection);
controller.findNext();
assertArrayishEquals([1], timeline.selection);
controller.findPrevious();
assertArrayishEquals([1], timeline.selection);
}
function testFindControllerMultipleHits() {
var timeline = new FakeTimeline();
var controller = new tracing.TimelineFindController();
controller.timeline = timeline;
timeline.addAllObjectsMatchingFilterToSelectionReturnValue = [1,2,3];
// Loop through hits then when we wrap, try moving backward.
controller.findNext();
assertArrayishEquals([1], timeline.selection);
controller.findNext();
assertArrayishEquals([2], timeline.selection);
controller.findNext();
assertArrayishEquals([3], timeline.selection);
controller.findNext();
assertArrayishEquals([1], timeline.selection);
controller.findPrevious();
assertArrayishEquals([3], timeline.selection);
controller.findPrevious();
assertArrayishEquals([2], timeline.selection);
}
function testFindControllerChangeFilterAfterNext() {
var timeline = new FakeTimeline();
var controller = new tracing.TimelineFindController();
controller.timeline = timeline;
timeline.addAllObjectsMatchingFilterToSelectionReturnValue = [1,2,3];
// Loop through hits then when we wrap, try moving backward.
controller.findNext();
timeline.addAllObjectsMatchingFilterToSelectionReturnValue = [4];
controller.filterText = "asdfsf";
controller.findNext();
assertArrayishEquals([4], timeline.selection);
}
function testFindControllerSelectsFirstItemImmediately() {
var timeline = new FakeTimeline();
var controller = new tracing.TimelineFindController();
controller.timeline = timeline;
timeline.addAllObjectsMatchingFilterToSelectionReturnValue = [1,2,3];
controller.filterText = "asdfsf";
assertArrayishEquals([1], timeline.selection);
controller.findNext();
assertArrayishEquals([2], timeline.selection);
}
function testFindControllerWithRealTimeline() {
var model = new tracing.TimelineModel();
var p1 = model.getOrCreateProcess(1);
var t1 = p1.getOrCreateThread(1);
t1.subRows[0].push(new tracing.TimelineThreadSlice('a', 0, 1, {}, 3));
var timeline = new tracing.Timeline();
timeline.model = model;
var controller = new tracing.TimelineFindController();
controller.timeline = timeline;
// Test find with no filterText.
controller.findNext();
// Test find with filter txt.
controller.filterText = 'a';
controller.findNext();
assertEquals(1, timeline.selection.length);
assertEquals(t1.subRows[0][0], timeline.selection[0].slice);
controller.filterText = 'xxx';
controller.findNext();
assertEquals(0, timeline.selection.length);
controller.findNext();
assertEquals(0, timeline.selection.length);
}
</script>
</body>
</html>