| <!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="/core/brushing_state_controller.html"> |
| <link rel="import" href="/core/test_utils.html"> |
| <link rel="import" href="/model/counter.html"> |
| <link rel="import" href="/model/counter_sample.html"> |
| <link rel="import" href="/model/counter_series.html"> |
| <link rel="import" href="/model/event_set.html"> |
| <link rel="import" href="/model/interaction_record.html"> |
| <link rel="import" href="/ui/analysis/analysis_view.html"> |
| |
| <script> |
| 'use strict'; |
| |
| tr.b.unittest.testSuite(function() { |
| var EventSet = tr.model.EventSet; |
| var BrushingStateController = tr.c.BrushingStateController; |
| var Model = tr.Model; |
| var Counter = tr.model.Counter; |
| var CounterSeries = tr.model.CounterSeries; |
| var CounterSample = tr.model.CounterSample; |
| var newThreadSlice = tr.c.test_utils.newThreadSlice; |
| var SCHEDULING_STATE = tr.model.SCHEDULING_STATE; |
| var InteractionRecord = tr.model.InteractionRecord; |
| |
| function assertEventSet(actualEventSet, expectedEvents) { |
| var expectedEventSet = new EventSet(expectedEvents); |
| assert.isTrue(actualEventSet.equals(expectedEventSet), |
| 'EventSet objects are not equal'); |
| } |
| |
| function checkTab(tab, expectedTagName, expectedSelectionEvents) { |
| assert.equal(tab.tagName, expectedTagName.toUpperCase()); |
| assertEventSet(tab.selection, expectedSelectionEvents); |
| } |
| |
| test('selectedTabChange', function() { |
| // Set up the model. |
| var model = new Model(); |
| var process = model.getOrCreateProcess(1); |
| |
| var counter = process.getOrCreateCounter('universe', 'planets'); |
| var series = counter.addSeries(new CounterSeries('x', 0)); |
| var sample1 = series.addCounterSample(0, 100); |
| var sample2 = series.addCounterSample(1, 90); |
| var sample3 = series.addCounterSample(2, 80); |
| |
| var thread = process.getOrCreateThread(2); |
| var slice1 = newThreadSlice(thread, SCHEDULING_STATE.RUNNING, 0, 1); |
| var slice2 = newThreadSlice(thread, SCHEDULING_STATE.SLEEPING, 1, 2.718); |
| thread.timeSlices = [slice1, slice2]; |
| |
| var record1 = new InteractionRecord('r1', 0, 200, 300); |
| record1.associatedEvents.push(sample1); |
| record1.associatedEvents.push(slice1); |
| var record2 = new InteractionRecord('r2', 0, 600, 100); |
| record2.associatedEvents.push(sample2); |
| record2.associatedEvents.push(sample3); |
| record2.associatedEvents.push(slice1); |
| |
| // Set up the analysis views and brushing state controller. |
| var analysisView = document.createElement('tr-ui-a-analysis-view'); |
| this.addHTMLOutput(analysisView); |
| var tabView = analysisView.tabView; |
| var controller = new BrushingStateController(undefined); |
| analysisView.brushingStateController = controller; |
| |
| function checkSelectedTab(expectedSelectedTab, expectedRelatedEvents) { |
| assert.strictEqual(tabView.selectedTab, expectedSelectedTab); |
| assertEventSet(controller.currentBrushingState.analysisViewRelatedEvents, |
| expectedRelatedEvents); |
| } |
| |
| // 1. Empty selection (implicit). |
| assert.lengthOf(tabView.tabs, 0); |
| checkSelectedTab(undefined, []); |
| |
| // 2. Event selection: two samples and one thread slice. |
| controller.changeSelectionFromRequestSelectionChangeEvent( |
| new EventSet([sample1, slice1, sample2])); |
| assert.lengthOf(tabView.tabs, 2); |
| var sampleTab2 = tabView.tabs[0]; |
| checkTab(sampleTab2, |
| 'tr-ui-a-counter-sample-sub-view', |
| [sample1, sample2]); |
| var singleThreadSliceTab2 = tabView.tabs[1]; |
| checkTab(singleThreadSliceTab2, |
| 'tr-ui-a-single-thread-time-slice-sub-view', |
| [slice1]); |
| // First tab should be selected. |
| checkSelectedTab(sampleTab2, []); |
| |
| // 3. Tab selection: single thread slice tab. |
| tabView.selectedTab = singleThreadSliceTab2; |
| checkSelectedTab(singleThreadSliceTab2, []); |
| |
| // 4. Event selection: one sample, two thread slices, and one interaction |
| // record. |
| controller.changeSelectionFromRequestSelectionChangeEvent( |
| new EventSet([slice1, slice2, sample3, record1])); |
| assert.lengthOf(tabView.tabs, 3); |
| var sampleTab4 = tabView.tabs[0]; |
| checkTab(sampleTab4, |
| 'tr-ui-a-counter-sample-sub-view', |
| [sample3]); |
| // Reuse tab (same event type and sub-view tag name). |
| assert.strictEqual(sampleTab4, sampleTab2); |
| var singleRecordTab4 = tabView.tabs[1]; |
| checkTab(singleRecordTab4, |
| 'tr-ui-a-single-interaction-record-sub-view', |
| [record1]); |
| var multiThreadSliceTab4 = tabView.tabs[2]; |
| checkTab(multiThreadSliceTab4, |
| 'tr-ui-a-multi-thread-time-slice-sub-view', |
| [slice1, slice2]); |
| // Remember selected tab (even though the tab was destroyed). |
| checkSelectedTab(multiThreadSliceTab4, []); |
| |
| // 5. Tab selection: single interaction record tab. |
| tabView.selectedTab = singleRecordTab4; |
| checkSelectedTab(singleRecordTab4, [sample1, slice1]); |
| |
| // 6. Event selection: one interaction record. |
| controller.changeSelectionFromRequestSelectionChangeEvent( |
| new EventSet([record2])); |
| assert.lengthOf(tabView.tabs, 1); |
| var singleRecordTab6 = tabView.tabs[0]; |
| checkTab(singleRecordTab6, |
| 'tr-ui-a-single-interaction-record-sub-view', |
| [record2]); |
| // Reuse tab (same event type and sub-view tag name). |
| assert.strictEqual(singleRecordTab6, singleRecordTab4); |
| // Remember selected tab. |
| checkSelectedTab(singleRecordTab6, [sample2, sample3, slice1]); |
| }); |
| }); |
| </script> |