// Copyright 2014 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.

// Include test fixture.
GEN_INCLUDE(['../../testing/chromevox_unittest_base.js']);

/**
 * Test fixture.
 * @constructor
 * @extends {ChromeVoxUnitTestBase}
 */
function ChromeVoxEventWatcherUnitTest() {
  ChromeVoxUnitTestBase.call(this);
}

ChromeVoxEventWatcherUnitTest.prototype = {
  __proto__: ChromeVoxUnitTestBase.prototype,

  /** @override */
  isAsync: true,

  /** @override */
  closureModuleDeps: ChromeVoxUnitTestBase.prototype.closureModuleDeps.concat([
    'cvox.ChromeVoxTester',
  ]),

  /** @override */
  setUp: function() {
    cvox.ChromeVoxTester.setUp(document);
  },

  /** @override */
  tearDown: function() {
    cvox.ChromeVoxTester.tearDown(document);
  },

  /**
   * Create mock event object.
   * @param {Element} target The event target.
   * @param {number=} opt_keyCode The event key code (i.e. 13 for Enter).
   * @param {string=} opt_type The event type (i.e. 'keydown' or
   *  'focus').
   * @param {number=} opt_timeStamp The event timeStamp.
   * @return {Event} The mock event.
   * @suppress {invalidCasts}
   */
  createMockEvent: function(target, opt_keyCode, opt_type, opt_timeStamp) {
    var mockEvent = {};
    mockEvent.target = target;
    if (opt_keyCode) {
      mockEvent.keyCode = opt_keyCode;
    }
    if (opt_type) {
      mockEvent.type = opt_type;
    }
    if (opt_timeStamp) {
      mockEvent.timeStamp = opt_timeStamp;
    }

    return /** @type {Event} */ (mockEvent);
  },

  /**
   * Simulate typing a key into an text field by modifying a given field and
   * dispatching a keydown event to ChromeVoxEventWatcher. Allows modifying the
   * selection so arrow keypresses can be simulated.
   * @param {Element} textField The text field.
   * @param {string} newValue The new value for the text field.
   * @param {number} newSelStart The new selection start.
   * @param {number} newSelEnd The new selection end.
   * @param {number} keyCode The key code for the keydown event.
   * @return {Element} The modified text field.
   */
  changeTextField: function(
      textField, newValue, newSelStart, newSelEnd, keyCode) {
    textField.value = newValue;
    textField.selectionStart = newSelStart;
    textField.selectionEnd = newSelEnd;

    cvox.ChromeVoxEventWatcher.keyDownEventWatcher(
        this.createMockEvent(textField, keyCode, 'keydown'));
    return textField;
  }
};

TEST_F('ChromeVoxEventWatcherUnitTest', 'ButtonFocusFeedback', function() {
  this.loadHtml('<div> <button id="alpha">Alpha</button> </div>');
  this.setFocus('alpha');
  this.waitForCalm(this.assertSpoken, 'Alpha Button');
});

/**
 * Test feedback when focusing links backwards (like shift-tabbing).
 */
TEST_F('ChromeVoxEventWatcherUnitTest', 'FocusLinksBackwards', function() {
  this.loadHtml('<div> <p>before</p>' +
      '<p><a href="#" id="l1">1</a></p>' +
      '<p><a href="#" id="l2">2</a></p>' +
      '<p><a href="#" id="l3">3</a></p>' +
      '</div>');

  this.waitForCalm(this.setFocus, 'l1')
      .waitForCalm(this.setFocus, 'l2')
      .waitForCalm(this.setFocus, 'l3')
      .waitForCalm(this.setFocus, 'l2')
      .waitForCalm(this.setFocus, 'l1')
      .waitForCalm(this.assertSpoken,
          '1 Internal link 2 Internal link 3 Internal link ' +
          '2 Internal link 1 Internal link');
});

/**
 * Test feedback when an editable text field gets focus.
 */
// Flaky on Chromium OS: crbug.com/622387, crbug.com/912390.
TEST_F('ChromeVoxEventWatcherUnitTest', 'DISABLED_TextFocusFeedback', function() {
  this.loadHtml('<div>' +
      '<label for="mytext">Label</label>' +
      '<input id="mytext" value="Value" title="Title" />' +
      '</div>');

  this.setFocus('mytext');
  this.waitForCalm(this.assertSpoken, 'Label Value Edit text');
});

/**
 * Test feedback when a contenteditable field gets focus.
 */
// Flaky on Chromium OS: crbug.com/622387.
TEST_F('ChromeVoxEventWatcherUnitTest', 'DISABLED_ContentEditableFocusFeedback',
       function() {
  this.loadHtml('<div>' +
      '<label for="mytext">Label</label>' +
      '<div id="mytext" contentEditable>This is editable</div>' +
      '</div>');

  this.setFocus('mytext');
  this.waitForCalm(this.assertSpoken, 'Label This is editable Edit text');
});

/**
 * Test feedback when an item in an dialog receives focus and then focus
 *     leaves the dialog.
 */
// Flaky on Chromium OS: crbug.com/622387.
TEST_F('ChromeVoxEventWatcherUnitTest', 'DISABLED_DialogFeedback', function() {
  this.loadHtml('<div>' +
      '<button id="show">Show</button>' +
      '<div aria-label="compose message" role="dialog">' +
      '  <button id="ok">OK</button>' +
      '  <button id="cancel">Cancel</button>' +
      '</div>' +
      '</div>');

  // Enter the dialog by focusing an element inside it.
  this.setFocus('ok');

  this.waitForCalm(this.assertSpoken,
                   'Entered dialog compose message Dialog OK Button')
      .waitForCalm(function() {
        this.setFocus('show')
            .setFocus('ok');
      })
      .waitForCalm(this.assertSpoken, 'OK Button')
      .waitForCalm(this.setFocus, 'show')
      .waitForCalm(this.assertSpoken, 'Exited dialog. Show Button');
});

/**
 * Test feedback when an item in an alert dialog receives focus.
 */
TEST_F('ChromeVoxEventWatcherUnitTest', 'AlertDialogFeedback', function() {
  this.loadHtml('<div>' +
      '<div role="alertdialog">' +
      '  <p>Are you sure you want to install Windows?</p>' +
      '  <button id="yes">Yes</button>' +
      '  <button id="no">No</button>' +
      '</div> </div>');

  // Enter the dialog by focusing an element inside it.
  this.setFocus('no');
  this.waitForCalm(this.assertSpoken,
          'Entered dialog ' +
          'Are you sure you want to install Windows? Yes Button No Button ' +
          'No Button');
});

/**
 * Test feedback when focus moves to two different items in a alertdialog
 * quickly - make sure the notification that we entered the dialog
 * isn't interrupted.
 */
// Flaky on Chromium OS: crbug.com/622387, crbug.com/912390.
TEST_F('ChromeVoxEventWatcherUnitTest', 'DISABLED_DoubleFocusAlertDialogFeedback',
    function() {
  this.loadHtml('<div>' +
      '<div role="alertdialog">' +
      '  <p>Are these the droids you\'re looking for?</p>' +
      '  <button id="yes">Yes</button>' +
      '  <button id="no">No</button>' +
      '</div>' +
      '<button id="outside">Outside</button>' +
      '</div>');

  // Enter the dialog by focusing an element inside it, but then the Jedi
  // mind trick quickly changes the default answer.
  this.setFocus('yes')
      .setFocus('no');

  this.waitForCalm(this.assertSpokenList,
                   this.spokenList()
                       .categoryFlush('Entered dialog')
                       .queue('Are these the droids you\'re looking for?')
                       .queue('Yes')
                       .queue('Button'))
      .waitForCalm(this.setFocus, 'outside')
      .waitForCalm(this.assertSpoken, 'Exited dialog. Outside Button');
});

/**
 * Test recovery when a dialog box closes and the user sends a tab event.
 */
TEST_F('ChromeVoxEventWatcherUnitTest', 'CloseDialogTabRecovery', function() {
  this.loadHtml('<div id="container">' +
      '<p id="first">first node</p>' +
      '<button id="button">valid button before</button>' +
      '<p id="before">valid text before</p>' +
      '<p id="dialog">invalid after click</p>' +
      '<p id="last">valid text after</p>' +
      '</div>');

  var first = $('first');
  var dialog = $('dialog');
  var displayNone = function() {
    dialog.style.display = 'none';
  };

  this.waitForCalm(cvox.ChromeVoxTester.syncToNode, first)
      .waitForCalm(cvox.ChromeVoxTester.setStrategy, 'lineardom')
      .waitForCalm(this.userCommand, 'forward')
      .waitForCalm(this.assertSpoken, 'valid button before Button')
      .waitForCalm(this.userCommand, 'forward')
      .waitForCalm(this.assertSpoken, 'valid text before')
      .waitForCalm(this.userCommand, 'forward')
      .waitForCalm(this.assertSpoken, 'invalid after click')
      .waitForCalm(displayNone)
      .waitForCalm(this.userCommand, 'forward')
      .waitForCalm(this.assertSpoken, 'valid text after');
});

/**
 * Test feedback when a list box with an active descendant receives focus.
 */
// Flaky on Chromium OS: crbug.com/622387.
TEST_F('ChromeVoxEventWatcherUnitTest', 'DISABLED_ListBoxFeedback', function() {
  this.loadHtml('<div>' +
      '<p id="before">My listbox</p>' +
      '<div id="listbox" role="listbox" tabindex="0"' +
      ' aria-activedescendant="red">' +
      '  <div id="red" aria-selected="true" role="option">Red</div>' +
      '  <div id="yellow" role="option">Yellow</div>' +
      '  <div id="green" role="option">Green</div>' +
      '</div>' +
      '<p id="after">After</p>' +
      '</div>');

  // Focus the listbox.
  this.setFocus('listbox');
  this.waitForCalm(this.assertSpoken, 'Red List box Selected 1 of 3')
      .waitForCalm(function() {
          // Set the activeDescendant and fire a keydown event.
          // TODO(dmazzoni): replace with a higher-level API that's
          // less brittle.
          var listbox = $('listbox');
          listbox.setAttribute('aria-activeDescendant', 'yellow');
          cvox.ChromeVoxEventWatcher.keyDownEventWatcher(/** @type {Event} */ (
              { 'target': listbox,
                'type': 'keydown' }));
        })
      .waitForCalm(this.assertSpoken, 'Yellow 2 of 3');
});

/**
 * Test feedback when the items of a list box receive focus.
 */
TEST_F('ChromeVoxEventWatcherUnitTest', 'ListBoxOptionFeedback', function() {
  this.loadHtml('<div>' +
      '<p id="before">My listbox</p>' +
      '<div id="listbox" role="listbox">' +
      ' <div id="red" tabindex="0" aria-selected="true" role="option">' +
      'Red</div>' +
      '  <div id="yellow" tabindex="-1" role="option">Yellow</div>' +
      '  <div id="green" tabindex="-1" role="option">Green</div>' +
      '</div>' +
      '<p id="after">After</p>' +
      '</div>');

  // Focus the second item.
  this.setFocus('yellow');

  this.waitForCalm(this.assertSpoken, 'List box Yellow 2 of 3')
      .waitForCalm(this.setFocus, 'red')
      .waitForCalm(this.assertSpoken, 'Red Selected 1 of 3');
});

/**
 * Test feedback when the list box is setting focus in response to arrow
 * (or some other) keypress and the user is also using ChromeVox navigation.
 */
TEST_F('ChromeVoxEventWatcherUnitTest', 'ListBoxOptionFeedbackWithFocus',
       function() {
  this.loadHtml('<div>' +
      '<p id="before">My listbox</p>' +
      '<div id="listbox" role="listbox">' +
      '  <div id="red" tabindex="0" aria-selected="true" role="option">' +
      'Red</div>' +
      '  <div id="yellow" tabindex="-1" role="option">Yellow</div>' +
      '  <div id="green" tabindex="-1" role="option">Green</div>' +
      '  <div id="blue" tabindex="-1" role="option">Blue</div>' +
      '</div>' +
      '<p id="after">After</p>' +
      '</div>');

  // Simulate the user using ChromeVox navigation to move forward in the listbox
  this.waitForCalm(cvox.ChromeVoxTester.setStrategy, 'lineardom')
      .waitForCalm(cvox.ChromeVoxTester.syncToFirstNode)
      .waitForCalm(this.userCommand, 'forward')
      .waitForCalm(this.assertSpoken, 'List box Red Selected 1 of 4')
      .waitForCalm(this.setFocus, 'yellow')
      .waitForCalm(this.assertSpoken, 'Yellow 2 of 4')
      .waitForCalm(this.setFocus, 'green')
      .waitForCalm(this.assertSpoken, 'Green 3 of 4')
      .waitForCalm(this.userCommand, 'forward')
      .waitForCalm(this.assertSpoken, 'Blue 4 of 4');
});

/**
 * Test feedback when interacting with an editable text field.
 * The low-level details are tested in editable_text_test.js, this is
 * a higher-level test of how that code interacts with the event watcher.
 */
TEST_F('ChromeVoxEventWatcherUnitTest', 'EditableText', function() {
  cvox.ChromeVoxEditableTextBase.eventTypingEcho = false;
  this.loadHtml('<div>' +
      '<button id="before">Before</button>' +
      '<label for="input">Query</label>' +
      '<input id="input" value="abc">' +
      '<p>After</p>' +
      '</div>');

  var before = $('before');
  var input = $('input');

  // Focus the button first.
  before.focus();

  // Then focus the text field.
  input.focus();
  input.setSelectionRange(3, 3);

  this.waitForCalm(this.changeTextField, input, 'abcd', 3, 3, 68)  // 'd'
      .waitForCalm(this.changeTextField, input, 'abcde', 4, 4, 69) // 'e'
      .waitForCalm(this.assertSpokenList,
                   this.spokenList()
                       .categoryFlush('Query')
                       .queue('abc')
                       .queue('Edit text')
                       .flush('d')
                       .flush('e'));
});

/**
 * Test feedback when interacting with an editable text field that drives
 * an listbox (to form an auto-complete combobox) but doesn't get updated.
 * The low-level details are tested in editable_text_test.js, this is
 * a higher-level test of how that code interacts with the event watcher.
 */
TEST_F('ChromeVoxEventWatcherUnitTest', 'EditableTextListbox', function() {
  this.loadHtml('<div>' +
      '<button id="before">Before</button>' +
      '<label for="input">Query</label>' +
      '<input id="input" value="" role="combobox" aria-autocomplete="list"' +
      '  aria-activedescendant>' +
      '<div role="listbox">' +
      '  <div id="option1" role="option">First pick</div>' +
      '  <div id="option2" role="option">Second pick</div>' +
      '</div>' +
      '<p>After</p>' +
      '</div>');

  var before = $('before');
  var input = $('input');

  // Focus the text field.
  this.waitForCalm(this.setFocus, 'input')
      .waitForCalm(this.assertSpoken, 'Query Combo box Autocompletion list');

  this.waitForCalm(function() {
          input.setAttribute('aria-activedescendant', 'option1');
          this.changeTextField(input, '', 0, 0, 40);  // 'down'
          })
      .waitForCalm(this.assertSpoken, 'First pick 1 of 2');
});

/**
 * Test feedback when interacting with an editable text field that drives
 * an listbox (to form an auto-complete combobox) and *does* get updated.
 * The low-level details are tested in editable_text_test.js, this is
 * a higher-level test of how that code interacts with the event watcher.
 */
TEST_F('ChromeVoxEventWatcherUnitTest', 'EditableTextListboxUpdatingInput',
    function() {
  cvox.ChromeVoxEditableTextBase.shouldSpeakInsertions = true;
  this.loadHtml('<div>' +
      '<button id="before">Before</button>' +
      '<label for="input">Query</label>' +
      '<input id="input" value="" role="combobox" aria-autocomplete="list"' +
      '  aria-activedescendant>' +
      '<div role="listbox">' +
      '  <div id="option1" role="option">First pick</div>' +
      '  <div id="option2" role="option">Second pick</div>' +
      '</div>' +
      '<p>After</p>' +
      '</div>');

  var before = $('before');
  var input = $('input');

  // Focus the text field.
  this.waitForCalm(this.setFocus, 'input')
      .waitForCalm(this.assertSpoken, 'Query Combo box Autocompletion list');

  this.waitForCalm(function() {
          input.setAttribute('aria-activedescendant', 'option1');
          this.changeTextField(input, 'First pick', 9, 9, 40);  // 'down'
          })
      .waitForCalm(this.assertSpoken, 'First pick');
});

/**
 * Tests navigating through a multiline text area.
 */
// Flaky on Chromium OS: crbug.com/622387.
TEST_F('ChromeVoxEventWatcherUnitTest', 'DISABLED_MultilineNavigation', function() {
  this.loadHtml('<div> <textarea id="area">' +
      'one' +
      '\n\n' +
      'two' +
      '\n\n' +
      'three</textarea>' +
      '</div>');

  var area = $('area');

  function setAreaCursor(pos) {
    area.setSelectionRange(pos, pos);
    cvox.ChromeVoxEventWatcher.keyDownEventWatcher(/** @type {Event} */ (
        { 'target': area,
          'type': 'keydown' }));
  }

  area.focus();
  this.waitForCalm(this.assertSpoken, 'one two three Text area')
      .waitForCalm(setAreaCursor, 0)
  // The cursor did not move, so don't say anything -- even though we
  // did press a key.
      .waitForCalm(this.assertSpoken, '')
      .waitForCalm(setAreaCursor, 5) // in front on the 'two'
      .waitForCalm(this.assertSpoken, 'two')
      .waitForCalm(setAreaCursor, 10) // in front of the 'three'
      .waitForCalm(this.assertSpoken, 'three')
      .waitForCalm(setAreaCursor, 0) // back to the first line
      .waitForCalm(this.assertSpoken, 'one')
      .waitForCalm(setAreaCursor, 4) // on the first new line
      .waitForCalm(this.assertSpoken, 'Blank')
      .waitForCalm(setAreaCursor, 5)
      .waitForCalm(this.assertSpoken, 'two')
      .waitForCalm(setAreaCursor, 9)
      .waitForCalm(this.assertSpoken, 'Blank')
      .waitForCalm(setAreaCursor, 10)
      .waitForCalm(this.assertSpoken, 'three');
});

SYNC_TEST_F('ChromeVoxEventWatcherUnitTest', 'ShouldWaitToProcess', function() {
  // The focus event just happened, wait.
  assertTrue(
      cvox.ChromeVoxEventWatcherUtil.shouldWaitToProcess(100, 100, 100));
  // The focus event just happened, but the first event is old, don't wait.
  assertFalse(
      cvox.ChromeVoxEventWatcherUtil.shouldWaitToProcess(100, 0, 100));
  // The focus event is old, don't wait.
  assertFalse(
      cvox.ChromeVoxEventWatcherUtil.shouldWaitToProcess(0, 0, 100));

});

/**
 * Test that no feedback is received for events that fire on elements
 * that are hidden (or the descendant of a hidden element).
 */
TEST_F('ChromeVoxEventWatcherUnitTest', 'AriaHiddenFeedback', function() {
  this.loadHtml('<div>' +
      '<div>' +
      '  <button id="button1">Button 1</button>' +
      '  <button id="button2" aria-hidden="true">Button 2</button>' +
      '</div>' +
      '<div aria-hidden="true">' +
      '  <h3>Random header</h3>' +
      '  <div>' +
      '     <button id="button3">Button 3</button>' +
      '  </div>' +
      '  <h3>Random header</h3>' +
      '</div>' +
      '<div>' +
      '  <button id="button4">Button 4</button>' +
      '</div>' +
      '</div>');

  this.setFocus('button1')
      .waitForCalm(this.assertSpoken, 'Button 1 Button')
      .waitForCalm(this.setFocus, 'button2')
      .waitForCalm(this.assertSpoken, '')
      .waitForCalm(this.setFocus, 'button3')
      .waitForCalm(this.assertSpoken, '')
      .waitForCalm(this.setFocus, 'button4')
      .waitForCalm(this.assertSpoken, 'Button 4 Button');
});

/**
 * Test that key down events don't cause excessive value and state announcements
 * when arrowing around radiobuttons.
 */
TEST_F('ChromeVoxEventWatcherUnitTest',
       'DISABLED_RadioButtonAnnouncements',
       function() {
  this.loadHtml(
    '<input id="radio1" type="radio" aria-label="green" tabindex=0>' +
    '<input id="radio2" type="radio" aria-label="blue" tabindex=0>');
  function performKeyDown(dir) {
    var evt = new KeyboardEvent("keydown", {key: dir});
    document.activeElement.dispatchEvent(evt);
  };

  var radio1 = $('radio1');
  radio1.focus();

  // TODO(dtseng): Repeated actual spoken text here; this is most certainly a
  // test framework bug.
  this.waitForCalm(this.assertSpoken, 'green Radio button unselected')
      .waitForCalm(performKeyDown, 'ArrowRight') // right arrow
      // Moves to next radiobutton.
      .waitForCalm(this.assertSpoken,
                   'blue Radio button selected blue Radio button selected')
      .waitForCalm(performKeyDown, 'ArrowRight') // right arrow
      // Arrowed beyond end. Should be quiet.
      .waitForCalm(this.assertSpoken, '');

  this.waitForCalm(performKeyDown, 'ArrowLeft') // left arrow
      // Moves back to first radio.
      .waitForCalm(this.assertSpoken,
                   'green Radio button selected green Radio button selected')
      .waitForCalm(performKeyDown, 'ArrowLeft') // left arrow
      // Arrowed beyond beginning. Should be quiet.
      .waitForCalm(this.assertSpoken, '');
});

/**
 * Test time widget.
 * Disabled because test relies on removed behavior; see crbug.com/520519.
 */
TEST_F('ChromeVoxEventWatcherUnitTest', 'DISABLED_TimeWidget', function() {
  this.loadHtml(
    '<label for="timewidget">Set alarm for:</label>' +
    '<input id="timewidget" type="time" value="12:00">');
  var performKeyDown = function(dir) {
    var evt = new KeyboardEvent("keydown", {key: dir});
    document.activeElement.dispatchEvent(evt);
  };
  var performKeyUp = function(dir) {
    var evt = new KeyboardEvent("keyup", {key: dir});
    document.activeElement.dispatchEvent(evt);
  };

  var timewidget = $('timewidget');
  timewidget.focus();

  this.waitForCalm(this.assertSpoken,
      'Set alarm for: 12:00 Set alarm for: 12 hours 00 minutes PM');

  this.waitForCalm(performKeyDown, 'ArrowDown') // down arrow
      .waitForCalm(performKeyUp, 'ArrowDown') // down arrow
      .waitForCalm(this.assertSpoken,
                   '11 hours');

  this.waitForCalm(performKeyDown, 'ArrowDown') // down arrow
      .waitForCalm(performKeyUp, 'ArrowDown') // down arrow
      .waitForCalm(this.assertSpoken,
                   '10 hours');

  this.waitForCalm(performKeyDown, 'ArrowRight') // right arrow
      .waitForCalm(performKeyUp, 'ArrowRight') // right arrow
      .waitForCalm(performKeyDown, 'ArrowUp') // right arrow
      .waitForCalm(performKeyUp, 'ArrowUp') // right arrow
      .waitForCalm(this.assertSpoken,
                   '01 minutes');

  this.waitForCalm(performKeyDown, 'ArrowDown') // down arrow
      .waitForCalm(performKeyUp, 'ArrowDown') // down arrow
      .waitForCalm(this.assertSpoken,
                   '00 minutes');

  this.waitForCalm(performKeyDown, 'ArrowRight') // right arrow
      .waitForCalm(performKeyUp, 'ArrowRight') // right arrow
      .waitForCalm(performKeyDown, 'ArrowUp') // right arrow
      .waitForCalm(performKeyUp, 'ArrowUp') // right arrow
      .waitForCalm(this.assertSpoken,
                   'AM');

  this.waitForCalm(performKeyDown, 'ArrowDown') // down arrow
      .waitForCalm(performKeyUp, 'ArrowDown') // down arrow
      .waitForCalm(this.assertSpoken,
                   'PM');
});

/**
 * Test date widget.
 * Disabled because test relies on removed behavior; see crbug.com/520519.
 */
TEST_F('ChromeVoxEventWatcherUnitTest', 'DISABLED_DateWidget', function() {
  this.loadHtml(
    '<label for="datewidget">Set birthdate:</label>' +
    '<input id="datewidget" type="date" value="1998-09-04"/>');
  var performKeyDown = function(dir) {
    var evt = new KeyboardEvent("keydown", {key: dir});
    document.activeElement.dispatchEvent(evt);
  };
  var performKeyUp = function(dir) {
    var evt = new KeyboardEvent("keyup", {key: dir});
    document.activeElement.dispatchEvent(evt);
  };

  var datewidget = $('datewidget');
  datewidget.focus();

  this.waitForCalm(this.assertSpoken,
      'Set birthdate: 1998-09-04 Date control Set birthdate: September 4 1998')

      .waitForCalm(performKeyDown, 'ArrowDown') // down arrow
      .waitForCalm(performKeyUp, 'ArrowDown') // down arrow
      .waitForCalm(this.assertSpoken,
                   'August')

      .waitForCalm(performKeyDown, 'ArrowDown') // down arrow
      .waitForCalm(performKeyUp, 'ArrowDown') // down arrow
      .waitForCalm(this.assertSpoken, 'July')

      .waitForCalm(performKeyDown, 'ArrowRight') // right arrow
      .waitForCalm(performKeyUp, 'ArrowRight') // right arrow
      .waitForCalm(performKeyDown, 'ArrowUp') // right arrow
      .waitForCalm(performKeyUp, 'ArrowUp') // right arrow
      .waitForCalm(this.assertSpoken, '5')

      .waitForCalm(performKeyDown, 'ArrowDown') // down arrow
      .waitForCalm(performKeyUp, 'ArrowDown') // down arrow
      .waitForCalm(this.assertSpoken, '4')

      .waitForCalm(performKeyDown, 'ArrowRight') // right arrow
      .waitForCalm(performKeyUp, 'ArrowRight') // right arrow
      .waitForCalm(performKeyDown, 'ArrowUp') // right arrow
      .waitForCalm(performKeyUp, 'ArrowUp') // right arrow
      .waitForCalm(this.assertSpoken,
                   '1999')

      .waitForCalm(performKeyDown, 'ArrowDown') // down arrow
      .waitForCalm(performKeyUp, 'ArrowDown') // down arrow
      .waitForCalm(this.assertSpoken,
                   '1998');
});

/**
 * Test that ChromeVox speaks the correct state when a focused control
 * changes as the result of a key up, not just key down.
 */
// Flaky on Chromium OS: crbug.com/622387, crbug.com/912390.
TEST_F('ChromeVoxEventWatcherUnitTest', 'DISABLED_ToggleOnKeyUp', function() {
  this.loadHtml('<div>' +
      '<div tabIndex=0 id="pressable" role="button" aria-pressed="false">' +
      'Toggle' +
      '</div>' +
      '</div>');

  // Focus on the button.
  this.setFocus('pressable');
  this.waitForCalm(this.assertSpoken, 'Toggle Button Not pressed');

  function keyupSpace() {
    var evt = document.createEvent('KeyboardEvent');
    evt.initKeyboardEvent(
        'keyup', true, true, window, ' ', 0, false, false, false, false);
    document.activeElement.dispatchEvent(evt);
  }

  function keyupSpaceAndMarkPressed() {
    keyupSpace();
    $('pressable').setAttribute('aria-pressed', 'true');
  };

  function keyupSpaceAndMarkNotPressed() {
    keyupSpace();
    $('pressable').setAttribute('aria-pressed', 'false');
  };

  this.waitForCalm(keyupSpaceAndMarkPressed)
      .waitForCalm(this.assertSpoken, 'Pressed')
      .waitForCalm(keyupSpaceAndMarkNotPressed)
      .waitForCalm(this.assertSpoken, 'Not pressed');
});

/**
 * Exiting dialog message should not interrupt a live region.
 */
TEST_F('ChromeVoxEventWatcherUnitTest', 'DISABLED_ExitDialogWithLiveRegion',
       function() {
  this.loadHtml(
      '<div role="dialog" aria-label="MyAlert">' +
      '  <h1>Heading</h1>' +
      '  <button id="initial">Initial focus</button>' +
      '</div>' +
      '<div>' +
      '  <button id="final">Final focus</button>' +
      '</div>' +
      '<div id="live" aria-live="polite"></div>');

  // Focus on the button in the dialog.
  this.setFocus('initial');
  this.waitForCalm(this.assertSpoken,
                   'Entered dialog MyAlert Dialog Initial focus Button')
      .waitForCalm(function() {
        $('live').innerText = 'Live region changed';
      })
      .waitForCalm(function() {
        this.setFocus('final');
      })
      .waitForCalm(function() {
        var ulist = cvox.ChromeVoxTester.testTts().getSpeechQueueOutput();
        assertEquals('Live region changed', ulist[0]);
        assertEquals('Exited dialog.', ulist[1]);
        assertEquals('Final focus', ulist[2]);
        assertEquals('Button', ulist[3]);
      });
});
