<!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/base/unit.html">
<link rel="import" href="/tracing/core/test_utils.html">
<link rel="import" href="/tracing/model/event_set.html">
<link rel="import" href="/tracing/model/model.html">
<link rel="import" href="/tracing/ui/analysis/selection_summary_table.html">
<link rel="import" href="/tracing/ui/base/deep_utils.html">

<script>
'use strict';

tr.b.unittest.testSuite(function() {
  var Model = tr.Model;
  var EventSet = tr.model.EventSet;
  var newSliceEx = tr.c.TestUtils.newSliceEx;

  test('noSelection', function() {
    var summaryTable =
        document.createElement('tr-ui-a-selection-summary-table');
    summaryTable.selection = undefined;
    this.addHTMLOutput(summaryTable);

    var tableEl = tr.b.findDeepElementMatching(
        summaryTable, 'tr-ui-b-table');
    assert.equal(tableEl.tableRows[0].value, '<empty>');
    assert.equal(tableEl.tableRows[1].value, '<empty>');
  });

  test('emptySelection', function() {
    var summaryTable =
        document.createElement('tr-ui-a-selection-summary-table');
    var selection = new EventSet();
    summaryTable.selection = selection;
    this.addHTMLOutput(summaryTable);

    var tableEl = tr.b.findDeepElementMatching(
        summaryTable, 'tr-ui-b-table');
    assert.equal(tableEl.tableRows[0].value, '<empty>');
    assert.equal(tableEl.tableRows[1].value, '<empty>');
  });

  test('selection', function() {
    var model = new Model();
    var thread = model.getOrCreateProcess(1).getOrCreateThread(2);
    var tsg = thread.sliceGroup;

    tsg.pushSlice(newSliceEx({title: 'a', start: 0, end: 3}));
    tsg.pushSlice(newSliceEx({title: 'b', start: 1, end: 2}));

    var selection = new EventSet();
    selection.push(tsg.slices[0]);
    selection.push(tsg.slices[1]);

    var summaryTable =
        document.createElement('tr-ui-a-selection-summary-table');
    summaryTable.selection = selection;
    this.addHTMLOutput(summaryTable);

    var tableEl = tr.b.findDeepElementMatching(
        summaryTable, 'tr-ui-b-table');
    assert.equal(tableEl.tableRows[0].value.value, 0);
    assert.strictEqual(tableEl.tableRows[0].value.unit,
        tr.b.Unit.byName.timeStampInMs);
    assert.equal(tableEl.tableRows[1].value.value, 3);
    assert.strictEqual(tableEl.tableRows[1].value.unit,
        tr.b.Unit.byName.timeDurationInMs);
  });
});
</script>
