12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <list>
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/chromedriver/chrome/status.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/chromedriver/chrome/ui_events.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/chromedriver/key_converter.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/chromedriver/test_util.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CheckEvents(const base::string16& keys,
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 KeyEvent expected_events[],
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 bool release_modifiers,
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 size_t expected_size,
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 int expected_modifiers) {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int modifiers = 0;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::list<KeyEvent> events;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kOk, ConvertKeysToKeyEvents(keys, release_modifiers,
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        &modifiers, &events).code());
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(expected_size, events.size());
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t i = 0;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::list<KeyEvent>::const_iterator it = events.begin();
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (i < expected_size && it != events.end()) {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_events[i].type, it->type);
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_events[i].modifiers, it->modifiers);
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_events[i].modified_text, it->modified_text);
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_events[i].unmodified_text, it->unmodified_text);
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(expected_events[i].key_code, it->key_code);
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++i;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++it;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(expected_modifiers, modifiers);
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CheckEventsReleaseModifiers(const base::string16& keys,
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 KeyEvent expected_events[],
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 size_t expected_size) {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckEvents(keys, expected_events, true /* release_modifier */,
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      expected_size, 0 /* expected_modifiers */);
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CheckEventsReleaseModifiers(const std::string& keys,
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 KeyEvent expected_events[],
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 size_t expected_size) {
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CheckEventsReleaseModifiers(base::UTF8ToUTF16(keys),
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      expected_events, expected_size);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CheckNonShiftChar(ui::KeyboardCode key_code, char character) {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int modifiers = 0;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string char_string;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  char_string.push_back(character);
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::list<KeyEvent> events;
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(kOk, ConvertKeysToKeyEvents(base::ASCIIToUTF16(char_string),
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        true /* release_modifiers*/,
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        &modifiers, &events).code());
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(3u, events.size()) << "Char: " << character;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::list<KeyEvent>::const_iterator it = events.begin();
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(key_code, it->key_code) << "Char: " << character;
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ++it;  // Move to the second event.
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1u, it->modified_text.length()) << "Char: " << character;
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1u, it->unmodified_text.length()) << "Char: " << character;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(character, it->modified_text[0]) << "Char: " << character;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(character, it->unmodified_text[0]) << "Char: " << character;
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ++it;  // Move to the third event.
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(key_code, it->key_code) << "Char: " << character;
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CheckShiftChar(ui::KeyboardCode key_code, char character, char lower) {
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int modifiers = 0;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string char_string;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  char_string.push_back(character);
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::list<KeyEvent> events;
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(kOk, ConvertKeysToKeyEvents(base::ASCIIToUTF16(char_string),
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        true /* release_modifiers*/,
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        &modifiers, &events).code());
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(5u, events.size()) << "Char: " << character;
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::list<KeyEvent>::const_iterator it = events.begin();
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ui::VKEY_SHIFT, it->key_code) << "Char: " << character;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ++it;  // Move to second event.
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(key_code, it->key_code) << "Char: " << character;
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ++it;  // Move to third event.
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1u, it->modified_text.length()) << "Char: " << character;
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1u, it->unmodified_text.length()) << "Char: " << character;
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(character, it->modified_text[0]) << "Char: " << character;
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(lower, it->unmodified_text[0]) << "Char: " << character;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ++it;  // Move to fourth event.
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(key_code, it->key_code) << "Char: " << character;
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ++it;  // Move to fifth event.
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ui::VKEY_SHIFT, it->key_code) << "Char: " << character;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, SingleChar) {
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  KeyEvent event_array[] = {
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_H, 0),
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateCharEvent("h", "h", 0),
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_H, 0)};
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckEventsReleaseModifiers("h", event_array, arraysize(event_array));
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, SingleNumber) {
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  KeyEvent event_array[] = {
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_1, 0),
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateCharEvent("1", "1", 0),
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_1, 0)};
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckEventsReleaseModifiers("1", event_array, arraysize(event_array));
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, MultipleChars) {
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  KeyEvent event_array[] = {
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_H, 0),
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateCharEvent("h", "h", 0),
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_H, 0),
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_E, 0),
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateCharEvent("e", "e", 0),
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_E, 0),
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_Y, 0),
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateCharEvent("y", "y", 0),
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_Y, 0)};
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckEventsReleaseModifiers("hey", event_array, arraysize(event_array));
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, WebDriverSpecialChar) {
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  KeyEvent event_array[] = {
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_SPACE, 0),
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateCharEvent(" ", " ", 0),
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_SPACE, 0)};
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 keys;
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  keys.push_back(static_cast<base::char16>(0xE00DU));
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckEventsReleaseModifiers(keys, event_array, arraysize(event_array));
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, WebDriverSpecialNonCharKey) {
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  KeyEvent event_array[] = {
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_F1, 0),
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_F1, 0)};
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 keys;
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  keys.push_back(static_cast<base::char16>(0xE031U));
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckEventsReleaseModifiers(keys, event_array, arraysize(event_array));
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, FrenchKeyOnEnglishLayout) {
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  KeyEvent event_array[] = {
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_UNKNOWN, 0),
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      CreateCharEvent(base::WideToUTF8(L"\u00E9"),
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      base::WideToUTF8(L"\u00E9"), 0),
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_UNKNOWN, 0)};
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CheckEventsReleaseModifiers(base::WideToUTF16(L"\u00E9"),
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      event_array, arraysize(event_array));
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, NeedsCtrlAndAlt) {
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RestoreKeyboardLayoutOnDestruct restore;
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int ctrl_and_alt = kControlKeyModifierMask | kAltKeyModifierMask;
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  KeyEvent event_array[] = {
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_CONTROL, 0),
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_MENU, 0),
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_Q, ctrl_and_alt),
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateCharEvent("q", "@", ctrl_and_alt),
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_Q, ctrl_and_alt),
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_MENU, 0),
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_CONTROL, 0)};
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(SwitchKeyboardLayout("00000407"));
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckEventsReleaseModifiers("@", event_array, arraysize(event_array));
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, UppercaseCharDoesShift) {
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  KeyEvent event_array[] = {
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_SHIFT, 0),
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_A, kShiftKeyModifierMask),
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateCharEvent("a", "A", kShiftKeyModifierMask),
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_A, kShiftKeyModifierMask),
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_SHIFT, 0)};
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckEventsReleaseModifiers("A", event_array, arraysize(event_array));
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, UppercaseSymbolCharDoesShift) {
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  KeyEvent event_array[] = {
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_SHIFT, 0),
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_1, kShiftKeyModifierMask),
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateCharEvent("1", "!", kShiftKeyModifierMask),
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_1, kShiftKeyModifierMask),
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_SHIFT, 0)};
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckEventsReleaseModifiers("!", event_array, arraysize(event_array));
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, UppercaseCharUsesShiftOnlyIfNecessary) {
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  KeyEvent event_array[] = {
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_SHIFT, kShiftKeyModifierMask),
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_A, kShiftKeyModifierMask),
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateCharEvent("a", "A", kShiftKeyModifierMask),
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_A, kShiftKeyModifierMask),
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_B, kShiftKeyModifierMask),
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateCharEvent("b", "B", kShiftKeyModifierMask),
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_B, kShiftKeyModifierMask),
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_C, kShiftKeyModifierMask),
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateCharEvent("c", "C", kShiftKeyModifierMask),
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_C, kShiftKeyModifierMask),
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_SHIFT, 0)};
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 keys;
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  keys.push_back(static_cast<base::char16>(0xE008U));
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  keys.append(base::UTF8ToUTF16("aBc"));
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckEventsReleaseModifiers(keys, event_array, arraysize(event_array));
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, ToggleModifiers) {
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  KeyEvent event_array[] = {
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_SHIFT, kShiftKeyModifierMask),
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_SHIFT, 0),
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_CONTROL, kControlKeyModifierMask),
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_CONTROL, 0),
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_MENU, kAltKeyModifierMask),
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_MENU, 0),
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_COMMAND, kMetaKeyModifierMask),
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_COMMAND, 0)};
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 keys;
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  keys.push_back(static_cast<base::char16>(0xE008U));
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  keys.push_back(static_cast<base::char16>(0xE008U));
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  keys.push_back(static_cast<base::char16>(0xE009U));
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  keys.push_back(static_cast<base::char16>(0xE009U));
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  keys.push_back(static_cast<base::char16>(0xE00AU));
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  keys.push_back(static_cast<base::char16>(0xE00AU));
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  keys.push_back(static_cast<base::char16>(0xE03DU));
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  keys.push_back(static_cast<base::char16>(0xE03DU));
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckEventsReleaseModifiers(keys, event_array, arraysize(event_array));
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN)
2414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// https://code.google.com/p/chromedriver/issues/detail?id=546
2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define MAYBE_AllShorthandKeys DISABLED_AllShorthandKeys
2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else
2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define MAYBE_AllShorthandKeys AllShorthandKeys
2454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
2464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST(KeyConverter, MAYBE_AllShorthandKeys) {
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  KeyEvent event_array[] = {
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_RETURN, 0),
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateCharEvent("\r", "\r", 0),
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_RETURN, 0),
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_RETURN, 0),
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateCharEvent("\r", "\r", 0),
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_RETURN, 0),
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_TAB, 0),
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA) || defined(OS_LINUX)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateCharEvent("\t", "\t", 0),
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_TAB, 0),
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_BACK, 0),
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA) || defined(OS_LINUX)
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateCharEvent("\b", "\b", 0),
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_BACK, 0),
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_SPACE, 0),
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateCharEvent(" ", " ", 0),
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_SPACE, 0)};
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckEventsReleaseModifiers("\n\r\n\t\b ",
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      event_array,arraysize(event_array));
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_LINUX)
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Fails on bots: crbug.com/174962
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_AllEnglishKeyboardSymbols DISABLED_AllEnglishKeyboardSymbols
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_AllEnglishKeyboardSymbols AllEnglishKeyboardSymbols
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, MAYBE_AllEnglishKeyboardSymbols) {
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 keys;
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ui::KeyboardCode kSymbolKeyCodes[] = {
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_OEM_3,
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_OEM_MINUS,
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_OEM_PLUS,
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_OEM_4,
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_OEM_6,
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_OEM_5,
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_OEM_1,
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_OEM_7,
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_OEM_COMMA,
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_OEM_PERIOD,
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_OEM_2};
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string kLowerSymbols = "`-=[]\\;',./";
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string kUpperSymbols = "~_+{}|:\"<>?";
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < kLowerSymbols.length(); ++i)
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CheckNonShiftChar(kSymbolKeyCodes[i], kLowerSymbols[i]);
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < kUpperSymbols.length(); ++i)
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CheckShiftChar(kSymbolKeyCodes[i], kUpperSymbols[i], kLowerSymbols[i]);
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, AllEnglishKeyboardTextChars) {
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string kLowerChars = "0123456789abcdefghijklmnopqrstuvwxyz";
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string kUpperChars = ")!@#$%^&*(ABCDEFGHIJKLMNOPQRSTUVWXYZ";
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < kLowerChars.length(); ++i) {
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int offset = 0;
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (i < 10)
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      offset = ui::VKEY_0;
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      offset = ui::VKEY_0 + 7;
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::KeyboardCode expected_code = static_cast<ui::KeyboardCode>(offset + i);
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CheckNonShiftChar(expected_code, kLowerChars[i]);
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < kUpperChars.length(); ++i) {
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int offset = 0;
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (i < 10)
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      offset = ui::VKEY_0;
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      offset = ui::VKEY_0 + 7;
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::KeyboardCode expected_code = static_cast<ui::KeyboardCode>(offset + i);
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CheckShiftChar(expected_code, kUpperChars[i], kLowerChars[i]);
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_LINUX) || defined(OS_WIN)
3254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// https://code.google.com/p/chromedriver/issues/detail?id=240
3264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// https://code.google.com/p/chromedriver/issues/detail?id=546
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_AllSpecialWebDriverKeysOnEnglishKeyboard \
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISABLED_AllSpecialWebDriverKeysOnEnglishKeyboard
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_AllSpecialWebDriverKeysOnEnglishKeyboard \
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AllSpecialWebDriverKeysOnEnglishKeyboard
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, MAYBE_AllSpecialWebDriverKeysOnEnglishKeyboard) {
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char kTextForKeys[] = {
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA) || defined(OS_LINUX)
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0, 0, 0, '\b', '\t', 0, '\r', '\r', 0, 0, 0, 0, 0x1B,
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x7F, ';', '=',
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0, 0, 0, 0, 0, 0, '\r', '\r', 0, 0, 0, 0, 0,
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ';', '=',
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      '*', '+', ',', '-', '.', '/'};
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i <= 0x3D; ++i) {
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (i > 0x29 && i < 0x31)
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::string16 keys;
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int modifiers = 0;
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    keys.push_back(0xE000U + i);
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::list<KeyEvent> events;
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (i == 1) {
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_NE(kOk, ConvertKeysToKeyEvents(keys,
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            true /* release_modifiers*/,
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            &modifiers, &events).code())
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          << "Index: " << i;
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(0u, events.size()) << "Index: " << i;
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(kOk, ConvertKeysToKeyEvents(keys,
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            true /* release_modifiers */,
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            &modifiers, &events).code())
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          << "Index: " << i;
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (i == 0) {
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, events.size()) << "Index: " << i;
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      } else if (i >= arraysize(kTextForKeys) || kTextForKeys[i] == 0) {
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2u, events.size()) << "Index: " << i;
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      } else {
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ASSERT_EQ(3u, events.size()) << "Index: " << i;
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        std::list<KeyEvent>::const_iterator it = events.begin();
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ++it;  // Move to the second event.
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ASSERT_EQ(1u, it->unmodified_text.length()) << "Index: " << i;
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(kTextForKeys[i], it->unmodified_text[0])
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            << "Index: " << i;
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, ModifiersState) {
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int shift_key_modifier = kShiftKeyModifierMask;
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int control_key_modifier = shift_key_modifier | kControlKeyModifierMask;
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int alt_key_modifier = control_key_modifier | kAltKeyModifierMask;
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int meta_key_modifier = alt_key_modifier | kMetaKeyModifierMask;
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  KeyEvent event_array[] = {
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_SHIFT, shift_key_modifier),
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_CONTROL, control_key_modifier),
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_MENU, alt_key_modifier),
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_COMMAND, meta_key_modifier)};
3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 keys;
3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  keys.push_back(static_cast<base::char16>(0xE008U));
3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  keys.push_back(static_cast<base::char16>(0xE009U));
3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  keys.push_back(static_cast<base::char16>(0xE00AU));
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  keys.push_back(static_cast<base::char16>(0xE03DU));
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckEvents(keys, event_array, false /* release_modifiers */,
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      arraysize(event_array), meta_key_modifier);
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, ReleaseModifiers) {
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  KeyEvent event_array[] = {
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_SHIFT, kShiftKeyModifierMask),
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyDownEvent(ui::VKEY_CONTROL,
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          kShiftKeyModifierMask | kControlKeyModifierMask),
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_SHIFT, 0),
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateKeyUpEvent(ui::VKEY_CONTROL, 0)};
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 keys;
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  keys.push_back(static_cast<base::char16>(0xE008U));
4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  keys.push_back(static_cast<base::char16>(0xE009U));
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckEvents(keys, event_array, true /* release_modifiers */,
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      arraysize(event_array), 0);
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
413