blob: b319fa41c5d6f44c238489233a942bf8dec5431a [file] [log] [blame]
<!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/find_controller.html">
<link rel="import" href="/core/test_utils.html">
<link rel="import" href="/core/timeline_track_view.html">
<link rel="import" href="/core/timeline_view.html">
<script>
'use strict';
tv.b.unittest.testSuite(function() {
var Task = tv.b.Task;
/*
* Just enough of the SelectionController to support the tests below.
*/
function FakeSelectionController() {
this.addAllEventsMatchingFilterToSelectionReturnValue = [];
this.viewport = undefined;
this.model = undefined;
this.selection = new tv.c.Selection();
this.findMatches = new tv.c.Selection();
}
FakeSelectionController.prototype = {
addAllEventsMatchingFilterToSelectionAsTask: function(filter, selection) {
return new Task(function() {
var n = this.addAllEventsMatchingFilterToSelectionReturnValue.length;
for (var i = 0; i < n; i++) {
selection.push(
this.addAllEventsMatchingFilterToSelectionReturnValue[i]);
}
}, this);
},
uiStateFromString: function(string) {
return undefined;
},
findTextChangedTo: function(selection) {
this.findMatches = selection;
this.selection = new tv.c.Selection();
},
findFocusChangedTo: function(selection) {
this.selection = selection;
},
findTextCleared: function(selection) {
this.selection = new tv.c.Selection();
this.findMatches = new tv.c.Selection();
}
};
function assertArrayShallowEquals(a, b, opt_message) {
if (a.length === b.length) {
var ok = true;
for (var i = 0; i < a.length; i++) {
ok &= (a[i] === b[i]);
}
if (ok)
return;
}
var message = opt_message || 'Expected array ' + a + ', got array ' + b;
throw new tv.b.unittest.TestError(message);
};
test('findControllerNoModel', function() {
var selectionController = new FakeSelectionController();
var controller = new tv.c.FindController(selectionController);
controller.findNext();
controller.findPrevious();
});
test('findControllerEmptyHit', function() {
var selectionController = new FakeSelectionController();
var controller = new tv.c.FindController(selectionController);
selectionController.selection = new tv.c.Selection();
selectionController.findMatches = new tv.c.Selection();
controller.findNext();
assertArrayShallowEquals([], selectionController.selection);
assertArrayShallowEquals([], selectionController.findMatches);
controller.findPrevious();
assertArrayShallowEquals([], selectionController.selection);
assertArrayShallowEquals([], selectionController.findMatches);
});
test('findControllerOneHit', function() {
var selectionController = new FakeSelectionController();
var controller = new tv.c.FindController(selectionController);
var s1 = {guid: 1};
selectionController.addAllEventsMatchingFilterToSelectionReturnValue = [
s1
];
controller.filterText = 'asdf';
var promise = controller.updateFilterHits();
promise.then(function() {
assertArrayShallowEquals([], selectionController.selection);
assertArrayShallowEquals([s1], selectionController.findMatches);
controller.findNext();
assertArrayShallowEquals([s1], selectionController.selection);
assertArrayShallowEquals([s1], selectionController.findMatches);
controller.findNext();
assertArrayShallowEquals([s1], selectionController.selection);
assertArrayShallowEquals([s1], selectionController.findMatches);
controller.findPrevious();
assertArrayShallowEquals([s1], selectionController.selection);
assertArrayShallowEquals([s1], selectionController.findMatches);
});
return promise;
});
test('findControllerMultipleHits', function() {
var selectionController = new FakeSelectionController();
var controller = new tv.c.FindController(selectionController);
var s1 = {guid: 1};
var s2 = {guid: 2};
var s3 = {guid: 3};
selectionController.addAllEventsMatchingFilterToSelectionReturnValue = [
s1, s2, s3
];
controller.filterText = 'asdf';
var promise = controller.updateFilterHits();
promise.then(function() {
// Loop through hits then when we wrap, try moving backward.
assertArrayShallowEquals([], selectionController.selection);
assertArrayShallowEquals([s1, s2, s3], selectionController.findMatches);
controller.findNext();
assertArrayShallowEquals([s1], selectionController.selection);
controller.findNext();
assertArrayShallowEquals([s2], selectionController.selection);
controller.findNext();
assertArrayShallowEquals([s3], selectionController.selection);
controller.findNext();
assertArrayShallowEquals([s1], selectionController.selection);
controller.findPrevious();
assertArrayShallowEquals([s3], selectionController.selection);
controller.findPrevious();
assertArrayShallowEquals([s2], selectionController.selection);
assertArrayShallowEquals([s1, s2, s3], selectionController.findMatches);
});
return promise;
});
test('findControllerChangeFilterAfterNext', function() {
var selectionController = new FakeSelectionController();
var controller = new tv.c.FindController(selectionController);
var s1 = {guid: 1};
var s2 = {guid: 2};
var s3 = {guid: 3};
var s4 = {guid: 4};
selectionController.addAllEventsMatchingFilterToSelectionReturnValue = [
s1, s2, s3
];
controller.filterText = 'asdf';
var promise = controller.updateFilterHits();
promise.then(function() {
// Loop through hits then when we wrap, try moving backward.
controller.findNext();
selectionController.addAllEventsMatchingFilterToSelectionReturnValue = [
s4
];
controller.filterText = 'asdfsf';
var nextPromise = controller.updateFilterHits();
nextPromise.then(function() {
controller.findNext();
assertArrayShallowEquals([s4], selectionController.selection);
});
});
return promise;
});
test('findControllerSelectsAllItemsFirst', function() {
var selectionController = new FakeSelectionController();
var controller = new tv.c.FindController(selectionController);
var s1 = {guid: 1};
var s2 = {guid: 2};
var s3 = {guid: 3};
selectionController.addAllEventsMatchingFilterToSelectionReturnValue = [
s1, s2, s3
];
controller.filterText = 'asdfsf';
var promise = controller.updateFilterHits();
promise.then(function() {
assertArrayShallowEquals([], selectionController.selection);
assertArrayShallowEquals([s1, s2, s3], selectionController.findMatches);
controller.findNext();
assertArrayShallowEquals([s1], selectionController.selection);
controller.findNext();
assertArrayShallowEquals([s2], selectionController.selection);
assertArrayShallowEquals([s1, s2, s3], selectionController.findMatches);
});
return promise;
});
test('findControllerWithRealTimeline', function() {
var model = tv.c.test_utils.newModel(function(model) {
var p1 = model.getOrCreateProcess(1);
var t1 = p1.getOrCreateThread(1);
t1.sliceGroup.pushSlice(new tv.c.trace_model.ThreadSlice(
'', 'a', 0, 1, {}, 3));
model.t1 = t1;
});
var timeline = new tv.c.TimelineView();
timeline.model = model;
var selectionController = timeline.selectionController;
var controller = timeline.findCtl_.controller;
// Test find with no filterText.
controller.findNext();
// Test find with filter txt.
controller.filterText = 'a';
var promise = controller.updateFilterHits();
promise = promise.then(function() {
assert.equal(selectionController.selection.length, 0);
assert.deepEqual(tv.b.asArray(selectionController.findMatches),
model.t1.sliceGroup.slices);
controller.findNext();
assert.equal(selectionController.selection.length, 1);
assert.equal(selectionController.selection[0],
model.t1.sliceGroup.slices[0]);
controller.filterText = 'xxx';
var nextPromise = controller.updateFilterHits();
nextPromise.then(function() {
assert.equal(selectionController.findMatches.length, 0);
assert.equal(selectionController.selection.length, 1);
controller.findNext();
assert.equal(selectionController.selection.length, 0);
controller.findNext();
assert.equal(selectionController.selection.length, 0);
});
return nextPromise;
});
return promise;
});
test('findControllerNavigation', function() {
var selectionController = new FakeSelectionController();
var controller = new tv.c.FindController(selectionController);
var navToPositionCallCount = 0;
var fakeUIState = {};
selectionController.uiStateFromString = function(string) {
if (string === '')
return undefined;
assert.equal(string, '2000@1.2x7');
return fakeUIState;
}
selectionController.navToPosition = function(uiState) {
assert.equal(uiState, fakeUIState);
navToPositionCallCount++;
};
controller.filterText = '2000@1.2x7';
controller.updateFilterHits();
assert.equal(navToPositionCallCount, 1);
var findTextClearedCallCount = 0;
selectionController.findTextCleared = function() {
findTextClearedCallCount++;
};
controller.filterText = '';
controller.updateFilterHits();
assert.equal(findTextClearedCallCount, 1);
});
});
</script>