<!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('videoExpectations_gapInMiddle', function() {
    var verifier = new UserExpectationVerifier();
    verifier.customizeModelCallback = function(model) {
      model.rendererMain.asyncSliceGroup.push(tr.c.TestUtils.newAsyncSliceEx(
          {title: 'VideoPlayback', start: 0, end: 100, isTopLevel: true}));
      chrome_test_utils.addFrameEvent(model, {start: 10, end: 20});
      model.rendererMain.asyncSliceGroup.push(tr.c.TestUtils.newAsyncSliceEx(
          {title: 'VideoPlayback', start: 200, end: 300, isTopLevel: true}));
      chrome_test_utils.addFrameEvent(model, {start: 210, end: 220});
    };
    verifier.expectedIRs = [
      {title: 'Video Animation', start: 0, end: 100, eventCount: 2},
      {title: 'Idle', start: 100, end: 200, eventCount: 0},
      {title: 'Video Animation', start: 200, end: 300, eventCount: 2},
    ];
    verifier.verify();
  });

  test('videoExpectations_overlapping', function() {
    var verifier = new UserExpectationVerifier();
    verifier.customizeModelCallback = function(model) {
      model.rendererMain.asyncSliceGroup.push(tr.c.TestUtils.newAsyncSliceEx(
          {title: 'VideoPlayback', start: 0, end: 200, isTopLevel: true}));
      chrome_test_utils.addFrameEvent(model, {start: 10, end: 20});
      model.rendererMain.asyncSliceGroup.push(tr.c.TestUtils.newAsyncSliceEx(
          {title: 'VideoPlayback', start: 100, end: 300, isTopLevel: true}));
      chrome_test_utils.addFrameEvent(model, {start: 210, end: 220});
    };
    verifier.expectedIRs = [
      {title: 'Video Animation', start: 0, end: 300, eventCount: 4},
    ];
    verifier.verify();
  });

  test('videoExpectations_oneInTheOther', function() {
    var verifier = new UserExpectationVerifier();
    verifier.customizeModelCallback = function(model) {
      model.rendererMain.asyncSliceGroup.push(tr.c.TestUtils.newAsyncSliceEx(
          {title: 'VideoPlayback', start: 0, end: 300, isTopLevel: true}));
      chrome_test_utils.addFrameEvent(model, {start: 10, end: 20});
      model.rendererMain.asyncSliceGroup.push(tr.c.TestUtils.newAsyncSliceEx(
          {title: 'VideoPlayback', start: 100, end: 200, isTopLevel: true}));
      chrome_test_utils.addFrameEvent(model, {start: 110, end: 120});
    };
    verifier.expectedIRs = [
      {title: 'Video Animation', start: 0, end: 300, eventCount: 4},
    ];
    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: 1},
      {title: 'Successful Load', start: 10, end: 20, eventCount: 1}
    ];
    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: 4},
      {title: 'Successful Load', start: 10, end: 30, eventCount: 0},
      {title: 'Idle', start: 30, end: 40, 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 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.addFrameEvent(model,
          {start: 1039, end: 1040, isTopLevel: true});
      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.addFrameEvent(model,
          {start: 1051, end: 1052, isTopLevel: true});
      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.addFrameEvent(model,
          {start: 1067, end: 1068, isTopLevel: true});
      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.addFrameEvent(model,
          {start: 2293, end: 2294, isTopLevel: true});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 1549, end: 2310});
      chrome_test_utils.addFrameEvent(model,
          {start: 2309, end: 2310, isTopLevel: true});
      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: 1},
      {title: 'Scroll,Tap,Touch Response', start: 919, end: 1054,
          eventCount: 6, isAnimationBegin: true},
      {title: 'Scroll,Touch Animation', start: 1054, end: 1068,
          eventCount: 11},
      {title: 'Fling Animation', start: 1054, end: 1432,
          eventCount: 4},
      {title: 'Scroll,Touch Response', start: 1432, end: 2605,
          eventCount: 5, isAnimationBegin: true},
      {title: 'Scroll Animation', start: 1549, end: 2310,
          eventCount: 3},
      {title: 'Fling Animation', start: 2605, end: 3000,
          eventCount: 4}
    ];
    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.addFrameEvent(model,
          {start: 19, end: 20, isTopLevel: true});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.MOUSE_WHEEL,
          {start: 16, end: 36});
      chrome_test_utils.addFrameEvent(model,
          {start: 35, end: 36, isTopLevel: true});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.MOUSE_WHEEL,
          {start: 55, end: 75});
      chrome_test_utils.addFrameEvent(model,
          {start: 74, end: 75, isTopLevel: true});

      // 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.addFrameEvent(model,
          {start: 149, end: 150, isTopLevel: true});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.MOUSE_WHEEL,
          {start: 141, end: 191});
      chrome_test_utils.addFrameEvent(model,
          {start: 190, end: 191, isTopLevel: true});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.MOUSE_WHEEL,
          {start: 182, end: 200});
      chrome_test_utils.addFrameEvent(model,
          {start: 199, end: 200, isTopLevel: true});
    };
    verifier.expectedIRs = [
      {title: 'MouseWheel Response', start: 0, end: 20, eventCount: 1},
      {title: 'MouseWheel Animation', start: 20, end: 75,
          eventCount: 5},
      {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.addFrameEvent(model, {start: 149, 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.addFrameEvent(model, {start: 499, 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: 5},
      {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: 5}
    ];
    verifier.verify();
  });

  test('webGLAnimations_oneAnimation', function() {
    var verifier = new UserExpectationVerifier();
    verifier.customizeModelCallback = function(model) {
      model.rendererMain.asyncSliceGroup.push(tr.c.TestUtils.newAsyncSliceEx(
          {title: 'DrawingBuffer::prepareMailbox', start: 0, end: 2}));
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'PageAnimator::serviceScriptedAnimations',
          start: 18, end: 19});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'DrawingBuffer::prepareMailbox', start: 20, end: 22});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'PageAnimator::serviceScriptedAnimations',
          start: 38, end: 39});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'DrawingBuffer::prepareMailbox', start: 40, end: 42});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'PageAnimator::serviceScriptedAnimations',
          start: 58, end: 59});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'DrawingBuffer::prepareMailbox', start: 60, end: 62});
    };
    verifier.expectedIRs = [
      {title: 'WebGL Animation', start: 0, end: 62, eventCount: 4},
    ];
    verifier.verify();
  });

  test('webGLAnimations_twoAnimations', function() {
    var verifier = new UserExpectationVerifier();
    verifier.customizeModelCallback = function(model) {
      model.rendererMain.asyncSliceGroup.push(tr.c.TestUtils.newAsyncSliceEx(
          {title: 'DrawingBuffer::prepareMailbox', start: 0, end: 2}));
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'PageAnimator::serviceScriptedAnimations',
          start: 18, end: 19});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'DrawingBuffer::prepareMailbox', start: 20, end: 22});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'PageAnimator::serviceScriptedAnimations',
          start: 38, end: 39});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'DrawingBuffer::prepareMailbox', start: 40, end: 42});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'PageAnimator::serviceScriptedAnimations',
          start: 58, end: 59});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'DrawingBuffer::prepareMailbox', start: 60, end: 62});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'PageAnimator::serviceScriptedAnimations',
          start: 218, end: 19});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'DrawingBuffer::prepareMailbox', start: 220, end: 222});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'PageAnimator::serviceScriptedAnimations',
          start: 238, end: 39});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'DrawingBuffer::prepareMailbox', start: 240, end: 242});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'PageAnimator::serviceScriptedAnimations',
          start: 258, end: 59});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'DrawingBuffer::prepareMailbox', start: 260, end: 262});
    };
    verifier.expectedIRs = [
      {title: 'WebGL Animation', start: 0, end: 62, eventCount: 4},
      {title: 'Idle', start: 62, end: 220, eventCount: 0},
      {title: 'WebGL Animation', start: 220, end: 262, eventCount: 3}
    ];
    verifier.verify();
  });

  test('webGLAnimations_oneWithAnimationEventsOneWithout', function() {
    var verifier = new UserExpectationVerifier();
    verifier.customizeModelCallback = function(model) {
      model.rendererMain.asyncSliceGroup.push(tr.c.TestUtils.newAsyncSliceEx(
          {title: 'DrawingBuffer::prepareMailbox', start: 0, end: 2}));
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'PageAnimator::serviceScriptedAnimations',
          start: 18, end: 19});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'DrawingBuffer::prepareMailbox', start: 20, end: 22});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'PageAnimator::serviceScriptedAnimations',
          start: 38, end: 39});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'DrawingBuffer::prepareMailbox', start: 40, end: 42});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'PageAnimator::serviceScriptedAnimations',
          start: 58, end: 59});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'DrawingBuffer::prepareMailbox', start: 60, end: 62});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'DrawingBuffer::prepareMailbox', start: 220, end: 222});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'DrawingBuffer::prepareMailbox', start: 240, end: 242});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'DrawingBuffer::prepareMailbox', start: 260, end: 262});
    };
    verifier.expectedIRs = [
      {title: 'WebGL Animation', start: 0, end: 62, eventCount: 4},
      {title: 'Idle', start: 62, end: 262, eventCount: 0},
    ];
    verifier.verify();
  });

  test('webGLAnimations_noAnimationEvents', function() {
    var verifier = new UserExpectationVerifier();
    verifier.customizeModelCallback = function(model) {
      model.rendererMain.asyncSliceGroup.push(tr.c.TestUtils.newAsyncSliceEx(
          {title: 'DrawingBuffer::prepareMailbox', start: 0, end: 2}));
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'DrawingBuffer::prepareMailbox', start: 20, end: 22});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'DrawingBuffer::prepareMailbox', start: 40, end: 42});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'DrawingBuffer::prepareMailbox', start: 60, end: 62});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'DrawingBuffer::prepareMailbox', start: 220, end: 222});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'DrawingBuffer::prepareMailbox', start: 240, end: 242});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'DrawingBuffer::prepareMailbox', start: 260, end: 262});
    };
    verifier.expectedIRs = [
      {title: 'Idle', start: 0, end: 262, eventCount: 0},
    ];
    verifier.verify();
  });

  test('webGLAnimations_animationEventsOnly', function() {
    var verifier = new UserExpectationVerifier();
    verifier.customizeModelCallback = function(model) {
      model.rendererMain.asyncSliceGroup.push(tr.c.TestUtils.newAsyncSliceEx(
          {title: 'PageAnimator::serviceScriptedAnimations',
          start: 0, end: 2}));
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'PageAnimator::serviceScriptedAnimations',
          start: 20, end: 22});
      chrome_test_utils.addEvent(model.rendererMain, {
          title: 'PageAnimator::serviceScriptedAnimations',
          start: 40, end: 42});
    };
    verifier.expectedIRs = [
      {title: 'Idle', start: 0, end: 42, eventCount: 0},
    ];
    verifier.verify();
  });

  test('webGLAnimations_oneEvent', function() {
    var verifier = new UserExpectationVerifier();
    verifier.customizeModelCallback = function(model) {
      model.rendererMain.asyncSliceGroup.push(tr.c.TestUtils.newAsyncSliceEx(
          {title: 'DrawingBuffer::prepareMailbox', start: 0, end: 2}));
      chrome_test_utils.addEvent(model.rendererMain, {
        title: 'PageAnimator::serviceScriptedAnimations',
        start: 4, end: 6});
    };
    verifier.expectedIRs = [
      {title: 'WebGL Animation', start: 0, end: 2, eventCount: 1},
      {title: 'Idle', start: 2, end: 6, eventCount: 0},
    ];
    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) {
      model.rendererMain.asyncSliceGroup.push(tr.c.TestUtils.newAsyncSliceEx(
          {title: 'Animation', start: 0, end: 130, isTopLevel: true}));
      chrome_test_utils.addFrameEvent(model, {start: 10, end: 20});
      chrome_test_utils.addEvent(model.rendererMain, {
        title: 'Animation', start: 131, end: 200, isTopLevel: true});
      chrome_test_utils.addFrameEvent(model, {start: 150, end: 160});
      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: 4},
      {title: 'Fling Animation', start: 150, end: 300, eventCount: 3}
    ];
    verifier.verify();
  });

  test('cssAnimationStatesRunningAtEnd', function() {
    var verifier = new UserExpectationVerifier();
    verifier.customizeModelCallback = function(model) {
      // If a top-level Animation async slice has state-change instant
      // events and the last one is a "running" event, then it will run
      // to the end of the top level event.
      var animationA = tr.c.TestUtils.newAsyncSliceEx(
          {title: 'Animation', start: 0, end: 500, isTopLevel: true});
      animationA.subSlices.push(tr.c.TestUtils.newInstantEvent(
          {title: 'Animation', start: 100, args: {data: {state: 'running'}}}));
      animationA.subSlices.push(tr.c.TestUtils.newInstantEvent(
          {title: 'Animation', start: 200, args: {data: {state: 'idle'}}}));
      animationA.subSlices.push(tr.c.TestUtils.newInstantEvent(
          {title: 'Animation', start: 300, args: {data: {state: 'running'}}}));
      model.rendererMain.asyncSliceGroup.push(animationA);
      chrome_test_utils.addFrameEvent(model, {start: 50, end: 60});
      chrome_test_utils.addFrameEvent(model, {start: 150, end: 160});
      chrome_test_utils.addFrameEvent(model, {start: 250, end: 260});
      chrome_test_utils.addFrameEvent(model, {start: 350, end: 360});
      chrome_test_utils.addFrameEvent(model, {start: 450, end: 460});
      // We include a frame event off the end of the top level animation slice
      // so we can test that it correctly stops the AnimationExpectation
      // at the end of the top-level event, not tne end of the whole trace,
      chrome_test_utils.addFrameEvent(model, {start: 1050, end: 1060});
    };
    verifier.expectedIRs = [
      {title: 'Idle', start: 0, end: 100, eventCount: 1},
      {title: 'CSS Animation', start: 100, end: 200, eventCount: 5},
      {title: 'Idle', start: 200, end: 300, eventCount: 1},
      {title: 'CSS Animation', start: 300, end: 500, eventCount: 6},
      {title: 'Idle', start: 500, end: 1060, eventCount: 1},
    ];
    verifier.verify();
  });

  test('cssAnimationStates', function() {
    var verifier = new UserExpectationVerifier();
    verifier.customizeModelCallback = function(model) {
      // If a top-level Animation async slice does not have state-change instant
      // subSlices, then assume that the animation was running throughout the
      // async slice.
      chrome_test_utils.addEvent(model.rendererMain, {
        title: 'Animation', start: 181, end: 250, isTopLevel: true});
      chrome_test_utils.addFrameEvent(model, {start: 200, end: 240});

      // Animation ranges should be merged if there is less than 32ms dead time
      // between them.

      // If a top-level Animation async slice has state-change instant events,
      // then run a state machine to find the time ranges when the animation was
      // actually running.

      // This animation was running from 10-40 and 50-60.
      var animationA = tr.c.TestUtils.newAsyncSliceEx(
          {title: 'Animation', start: 50, end: 500, isTopLevel: true});
      animationA.subSlices.push(tr.c.TestUtils.newInstantEvent(
          {title: 'Animation', start: 71, args: {data: {state: 'running'}}}));
      animationA.subSlices.push(tr.c.TestUtils.newInstantEvent(
          {title: 'Animation', start: 104, args: {data: {state: 'pending'}}}));
      animationA.subSlices.push(tr.c.TestUtils.newInstantEvent(
          {title: 'Animation', start: 137, args: {data: {state: 'running'}}}));
      animationA.subSlices.push(tr.c.TestUtils.newInstantEvent(
          {title: 'Animation', start: 150, args: {data: {state: 'paused'}}}));
      animationA.subSlices.push(tr.c.TestUtils.newInstantEvent(
          {title: 'Animation', start: 281, args: {data: {state: 'running'}}}));
      animationA.subSlices.push(tr.c.TestUtils.newInstantEvent(
          {title: 'Animation', start: 350, args: {data: {state: 'idle'}}}));
      model.rendererMain.asyncSliceGroup.push(animationA);
      chrome_test_utils.addFrameEvent(model, {start: 80, end: 90});
      chrome_test_utils.addFrameEvent(model, {start: 290, end: 300});

      // An animation without a frame event isn't really an animation.
      var animationC = tr.c.TestUtils.newAsyncSliceEx(
          {title: 'Animation', start: 350, end: 382, isTopLevel: true});
      model.rendererMain.asyncSliceGroup.push(animationC);
      animationA.subSlices.push(tr.c.TestUtils.newInstantEvent(
          {title: 'Animation', start: 350, args: {data: {state: 'idle'}}}));

      // This animation was running from model.bounds.min-50 and
      // 70-model.bounds.max.
      var animationB = tr.c.TestUtils.newAsyncSliceEx(
          {title: 'Animation', start: 0, end: 500, isTopLevel: true});
      animationB.subSlices.push(tr.c.TestUtils.newInstantEvent(
          {title: 'Animation', start: 40, args: {data: {state: 'finished'}}}));
      animationB.subSlices.push(tr.c.TestUtils.newInstantEvent(
          {title: 'Animation', start: 382, args: {data: {state: 'running'}}}));
      model.rendererMain.asyncSliceGroup.push(animationB);
      chrome_test_utils.addFrameEvent(model, {start: 10, end: 20});
      chrome_test_utils.addFrameEvent(model, {start: 390, end: 400});
    };
    verifier.expectedIRs = [
      {title: 'CSS Animation', start: 0, end: 350, eventCount: 16},
      {title: 'Idle', start: 350, end: 382, eventCount: 0},
      {title: 'CSS Animation', start: 382, end: 500, eventCount: 4},
    ];
    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: 199, end: 200});
      chrome_test_utils.addFrameEvent(model, {start: 290, end: 300});
    };
    verifier.expectedIRs = [
      {title: 'Fling Animation', start: 32, end: 200, eventCount: 3},
      {title: 'Idle', start: 200, end: 300, eventCount: 1}
    ];
    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});
      chrome_test_utils.addFrameEvent(model, {start: 104, end: 105});
      chrome_test_utils.addFrameEvent(model, {start: 149, end: 150});
    };
    verifier.expectedIRs = [
      {title: 'Fling Animation', start: 32, end: 105, eventCount: 3},
      {title: 'Idle', start: 105, end: 150, eventCount: 1}
    ];
    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.addFrameEvent(model, {start: 40, end: 41});
      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.addFrameEvent(model, {start: 150, end: 151});
      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: 3},
      {title: 'Touch Response', start: 100, end: 140, eventCount: 2,
          isAnimationBegin: true},
      {title: 'Touch Animation', start: 140, end: 210, eventCount: 3},
      {title: 'Fling Animation', start: 200, end: 240, eventCount: 2}
    ];
    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', start: 2, end: 20, eventCount: 3},
      {title: 'Idle', start: 20, end: 30, eventCount: 1}
    ];
    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: 1}
    ];
    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: 1},
      {title: 'Successful Load', start: 1, end: 4, eventCount: 0},
      {title: 'Idle', start: 4, end: 13, eventCount: 1}
    ];
    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});
      chrome_test_utils.addFrameEvent(model, {start: 299, end: 300});
    };
    verifier.expectedIRs = [
      {title: 'Touch Response', start: 0, end: 100, eventCount: 2,
          isAnimationBegin: true},
      {title: 'Touch Animation', start: 100, end: 300, eventCount: 3}
    ];
    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.addFrameEvent(model, {start: 159, end: 160});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.PINCH_UPDATE,
          {start: 140, end: 200});
      chrome_test_utils.addFrameEvent(model, {start: 199, end: 200});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.PINCH_UPDATE,
          {start: 150, end: 205});
      chrome_test_utils.addFrameEvent(model, {start: 204, end: 205});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.PINCH_UPDATE,
          {start: 210, end: 220});
      chrome_test_utils.addFrameEvent(model, {start: 219, end: 220});
      // pause > 200ms
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.PINCH_UPDATE,
          {start: 421, end: 470});
      chrome_test_utils.addFrameEvent(model, {start: 469, end: 470});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.PINCH_END,
          {start: 460, end: 500});
    };
    verifier.expectedIRs = [
      {title: 'Idle', start: 0, end: 100, eventCount: 1},
      {title: 'Pinch Response', start: 100, end: 160, eventCount: 2,
          isAnimationBegin: true},
      {title: 'Pinch Animation', start: 160, end: 220, eventCount: 7},
      {title: 'Idle', start: 220, end: 421, eventCount: 0},
      {title: 'Pinch Animation', start: 421, end: 500, eventCount: 3}
    ];
    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});
      chrome_test_utils.addFrameEvent(model, {start: 199, 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: 2}
    ];
    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.addFrameEvent(model, {start: 199, end: 200});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.FLING_START,
          {start: 180, end: 210});
      chrome_test_utils.addFrameEvent(model, {start: 209, 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: 1},
      {title: 'Pinch,Scroll,Tap,Touch Response', start: 20, end: 110,
          eventCount: 9, isAnimationBegin: true},
      {title: 'Scroll,Touch Animation', start: 110, end: 210,
          eventCount: 7},
      {title: 'Fling Animation', start: 180, end: 220, eventCount: 4}
    ];
    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.addFrameEvent(model, {start: 99, 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: 3},
      {title: 'Fling Animation', start: 80, end: 200, eventCount: 3}
    ];
    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.addFrameEvent(model, {start: 1431, end: 1432});
      chrome_test_utils.addInputEvent(model, INPUT_TYPE.SCROLL_UPDATE,
          {start: 1419, end: 1474});
      chrome_test_utils.addFrameEvent(model, {start: 1473, 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: 12},
      {title: 'Fling Animation', start: 1427, end: 2300,
          eventCount: 4},
      {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.addFrameEvent(model, {start: 19, 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: 5}
    ];
    verifier.verify();
  });
});
</script>
