<!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="/extras/audits/rail_ir_finder.html">
<link rel="import" href="/extras/audits/chrome_test_utils.html">
<link rel="import" href="/extras/importer/trace_event_importer.html">
<link rel="import" href="/core/test_utils.html">
<link rel="import" href="/core/trace_model/trace_model.html">

<script>
'use strict';

tv.b.unittest.testSuite(function() {
  var audits = tv.e.audits;

  function newRIRF(customizeModelCallback) {
    var model = tv.e.audits.newChromeModel(customizeModelCallback);
    var modelHelper = new tv.e.audits.ChromeModelHelper(model);
    return new tv.e.audits.RAILIRFinder(model, modelHelper);
  }

  test('twoScrollsNoFling', function() {
    var rirf = newRIRF(function(model) {
      audits.addGeneralLatencyInfoEvent(model, {start: 0, end: 100});
      audits.addGeneralLatencyInfoEvent(model, {start: 16, end: 100});
      audits.addGeneralLatencyInfoEvent(model, {start: 32, end: 100});

      audits.addGeneralLatencyInfoEvent(model, {start: 300, end: 330});
      audits.addGeneralLatencyInfoEvent(model, {start: 316, end: 346});
      audits.addGeneralLatencyInfoEvent(model, {start: 332, end: 368});
    });

    var gestures = rirf.getAllGestures();
    assert.equal(gestures.length, 2);

    assert.equal(gestures[0].expectedStart, 0);
    assert.equal(gestures[0].expectedEnd, 32);

    assert.equal(gestures[1].expectedStart, 300);
    assert.equal(gestures[1].expectedEnd, 332);
  });

  test('flingThatIsntstopped', function() {
    var rirf = newRIRF(function(model) {
      audits.addGeneralLatencyInfoEvent(model, {start: 0, end: 100});
      audits.addGeneralLatencyInfoEvent(model, {start: 16, end: 100});
      audits.addFlingStartLatencyInfoEvent(model, {start: 32, end: 100,
                                                   flingStart: 38});
      audits.addFlingAnimationEvent(model, {start: 38, end: 200});
    });

    var e60ranges = rirf.getAllExpected60Ranges();
    assert.equal(e60ranges.length, 1);

    var e60r = e60ranges[0];
    assert.equal(e60r.expectedStart, 32);
    assert.equal(e60r.expectedEnd, 200);
  });

  test('flingThatIsStopped', function() {
    var rirf = newRIRF(function(model) {
      audits.addGeneralLatencyInfoEvent(model, {start: 0, end: 100});
      audits.addGeneralLatencyInfoEvent(model, {start: 16, end: 100});
      audits.addFlingStartLatencyInfoEvent(model, {start: 32, end: 100,
                                                   flingStart: 38});
      audits.addFlingAnimationEvent(model, {start: 38, end: 200});
      audits.addFlingCancelLatencyInfoEvent(model, {start: 100, end: 150,
                                                    flingCancel: 105});

    });

    var e60ranges = rirf.getAllExpected60Ranges();
    assert.equal(e60ranges.length, 1);

    var e60r = e60ranges[0];
    assert.equal(e60r.expectedStart, 32);
    assert.equal(e60r.expectedEnd, 100);
  });

});
</script>