<!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="/base/range_utils.html">
<link rel="import" href="/core/test_utils.html">

<script>
'use strict';

tr.b.unittest.testSuite(function() {
  function simpleMerger(events) {
    return {
      start: events[0].start,
      end: events[events.length - 1].end
    };
  }
  test('simple', function() {
    var inEvents = [
      {start: 0, end: 100},
      {start: 100, end: 120},
      {start: 200, end: 220}
    ];

    var merged = tr.e.audits.mergeExplicitRanges(inEvents, 50, simpleMerger);

    assert.equal(merged.length, 2);
    assert.deepEqual(merged[0], {start: 0, end: 120});
    assert.deepEqual(merged[1], {start: 200, end: 220});
  });

  test('overlapping', function() {
    var inEvents = [
      {start: 0, end: 100},
      {start: 80, end: 120},
      {start: 200, end: 220}
    ];

    var merged = tr.e.audits.mergeExplicitRanges(inEvents, 50, simpleMerger);

    assert.equal(merged.length, 2);
    assert.deepEqual(merged[0], {start: 0, end: 120});
    assert.deepEqual(merged[1], {start: 200, end: 220});
  });

  test('middleOneIsSmall', function() {
    var inEvents = [
      {start: 0, end: 100},
      {start: 40, end: 50},
      {start: 100, end: 120}
    ];

    var merged = tr.e.audits.mergeExplicitRanges(inEvents, 50, simpleMerger);

    assert.equal(merged.length, 1);
    assert.deepEqual(merged[0], {start: 0, end: 120});
  });

  test('firstEventIsSplitPoint', function() {
    var inEvents = [
      {start: 0, end: 100},
      {start: 150, end: 200}
    ];

    var merged = tr.e.audits.mergeExplicitRanges(inEvents, 25, simpleMerger);

    assert.equal(merged.length, 2);
    assert.deepEqual(merged[0], {start: 0, end: 100});
    assert.deepEqual(merged[1], {start: 150, end: 200});
  });

  test('mergeSingleEvent', function() {
    var inEvents = [
      {start: 0, end: 100}
    ];

    var mergeCount = 0;
    tr.e.audits.mergeExplicitRanges(inEvents, 25, function(events) {
      assert.deepEqual(events, inEvents);
      mergeCount++;
    });
    assert.equal(mergeCount, 1);
  });

  test('zeroDurationSplit', function() {
    var inEvents = [0, 10, 20, 50, 60];
    var identityFunction = function(x) {
      return x;
    };
    var timestampMerger = function(timestamps) {
      console.log(timestamps);
      return {
        start: timestamps[0],
        end: timestamps[timestamps.length - 1]
      };
    };
    var merged = tr.e.audits.mergeExplicitRanges(inEvents, 15, timestampMerger,
                                         identityFunction, identityFunction);
    console.log(merged);
    assert.equal(merged.length, 2);
    assert.deepEqual(merged[0], {start: 0, end: 20});
    assert.deepEqual(merged[1], {start: 50, end: 60});
  });

  test('findEmptyRangesBetweenExplicitRanges', function() {
    var events = [
      {start: 2, end: 4},
      {start: 1, end: 3},
      {start: 6, end: 8}
    ];
    var ranges = tr.e.audits.findEmptyRangesBetweenExplicitRanges(
        events, {start: 0, end: 10});
    assert.equal(3, ranges.length);
    assert.equal(0, ranges[0].min);
    assert.equal(1, ranges[0].max);
    assert.equal(4, ranges[1].min);
    assert.equal(6, ranges[1].max);
    assert.equal(8, ranges[2].min);
    assert.equal(10, ranges[2].max);
  });

  test('findEmptyRangesWithEmptyInput', function() {
    var ranges = tr.e.audits.findEmptyRangesBetweenExplicitRanges(
        [], {start: 0, end: 10});
    assert.equal(1, ranges.length);
    assert.equal(0, ranges[0].min);
    assert.equal(10, ranges[0].max);

    ranges = tr.e.audits.findEmptyRangesBetweenExplicitRanges([]);
    assert.equal(0, ranges.length);
  });
});
</script>
