// 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.
'use strict';
base.require('tracing.test_utils');
base.require('tracing.find_control');
base.unittest.testSuite('tracing.find_control', function() {
/*
* Just enough of the Timeline to support the tests below.
*/
var FakeTimeline = ui.define('div');
FakeTimeline.prototype = {
__proto__: HTMLDivElement.prototype,
decorate: function() {
this.addAllObjectsMatchingFilterToSelectionReturnValue = [];
this.selection = new tracing.Selection();
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;
},
zoomToSelection: function() {},
panToSelection: function() {},
addAllObjectsMatchingFilterToSelection: function(filter, selection) {
var n = this.addAllObjectsMatchingFilterToSelectionReturnValue.length;
for (var i = 0; i < n; i++)
selection.push_(
this.addAllObjectsMatchingFilterToSelectionReturnValue[i]);
}
};
test('instantiate', function() {
var ctl = new tracing.FindControl();
var didFindPrevious = false;
var didFindNext = false;
ctl.controller = {
findNext: function() {
didFindNext = true;
},
findPrevious: function() {
didFindPrevious = true;
},
reset: function() {},
filterHits: [],
currentHitIndex: 0
};
this.addHTMLOutput(ctl);
ctl.querySelector('input').focus();
ctl.querySelector('input').blur();
ctl.querySelector('.find-previous').click();
assertTrue(didFindPrevious);
ctl.querySelector('.find-next').click();
assertTrue(didFindNext);
});
test('findControllerNoTimeline', function() {
var controller = new tracing.FindController();
controller.findNext();
controller.findPrevious();
});
test('findControllerEmptyHit', function() {
var timeline = new FakeTimeline();
var controller = new tracing.FindController();
controller.timeline = timeline;
timeline.selection = new tracing.Selection();
controller.findNext();
assertArrayShallowEquals([], timeline.selection);
controller.findPrevious();
assertArrayShallowEquals([], timeline.selection);
});
test('findControllerOneHit', function() {
var timeline = new FakeTimeline();
var controller = new tracing.FindController();
controller.timeline = timeline;
timeline.addAllObjectsMatchingFilterToSelectionReturnValue = [1];
controller.filterText = 'asdf';
controller.findNext();
assertArrayShallowEquals([1], timeline.selection);
controller.findNext();
assertArrayShallowEquals([1], timeline.selection);
controller.findPrevious();
assertArrayShallowEquals([1], timeline.selection);
});
test('findControllerMultipleHits', function() {
var timeline = new FakeTimeline();
var controller = new tracing.FindController();
controller.timeline = timeline;
timeline.addAllObjectsMatchingFilterToSelectionReturnValue = [1, 2, 3];
controller.filterText = 'asdf';
// Loop through hits then when we wrap, try moving backward.
controller.findNext();
assertArrayShallowEquals([1], timeline.selection);
controller.findNext();
assertArrayShallowEquals([2], timeline.selection);
controller.findNext();
assertArrayShallowEquals([3], timeline.selection);
controller.findNext();
assertArrayShallowEquals([1], timeline.selection);
controller.findPrevious();
assertArrayShallowEquals([3], timeline.selection);
controller.findPrevious();
assertArrayShallowEquals([2], timeline.selection);
});
test('findControllerChangeFilterAfterNext', function() {
var timeline = new FakeTimeline();
var controller = new tracing.FindController();
controller.timeline = timeline;
timeline.addAllObjectsMatchingFilterToSelectionReturnValue = [1, 2, 3];
controller.filterText = 'asdf';
// Loop through hits then when we wrap, try moving backward.
controller.findNext();
timeline.addAllObjectsMatchingFilterToSelectionReturnValue = [4];
controller.filterText = 'asdfsf';
controller.findNext();
assertArrayShallowEquals([4], timeline.selection);
});
test('findControllerSelectsAllItemsFirst', function() {
var timeline = new FakeTimeline();
var controller = new tracing.FindController();
controller.timeline = timeline;
timeline.addAllObjectsMatchingFilterToSelectionReturnValue = [1, 2, 3];
controller.filterText = 'asdfsf';
assertArrayShallowEquals([1, 2, 3], timeline.selection);
controller.findNext();
assertArrayShallowEquals([1], timeline.selection);
controller.findNext();
assertArrayShallowEquals([2], timeline.selection);
});
test('findControllerWithRealTimeline', function() {
var model = new tracing.TraceModel();
var p1 = model.getOrCreateProcess(1);
var t1 = p1.getOrCreateThread(1);
t1.sliceGroup.pushSlice(new tracing.trace_model.ThreadSlice(
'', 'a', 0, 1, {}, 3));
var timeline = new tracing.TimelineTrackView();
timeline.model = model;
var controller = new tracing.FindController();
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.sliceGroup.slices[0], timeline.selection[0].slice);
controller.filterText = 'xxx';
controller.findNext();
assertEquals(0, timeline.selection.length);
controller.findNext();
assertEquals(0, timeline.selection.length);
});
});