Home | History | Annotate | Download | only in chromedriver
      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