166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// Copyright (c) 2013 The Chromium Authors. All rights reserved.
266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// Use of this source code is governed by a BSD-style license that can be
366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// found in the LICENSE file.
466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis'use strict';
666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('tracing.test_utils');
866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('tracing.find_control');
966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
1066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.unittest.testSuite('tracing.find_control', function() {
1166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  /*
1266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   * Just enough of the Timeline to support the tests below.
1366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   */
1466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  var FakeTimeline = ui.define('div');
1566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
1666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  FakeTimeline.prototype = {
1766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    __proto__: HTMLDivElement.prototype,
1866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
1966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    decorate: function() {
2066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.addAllObjectsMatchingFilterToSelectionReturnValue = [];
2166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
2266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.selection = new tracing.Selection();
2366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.keyHelp = '<keyHelp>';
2466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
2566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      // Put some simple UI in for testing purposes.
2666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var noteEl = document.createElement('div');
2766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      noteEl.textContent = 'FakeTimeline:';
2866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.appendChild(noteEl);
2966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
3066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.statusEl_ = document.createElement('div');
3166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.appendChild(this.statusEl_);
3266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.refresh_();
3366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
3466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
3566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    refresh_: function() {
3666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var status;
3766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (this.model)
3866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        status = 'model=set';
3966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      else
4066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        status = 'model=undefined';
4166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.statusEl_.textContent = status;
4266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
4366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
4466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    zoomToSelection: function() {},
4566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
4666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    panToSelection: function() {},
4766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
4866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    addAllObjectsMatchingFilterToSelection: function(filter, selection) {
4966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var n = this.addAllObjectsMatchingFilterToSelectionReturnValue.length;
5066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      for (var i = 0; i < n; i++)
5166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        selection.push_(
5266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            this.addAllObjectsMatchingFilterToSelectionReturnValue[i]);
5366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    }
5466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  };
5566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
5666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  test('instantiate', function() {
5766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var ctl = new tracing.FindControl();
5866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var didFindPrevious = false;
5966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var didFindNext = false;
6066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    ctl.controller = {
6166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      findNext: function() {
6266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        didFindNext = true;
6366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      },
6466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
6566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      findPrevious: function() {
6666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        didFindPrevious = true;
6766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      },
6866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
6966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      reset: function() {},
7066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
7166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      filterHits: [],
7266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
7366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      currentHitIndex: 0
7466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    };
7566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
7666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    this.addHTMLOutput(ctl);
7766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
7866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    ctl.querySelector('input').focus();
7966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    ctl.querySelector('input').blur();
8066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
8166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    ctl.querySelector('.find-previous').click();
8266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertTrue(didFindPrevious);
8366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    ctl.querySelector('.find-next').click();
8466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertTrue(didFindNext);
8566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  });
8666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
8766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  test('findControllerNoTimeline', function() {
8866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var controller = new tracing.FindController();
8966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.findNext();
9066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.findPrevious();
9166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  });
9266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
9366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  test('findControllerEmptyHit', function() {
9466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var timeline = new FakeTimeline();
9566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var controller = new tracing.FindController();
9666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.timeline = timeline;
9766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
9866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    timeline.selection = new tracing.Selection();
9966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.findNext();
10066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertArrayShallowEquals([], timeline.selection);
10166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.findPrevious();
10266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertArrayShallowEquals([], timeline.selection);
10366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  });
10466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
10566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  test('findControllerOneHit', function() {
10666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var timeline = new FakeTimeline();
10766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var controller = new tracing.FindController();
10866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.timeline = timeline;
10966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
11066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    timeline.addAllObjectsMatchingFilterToSelectionReturnValue = [1];
11166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.filterText = 'asdf';
11266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
11366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.findNext();
11466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertArrayShallowEquals([1], timeline.selection);
11566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.findNext();
11666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertArrayShallowEquals([1], timeline.selection);
11766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.findPrevious();
11866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertArrayShallowEquals([1], timeline.selection);
11966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  });
12066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
12166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  test('findControllerMultipleHits', function() {
12266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var timeline = new FakeTimeline();
12366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var controller = new tracing.FindController();
12466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.timeline = timeline;
12566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
12666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    timeline.addAllObjectsMatchingFilterToSelectionReturnValue = [1, 2, 3];
12766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.filterText = 'asdf';
12866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
12966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    // Loop through hits then when we wrap, try moving backward.
13066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.findNext();
13166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertArrayShallowEquals([1], timeline.selection);
13266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.findNext();
13366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertArrayShallowEquals([2], timeline.selection);
13466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.findNext();
13566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertArrayShallowEquals([3], timeline.selection);
13666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.findNext();
13766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertArrayShallowEquals([1], timeline.selection);
13866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.findPrevious();
13966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertArrayShallowEquals([3], timeline.selection);
14066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.findPrevious();
14166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertArrayShallowEquals([2], timeline.selection);
14266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  });
14366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
14466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  test('findControllerChangeFilterAfterNext', function() {
14566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var timeline = new FakeTimeline();
14666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var controller = new tracing.FindController();
14766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.timeline = timeline;
14866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
14966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    timeline.addAllObjectsMatchingFilterToSelectionReturnValue = [1, 2, 3];
15066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.filterText = 'asdf';
15166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
15266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    // Loop through hits then when we wrap, try moving backward.
15366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.findNext();
15466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    timeline.addAllObjectsMatchingFilterToSelectionReturnValue = [4];
15566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.filterText = 'asdfsf';
15666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.findNext();
15766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertArrayShallowEquals([4], timeline.selection);
15866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  });
15966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
16066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  test('findControllerSelectsAllItemsFirst', function() {
16166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var timeline = new FakeTimeline();
16266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var controller = new tracing.FindController();
16366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.timeline = timeline;
16466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
16566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    timeline.addAllObjectsMatchingFilterToSelectionReturnValue = [1, 2, 3];
16666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.filterText = 'asdfsf';
16766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertArrayShallowEquals([1, 2, 3], timeline.selection);
16866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.findNext();
16966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertArrayShallowEquals([1], timeline.selection);
17066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.findNext();
17166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertArrayShallowEquals([2], timeline.selection);
17266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  });
17366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
17466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  test('findControllerWithRealTimeline', function() {
17566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var model = new tracing.TraceModel();
17666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var p1 = model.getOrCreateProcess(1);
17766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var t1 = p1.getOrCreateThread(1);
17866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    t1.sliceGroup.pushSlice(new tracing.trace_model.ThreadSlice(
17966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        '', 'a', 0, 1, {}, 3));
18066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
18166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var timeline = new tracing.TimelineTrackView();
18266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    timeline.model = model;
18366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
18466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var controller = new tracing.FindController();
18566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.timeline = timeline;
18666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
18766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    // Test find with no filterText.
18866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.findNext();
18966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
19066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    // Test find with filter txt.
19166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.filterText = 'a';
19266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.findNext();
19366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertEquals(1, timeline.selection.length);
19466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertEquals(t1.sliceGroup.slices[0], timeline.selection[0].slice);
19566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
19666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.filterText = 'xxx';
19766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.findNext();
19866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertEquals(0, timeline.selection.length);
19966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    controller.findNext();
20066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    assertEquals(0, timeline.selection.length);
20166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  });
20266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis});
203