<!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="/tracing/core/test_utils.html">
<link rel="import" href="/tracing/model/counter.html">
<link rel="import" href="/tracing/model/counter_sample.html">
<link rel="import" href="/tracing/model/counter_series.html">
<link rel="import" href="/tracing/model/event_set.html">
<link rel="import" href="/tracing/model/interaction_record.html">
<link rel="import" href="/tracing/ui/analysis/analysis_view.html">
<link rel="import" href="/tracing/ui/brushing_state_controller.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>
