analysis_view_test.html revision 8d2b206a675ec20ea07100c35df34e65ee1e45e8
1<!DOCTYPE html>
2<!--
3Copyright (c) 2013 The Chromium Authors. All rights reserved.
4Use of this source code is governed by a BSD-style license that can be
5found in the LICENSE file.
6-->
7
8<link rel="import" href="/tracing/core/test_utils.html">
9<link rel="import" href="/tracing/model/counter.html">
10<link rel="import" href="/tracing/model/counter_sample.html">
11<link rel="import" href="/tracing/model/counter_series.html">
12<link rel="import" href="/tracing/model/event_set.html">
13<link rel="import" href="/tracing/model/interaction_record.html">
14<link rel="import" href="/tracing/ui/analysis/analysis_view.html">
15<link rel="import" href="/tracing/ui/brushing_state_controller.html">
16
17<script>
18'use strict';
19
20tr.b.unittest.testSuite(function() {
21  var EventSet = tr.model.EventSet;
22  var BrushingStateController = tr.c.BrushingStateController;
23  var Model = tr.Model;
24  var Counter = tr.model.Counter;
25  var CounterSeries = tr.model.CounterSeries;
26  var CounterSample = tr.model.CounterSample;
27  var newThreadSlice = tr.c.TestUtils.newThreadSlice;
28  var SCHEDULING_STATE = tr.model.SCHEDULING_STATE;
29  var InteractionRecord = tr.model.InteractionRecord;
30
31  function assertEventSet(actualEventSet, expectedEvents) {
32    var expectedEventSet = new EventSet(expectedEvents);
33    assert.isTrue(actualEventSet.equals(expectedEventSet),
34        'EventSet objects are not equal');
35  }
36
37  function checkTab(tab, expectedTagName, expectedSelectionEvents) {
38    assert.equal(tab.tagName, expectedTagName.toUpperCase());
39    assertEventSet(tab.selection, expectedSelectionEvents);
40  }
41
42  test('selectedTabChange', function() {
43    // Set up the model.
44    var model = new Model();
45    var process = model.getOrCreateProcess(1);
46
47    var counter = process.getOrCreateCounter('universe', 'planets');
48    var series = counter.addSeries(new CounterSeries('x', 0));
49    var sample1 = series.addCounterSample(0, 100);
50    var sample2 = series.addCounterSample(1, 90);
51    var sample3 = series.addCounterSample(2, 80);
52
53    var thread = process.getOrCreateThread(2);
54    var slice1 = newThreadSlice(thread, SCHEDULING_STATE.RUNNING, 0, 1);
55    var slice2 = newThreadSlice(thread, SCHEDULING_STATE.SLEEPING, 1, 2.718);
56    thread.timeSlices = [slice1, slice2];
57
58    var record1 = new InteractionRecord(model, 'r1', 0, 200, 300);
59    record1.associatedEvents.push(sample1);
60    record1.associatedEvents.push(slice1);
61    var record2 = new InteractionRecord(model, 'r2', 0, 600, 100);
62    record2.associatedEvents.push(sample2);
63    record2.associatedEvents.push(sample3);
64    record2.associatedEvents.push(slice1);
65
66    // Set up the analysis views and brushing state controller.
67    var analysisView = document.createElement('tr-ui-a-analysis-view');
68    this.addHTMLOutput(analysisView);
69    var tabView = analysisView.tabView;
70    var controller = new BrushingStateController(undefined);
71    analysisView.brushingStateController = controller;
72
73    function checkSelectedTab(expectedSelectedTab, expectedRelatedEvents) {
74      assert.strictEqual(tabView.selectedTab, expectedSelectedTab);
75      assertEventSet(controller.currentBrushingState.analysisViewRelatedEvents,
76          expectedRelatedEvents);
77    }
78
79    // 1. Empty selection (implicit).
80    assert.lengthOf(tabView.tabs, 0);
81    checkSelectedTab(undefined, []);
82
83    // 2. Event selection: two samples and one thread slice.
84    controller.changeSelectionFromRequestSelectionChangeEvent(
85        new EventSet([sample1, slice1, sample2]));
86    assert.lengthOf(tabView.tabs, 2);
87    var sampleTab2 = tabView.tabs[0];
88    checkTab(sampleTab2,
89        'tr-ui-a-counter-sample-sub-view',
90        [sample1, sample2]);
91    var singleThreadSliceTab2 = tabView.tabs[1];
92    checkTab(singleThreadSliceTab2,
93        'tr-ui-a-single-thread-time-slice-sub-view',
94        [slice1]);
95    // First tab should be selected.
96    checkSelectedTab(sampleTab2, []);
97
98    // 3. Tab selection: single thread slice tab.
99    tabView.selectedTab = singleThreadSliceTab2;
100    checkSelectedTab(singleThreadSliceTab2, []);
101
102    // 4. Event selection: one sample, two thread slices, and one interaction
103    // record.
104    controller.changeSelectionFromRequestSelectionChangeEvent(
105        new EventSet([slice1, slice2, sample3, record1]));
106    assert.lengthOf(tabView.tabs, 3);
107    var sampleTab4 = tabView.tabs[1];
108    checkTab(sampleTab4,
109        'tr-ui-a-counter-sample-sub-view',
110        [sample3]);
111    // Reuse tab (same event type and sub-view tag name).
112    assert.strictEqual(sampleTab4, sampleTab2);
113    var singleRecordTab4 = tabView.tabs[2];
114    checkTab(singleRecordTab4,
115        'tr-ui-a-single-interaction-record-sub-view',
116        [record1]);
117    var multiThreadSliceTab4 = tabView.tabs[0];
118    checkTab(multiThreadSliceTab4,
119        'tr-ui-a-multi-thread-time-slice-sub-view',
120        [slice1, slice2]);
121    // Remember selected tab (even though the tab was destroyed).
122    checkSelectedTab(multiThreadSliceTab4, []);
123
124    // 5. Tab selection: single interaction record tab.
125    tabView.selectedTab = singleRecordTab4;
126    checkSelectedTab(singleRecordTab4, [sample1, slice1]);
127
128    // 6. Event selection: one interaction record.
129    controller.changeSelectionFromRequestSelectionChangeEvent(
130        new EventSet([record2]));
131    assert.lengthOf(tabView.tabs, 1);
132    var singleRecordTab6 = tabView.tabs[0];
133    checkTab(singleRecordTab6,
134        'tr-ui-a-single-interaction-record-sub-view',
135        [record2]);
136    // Reuse tab (same event type and sub-view tag name).
137    assert.strictEqual(singleRecordTab6, singleRecordTab4);
138    // Remember selected tab.
139    checkSelectedTab(singleRecordTab6, [sample2, sample3, slice1]);
140  });
141});
142</script>
143