<!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/importer/user_expectation_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 UserExpectationVerifier = tr.importer.UserExpectationVerifier;

  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 UserExpectationVerifier();
    verifier.customizeModelCallback = function(model) {
    };
    verifier.expectedIRs = [
    ];
    verifier.verify();
  });

  test('slowMouseMoveResponses', function() {
    var verifier = new UserExpectationVerifier();
    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: 'Mouse Response', start: 10, end: 20, eventCount: 4},
      {title: 'Idle', start: 20, end: 70, eventCount: 0},
      {title: 'Mouse Response', start: 70, end: 80, eventCount: 3},
      {title: 'Idle', start: 80, end: 130, eventCount: 0},
      {title: 'Mouse Response', start: 130, end: 140, eventCount: 3}
    ];
    verifier.verify();
  });

  test('mouseEventResponses', function() {
    var verifier = new UserExpectationVerifier();
    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: 'Mouse Response', start: 0, end: 50, eventCount: 3},
      {title: 'Mouse Response', start: 50, end: 100, eventCount: 3},
      {title: 'Idle', start: 100, end: 200, eventCount: 0},
      {title: 'Mouse Response', start: 200, end: 250, eventCount: 3}
    ];
    verifier.verify();
  });

  test('mouseEventsIgnored', function() {
    var verifier = new UserExpectationVerifier();
    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 UserExpectationVerifier();
    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('stillLoading', function() {
    var verifier = new UserExpectationVerifier();
    verifier.customizeModelCallback = function(model) {
      chrome_test_utils.addFrameEvent(model, {start: 0, end: 10});
      chrome_test_utils.addNavigationStartEvent(model, {start: 10});
      chrome_test_utils.addFrameEvent(model, {start: 19, end: 20});
    };
    verifier.expectedIRs = [
      {title: 'Idle', start: 0, end: 10, eventCount: 0},
      {title: 'Successful Load', start: 10, end: 20, eventCount: 0}
    ];
    verifier.verify();
  });

  test('overlappingIdleAndLoadCollectUnassociatedEvents', function() {
    var verifier = new UserExpectationVerifier();
    verifier.customizeModelCallback = function(model) {
      chrome_test_utils.addFrameEvent(model, {start: 0, end: 10});
      chrome_test_utils.addNavigationStartEvent(model, {start: 10});
      chrome_test_utils.addFirstContentfulPaintEvent(model, {start: 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: 3},
      {title: 'Successful Load', start: 10, end: 30, eventCount: 0},
      {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 UserExpectationVerifier();
    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: 'Scroll,Tap,Touch Response', start: 919, end: 1054,
          eventCount: 6, isAnimationBegin: true},
      {title: 'Scroll,Touch Animation', start: 1054, end: 1068,
          eventCount: 8},
      {title: 'Fling Animation', start: 1054, end: 1432,
          eventCount: 2},
      {title: 'Scroll,Touch Response', start: 1432, end: 2605,
          eventCount: 5, isAnimationBegin: true},
      {title: 'Scroll Animation', start: 1549, end: 2310,
          eventCount: 1},
      {title: 'Fling Animation', start: 2605, end: 3000,
          eventCount: 1}
    ];
    verifier.verify();
  });

  test('keyboardEvents', function() {
    var verifier = new UserExpectationVerifier();
    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: 'Keyboard Response', start: 0, end: 50, eventCount: 2}
    ];
    verifier.verify();
  });

  test('mouseResponses', function() {
    var verifier = new UserExpectationVerifier();
    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: 'Mouse Response', start: 0, end: 100, eventCount: 1},
      {title: 'Idle', start: 100, end: 200, eventCount: 0},
      {title: 'Mouse Response', start: 200, end: 300, eventCount: 1},
      {title: 'Idle', start: 300, end: 400, eventCount: 0},
      {title: 'MouseWheel Response', start: 400, end: 500,
          eventCount: 1}
    ];
    verifier.verify();
  });

  test('mouseWheelAnimation', function() {
    var verifier = new UserExpectationVerifier();
    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: 'MouseWheel Response', start: 0, end: 20, eventCount: 1},
      {title: 'MouseWheel Animation', start: 20, end: 75,
          eventCount: 2},
      {title: 'Idle', start: 75, end: 100, eventCount: 0},
      {title: 'MouseWheel Response', start: 100, end: 150,
          eventCount: 1},
      {title: 'MouseWheel Response', start: 141, end: 191,
          eventCount: 1},
      {title: 'MouseWheel Response', start: 182, end: 200,
          eventCount: 1}
    ];
    verifier.verify();
  });

  test('mouseDownUpResponse', function() {
    var verifier = new UserExpectationVerifier();
    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: 'Mouse Response', start: 200, end: 210, eventCount: 2}
    ];
    verifier.verify();
  });

  test('ignoreLoneMouseMoves', function() {
    var verifier = new UserExpectationVerifier();
    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 UserExpectationVerifier();
    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: 'Mouse Response', start: 200, end: 215, eventCount: 4},
      {title: 'Mouse Animation', start: 215, end: 240, eventCount: 6}
    ];
    verifier.verify();
  });

  test('twoScrollsNoFling', function() {
    var verifier = new UserExpectationVerifier();
    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: 'Scroll Response', start: 0, end: 100, eventCount: 2,
          isAnimationBegin: true},
      {title: 'Scroll Animation', start: 100, end: 150, eventCount: 4},
      {title: 'Idle', start: 150, end: 300, eventCount: 0},
      {title: 'Scroll Response', start: 300, end: 400, eventCount: 2,
          isAnimationBegin: true},
      {title: 'Scroll 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 UserExpectationVerifier();
    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: 'CSS Animation', start: 0, end: 200, eventCount: 2},
      {title: 'Fling Animation', start: 150, end: 300, eventCount: 1}
    ];
    verifier.verify();
  });

  test('flingThatIsntstopped', function() {
    var verifier = new UserExpectationVerifier();
    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: 'Fling Animation', start: 32, end: 200, eventCount: 2},
      {title: 'Idle', start: 200, end: 300, eventCount: 0}
    ];
    verifier.verify();
  });

  test('flingThatIsStopped', function() {
    var verifier = new UserExpectationVerifier();
    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: 'Fling 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 UserExpectationVerifier();
    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: 'Fling Animation', start: 0, end: 100, eventCount: 2},
      {title: 'Touch Response', start: 100, end: 140, eventCount: 2,
          isAnimationBegin: true},
      {title: 'Touch Animation', start: 140, end: 210, eventCount: 2},
      {title: 'Fling Animation', start: 200, end: 240, eventCount: 1}
    ];
    verifier.verify();
  });

  test('load', function() {
    var verifier = new UserExpectationVerifier();
    verifier.customizeModelCallback = function(model) {
      chrome_test_utils.addNavigationStartEvent(model, {start: 0});
      chrome_test_utils.addFirstContentfulPaintEvent(model, {start: 20});
    };
    verifier.expectedIRs = [
      {title: 'Successful Load', start: 0, end: 20, eventCount: 0}
    ];
    verifier.verify();
  });

  test('loadStartup', function() {
    var verifier = new UserExpectationVerifier();
    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: 'Startup Load', start: 2, end: 20, eventCount: 2},
      {title: 'Idle', start: 20, end: 30, eventCount: 0}
    ];
    verifier.verify();
  });

  test('totalIdle', function() {
    var verifier = new UserExpectationVerifier();
    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 UserExpectationVerifier();
    verifier.customizeModelCallback = function(model) {
      chrome_test_utils.addFrameEvent(model, {start: 0, end: 1});
      chrome_test_utils.addNavigationStartEvent(model, {start: 1});
      chrome_test_utils.addFirstContentfulPaintEvent(model, {start: 4});
      chrome_test_utils.addFrameEvent(model, {start: 12, end: 13});
    };
    verifier.expectedIRs = [
      {title: 'Idle', start: 0, end: 1, eventCount: 0},
      {title: 'Successful Load', start: 1, end: 4, eventCount: 0},
      {title: 'Idle', start: 4, end: 13, eventCount: 0}
    ];
    verifier.verify();
  });

  test('touchStartTouchEndTap', function() {
    var verifier = new UserExpectationVerifier();
    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: 'Touch Response', start: 0, end: 210, eventCount: 2,
          isAnimationBegin: true}
    ];
    verifier.verify();
  });

  test('touchMoveResponseAnimation', function() {
    var verifier = new UserExpectationVerifier();
    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: 'Touch Response', start: 0, end: 100, eventCount: 2,
          isAnimationBegin: true},
      {title: 'Touch Animation', start: 100, end: 300, eventCount: 2}
    ];
    verifier.verify();
  });

  test('tapEvents', function() {
    var verifier = new UserExpectationVerifier();
    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: 'Tap Response', start: 0, end: 50, eventCount: 1},
      {title: 'Idle', start: 50, end: 300, eventCount: 0},
      {title: 'Tap Response', start: 300, end: 350, eventCount: 2}
    ];
    verifier.verify();
  });

  test('tapAndTapCancelResponses', function() {
    var verifier = new UserExpectationVerifier();
    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: 'Tap Response', start: 0, end: 100, eventCount: 1},
      {title: 'Idle', start: 100, end: 300, eventCount: 0},
      {title: 'Tap Response', start: 300, end: 350, eventCount: 1}
    ];
    verifier.verify();
  });

  test('tapCancelResponse', function() {
    var verifier = new UserExpectationVerifier();
    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: 'Tap Response', start: 0, end: 200, eventCount: 2}
    ];
    verifier.verify();
  });

  test('pinchResponseAnimation', function() {
    var verifier = new UserExpectationVerifier();
    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: 'Pinch Response', start: 100, end: 160, eventCount: 2,
          isAnimationBegin: true},
      {title: 'Pinch Animation', start: 160, end: 220, eventCount: 3},
      {title: 'Idle', start: 220, end: 421, eventCount: 0},
      {title: 'Pinch Animation', start: 421, end: 500, eventCount: 2}
    ];
    verifier.verify();
  });

  test('tapThenScroll', function() {
    // measurmt-traces/mobile/google_io_instrument_strumming.json
    var verifier = new UserExpectationVerifier();
    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: 'Touch Response', start: 0, end: 100, eventCount: 2,
          isAnimationBegin: true},
      {title: 'Touch Response', start: 50, end: 150, eventCount: 2,
          isAnimationBegin: true},
      {title: 'Touch Animation', start: 150, end: 200, eventCount: 1}
    ];
    verifier.verify();
  });

  test('pinchFlingTapTouchEventsOverlap', function() {
    var verifier = new UserExpectationVerifier();
    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: 'Pinch,Scroll,Tap,Touch Response', start: 20, end: 110,
          eventCount: 9, isAnimationBegin: true},
      {title: 'Scroll,Touch Animation', start: 110, end: 210,
          eventCount: 6},
      {title: 'Fling Animation', start: 180, end: 220, eventCount: 1}
    ];
    verifier.verify();
  });

  test('scrollThenFling', function() {
    var verifier = new UserExpectationVerifier();
    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: 'Scroll Animation', start: 0, end: 100, eventCount: 2},
      {title: 'Fling 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('flingHNToRest', function() {
    var verifier = new UserExpectationVerifier();
    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: 'Scroll,Tap,Touch Response', start: 1274, end: 1387,
          eventCount: 6, isAnimationBegin: true},
      {title: 'Scroll,Touch Animation', start: 1387, end: 1474,
          eventCount: 10},
      {title: 'Fling Animation', start: 1427, end: 2300,
          eventCount: 2},
      {title: 'Idle', start: 2300, end: 3185, eventCount: 0}
    ];
    verifier.verify();
  });

  test('TapResponseOverlappingTouchAnimation', function() {
    var verifier = new UserExpectationVerifier();
    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: 'Tap,Touch Response', start: 0, end: 100,
          eventCount: 4}
    ];
    verifier.verify();
  });
});
</script>
