<!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/extras/chrome/cc/input_latency_async_slice.html">
<link rel="import" href="/tracing/extras/chrome/chrome_test_utils.html">
<link rel="import" href="/tracing/extras/rail/ir_verifier.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 IRVerifier = tr.e.rail.IRVerifier;

  test('empty', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
    };
    verifier.expectedIRs = [
    ];
    verifier.verify();
  });

  test('MouseEventResponses', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      var mouseDown = audits.addInputEvent(model, INPUT_TYPE.MOUSE_DOWN,
          {start: 0, end: 50, id: '0x100'});
      var mouseDownFrame = audits.addFrameEvent(model,
          {start: 40, end: 50, isTopLevel: true});
      model.flowEvents.push(tr.c.test_utils.newFlowEventEx({
        id: '0x100',
        start: 0,
        end: 40,
        startSlice: mouseDownFrame,
        endSlice: mouseDownFrame
      }));

      var mouseUp = audits.addInputEvent(model, INPUT_TYPE.MOUSE_UP,
          {start: 50, end: 100, id: '0x101'});
      var mouseUpFrame = audits.addFrameEvent(model,
          {start: 240, end: 250, isTopLevel: true});
      model.flowEvents.push(tr.c.test_utils.newFlowEventEx({
        id: '0x101',
        start: 50,
        end: 240,
        startSlice: mouseUpFrame,
        endSlice: mouseUpFrame
      }));

      var mouseMove = audits.addInputEvent(model, INPUT_TYPE.MOUSE_MOVE,
          {start: 200, end: 250, id: '0x102'});
      var mouseMoveFrame = audits.addFrameEvent(model,
          {start: 240, end: 250, isTopLevel: true});
      model.flowEvents.push(tr.c.test_utils.newFlowEventEx({
        id: '0x102',
        start: 200,
        end: 240,
        startSlice: mouseMoveFrame,
        endSlice: mouseMoveFrame
      }));
    };
    verifier.expectedIRs = [
      {title: 'Response', start: 0, end: 50, eventCount: 3},
      {title: 'Response', start: 50, end: 100, eventCount: 3},
      {title: 'Idle', start: 100, end: 200, eventCount: 0},
      {title: 'Response', start: 200, end: 250, eventCount: 3}
    ];
    verifier.verify();
  });

  test('MouseEventsIgnored', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      audits.addInputEvent(model, INPUT_TYPE.MOUSE_MOVE,
          {start: 0, end: 50});
      audits.addInputEvent(model, INPUT_TYPE.MOUSE_DOWN,
          {start: 50, end: 100});
    };
    verifier.expectedIRs = [
      {title: 'Idle', start: 0, end: 100, eventCount: 0}
    ];
    verifier.verify();
  });

  test('unassociatedEvents', function() {
    // Unassociated ThreadSlices that start during an Idle should be associated
    // with it. Expect the Idle IR to have 2 associated events: both of the
    // ThreadSlices in the model.
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      var start = tr.c.test_utils.newSliceEx(
          {title: 'model start', start: 0, end: 1, type: tr.model.ThreadSlice});
      start.isTopLevel = true;
      model.browserMain.sliceGroup.pushSlice(start);

      var end = tr.c.test_utils.newSliceEx(
          {title: 'model end', start: 9, end: 10, type: tr.model.ThreadSlice});
      end.isTopLevel = true;
      model.browserMain.sliceGroup.pushSlice(end);
    };
    verifier.expectedIRs = [
      {title: 'Idle', start: 0, end: 10, eventCount: 2}
    ];
    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 = new IRVerifier();
    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: 1068, eventCount: 8},
      {title: 'Animation', start: 1054, end: 1432, eventCount: 2},
      {title: 'Response', start: 1432, end: 2605, eventCount: 5},
      {title: 'Animation', start: 1549, end: 2310, eventCount: 1},
      {title: 'Animation', start: 2605, end: 3000, eventCount: 1}
    ];
    verifier.verify();
  });

  test('keyboardEvents', function() {
    var verifier = new IRVerifier();
    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 = new IRVerifier();
    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('mouseWheelAnimation', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      audits.addInputEvent(model, INPUT_TYPE.MOUSE_WHEEL,
          {start: 0, end: 20});
      audits.addInputEvent(model, INPUT_TYPE.MOUSE_WHEEL,
          {start: 16, end: 36});
      audits.addInputEvent(model, INPUT_TYPE.MOUSE_WHEEL,
          {start: 55, end: 75});

      // This threshold uses both events' start times, not end...start.
      audits.addInputEvent(model, INPUT_TYPE.MOUSE_WHEEL,
          {start: 100, end: 150});
      audits.addInputEvent(model, INPUT_TYPE.MOUSE_WHEEL,
          {start: 141, end: 191});
      audits.addInputEvent(model, INPUT_TYPE.MOUSE_WHEEL,
          {start: 182, end: 200});
    };
    verifier.expectedIRs = [
      {title: 'Response', start: 0, end: 20, eventCount: 1},
      {title: 'Animation', start: 20, end: 75, eventCount: 2},
      {title: 'Idle', start: 75, end: 100, eventCount: 0},
      {title: 'Response', start: 100, end: 150, eventCount: 1},
      {title: 'Response', start: 141, end: 191, eventCount: 1},
      {title: 'Response', start: 182, end: 200, eventCount: 1}
    ];
    verifier.verify();
  });

  test('mouseDownUpResponse', function() {
    var verifier = new IRVerifier();
    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 = new IRVerifier();
    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 = new IRVerifier();
    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 = new IRVerifier();
    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 = new IRVerifier();
    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: 200, eventCount: 2},
      {title: 'Animation', start: 150, end: 300, eventCount: 1}
    ];
    verifier.verify();
  });

  test('flingThatIsntstopped', function() {
    var verifier = new IRVerifier();
    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 = new IRVerifier();
    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 = new IRVerifier();
    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: 210, eventCount: 2},
      {title: 'Animation', start: 200, end: 240, eventCount: 1}
    ];
    verifier.verify();
  });

  test('Load', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      audits.addCommitLoadEvent(model, {start: 0, end: 10});
      audits.addFrameEvent(model, {start: 11, end: 20});
    };
    verifier.expectedIRs = [
      {title: 'Load', name: 'Succeeded', start: 0, end: 20, eventCount: 2}
    ];
    verifier.verify();
  });

  test('LoadFailed', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      audits.addStartProvisionalLoadEvent(model, {start: 0, end: 10});
      audits.addFailProvisionalLoadEvent(model, {start: 11, end: 20});
    };
    verifier.expectedIRs = [
      {title: 'Load', name: 'Failed', start: 0, end: 20, eventCount: 2}
    ];
    verifier.verify();
  });

  test('LoadMainRunner', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      audits.addMainRunnerEvent(model, {start: 0, end: 10});
      audits.addFrameEvent(model, {start: 11, end: 20});
    };
    verifier.expectedIRs = [
      {title: 'Load', name: 'Startup', start: 0, end: 20, eventCount: 2}
    ];
    verifier.verify();
  });

  test('totalIdle', function() {
    var verifier = new IRVerifier();
    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 = new IRVerifier();
    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', name: 'Succeeded', start: 1, end: 4, eventCount: 2},
      {title: 'Idle', start: 4, end: 5, eventCount: 0},
      {title: 'Load', name: 'Succeeded', start: 5, end: 8, eventCount: 2},
      {title: 'Idle', start: 8, end: 9, eventCount: 0},
      {title: 'Load', name: 'Succeeded', start: 9, end: 12, eventCount: 2},
      {title: 'Idle', start: 12, end: 13, eventCount: 0}
    ];
    verifier.verify();
  });

  test('TouchStartTouchEndTap', function() {
    var verifier = new IRVerifier();
    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 = new IRVerifier();
    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 = new IRVerifier();
    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 = new IRVerifier();
    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 = new IRVerifier();
    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 = new IRVerifier();
    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 = new IRVerifier();
    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 = new IRVerifier();
    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: 210, eventCount: 6},
      {title: 'Animation', start: 180, end: 220, eventCount: 1}
    ];
    verifier.verify();
  });

  test('ScrollThenFling', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 0, end: 40});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 50, end: 100});
      audits.addInputEvent(model, INPUT_TYPE.FLING_START,
          {start: 80, end: 100});
      audits.addFrameEvent(model, {start: 190, end: 200});
    };
    verifier.expectedIRs = [
      {title: 'Animation', start: 0, end: 100, eventCount: 2},
      {title: 'Animation', start: 80, end: 200, eventCount: 1}
    ];
    verifier.verify();
  });

  /*
    This test was generated from
    /test_data/measurmt-traces/mobile/fling_HN_to_rest.json
   */
  test('fling_HN_to_rest', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      audits.addEvent(model.browserMain,
          {title: 'model start', start: 0, end: 1});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_START,
          {start: 1274, end: 1297});
      audits.addInputEvent(model, INPUT_TYPE.TAP_DOWN,
          {start: 1274, end: 1305});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 1343, end: 1350});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 1359, end: 1366});
      audits.addInputEvent(model, INPUT_TYPE.TAP_CANCEL,
          {start: 1359, end: 1366});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_BEGIN,
          {start: 1359, end: 1367});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 1359, end: 1387});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 1375, end: 1385});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 1375, end: 1416});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 1389, end: 1404});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 1389, end: 1429});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 1405, end: 1418});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 1405, end: 1449});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 1419, end: 1432});
      audits.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 1419, end: 1474});
      audits.addInputEvent(model, INPUT_TYPE.TOUCH_END,
          {start: 1427, end: 1435});
      audits.addInputEvent(model, INPUT_TYPE.FLING_START,
          {start: 1427, end: 1474});
      audits.addFlingAnimationEvent(model, {start: 1440, end: 2300});
      audits.addEvent(model.browserMain,
          {title: 'model end', start: 3184, end: 3185});
    };
    verifier.expectedIRs = [
      {title: 'Idle', start: 0, end: 1274, eventCount: 0},
      {title: 'Response', start: 1274, end: 1387, eventCount: 6},
      {title: 'Animation', start: 1387, end: 1474, eventCount: 10},
      {title: 'Animation', start: 1427, end: 2300, eventCount: 2},
      {title: 'Idle', start: 2300, end: 3185, eventCount: 0}
    ];
    verifier.verify();
  });
});
</script>
