<!DOCTYPE html>
<!--
Copyright (c) 2015 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/model/device.html">
<link rel="import" href="/tracing/model/model.html">
<link rel="import" href="/tracing/model/power_series.html">

<script>
'use strict';

tr.b.unittest.testSuite(function() {

  var Model = tr.Model;
  var PowerSeries = tr.model.PowerSeries;

  test('stableId', function() {
    var device = { stableId: 'test' };
    var series = new PowerSeries(device);

    assert.equal(series.stableId, 'test.PowerSeries');
  });

  test('device', function() {
    var device = new tr.model.Device(new Model());
    var series = new PowerSeries(device);

    assert.equal(series.device, device);
  });

  test('addPowerSample', function() {
    var series = new PowerSeries(new Model().device);

    assert.equal(series.samples.length, 0);

    var sample1 = series.addPowerSample(0, 1000);
    var sample2 = series.addPowerSample(1, 2000);

    assert.deepEqual(series.samples, [sample1, sample2]);
  });

  test('getEnergyConsumed_oneSample', function() {
    var series = new PowerSeries(new Model().device);
    series.addPowerSample(0, 1);
    series.addPowerSample(1000, 2);

    assert.equal(series.getEnergyConsumed(0, 1000), 1);
  });

  test('getEnergyConsumed_twoSamples', function() {
    var series = new PowerSeries(new Model().device);
    series.addPowerSample(0, 1);
    series.addPowerSample(1000, 2);

    assert.equal(series.getEnergyConsumed(0, 2000), 3);
  });

  test('getEnergyConsumed_firstSampleAfterStart', function() {
    var series = new PowerSeries(new Model().device);
    series.addPowerSample(1000, 1);

    assert.equal(series.getEnergyConsumed(0, 2000), 1);
  });

  test('getEnergyConsumed_extraSamplesBeforeStart', function() {
    var series = new PowerSeries(new Model().device);
    series.addPowerSample(0, 10);
    series.addPowerSample(1000, 1);
    series.addPowerSample(2000, 1);
    series.addPowerSample(3000, 1);

    assert.equal(series.getEnergyConsumed(2000, 4000), 2);
  });

  test('getEnergyConsumed_extraSamplesAfterEnd', function() {
    var series = new PowerSeries(new Model().device);
    series.addPowerSample(0, 1);
    series.addPowerSample(1000, 1);
    series.addPowerSample(2000, 1);
    series.addPowerSample(3000, 10);

    assert.equal(series.getEnergyConsumed(0, 2000), 2);
  });

  test('shiftTimestampsForward', function() {
    var series = new PowerSeries(new Model().device);

    series.addPowerSample(0, 1000);
    series.addPowerSample(1, 2000);

    series.shiftTimestampsForward(2);

    assert.equal(series.samples[0].start, 2);
    assert.equal(series.samples[1].start, 3);

    series.shiftTimestampsForward(-4);

    assert.equal(series.samples[0].start, -2);
    assert.equal(series.samples[1].start, -1);
  });


  test('updateBounds', function() {
    var series = new PowerSeries(new Model().device);

    series.addPowerSample(0, 1000);
    series.addPowerSample(1, 2000);
    series.updateBounds();

    assert.equal(series.bounds.min, 0);
    assert.equal(series.bounds.max, 1);

    series.addPowerSample(4, 3000);
    series.updateBounds();

    assert.equal(series.bounds.min, 0);
    assert.equal(series.bounds.max, 4);
  });

  test('iterateAllEventsInThisContainer', function() {
    var series = new PowerSeries(new Model().device);

    var eventsInSeries = [];
    series.iterateAllEventsInThisContainer(
        function() { return true; },
        function(event) {
          eventsInSeries.push(event);
        });

    assert.deepEqual(eventsInSeries, []);

    var sample1 = series.addPowerSample(0, 1000);
    var sample2 = series.addPowerSample(1, 2000);

    eventsInSeries = [];
    series.iterateAllEventsInThisContainer(
        function() { return true; },
        function(event) {
          eventsInSeries.push(event);
        });

    assert.deepEqual(eventsInSeries, [sample1, sample2]);
  });
});
</script>
