<!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 chrome_test_utils = tr.e.chrome.ChromeTestUtils;
  var IRVerifier = tr.e.rail.IRVerifier;

  function addFrameEventForInput(model, event) {
    var frame = chrome_test_utils.addFrameEvent(model,
        {start: event.start, end: event.end, isTopLevel: true});
    model.flowEvents.push(tr.c.TestUtils.newFlowEventEx({
      id: event.id,
      start: event.start,
      end: event.end,
      startSlice: frame,
      endSlice: frame
    }));
  }

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

  test('slowMouseMoveResponses', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      chrome_test_utils.addInputEvent(
          model, INPUT_TYPE.MOUSE_DOWN, {start: 0, end: 10});
      var mouseMove = chrome_test_utils.addInputEvent(
          model, INPUT_TYPE.MOUSE_MOVE, {start: 10, end: 20, id: '0x100'});
      addFrameEventForInput(model, mouseMove);

      mouseMove = chrome_test_utils.addInputEvent(
          model, INPUT_TYPE.MOUSE_MOVE, {start: 70, end: 80, id: '0x101'});
      addFrameEventForInput(model, mouseMove);

      mouseMove = chrome_test_utils.addInputEvent(
          model, INPUT_TYPE.MOUSE_MOVE, {start: 130, end: 140, id: '0x102'});
      addFrameEventForInput(model, mouseMove);
    };
    verifier.expectedIRs = [
      {title: 'Idle', start: 0, end: 10, eventCount: 0},
      {title: 'Response', name: 'Mouse', start: 10, end: 20, eventCount: 4},
      {title: 'Idle', start: 20, end: 70, eventCount: 0},
      {title: 'Response', name: 'Mouse', start: 70, end: 80, eventCount: 3},
      {title: 'Idle', start: 80, end: 130, eventCount: 0},
      {title: 'Response', name: 'Mouse', start: 130, end: 140, eventCount: 3}
    ];
    verifier.verify();
  });

  test('mouseEventResponses', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      var mouseDown = chrome_test_utils.addInputEvent(
          model, INPUT_TYPE.MOUSE_DOWN, {start: 0, end: 50, id: '0x100'});
      addFrameEventForInput(model, mouseDown);

      var mouseUp = chrome_test_utils.addInputEvent(model, INPUT_TYPE.MOUSE_UP,
          {start: 50, end: 100, id: '0x101'});
      addFrameEventForInput(model, mouseUp);

      var mouseMove = chrome_test_utils.addInputEvent(
          model, INPUT_TYPE.MOUSE_MOVE, {start: 200, end: 250, id: '0x102'});
      addFrameEventForInput(model, mouseMove);
    };
    verifier.expectedIRs = [
      {title: 'Response', name: 'Mouse', start: 0, end: 50, eventCount: 3},
      {title: 'Response', name: 'Mouse', start: 50, end: 100, eventCount: 3},
      {title: 'Idle', start: 100, end: 200, eventCount: 0},
      {title: 'Response', name: 'Mouse', start: 200, end: 250, eventCount: 3}
    ];
    verifier.verify();
  });

  test('mouseEventsIgnored', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.MOUSE_MOVE,
          {start: 0, end: 50});
      chrome_test_utils.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.TestUtils.newSliceEx(
          {title: 'model start', start: 0, end: 1, type: tr.model.ThreadSlice});
      start.isTopLevel = true;
      model.browserMain.sliceGroup.pushSlice(start);

      var end = tr.c.TestUtils.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('overlappingIdleAndLoadCollectUnassociatedEvents', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      chrome_test_utils.addFrameEvent(model, {start: 0, end: 10});
      chrome_test_utils.addCommitLoadEvent(
          model, {start: 10, end: 20, args: {id: 1}});
      chrome_test_utils.addFinishLoadEvent(
          model, {start: 21, end: 24, args: {id: 1}});
      chrome_test_utils.addLoadFinishedEvent(
          model, {start: 22, end: 23});
      chrome_test_utils.addFrameEvent(model, {start: 25, end: 30});
      chrome_test_utils.addFrameEvent(model, {start: 35, end: 40});
      // 3 Idle events.
      chrome_test_utils.addRenderingEvent(model, {start: 5, end: 15});
      chrome_test_utils.addRenderingEvent(model, {start: 11, end: 15});
      chrome_test_utils.addRenderingEvent(model, {start: 13, end: 15});
      // 1 Idle event.
      chrome_test_utils.addRenderingEvent(model, {start: 35, end: 36});
    };
    verifier.expectedIRs = [
      {title: 'Idle', start: 0, end: 10, eventCount: 1},
      {title: 'Load', name: 'Succeeded', start: 10, end: 30, eventCount: 4},
      {title: 'Idle', start: 30, end: 40, eventCount: 1}
    ];
    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) {
      chrome_test_utils.addFrameEvent(model, {start: 0, end: 10});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_START,
          {start: 919, end: 998});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.FLING_CANCEL,
          {start: 919, end: 1001});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TAP_DOWN,
          {start: 919, end: 1001});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TAP_CANCEL,
          {start: 974, end: 1020});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.SCROLL_BEGIN,
          {start: 974, end: 1020});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 974, end: 1040});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 974, end: 1054});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 990, end: 1021});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 990, end: 1052});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 1006, end: 1021});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 1022, end: 1036});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 1022, end: 1052});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 1038, end: 1049});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 1038, end: 1068});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_END,
          {start: 1046, end: 1050});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.FLING_START,
          {start: 1046, end: 1077});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_START,
          {start: 1432, end: 2238});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.FLING_CANCEL,
          {start: 1432, end: 2241});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 1516, end: 2605});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.SCROLL_BEGIN,
          {start: 1532, end: 2274});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 1532, end: 2294});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 1549, end: 2310});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_END,
          {start: 1627, end: 2275});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.FLING_START,
          {start: 1627, end: 2310});
      chrome_test_utils.addFrameEvent(model, {start: 2990, end: 3000});
    };
    verifier.expectedIRs = [
      {title: 'Idle', start: 0, end: 919, eventCount: 0},
      {title: 'Response', name: 'Scroll,Tap,Touch', start: 919, end: 1054,
          eventCount: 6},
      {title: 'Animation', name: 'Scroll,Touch', start: 1054, end: 1068,
          eventCount: 8},
      {title: 'Animation', name: 'Fling', start: 1054, end: 1432,
          eventCount: 2},
      {title: 'Response', name: 'Scroll,Touch', start: 1432, end: 2605,
          eventCount: 5},
      {title: 'Animation', name: 'Scroll', start: 1549, end: 2310,
          eventCount: 1},
      {title: 'Animation', name: 'Fling', start: 2605, end: 3000,
          eventCount: 1}
    ];
    verifier.verify();
  });

  test('keyboardEvents', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.KEY_DOWN_RAW,
          {start: 0, end: 45});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.CHAR,
          {start: 10, end: 50});
    };
    verifier.expectedIRs = [
      {title: 'Response', name: 'Keyboard', start: 0, end: 50, eventCount: 2}
    ];
    verifier.verify();
  });

  test('mouseResponses', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.CLICK,
          {start: 0, end: 100});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.CONTEXT_MENU,
          {start: 200, end: 300});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.MOUSE_WHEEL,
          {start: 400, end: 500});
    };
    verifier.expectedIRs = [
      {title: 'Response', name: 'Mouse', start: 0, end: 100, eventCount: 1},
      {title: 'Idle', start: 100, end: 200, eventCount: 0},
      {title: 'Response', name: 'Mouse', start: 200, end: 300, eventCount: 1},
      {title: 'Idle', start: 300, end: 400, eventCount: 0},
      {title: 'Response', name: 'MouseWheel', start: 400, end: 500,
          eventCount: 1}
    ];
    verifier.verify();
  });

  test('mouseWheelAnimation', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.MOUSE_WHEEL,
          {start: 0, end: 20});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.MOUSE_WHEEL,
          {start: 16, end: 36});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.MOUSE_WHEEL,
          {start: 55, end: 75});

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

  test('mouseDownUpResponse', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.MOUSE_DOWN,
          {start: 0, end: 100});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.MOUSE_UP,
          {start: 200, end: 210});
    };
    verifier.expectedIRs = [
      {title: 'Idle', start: 0, end: 200, eventCount: 0},
      {title: 'Response', name: 'Mouse', start: 200, end: 210, eventCount: 2}
    ];
    verifier.verify();
  });

  test('ignoreLoneMouseMoves', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      chrome_test_utils.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) {
      chrome_test_utils.addInputEvent(
          model, INPUT_TYPE.MOUSE_DOWN, {start: 0, end: 100});
      var mouseMove = chrome_test_utils.addInputEvent(
          model, INPUT_TYPE.MOUSE_MOVE, {start: 200, end: 215});
      addFrameEventForInput(model, mouseMove);
      mouseMove = chrome_test_utils.addInputEvent(
          model, INPUT_TYPE.MOUSE_MOVE, {start: 210, end: 220});
      addFrameEventForInput(model, mouseMove);
      mouseMove = chrome_test_utils.addInputEvent(
          model, INPUT_TYPE.MOUSE_MOVE, {start: 221, end: 240});
      addFrameEventForInput(model, mouseMove);
    };
    verifier.expectedIRs = [
      {title: 'Idle', start: 0, end: 200, eventCount: 0},
      {title: 'Response', name: 'Mouse', start: 200, end: 215, eventCount: 4},
      {title: 'Animation', name: 'Mouse', start: 215, end: 240, eventCount: 6}
    ];
    verifier.verify();
  });

  test('twoScrollsNoFling', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.SCROLL_BEGIN,
          {start: 0, end: 100});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 20, end: 100});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 40, end: 100});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 60, end: 150});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 70, end: 150});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.SCROLL_END,
          {start: 80, end: 150});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.SCROLL_BEGIN,
          {start: 300, end: 400});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 320, end: 400});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 330, end: 450});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 340, end: 450});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 350, end: 500});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.SCROLL_END,
          {start: 360, end: 500});
    };
    verifier.expectedIRs = [
      {title: 'Response', name: 'Scroll', start: 0, end: 100, eventCount: 2},
      {title: 'Animation', name: 'Scroll', start: 100, end: 150, eventCount: 4},
      {title: 'Idle', start: 150, end: 300, eventCount: 0},
      {title: 'Response', name: 'Scroll', start: 300, end: 400, eventCount: 2},
      {title: 'Animation', name: 'Scroll', 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) {
      chrome_test_utils.addEvent(model.rendererMain, {
        title: 'Animation', start: 0, end: 100});
      chrome_test_utils.addEvent(model.rendererMain, {
        title: 'Animation', start: 99, end: 200});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.FLING_START,
          {start: 150, end: 180});
      chrome_test_utils.addFrameEvent(model, {start: 290, end: 300});
    };
    verifier.expectedIRs = [
      {title: 'Animation', name: 'CSS', start: 0, end: 200, eventCount: 2},
      {title: 'Animation', name: 'Fling', start: 150, end: 300, eventCount: 1}
    ];
    verifier.verify();
  });

  test('flingThatIsntstopped', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.FLING_START,
          {start: 32, end: 100});
      chrome_test_utils.addFlingAnimationEvent(model, {start: 38, end: 200});
      chrome_test_utils.addFrameEvent(model, {start: 290, end: 300});
    };
    verifier.expectedIRs = [
      {title: 'Animation', name: 'Fling', 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) {
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.FLING_START,
          {start: 32, end: 100});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.FLING_CANCEL,
          {start: 105, end: 150});
    };
    verifier.expectedIRs = [
      {title: 'Animation', name: 'Fling', 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) {
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.FLING_START,
          {start: 0, end: 30});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_START,
          {start: 100, end: 130});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.FLING_CANCEL,
          {start: 100, end: 130});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 110, end: 140});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 170, end: 180});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_END,
          {start: 200, end: 210});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.FLING_START,
          {start: 200, end: 220});
      chrome_test_utils.addFrameEvent(model, {start: 230, end: 240});
    };
    verifier.expectedIRs = [
      {title: 'Animation', name: 'Fling', start: 0, end: 100, eventCount: 2},
      {title: 'Response', name: 'Touch', start: 100, end: 140, eventCount: 2},
      {title: 'Animation', name: 'Touch', start: 140, end: 210, eventCount: 2},
      {title: 'Animation', name: 'Fling', start: 200, end: 240, eventCount: 1}
    ];
    verifier.verify();
  });

  test('load', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      chrome_test_utils.addCommitLoadEvent(model, {
          start: 0, end: 10, args: {id: 1}});
      chrome_test_utils.addFinishLoadEvent(
          model, {start: 11, end: 14, args: {id: 1}});
      chrome_test_utils.addLoadFinishedEvent(
          model, {start: 12, end: 13});
      chrome_test_utils.addFrameEvent(model, {start: 15, end: 20});
    };
    verifier.expectedIRs = [
      {title: 'Load', name: 'Succeeded', start: 0, end: 20, eventCount: 4}
    ];
    verifier.verify();
  });

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

  test('loadStartup', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      chrome_test_utils.addRenderingEvent(model, {start: 2, end: 3});
      chrome_test_utils.addCreateThreadsEvent(model, {start: 5, end: 10});
      // Throw an second one in there, just to try to confuse the algo.
      chrome_test_utils.addCreateThreadsEvent(model, {start: 25, end: 30});
      chrome_test_utils.addFrameEvent(model, {start: 11, end: 20});
    };
    verifier.expectedIRs = [
      {title: 'Load', name: 'Startup', start: 2, end: 20, eventCount: 2},
      {title: 'Idle', start: 20, end: 30, eventCount: 0}
    ];
    verifier.verify();
  });

  test('totalIdle', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      chrome_test_utils.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) {
      chrome_test_utils.addFrameEvent(model, {start: 0, end: 1});
      chrome_test_utils.addCommitLoadEvent(model, {
          start: 1, end: 2, args: {id: 1}});
      chrome_test_utils.addFinishLoadEvent(
          model, {start: 2.1, end: 2.4, args: {id: 1}});
      chrome_test_utils.addLoadFinishedEvent(
          model, {start: 2.2, end: 2.3});
      chrome_test_utils.addFrameEvent(model, {start: 3, end: 4});
      chrome_test_utils.addCreateChildFrameEvent(model, {
          start: 4, end: 5, args: {id: 1, child: 2}});
      chrome_test_utils.addCommitLoadEvent(model, {
          start: 5, end: 6, args: {id: 2}});
      chrome_test_utils.addFrameEvent(model, {start: 7, end: 8});
      chrome_test_utils.addCreateChildFrameEvent(model, {
          start: 8, end: 9, args: {id: 1, child: 3}});
      chrome_test_utils.addCommitLoadEvent(model, {
          start: 9, end: 10, args: {id: 3}});
      chrome_test_utils.addFrameEvent(model, {start: 11, end: 12});
      chrome_test_utils.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: 4},
      {title: 'Idle', start: 4, end: 13, eventCount: 0}
    ];
    verifier.verify();
  });

  test('touchStartTouchEndTap', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_START,
          {start: 0, end: 10});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_END,
          {start: 200, end: 210});
    };
    verifier.expectedIRs = [
      {title: 'Response', name: 'Touch', start: 0, end: 210, eventCount: 2}
    ];
    verifier.verify();
  });

  test('touchMoveResponseAnimation', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_START,
          {start: 0, end: 10});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 50, end: 100});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 70, end: 150});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_END,
          {start: 200, end: 300});
    };
    verifier.expectedIRs = [
      {title: 'Response', name: 'Touch', start: 0, end: 100, eventCount: 2},
      {title: 'Animation', name: 'Touch', start: 100, end: 300, eventCount: 2}
    ];
    verifier.verify();
  });

  test('tapEvents', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TAP,
          {start: 0, end: 50});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TAP_DOWN,
          {start: 300, end: 310});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TAP,
          {start: 320, end: 350});
    };
    verifier.expectedIRs = [
      {title: 'Response', name: 'Tap', start: 0, end: 50, eventCount: 1},
      {title: 'Idle', start: 50, end: 300, eventCount: 0},
      {title: 'Response', name: 'Tap', start: 300, end: 350, eventCount: 2}
    ];
    verifier.verify();
  });

  test('tapAndTapCancelResponses', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TAP_DOWN,
          {start: 0, end: 100});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TAP_CANCEL,
          {start: 300, end: 350});
    };
    verifier.expectedIRs = [
      {title: 'Response', name: 'Tap', start: 0, end: 100, eventCount: 1},
      {title: 'Idle', start: 100, end: 300, eventCount: 0},
      {title: 'Response', name: 'Tap', start: 300, end: 350, eventCount: 1}
    ];
    verifier.verify();
  });

  test('tapCancelResponse', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TAP_DOWN,
          {start: 0, end: 100});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TAP_CANCEL,
          {start: 150, end: 200});
    };
    verifier.expectedIRs = [
      {title: 'Response', name: 'Tap', start: 0, end: 200, eventCount: 2}
    ];
    verifier.verify();
  });

  test('pinchResponseAnimation', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      chrome_test_utils.addFrameEvent(model, {start: 0, end: 10});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.PINCH_BEGIN,
          {start: 100, end: 150});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.PINCH_UPDATE,
          {start: 130, end: 160});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.PINCH_UPDATE,
          {start: 140, end: 200});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.PINCH_UPDATE,
          {start: 150, end: 205});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.PINCH_UPDATE,
          {start: 210, end: 220});
      // pause > 200ms
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.PINCH_UPDATE,
          {start: 421, end: 470});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.PINCH_END,
          {start: 460, end: 500});
    };
    verifier.expectedIRs = [
      {title: 'Idle', start: 0, end: 100, eventCount: 0},
      {title: 'Response', name: 'Pinch', start: 100, end: 160, eventCount: 2},
      {title: 'Animation', name: 'Pinch', start: 160, end: 220, eventCount: 3},
      {title: 'Idle', start: 220, end: 421, eventCount: 0},
      {title: 'Animation', name: 'Pinch', 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) {
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_START,
          {start: 0, end: 20});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_END,
          {start: 40, end: 100});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_START,
          {start: 50, end: 120});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 80, end: 150});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 180, end: 200});
    };
    verifier.expectedIRs = [
      {title: 'Response', name: 'Touch', start: 0, end: 100, eventCount: 2},
      {title: 'Response', name: 'Touch', start: 50, end: 150, eventCount: 2},
      {title: 'Animation', name: 'Touch', start: 150, end: 200, eventCount: 1}
    ];
    verifier.verify();
  });

  test('pinchFlingTapTouchEventsOverlap', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      chrome_test_utils.addFrameEvent(model, {start: 0, end: 10});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_START,
          {start: 20, end: 50});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TAP_DOWN,
          {start: 20, end: 30});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.FLING_CANCEL,
          {start: 20, end: 50});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 60, end: 100});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_START,
          {start: 60, end: 110});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.PINCH_BEGIN,
          {start: 60, end: 100});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TAP_CANCEL,
          {start: 65, end: 75});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 70, end: 100});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.PINCH_UPDATE,
          {start: 70, end: 100});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 75, end: 100});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 80, end: 100});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 85, end: 100});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.SCROLL_BEGIN,
          {start: 75, end: 100});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 150, end: 200});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 150, end: 200});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.FLING_START,
          {start: 180, end: 210});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_END,
          {start: 190, end: 210});
      chrome_test_utils.addFrameEvent(model, {start: 215, end: 220});
    };
    verifier.expectedIRs = [
      {title: 'Idle', start: 0, end: 20, eventCount: 0},
      {title: 'Response', name: 'Pinch,Scroll,Tap,Touch', start: 20, end: 110,
          eventCount: 9},
      {title: 'Animation', name: 'Scroll,Touch', start: 110, end: 210,
          eventCount: 6},
      {title: 'Animation', name: 'Fling', start: 180, end: 220, eventCount: 1}
    ];
    verifier.verify();
  });

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

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

  test('TapResponseOverlappingTouchAnimation', function() {
    var verifier = new IRVerifier();
    verifier.customizeModelCallback = function(model) {
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 0, end: 10});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 5, end: 15});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TOUCH_MOVE,
          {start: 10, end: 20});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.TAP,
          {start: 15, end: 100});
    };
    verifier.expectedIRs = [
      {title: 'Response', name: 'Tap,Touch', start: 0, end: 100,
          eventCount: 4}
    ];
    verifier.verify();
  });
});
</script>
