| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2011 The Chromium OS 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 // DEPRECATED. TODO(satorux): Remove this file. | |
| 6 | |
| 7 // How to run the test: | |
| 8 // $ FEATURES="test" emerge-x86-generic -a libcros | |
| 9 | |
| 10 #include "chromeos_keyboard.h" | |
| 11 | |
| 12 #include <algorithm> | |
| 13 #include <set> | |
| 14 #include <string> | |
| 15 | |
| 16 #include <gtest/gtest.h> | |
| 17 #include <X11/Xlib.h> | |
| 18 | |
| 19 #include "base/logging.h" | |
| 20 | |
| 21 namespace chromeos { | |
| 22 | |
| 23 namespace { | |
| 24 | |
| 25 // Returns a ModifierMap object that contains the following mapping: | |
| 26 // - kSearchKey is mapped to |search|. | |
| 27 // - kLeftControl key is mapped to |control|. | |
| 28 // - kLeftAlt key is mapped to |alt|. | |
| 29 ModifierMap GetMap(ModifierKey search, ModifierKey control, ModifierKey alt) { | |
| 30 ModifierMap modifier_key; | |
| 31 // Use the Search key as |search|. | |
| 32 modifier_key.push_back(ModifierKeyPair(kSearchKey, search)); | |
| 33 modifier_key.push_back(ModifierKeyPair(kLeftControlKey, control)); | |
| 34 modifier_key.push_back(ModifierKeyPair(kLeftAltKey, alt)); | |
| 35 return modifier_key; | |
| 36 } | |
| 37 | |
| 38 // Checks |modifier_map| and returns true if the following conditions are met: | |
| 39 // - kSearchKey is mapped to |search|. | |
| 40 // - kLeftControl key is mapped to |control|. | |
| 41 // - kLeftAlt key is mapped to |alt|. | |
| 42 bool CheckMap(const ModifierMap& modifier_map, | |
| 43 ModifierKey search, ModifierKey control, ModifierKey alt) { | |
| 44 ModifierMap::const_iterator begin = modifier_map.begin(); | |
| 45 ModifierMap::const_iterator end = modifier_map.end(); | |
| 46 if ((std::count(begin, end, ModifierKeyPair(kSearchKey, search)) == 1) && | |
| 47 (std::count(begin, end, | |
| 48 ModifierKeyPair(kLeftControlKey, control)) == 1) && | |
| 49 (std::count(begin, end, ModifierKeyPair(kLeftAltKey, alt)) == 1)) { | |
| 50 return true; | |
| 51 } | |
| 52 return false; | |
| 53 } | |
| 54 | |
| 55 // Returns true if X display is available. | |
| 56 bool DisplayAvailable() { | |
| 57 Display* display = XOpenDisplay(NULL); | |
| 58 if (!display) { | |
| 59 return false; | |
| 60 } | |
| 61 XCloseDisplay(display); | |
| 62 return true; | |
| 63 } | |
| 64 | |
| 65 } // namespace | |
| 66 | |
| 67 // Tests CreateFullXkbLayoutName() function. | |
| 68 TEST(ChromeOSKeyboardTest, TestCreateFullXkbLayoutNameBasic) { | |
| 69 // CreateFullXkbLayoutName should not accept an empty |layout_name|. | |
| 70 EXPECT_STREQ("", CreateFullXkbLayoutName( | |
| 71 "", GetMap(kVoidKey, kVoidKey, kVoidKey)).c_str()); | |
| 72 | |
| 73 // CreateFullXkbLayoutName should not accept an empty ModifierMap. | |
| 74 EXPECT_STREQ("", CreateFullXkbLayoutName("us", ModifierMap()).c_str()); | |
| 75 | |
| 76 // CreateFullXkbLayoutName should not accept an incomplete ModifierMap. | |
| 77 ModifierMap tmp_map = GetMap(kVoidKey, kVoidKey, kVoidKey); | |
| 78 tmp_map.pop_back(); | |
| 79 EXPECT_STREQ("", CreateFullXkbLayoutName("us", tmp_map).c_str()); | |
| 80 | |
| 81 // CreateFullXkbLayoutName should not accept redundant ModifierMaps. | |
| 82 tmp_map = GetMap(kVoidKey, kVoidKey, kVoidKey); | |
| 83 tmp_map.push_back(ModifierKeyPair(kSearchKey, kVoidKey)); // two search maps | |
| 84 EXPECT_STREQ("", CreateFullXkbLayoutName("us", tmp_map).c_str()); | |
| 85 tmp_map = GetMap(kVoidKey, kVoidKey, kVoidKey); | |
| 86 tmp_map.push_back(ModifierKeyPair(kLeftControlKey, kVoidKey)); // two ctrls | |
| 87 EXPECT_STREQ("", CreateFullXkbLayoutName("us", tmp_map).c_str()); | |
| 88 tmp_map = GetMap(kVoidKey, kVoidKey, kVoidKey); | |
| 89 tmp_map.push_back(ModifierKeyPair(kLeftAltKey, kVoidKey)); // two alts. | |
| 90 EXPECT_STREQ("", CreateFullXkbLayoutName("us", tmp_map).c_str()); | |
| 91 | |
| 92 // CreateFullXkbLayoutName should not accept invalid ModifierMaps. | |
| 93 tmp_map = GetMap(kVoidKey, kVoidKey, kVoidKey); | |
| 94 tmp_map.push_back(ModifierKeyPair(kVoidKey, kSearchKey)); // can't remap void | |
| 95 EXPECT_STREQ("", CreateFullXkbLayoutName("us", tmp_map).c_str()); | |
| 96 tmp_map = GetMap(kVoidKey, kVoidKey, kVoidKey); | |
| 97 tmp_map.push_back(ModifierKeyPair(kCapsLockKey, kSearchKey)); // ditto | |
| 98 EXPECT_STREQ("", CreateFullXkbLayoutName("us", tmp_map).c_str()); | |
| 99 | |
| 100 // CreateFullXkbLayoutName can remap Search/Ctrl/Alt to CapsLock. | |
| 101 EXPECT_STREQ("us+chromeos(capslock_disabled_disabled)", | |
| 102 CreateFullXkbLayoutName( | |
| 103 "us", | |
| 104 GetMap(kCapsLockKey, kVoidKey, kVoidKey)).c_str()); | |
| 105 EXPECT_STREQ("us+chromeos(disabled_capslock_disabled)", | |
| 106 CreateFullXkbLayoutName( | |
| 107 "us", | |
| 108 GetMap(kVoidKey, kCapsLockKey, kVoidKey)).c_str()); | |
| 109 EXPECT_STREQ("us+chromeos(disabled_disabled_capslock)", | |
| 110 CreateFullXkbLayoutName( | |
| 111 "us", | |
| 112 GetMap(kVoidKey, kVoidKey, kCapsLockKey)).c_str()); | |
| 113 | |
| 114 // CreateFullXkbLayoutName should not accept non-alphanumeric characters | |
| 115 // except "()-_". | |
| 116 EXPECT_STREQ("", CreateFullXkbLayoutName( | |
| 117 "us!", GetMap(kVoidKey, kVoidKey, kVoidKey)).c_str()); | |
| 118 EXPECT_STREQ("", CreateFullXkbLayoutName( | |
| 119 "us; /bin/sh", GetMap(kVoidKey, kVoidKey, kVoidKey)).c_str()); | |
| 120 EXPECT_STREQ("ab-c_12+chromeos(disabled_disabled_disabled),us", | |
| 121 CreateFullXkbLayoutName( | |
| 122 "ab-c_12", | |
| 123 GetMap(kVoidKey, kVoidKey, kVoidKey)).c_str()); | |
| 124 | |
| 125 // CreateFullXkbLayoutName should not accept upper-case ascii characters. | |
| 126 EXPECT_STREQ("", CreateFullXkbLayoutName( | |
| 127 "US", GetMap(kVoidKey, kVoidKey, kVoidKey)).c_str()); | |
| 128 | |
| 129 // CreateFullXkbLayoutName should accept lower-case ascii characters. | |
| 130 for (int c = 'a'; c <= 'z'; ++c) { | |
| 131 EXPECT_STRNE("", CreateFullXkbLayoutName( | |
| 132 std::string(3, c), | |
| 133 GetMap(kVoidKey, kVoidKey, kVoidKey)).c_str()); | |
| 134 } | |
| 135 | |
| 136 // CreateFullXkbLayoutName should accept numbers. | |
| 137 for (int c = '0'; c <= '9'; ++c) { | |
| 138 EXPECT_STRNE("", CreateFullXkbLayoutName( | |
| 139 std::string(3, c), | |
| 140 GetMap(kVoidKey, kVoidKey, kVoidKey)).c_str()); | |
| 141 } | |
| 142 | |
| 143 // CreateFullXkbLayoutName should accept a layout with a variant name. | |
| 144 EXPECT_STREQ("us(dvorak)+chromeos(disabled_disabled_disabled)", | |
| 145 CreateFullXkbLayoutName( | |
| 146 "us(dvorak)", | |
| 147 GetMap(kVoidKey, kVoidKey, kVoidKey)).c_str()); | |
| 148 EXPECT_STREQ("gb(extd)+chromeos(disabled_disabled_disabled),us", | |
| 149 CreateFullXkbLayoutName( | |
| 150 "gb(extd)", | |
| 151 GetMap(kVoidKey, kVoidKey, kVoidKey)).c_str()); | |
| 152 EXPECT_STREQ("gb(extd)+", CreateFullXkbLayoutName( | |
| 153 "gb(extd)", | |
| 154 GetMap(kVoidKey, kVoidKey, kVoidKey)).substr(0, 9).c_str()); | |
| 155 EXPECT_STREQ("jp+", CreateFullXkbLayoutName( | |
| 156 "jp", GetMap(kVoidKey, kVoidKey, kVoidKey)).substr(0, 3).c_str()); | |
| 157 | |
| 158 // When the layout name is not "us", the second layout should be added. | |
| 159 EXPECT_EQ(-1, CreateFullXkbLayoutName( | |
| 160 "us", GetMap(kVoidKey, kVoidKey, kVoidKey)).find(",us")); | |
| 161 EXPECT_EQ(-1, CreateFullXkbLayoutName( | |
| 162 "us(dvorak)", GetMap(kVoidKey, kVoidKey, kVoidKey)).find(",us")); | |
| 163 EXPECT_NE(-1, CreateFullXkbLayoutName( | |
| 164 "gb(extd)", GetMap(kVoidKey, kVoidKey, kVoidKey)).find(",us")); | |
| 165 EXPECT_NE(-1, CreateFullXkbLayoutName( | |
| 166 "jp", GetMap(kVoidKey, kVoidKey, kVoidKey)).find(",us")); | |
| 167 } | |
| 168 | |
| 169 // Tests if CreateFullXkbLayoutName and ExtractLayoutNameFromFullXkbLayoutName | |
| 170 // functions could handle all combinations of modifier remapping. | |
| 171 TEST(ChromeOSKeyboardTest, TestCreateFullXkbLayoutNameModifierKeys) { | |
| 172 std::set<std::string> layouts; | |
| 173 for (int i = 0; i < static_cast<int>(kNumModifierKeys); ++i) { | |
| 174 for (int j = 0; j < static_cast<int>(kNumModifierKeys); ++j) { | |
| 175 for (int k = 0; k < static_cast<int>(kNumModifierKeys); ++k) { | |
| 176 const std::string layout = CreateFullXkbLayoutName( | |
| 177 "us", GetMap(ModifierKey(i), ModifierKey(j), ModifierKey(k))); | |
| 178 // CreateFullXkbLayoutName should succeed (i.e. should not return "".) | |
| 179 EXPECT_STREQ("us+", layout.substr(0, 3).c_str()) | |
| 180 << "layout: " << layout; | |
| 181 // All 4*3*3 layouts should be different. | |
| 182 EXPECT_TRUE(layouts.insert(layout).second) << "layout: " << layout; | |
| 183 } | |
| 184 } | |
| 185 } | |
| 186 } | |
| 187 | |
| 188 TEST(ChromeOSKeyboardTest, TestSetCapsLockIsEnabled) { | |
| 189 if (!DisplayAvailable()) { | |
| 190 return; | |
| 191 } | |
| 192 const bool initial_lock_state = CapsLockIsEnabled(); | |
| 193 SetCapsLockEnabled(true); | |
| 194 EXPECT_TRUE(CapsLockIsEnabled()); | |
| 195 SetCapsLockEnabled(false); | |
| 196 EXPECT_FALSE(CapsLockIsEnabled()); | |
| 197 SetCapsLockEnabled(true); | |
| 198 EXPECT_TRUE(CapsLockIsEnabled()); | |
| 199 SetCapsLockEnabled(false); | |
| 200 EXPECT_FALSE(CapsLockIsEnabled()); | |
| 201 SetCapsLockEnabled(initial_lock_state); | |
| 202 } | |
| 203 | |
| 204 TEST(ChromeOSKeyboardTest, TestContainsModifierKeyAsReplacement) { | |
| 205 EXPECT_FALSE(ContainsModifierKeyAsReplacement( | |
| 206 GetMap(kVoidKey, kVoidKey, kVoidKey), kCapsLockKey)); | |
| 207 EXPECT_TRUE(ContainsModifierKeyAsReplacement( | |
| 208 GetMap(kCapsLockKey, kVoidKey, kVoidKey), kCapsLockKey)); | |
| 209 EXPECT_TRUE(ContainsModifierKeyAsReplacement( | |
| 210 GetMap(kVoidKey, kCapsLockKey, kVoidKey), kCapsLockKey)); | |
| 211 EXPECT_TRUE(ContainsModifierKeyAsReplacement( | |
| 212 GetMap(kVoidKey, kVoidKey, kCapsLockKey), kCapsLockKey)); | |
| 213 EXPECT_TRUE(ContainsModifierKeyAsReplacement( | |
| 214 GetMap(kCapsLockKey, kCapsLockKey, kVoidKey), kCapsLockKey)); | |
| 215 EXPECT_TRUE(ContainsModifierKeyAsReplacement( | |
| 216 GetMap(kCapsLockKey, kCapsLockKey, kCapsLockKey), kCapsLockKey)); | |
| 217 EXPECT_TRUE(ContainsModifierKeyAsReplacement( | |
| 218 GetMap(kSearchKey, kVoidKey, kVoidKey), kSearchKey)); | |
| 219 } | |
| 220 | |
| 221 } // namespace chromeos | |
| OLD | NEW |