<!DOCTYPE html>
<!--
Copyright (c) 2014 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="/model/thread.html">
<link rel="import" href="/extras/highlighter/vsync_highlighter.html">

<script>
'use strict';

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

  var VSyncHighlighter = tr.e.highlighter.VSyncHighlighter;

  var VIEW_L_WORLD = 100;
  var VIEW_R_WORLD = 1000;

  function buildModel(slices) {
    var model = new tr.Model();
    var process = model.getOrCreateProcess(1);
    for (var i = 0; i < slices.length; i++) {
      var thread = process.getOrCreateThread(i);
      for (var j = 0; j < slices[i].length; j++) {
        thread.sliceGroup.pushSlice(slices[i][j]);
      }
    }
    return model;
  }

  function buildSlice(title, time) {
    return new tr.model.ThreadSlice('', title, 0, time, {});
  }

  function testFindVSyncTimes(slices, expectedTimes) {
    assert.deepEqual(
        expectedTimes, VSyncHighlighter.findVSyncTimes(buildModel(slices)));
  }

  function testGenerateStripes(times, expectedRanges) {
    var ranges = VSyncHighlighter.generateStripes(
        times, VIEW_L_WORLD, VIEW_R_WORLD);
    ranges.sort();
    expectedRanges.sort();

    assert.equal(ranges.length, expectedRanges.length);
    for (var i = 0; i < expectedRanges.length; i++) {
      assert.deepEqual(ranges[i], expectedRanges[i]);
    }
  }

  test('findEmpty', function() {
    testFindVSyncTimes([], []);
  });

  test('findNoVsync', function() {
    testFindVSyncTimes([
        [buildSlice('MessageLoop::RunTask', 10),
         buildSlice('MessageLoop::RunTask', 20)],
        [buildSlice('MessageLoop::RunTask', 15)]
    ], []);
  });

  test('findOneVsync', function() {
    testFindVSyncTimes([[buildSlice('vblank', 42)]], [42]);
  });

  test('findMultipleVsyncs', function() {
    testFindVSyncTimes([
        [buildSlice('VSYNC', 1), buildSlice('MessageLoop::RunTask', 2)],
        [buildSlice('MessageLoop::RunTask', 3)],
        [buildSlice('MessageLoop::RunTask', 4), buildSlice('VSYNC', 5)],
        [buildSlice('VSYNC', 6), buildSlice('VSYNC', 7)]
    ], [1, 5, 6, 7]);
  });

  test('findUnsorted', function() {
    testFindVSyncTimes([
        [buildSlice('RenderWidgetHostViewAndroid::OnVSync', 4),
         buildSlice('MessageLoop::RunTask', 2)],
        [buildSlice('RenderWidgetHostViewAndroid::OnVSync', 1),
         buildSlice('RenderWidgetHostViewAndroid::OnVSync', 3)]
    ], [1, 3, 4]);
  });

  test('findDifferentPrecisions', function() {
    // vblank has higher precision than RenderWidgetHostViewAndroid::OnVSync.
    testFindVSyncTimes([
        [buildSlice('RenderWidgetHostViewAndroid::OnVSync', 1),
         buildSlice('vblank', 2),
         buildSlice('RenderWidgetHostViewAndroid::OnVSync', 3)]
    ], [2]);
  });

  test('generateInside', function() {
    testGenerateStripes([], []);
    testGenerateStripes([200, 500], [[200, 500]]);
    testGenerateStripes([200, 500, 800, 900], [[200, 500], [800, 900]]);
    testGenerateStripes(
        [200, 500, 800, 900, 998, 999],
        [[200, 500], [800, 900], [998, 999]]);
  });

  test('generateOutside', function() {
    // Far left.
    testGenerateStripes([0, 99], []);
    testGenerateStripes([0, 10, 50, 99], []);
    testGenerateStripes([0, 99, 101, 999], [[101, 999]]);
    testGenerateStripes([0, 10, 50, 99, 101, 999], [[101, 999]]);

    // Far right.
    testGenerateStripes([1001, 2000], []);
    testGenerateStripes([1001, 2000, 3000, 4000], []);
    testGenerateStripes([101, 999, 1001, 2000], [[101, 999]]);
    testGenerateStripes([101, 999, 1001, 2000, 3000, 4000], [[101, 999]]);

    // Far both.
    testGenerateStripes([0, 99, 1001, 2000], []);
    testGenerateStripes([0, 10, 50, 99, 1001, 2000], []);
    testGenerateStripes([0, 10, 50, 99, 1001, 2000, 3000, 4000], []);
    testGenerateStripes([0, 99, 101, 999, 1001, 2000], [[101, 999]]);
  });

  test('generateOverlap', function() {
    // Left overlap.
    testGenerateStripes([0, 101], [[VIEW_L_WORLD, 101]]);
    testGenerateStripes([0, 1, 2, 101], [[VIEW_L_WORLD, 101]]);
    testGenerateStripes(
        [2, 101, 102, 103],
        [[VIEW_L_WORLD, 101], [102, 103]]);
    testGenerateStripes(
        [0, 1, 2, 101, 102, 103],
        [[VIEW_L_WORLD, 101], [102, 103]]);
    testGenerateStripes(
        [0, 1, 2, 101, 102, 103, 1001, 3000],
        [[VIEW_L_WORLD, 101], [102, 103]]);

    // Right overlap.
    testGenerateStripes([999, 2000], [[999, VIEW_R_WORLD]]);
    testGenerateStripes([999, 2000, 3000, 4000], [[999, VIEW_R_WORLD]]);
    testGenerateStripes(
        [997, 998, 999, 2000],
        [[997, 998], [999, VIEW_R_WORLD]]);
    testGenerateStripes(
        [997, 998, 999, 2000, 3000, 4000],
        [[997, 998], [999, VIEW_R_WORLD]]);
    testGenerateStripes(
        [0, 10, 997, 998, 999, 2000, 3000, 4000],
        [[997, 998], [999, VIEW_R_WORLD]]);

    // Both overlap.
    testGenerateStripes([0, 2000], [[VIEW_L_WORLD, VIEW_R_WORLD]]);
    testGenerateStripes(
        [0, 101, 999, 2000],
        [[VIEW_L_WORLD, 101], [999, VIEW_R_WORLD]]);
    testGenerateStripes(
        [0, 101, 200, 900, 999, 2000],
        [[VIEW_L_WORLD, 101], [200, 900], [999, VIEW_R_WORLD]]);
    testGenerateStripes(
        [0, 10, 90, 101, 999, 2000, 3000, 4000],
        [[VIEW_L_WORLD, 101], [999, VIEW_R_WORLD]]);
    testGenerateStripes(
        [0, 10, 90, 101, 200, 900, 999, 2000, 3000, 4000],
        [[VIEW_L_WORLD, 101], [200, 900], [999, VIEW_R_WORLD]]);
  });

  test('generateOdd', function() {
    // One VSync.
    testGenerateStripes([0], [[VIEW_L_WORLD, VIEW_R_WORLD]]);
    testGenerateStripes([500], [[500, VIEW_R_WORLD]]);
    testGenerateStripes([1500], []);

    // Multiple VSyncs.
    testGenerateStripes([0, 10, 20], [[VIEW_L_WORLD, VIEW_R_WORLD]]);
    testGenerateStripes([0, 500, 2000], [[VIEW_L_WORLD, 500]]);
    testGenerateStripes([0, 10, 500], [[500, VIEW_R_WORLD]]);
    testGenerateStripes([0, 10, 2000], []);
    testGenerateStripes(
        [0, 200, 500],
        [[VIEW_L_WORLD, 200], [500, VIEW_R_WORLD]]);
    testGenerateStripes(
        [0, 200, 500, 900],
        [[VIEW_L_WORLD, 200], [500, 900]]);
  });

  test('generateBorder', function() {
    testGenerateStripes([0, VIEW_L_WORLD], [[VIEW_L_WORLD, VIEW_L_WORLD]]);
    testGenerateStripes(
        [VIEW_L_WORLD, VIEW_L_WORLD],
        [[VIEW_L_WORLD, VIEW_L_WORLD]]);
    testGenerateStripes(
        [VIEW_R_WORLD, 2000],
        [[VIEW_R_WORLD, VIEW_R_WORLD]]);
    testGenerateStripes(
        [VIEW_R_WORLD, VIEW_R_WORLD],
        [[VIEW_R_WORLD, VIEW_R_WORLD]]);
    testGenerateStripes(
        [VIEW_L_WORLD, VIEW_R_WORLD],
        [[VIEW_L_WORLD, VIEW_R_WORLD]]);
    testGenerateStripes(
        [VIEW_L_WORLD, 200, 500, VIEW_R_WORLD],
        [[VIEW_L_WORLD, 200], [500, VIEW_R_WORLD]]);
    testGenerateStripes(
        [0, VIEW_L_WORLD, VIEW_R_WORLD, 2000],
        [[VIEW_L_WORLD, VIEW_L_WORLD], [VIEW_R_WORLD, VIEW_R_WORLD]]);
    testGenerateStripes(
        [0, VIEW_L_WORLD, VIEW_R_WORLD, 2000],
        [[VIEW_L_WORLD, VIEW_L_WORLD], [VIEW_R_WORLD, VIEW_R_WORLD]]);
    testGenerateStripes(
        [0, VIEW_L_WORLD, 200, 500, VIEW_R_WORLD, 2000],
        [[VIEW_L_WORLD, VIEW_L_WORLD], [200, 500],
         [VIEW_R_WORLD, VIEW_R_WORLD]]);
    testGenerateStripes(
        [0, 10, VIEW_L_WORLD, VIEW_R_WORLD, 2000, 3000],
        [[VIEW_L_WORLD, VIEW_R_WORLD]]);
  });
});
</script>
