<!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/chrome/cc/input_latency_async_slice.html">
<link rel="import" href="/extras/rail/ir_verifier_test_helper.html">

<script>
'use strict';

tr.b.unittest.testSuite(function() {
  var INPUT_TYPE = tr.e.cc.INPUT_EVENT_TYPE_NAMES;
  var audits = tr.e.audits;
  var INPUT_TYPE = tr.e.cc.INPUT_EVENT_TYPE_NAMES;

  test('empty', function() {
    var verifier = document.createElement('tr-e-rail-ir-verifier');
    verifier.customizeModelCallback = function(model) {
    };
    verifier.expectedIRs = [
    ];
    verifier.verify();
  });

  test('FlingFlingFling', function() {
    // This trace gave me so many different kinds of trouble that I'm just going
    // to copy it straight in here, without trying to clarify it at all.
    // measurmt-traces/mobile/cnet_fling_up_fling_down_motox_2013.json
    var verifier = document.createElement('tr-e-rail-ir-verifier');
    verifier.customizeModelCallback = function(model) {
      audits.addFrameEvent(model, {start: 0, end: 10});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_START,
          {start: 919, end: 998});
      audits.addInputEvent(model, INPUT_TYPE.FLING_CANCEL,
          {start: 919, end: 1001});
      audits.addInputEvent(model, INPUT_TYPE.TAP_DOWN,
          {start: 919, end: 1001});
      audits.addInputEvent(model, INPUT_TYPE.TAP_CANCEL,
          {start: 974, end: 1020});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_BEGIN,
          {start: 974, end: 1020});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 974, end: 1040});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 974, end: 1054});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 990, end: 1021});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 990, end: 1052});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 1006, end: 1021});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 1022, end: 1036});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 1022, end: 1052});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 1038, end: 1049});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 1038, end: 1068});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_END,
          {start: 1046, end: 1050});
      audits.addInputEvent(model, INPUT_TYPE.FLING_START,
          {start: 1046, end: 1077});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_START,
          {start: 1432, end: 2238});
      audits.addInputEvent(model, INPUT_TYPE.FLING_CANCEL,
          {start: 1432, end: 2241});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 1516, end: 2605});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_BEGIN,
          {start: 1532, end: 2274});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 1532, end: 2294});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 1549, end: 2310});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_END,
          {start: 1627, end: 2275});
      audits.addInputEvent(model, INPUT_TYPE.FLING_START,
          {start: 1627, end: 2310});
      audits.addFrameEvent(model, {start: 2990, end: 3000});
    };
    verifier.expectedIRs = [
      {title: 'Idle', start: 0, end: 919, eventCount: 0},
      {title: 'Response', start: 919, end: 1054, eventCount: 6},
      {title: 'Animation', start: 1054, end: 1432, eventCount: 10},
      {title: 'Response', start: 1432, end: 2605, eventCount: 5},
      {title: 'Animation', start: 2605, end: 3000, eventCount: 2}
    ];
    verifier.verify();
  });

  test('keyboardEvents', function() {
    var verifier = document.createElement('tr-e-rail-ir-verifier');
    verifier.customizeModelCallback = function(model) {
      audits.addInputEvent(model, INPUT_TYPE.KEY_DOWN_RAW,
          {start: 0, end: 45});
      audits.addInputEvent(model, INPUT_TYPE.CHAR,
          {start: 10, end: 50});
    };
    verifier.expectedIRs = [
      {title: 'Response', start: 0, end: 50, eventCount: 2}
    ];
    verifier.verify();
  });

  test('mouseResponses', function() {
    var verifier = document.createElement('tr-e-rail-ir-verifier');
    verifier.customizeModelCallback = function(model) {
      audits.addInputEvent(model, INPUT_TYPE.CLICK,
          {start: 0, end: 100});
      audits.addInputEvent(model, INPUT_TYPE.CONTEXT_MENU,
          {start: 200, end: 300});
      audits.addInputEvent(model, INPUT_TYPE.MOUSE_WHEEL,
          {start: 400, end: 500});
    };
    verifier.expectedIRs = [
      {title: 'Response', start: 0, end: 100, eventCount: 1},
      {title: 'Idle', start: 100, end: 200, eventCount: 0},
      {title: 'Response', start: 200, end: 300, eventCount: 1},
      {title: 'Idle', start: 300, end: 400, eventCount: 0},
      {title: 'Response', start: 400, end: 500, eventCount: 1}
    ];
    verifier.verify();
  });

  test('mouseDownUpResponse', function() {
    var verifier = document.createElement('tr-e-rail-ir-verifier');
    verifier.customizeModelCallback = function(model) {
      audits.addInputEvent(model, INPUT_TYPE.MOUSE_DOWN,
          {start: 0, end: 100});
      audits.addInputEvent(model, INPUT_TYPE.MOUSE_UP,
          {start: 200, end: 210});
    };
    verifier.expectedIRs = [
      {title: 'Idle', start: 0, end: 200, eventCount: 0},
      {title: 'Response', start: 200, end: 210, eventCount: 2}
    ];
    verifier.verify();
  });

  test('ignoreLoneMouseMoves', function() {
    var verifier = document.createElement('tr-e-rail-ir-verifier');
    verifier.customizeModelCallback = function(model) {
      audits.addInputEvent(model, INPUT_TYPE.MOUSE_MOVE,
          {start: 0, end: 100});
    };
    verifier.expectedIRs = [
      {title: 'Idle', start: 0, end: 100, eventCount: 0}
    ];
    verifier.verify();
  });

  test('mouseDrags', function() {
    var verifier = document.createElement('tr-e-rail-ir-verifier');
    verifier.customizeModelCallback = function(model) {
      audits.addInputEvent(model, INPUT_TYPE.MOUSE_DOWN,
          {start: 0, end: 100});
      audits.addInputEvent(model, INPUT_TYPE.MOUSE_MOVE,
          {start: 200, end: 215});
      audits.addInputEvent(model, INPUT_TYPE.MOUSE_MOVE,
          {start: 210, end: 220});
      audits.addInputEvent(model, INPUT_TYPE.MOUSE_MOVE,
          {start: 221, end: 240});
      audits.addInputEvent(model, INPUT_TYPE.MOUSE_UP,
          {start: 400, end: 410});
    };
    verifier.expectedIRs = [
      {title: 'Idle', start: 0, end: 200, eventCount: 0},
      {title: 'Response', start: 200, end: 215, eventCount: 2},
      {title: 'Animation', start: 215, end: 410, eventCount: 3}
    ];
    verifier.verify();
  });

  test('twoScrollsNoFling', function() {
    var verifier = document.createElement('tr-e-rail-ir-verifier');
    verifier.customizeModelCallback = function(model) {
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_BEGIN,
          {start: 0, end: 100});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 20, end: 100});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 40, end: 100});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 60, end: 150});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 70, end: 150});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_END,
          {start: 80, end: 150});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_BEGIN,
          {start: 300, end: 400});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 320, end: 400});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 330, end: 450});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 340, end: 450});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 350, end: 500});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_END,
          {start: 360, end: 500});
    };
    verifier.expectedIRs = [
      {title: 'Response', start: 0, end: 100, eventCount: 2},
      {title: 'Animation', start: 100, end: 150, eventCount: 4},
      {title: 'Idle', start: 150, end: 300, eventCount: 0},
      {title: 'Response', start: 300, end: 400, eventCount: 2},
      {title: 'Animation', start: 400, end: 500, eventCount: 4}
    ];
    verifier.verify();
  });

  test('CSSAnimations', function() {
    // CSS Animations happen on the renderer process, not the browser process.
    // They are merged if they overlap.
    // They are merged with other kinds of animations.
    var verifier = document.createElement('tr-e-rail-ir-verifier');
    verifier.customizeModelCallback = function(model) {
      audits.addEvent(model.rendererMain, {
        title: 'Animation', start: 0, end: 100});
      audits.addEvent(model.rendererMain, {
        title: 'Animation', start: 99, end: 200});
      audits.addInputEvent(model, INPUT_TYPE.FLING_START,
          {start: 150, end: 180});
      audits.addFrameEvent(model, {start: 290, end: 300});
    };
    verifier.expectedIRs = [
      {title: 'Animation', start: 0, end: 300, eventCount: 3}
    ];
    verifier.verify();
  });

  test('flingThatIsntstopped', function() {
    var verifier = document.createElement('tr-e-rail-ir-verifier');
    verifier.customizeModelCallback = function(model) {
      audits.addInputEvent(model, INPUT_TYPE.FLING_START,
          {start: 32, end: 100});
      audits.addFlingAnimationEvent(model, {start: 38, end: 200});
      audits.addFrameEvent(model, {start: 290, end: 300});
    };
    verifier.expectedIRs = [
      {title: 'Animation', start: 32, end: 200, eventCount: 2},
      {title: 'Idle', start: 200, end: 300, eventCount: 0}
    ];
    verifier.verify();
  });

  test('flingThatIsStopped', function() {
    var verifier = document.createElement('tr-e-rail-ir-verifier');
    verifier.customizeModelCallback = function(model) {
      audits.addInputEvent(model, INPUT_TYPE.FLING_START,
          {start: 32, end: 100});
      audits.addInputEvent(model, INPUT_TYPE.FLING_CANCEL,
          {start: 105, end: 150});
    };
    verifier.expectedIRs = [
      {title: 'Animation', start: 32, end: 105, eventCount: 2},
      {title: 'Idle', start: 105, end: 150, eventCount: 0}
    ];
    verifier.verify();
  });

  test('FlingFling', function() {
    // measurmt-traces/mobile/facebook_obama_scroll_dialog_box.html
    var verifier = document.createElement('tr-e-rail-ir-verifier');
    verifier.customizeModelCallback = function(model) {
      audits.addInputEvent(model, INPUT_TYPE.FLING_START,
          {start: 0, end: 30});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_START,
          {start: 100, end: 130});
      audits.addInputEvent(model, INPUT_TYPE.FLING_CANCEL,
          {start: 100, end: 130});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 110, end: 140});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 170, end: 180});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_END,
          {start: 200, end: 210});
      audits.addInputEvent(model, INPUT_TYPE.FLING_START,
          {start: 200, end: 220});
      audits.addFrameEvent(model, {start: 230, end: 240});
    };
    verifier.expectedIRs = [
      {title: 'Animation', start: 0, end: 100, eventCount: 2},
      {title: 'Response', start: 100, end: 140, eventCount: 2},
      {title: 'Animation', start: 140, end: 240, eventCount: 3}
    ];
    verifier.verify();
  });

  test('Load', function() {
    var verifier = document.createElement('tr-e-rail-ir-verifier');
    verifier.customizeModelCallback = function(model) {
      audits.addCommitLoadEvent(model, {start: 0, end: 10});
      audits.addFrameEvent(model, {start: 11, end: 20});
    };
    verifier.expectedIRs = [
      {title: 'Load', start: 0, end: 20, eventCount: 2}
    ];
    verifier.verify();
  });

  test('totalIdle', function() {
    var verifier = document.createElement('tr-e-rail-ir-verifier');
    verifier.customizeModelCallback = function(model) {
      audits.addFrameEvent(model, {start: 0, end: 10});
    };
    verifier.expectedIRs = [
      {title: 'Idle', start: 0, end: 10, eventCount: 0}
    ];
    verifier.verify();
  });

  test('MultipleIdles', function() {
    var verifier = document.createElement('tr-e-rail-ir-verifier');
    verifier.customizeModelCallback = function(model) {
      audits.addFrameEvent(model, {start: 0, end: 1});
      audits.addCommitLoadEvent(model, {start: 1, end: 2});
      audits.addFrameEvent(model, {start: 3, end: 4});
      audits.addCommitLoadEvent(model, {start: 5, end: 6});
      audits.addFrameEvent(model, {start: 7, end: 8});
      audits.addCommitLoadEvent(model, {start: 9, end: 10});
      audits.addFrameEvent(model, {start: 11, end: 12});
      audits.addFrameEvent(model, {start: 12, end: 13});
    };
    verifier.expectedIRs = [
      {title: 'Idle', start: 0, end: 1, eventCount: 0},
      {title: 'Load', start: 1, end: 4, eventCount: 2},
      {title: 'Idle', start: 4, end: 5, eventCount: 0},
      {title: 'Load', start: 5, end: 8, eventCount: 2},
      {title: 'Idle', start: 8, end: 9, eventCount: 0},
      {title: 'Load', start: 9, end: 12, eventCount: 2},
      {title: 'Idle', start: 12, end: 13, eventCount: 0}
    ];
    verifier.verify();
  });

  test('TouchStartTouchEndTap', function() {
    var verifier = document.createElement('tr-e-rail-ir-verifier');
    verifier.customizeModelCallback = function(model) {
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_START,
          {start: 0, end: 10});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_END,
          {start: 200, end: 210});
    };
    verifier.expectedIRs = [
      {title: 'Response', start: 0, end: 210, eventCount: 2}
    ];
    verifier.verify();
  });

  test('TouchMoveResponseAnimation', function() {
    var verifier = document.createElement('tr-e-rail-ir-verifier');
    verifier.customizeModelCallback = function(model) {
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_START,
          {start: 0, end: 10});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 50, end: 100});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 70, end: 150});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_END,
          {start: 200, end: 300});
    };
    verifier.expectedIRs = [
      {title: 'Response', start: 0, end: 100, eventCount: 2},
      {title: 'Animation', start: 100, end: 300, eventCount: 2}
    ];
    verifier.verify();
  });

  test('TapEvents', function() {
    var verifier = document.createElement('tr-e-rail-ir-verifier');
    verifier.customizeModelCallback = function(model) {
      audits.addInputEvent(model, INPUT_TYPE.TAP,
          {start: 0, end: 50});
      audits.addInputEvent(model, INPUT_TYPE.TAP_DOWN,
          {start: 300, end: 310});
      audits.addInputEvent(model, INPUT_TYPE.TAP,
          {start: 320, end: 350});
    };
    verifier.expectedIRs = [
      {title: 'Response', start: 0, end: 50, eventCount: 1},
      {title: 'Idle', start: 50, end: 300, eventCount: 0},
      {title: 'Response', start: 300, end: 350, eventCount: 2}
    ];
    verifier.verify();
  });

  test('TapAndTapCancelResponses', function() {
    var verifier = document.createElement('tr-e-rail-ir-verifier');
    verifier.customizeModelCallback = function(model) {
      audits.addInputEvent(model, INPUT_TYPE.TAP_DOWN,
          {start: 0, end: 100});
      audits.addInputEvent(model, INPUT_TYPE.TAP_CANCEL,
          {start: 300, end: 350});
    };
    verifier.expectedIRs = [
      {title: 'Response', start: 0, end: 100, eventCount: 1},
      {title: 'Idle', start: 100, end: 300, eventCount: 0},
      {title: 'Response', start: 300, end: 350, eventCount: 1}
    ];
    verifier.verify();
  });

  test('TapCancelResponse', function() {
    var verifier = document.createElement('tr-e-rail-ir-verifier');
    verifier.customizeModelCallback = function(model) {
      audits.addInputEvent(model, INPUT_TYPE.TAP_DOWN,
          {start: 0, end: 100});
      audits.addInputEvent(model, INPUT_TYPE.TAP_CANCEL,
          {start: 150, end: 200});
    };
    verifier.expectedIRs = [
      {title: 'Response', start: 0, end: 200, eventCount: 2}
    ];
    verifier.verify();
  });

  test('PinchResponseAnimation', function() {
    var verifier = document.createElement('tr-e-rail-ir-verifier');
    verifier.customizeModelCallback = function(model) {
      audits.addFrameEvent(model, {start: 0, end: 10});
      audits.addInputEvent(model, INPUT_TYPE.PINCH_BEGIN,
          {start: 100, end: 150});
      audits.addInputEvent(model, INPUT_TYPE.PINCH_UPDATE,
          {start: 130, end: 160});
      audits.addInputEvent(model, INPUT_TYPE.PINCH_UPDATE,
          {start: 140, end: 200});
      audits.addInputEvent(model, INPUT_TYPE.PINCH_UPDATE,
          {start: 150, end: 205});
      audits.addInputEvent(model, INPUT_TYPE.PINCH_UPDATE,
          {start: 210, end: 220});
      // pause > 200ms
      audits.addInputEvent(model, INPUT_TYPE.PINCH_UPDATE,
          {start: 421, end: 470});
      audits.addInputEvent(model, INPUT_TYPE.PINCH_END,
          {start: 460, end: 500});
    };
    verifier.expectedIRs = [
      {title: 'Idle', start: 0, end: 100, eventCount: 0},
      {title: 'Response', start: 100, end: 160, eventCount: 2},
      {title: 'Animation', start: 160, end: 220, eventCount: 3},
      {title: 'Idle', start: 220, end: 421, eventCount: 0},
      {title: 'Animation', start: 421, end: 500, eventCount: 2}
    ];
    verifier.verify();
  });

  test('TapThenScroll', function() {
    // measurmt-traces/mobile/google_io_instrument_strumming.json
    var verifier = document.createElement('tr-e-rail-ir-verifier');
    verifier.customizeModelCallback = function(model) {
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_START,
          {start: 0, end: 20});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_END,
          {start: 40, end: 100});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_START,
          {start: 50, end: 120});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 80, end: 150});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 180, end: 200});
    };
    verifier.expectedIRs = [
      {title: 'Response', start: 0, end: 100, eventCount: 2},
      {title: 'Response', start: 50, end: 150, eventCount: 2},
      {title: 'Animation', start: 150, end: 200, eventCount: 1}
    ];
    verifier.verify();
  });

  test('PinchFlingTapTouchEventsOverlap', function() {
    var verifier = document.createElement('tr-e-rail-ir-verifier');
    verifier.customizeModelCallback = function(model) {
      audits.addFrameEvent(model, {start: 0, end: 10});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_START,
          {start: 20, end: 50});
      audits.addInputEvent(model, INPUT_TYPE.TAP_DOWN,
          {start: 20, end: 30});
      audits.addInputEvent(model, INPUT_TYPE.FLING_CANCEL,
          {start: 20, end: 50});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 60, end: 100});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_START,
          {start: 60, end: 110});
      audits.addInputEvent(model, INPUT_TYPE.PINCH_BEGIN,
          {start: 60, end: 100});
      audits.addInputEvent(model, INPUT_TYPE.TAP_CANCEL,
          {start: 65, end: 75});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 70, end: 100});
      audits.addInputEvent(model, INPUT_TYPE.PINCH_UPDATE,
          {start: 70, end: 100});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 75, end: 100});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 80, end: 100});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 85, end: 100});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_BEGIN,
          {start: 75, end: 100});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 150, end: 200});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 150, end: 200});
      audits.addInputEvent(model, INPUT_TYPE.FLING_START,
          {start: 180, end: 210});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_END,
          {start: 190, end: 210});
      audits.addFrameEvent(model, {start: 215, end: 220});
    };
    verifier.expectedIRs = [
      {title: 'Idle', start: 0, end: 20, eventCount: 0},
      {title: 'Response', start: 20, end: 110, eventCount: 9},
      {title: 'Animation', start: 110, end: 220, eventCount: 7}
    ];
    verifier.verify();
  });
});
</script>
