1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include <string> 6 7 #include "base/strings/string16.h" 8 #include "base/strings/utf_string_conversions.h" 9 #include "chrome/test/chromedriver/chrome/ui_events.h" 10 #include "chrome/test/chromedriver/keycode_text_conversion.h" 11 #include "chrome/test/chromedriver/test_util.h" 12 #include "testing/gtest/include/gtest/gtest.h" 13 #include "ui/base/keycodes/keyboard_codes.h" 14 15 namespace { 16 17 void CheckCharToKeyCode(char character, ui::KeyboardCode key_code, 18 int modifiers) { 19 std::string character_string; 20 character_string.push_back(character); 21 char16 character_utf16 = UTF8ToUTF16(character_string)[0]; 22 ui::KeyboardCode actual_key_code = ui::VKEY_UNKNOWN; 23 int actual_modifiers = 0; 24 std::string error_msg; 25 EXPECT_TRUE(ConvertCharToKeyCode( 26 character_utf16, &actual_key_code, &actual_modifiers, &error_msg)); 27 EXPECT_EQ(key_code, actual_key_code) << "Char: " << character; 28 EXPECT_EQ(modifiers, actual_modifiers) << "Char: " << character; 29 } 30 31 void CheckCantConvertChar(wchar_t character) { 32 std::wstring character_string; 33 character_string.push_back(character); 34 char16 character_utf16 = WideToUTF16(character_string)[0]; 35 ui::KeyboardCode actual_key_code = ui::VKEY_UNKNOWN; 36 int actual_modifiers = 0; 37 std::string error_msg; 38 EXPECT_FALSE(ConvertCharToKeyCode( 39 character_utf16, &actual_key_code, &actual_modifiers, &error_msg)); 40 } 41 42 std::string ConvertKeyCodeToTextNoError(ui::KeyboardCode key_code, 43 int modifiers) { 44 std::string error_msg; 45 std::string text; 46 EXPECT_TRUE(ConvertKeyCodeToText(key_code, modifiers, &text, &error_msg)); 47 return text; 48 } 49 50 } // namespace 51 52 #if defined(OS_LINUX) 53 // Fails on bots: crbug.com/174962 54 #define MAYBE_KeyCodeToText DISABLED_KeyCodeToText 55 #else 56 #define MAYBE_KeyCodeToText KeyCodeToText 57 #endif 58 59 TEST(KeycodeTextConversionTest, MAYBE_KeyCodeToText) { 60 EXPECT_EQ("a", ConvertKeyCodeToTextNoError(ui::VKEY_A, 0)); 61 EXPECT_EQ("A", 62 ConvertKeyCodeToTextNoError(ui::VKEY_A, kShiftKeyModifierMask)); 63 64 EXPECT_EQ("1", ConvertKeyCodeToTextNoError(ui::VKEY_1, 0)); 65 EXPECT_EQ("!", 66 ConvertKeyCodeToTextNoError(ui::VKEY_1, kShiftKeyModifierMask)); 67 68 EXPECT_EQ(",", ConvertKeyCodeToTextNoError(ui::VKEY_OEM_COMMA, 0)); 69 EXPECT_EQ("<", ConvertKeyCodeToTextNoError( 70 ui::VKEY_OEM_COMMA, kShiftKeyModifierMask)); 71 72 EXPECT_EQ("", ConvertKeyCodeToTextNoError(ui::VKEY_F1, 0)); 73 EXPECT_EQ("", 74 ConvertKeyCodeToTextNoError(ui::VKEY_F1, kShiftKeyModifierMask)); 75 76 EXPECT_EQ("/", ConvertKeyCodeToTextNoError(ui::VKEY_DIVIDE, 0)); 77 EXPECT_EQ("/", 78 ConvertKeyCodeToTextNoError(ui::VKEY_DIVIDE, kShiftKeyModifierMask)); 79 80 EXPECT_EQ("", ConvertKeyCodeToTextNoError(ui::VKEY_SHIFT, 0)); 81 EXPECT_EQ("", 82 ConvertKeyCodeToTextNoError(ui::VKEY_SHIFT, kShiftKeyModifierMask)); 83 } 84 85 #if defined(OS_LINUX) 86 // Fails on bots: crbug.com/174962 87 #define MAYBE_CharToKeyCode DISABLED_CharToKeyCode 88 #else 89 #define MAYBE_CharToKeyCode CharToKeyCode 90 #endif 91 92 TEST(KeycodeTextConversionTest, MAYBE_CharToKeyCode) { 93 CheckCharToKeyCode('a', ui::VKEY_A, 0); 94 CheckCharToKeyCode('A', ui::VKEY_A, kShiftKeyModifierMask); 95 96 CheckCharToKeyCode('1', ui::VKEY_1, 0); 97 CheckCharToKeyCode('!', ui::VKEY_1, kShiftKeyModifierMask); 98 99 CheckCharToKeyCode(',', ui::VKEY_OEM_COMMA, 0); 100 CheckCharToKeyCode('<', ui::VKEY_OEM_COMMA, kShiftKeyModifierMask); 101 102 CheckCharToKeyCode('/', ui::VKEY_OEM_2, 0); 103 CheckCharToKeyCode('?', ui::VKEY_OEM_2, kShiftKeyModifierMask); 104 105 CheckCantConvertChar(L'\u00E9'); 106 CheckCantConvertChar(L'\u2159'); 107 } 108 109 #if defined(OS_LINUX) || defined(OS_MACOSX) 110 // Not implemented on Linux. 111 // Fails if German layout is not installed on Mac. 112 #define MAYBE_NonShiftModifiers DISABLED_NonShiftModifiers 113 #else 114 #define MAYBE_NonShiftModifiers NonShiftModifiers 115 #endif 116 117 TEST(KeycodeTextConversionTest, MAYBE_NonShiftModifiers) { 118 RestoreKeyboardLayoutOnDestruct restore; 119 #if defined(OS_WIN) 120 ASSERT_TRUE(SwitchKeyboardLayout("00000407")); // german 121 int ctrl_and_alt = kControlKeyModifierMask | kAltKeyModifierMask; 122 CheckCharToKeyCode('@', ui::VKEY_Q, ctrl_and_alt); 123 EXPECT_EQ("@", ConvertKeyCodeToTextNoError(ui::VKEY_Q, ctrl_and_alt)); 124 #elif defined(OS_MACOSX) 125 ASSERT_TRUE(SwitchKeyboardLayout("com.apple.keylayout.German")); 126 EXPECT_EQ("@", ConvertKeyCodeToTextNoError( 127 ui::VKEY_L, kAltKeyModifierMask)); 128 #endif 129 } 130 131 #if defined(OS_LINUX) || defined(OS_MACOSX) 132 // Not implemented on Linux. 133 // Fails if German layout is not installed on Mac. 134 #define MAYBE_NonEnglish DISABLED_NonEnglish 135 #else 136 #define MAYBE_NonEnglish NonEnglish 137 #endif 138 139 TEST(KeycodeTextConversionTest, MAYBE_NonEnglish) { 140 RestoreKeyboardLayoutOnDestruct restore; 141 #if defined(OS_WIN) 142 ASSERT_TRUE(SwitchKeyboardLayout("00000408")); // greek 143 CheckCharToKeyCode(';', ui::VKEY_Q, 0); 144 EXPECT_EQ(";", ConvertKeyCodeToTextNoError(ui::VKEY_Q, 0)); 145 #elif defined(OS_MACOSX) 146 ASSERT_TRUE(SwitchKeyboardLayout("com.apple.keylayout.German")); 147 CheckCharToKeyCode('z', ui::VKEY_Y, 0); 148 EXPECT_EQ("z", ConvertKeyCodeToTextNoError(ui::VKEY_Y, 0)); 149 #endif 150 } 151