<!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/analysis/analysis_view.html">
<link rel="import" href="/core/analysis/stub_analysis_results.html">
<link rel="import" href="/core/test_utils.html">
<link rel="import" href="/core/selection.html">
<link rel="import" href="/model/model.html">

<script>
'use strict';

tr.b.unittest.testSuite(function() {
  var Counter = tr.model.Counter;
  var CounterSeries = tr.model.CounterSeries;

  var Selection = tr.c.Selection;
  var StubAnalysisResults = tr.c.analysis.StubAnalysisResults;

  function createSeries(ctr) {
    var allocatedSeries = new CounterSeries('bytesallocated', 0);
    var freeSeries = new CounterSeries('bytesfree', 1);

    ctr.addSeries(allocatedSeries);
    ctr.addSeries(freeSeries);

    allocatedSeries.addCounterSample(0, 0);
    allocatedSeries.addCounterSample(10, 25);
    allocatedSeries.addCounterSample(20, 10);

    freeSeries.addCounterSample(0, 15);
    freeSeries.addCounterSample(10, 20);
    freeSeries.addCounterSample(20, 5);
  }

  var createSelectionWithTwoSeriesSingleCounter = function() {
    var ctr = new Counter(null, 0, 'foo', 'ctr[0]');
    createSeries(ctr);

    var selection = new Selection();
    var t1track = {};

    selection.push(ctr.getSeries(0).samples[1]);
    selection.push(ctr.getSeries(1).samples[1]);
    return selection;
  };

  test('instantiate_singleCounterWithTwoSeries', function() {
    var selection = createSelectionWithTwoSeriesSingleCounter();

    var analysisEl = document.createElement('tr-c-a-counter-sample-sub-view');
    analysisEl.selection = selection;
    this.addHTMLOutput(analysisEl);
  });

  var createSelectionWithTwoSeriesTwoCounters = function() {
    var ctr1 = new Counter(null, 0, '', 'ctr1');
    createSeries(ctr1);

    var ctr2 = new Counter(null, 0, '', 'ctr2');
    createSeries(ctr2);

    var selection = new Selection();
    var t1track = {};

    selection.push(ctr1.getSeries(0).samples[1]);
    selection.push(ctr1.getSeries(1).samples[1]);


    selection.push(ctr2.getSeries(0).samples[2]);
    selection.push(ctr2.getSeries(1).samples[2]);
    return selection;
  };

  test('instantiate_twoCountersWithTwoSeries', function() {
    var selection = createSelectionWithTwoSeriesTwoCounters();

    var analysisEl = document.createElement('tr-c-a-counter-sample-sub-view');
    analysisEl.selection = selection;
    this.addHTMLOutput(analysisEl);
  });

  test('analyzeSelectionWithSingleCounter', function() {
    var ctr = new Counter(null, 0, '', 'ctr');
    var series = new CounterSeries('value', 0);
    ctr.addSeries(series);

    series.addCounterSample(0, 0);
    series.addCounterSample(10, 10);

    var selection = new Selection();
    var t1track = {};
    selection.push(ctr.getSeries(0).samples[1]);

    var view = document.createElement('tr-c-a-counter-sample-sub-view');
    var results = new StubAnalysisResults();
    view.analyzeCounterSamples_(results, selection);

    assert.equal(results.tables.length, 1);
    assert.equal(results.headers[0].label, 'Selected counter:');
    var table = results.tables[0];
    assert.equal(table.rows.length, 3);

    assert.equal(table.rows[0].label, 'Title');
    assert.equal(table.rows[1].label, 'Timestamp');
    assert.equal(table.rows[2].label, 'value');
    assert.equal(table.rows[2].text, 10);
  });

  function createSelectionWithTwoCountersDiffSeriesDiffEvents() {
    var ctr1 = new Counter(null, 0, '', 'a');
    var ctr1AllocatedSeries = new CounterSeries('bytesallocated', 0);
    ctr1.addSeries(ctr1AllocatedSeries);

    ctr1AllocatedSeries.addCounterSample(0, 0);
    ctr1AllocatedSeries.addCounterSample(10, 25);
    ctr1AllocatedSeries.addCounterSample(20, 15);

    assert.equal(ctr1.name, 'a');
    assert.equal(ctr1.numSamples, 3);
    assert.equal(ctr1.numSeries, 1);

    var ctr2 = new Counter(null, 0, '', 'b');
    var ctr2AllocatedSeries = new CounterSeries('bytesallocated', 0);
    var ctr2FreeSeries = new CounterSeries('bytesfree', 1);

    ctr2.addSeries(ctr2AllocatedSeries);
    ctr2.addSeries(ctr2FreeSeries);

    ctr2AllocatedSeries.addCounterSample(0, 0);
    ctr2AllocatedSeries.addCounterSample(10, 25);
    ctr2AllocatedSeries.addCounterSample(20, 10);
    ctr2AllocatedSeries.addCounterSample(30, 15);

    ctr2FreeSeries.addCounterSample(0, 20);
    ctr2FreeSeries.addCounterSample(10, 5);
    ctr2FreeSeries.addCounterSample(20, 25);
    ctr2FreeSeries.addCounterSample(30, 0);

    assert.equal(ctr2.name, 'b');
    assert.equal(ctr2.numSamples, 4);
    assert.equal(ctr2.numSeries, 2);

    var selection = new Selection();
    var t1track = {};
    var t2track = {};

    selection.push(ctr1AllocatedSeries.samples[1]);
    selection.push(ctr2AllocatedSeries.samples[2]);
    selection.push(ctr2FreeSeries.samples[2]);

    return selection;
  };

  test('analyzeSelectionWithComplexSeriesTwoCounters', function() {
    var selection = createSelectionWithTwoCountersDiffSeriesDiffEvents();

    var view = document.createElement('tr-c-a-counter-sample-sub-view');
    var results = new StubAnalysisResults();
    view.analyzeCounterSamples_(results, selection);

    assert.equal(results.tables.length, 2);
  });
});
</script>
