00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <gtest/gtest.h>
00020 #include <gmock/gmock.h>
00021
00022 #define TEST_ENV
00023 #include "Global.h"
00024
00025 #include "CMockKeyMap.h"
00026 #include "CMockEventQueue.h"
00027 #include "CXWindowsKeyState.h"
00028 #include "CLog.h"
00029 #include <errno.h>
00030
00031 #define XK_LATIN1
00032 #define XK_MISCELLANY
00033 #include "X11/keysymdef.h"
00034
00035 #if HAVE_XKB_EXTENSION
00036 # include <X11/XKBlib.h>
00037 #endif
00038
00039 class CXWindowsKeyStateTests : public ::testing::Test
00040 {
00041 protected:
00042 CXWindowsKeyStateTests() :
00043 m_display(NULL)
00044 {
00045 }
00046
00047 ~CXWindowsKeyStateTests()
00048 {
00049 if (m_display != NULL) {
00050 LOG((CLOG_DEBUG "closing display"));
00051 XCloseDisplay(m_display);
00052 }
00053 }
00054
00055 virtual void
00056 SetUp()
00057 {
00058
00059 if (this->m_display == NULL) {
00060 LOG((CLOG_DEBUG "opening display"));
00061 this->m_display = XOpenDisplay(NULL);
00062
00063 ASSERT_TRUE(this->m_display != NULL)
00064 << "unable to open display: " << errno;
00065 }
00066 }
00067
00068 virtual void
00069 TearDown()
00070 {
00071 }
00072
00073 Display* m_display;
00074 };
00075
00076 TEST_F(CXWindowsKeyStateTests, setActiveGroup_pollAndSet_groupIsZero)
00077 {
00078 CMockKeyMap keyMap;
00079 CMockEventQueue eventQueue;
00080 CXWindowsKeyState keyState(m_display, true, eventQueue, keyMap);
00081
00082 keyState.setActiveGroup(CXWindowsKeyState::kGroupPollAndSet);
00083
00084 ASSERT_EQ(0, keyState.m_group);
00085 }
00086
00087 TEST_F(CXWindowsKeyStateTests, setActiveGroup_poll_groupIsNotSet)
00088 {
00089 CMockKeyMap keyMap;
00090 CMockEventQueue eventQueue;
00091 CXWindowsKeyState keyState(m_display, true, eventQueue, keyMap);
00092
00093 keyState.setActiveGroup(CXWindowsKeyState::kGroupPoll);
00094
00095 ASSERT_LE(-1, keyState.m_group);
00096 }
00097
00098 TEST_F(CXWindowsKeyStateTests, setActiveGroup_customGroup_groupWasSet)
00099 {
00100 CMockKeyMap keyMap;
00101 CMockEventQueue eventQueue;
00102 CXWindowsKeyState keyState(m_display, true, eventQueue, keyMap);
00103
00104 keyState.setActiveGroup(1);
00105
00106 ASSERT_EQ(1, keyState.m_group);
00107 }
00108
00109 TEST_F(CXWindowsKeyStateTests, mapModifiersFromX_zeroState_zeroMask)
00110 {
00111 CMockKeyMap keyMap;
00112 CMockEventQueue eventQueue;
00113 CXWindowsKeyState keyState(m_display, true, eventQueue, keyMap);
00114
00115 int mask = keyState.mapModifiersFromX(0);
00116
00117 ASSERT_EQ(0, mask);
00118 }
00119
00120 TEST_F(CXWindowsKeyStateTests, mapModifiersToX_zeroMask_resultIsTrue)
00121 {
00122 CMockKeyMap keyMap;
00123 CMockEventQueue eventQueue;
00124 CXWindowsKeyState keyState(m_display, true, eventQueue, keyMap);
00125
00126 unsigned int modifiers = 0;
00127 bool result = keyState.mapModifiersToX(0, modifiers);
00128
00129 ASSERT_TRUE(result);
00130 }
00131
00132 TEST_F(CXWindowsKeyStateTests, fakeCtrlAltDel_default_returnsFalse)
00133 {
00134 CMockKeyMap keyMap;
00135 CMockEventQueue eventQueue;
00136 CXWindowsKeyState keyState(m_display, true, eventQueue, keyMap);
00137
00138 bool result = keyState.fakeCtrlAltDel();
00139
00140 ASSERT_FALSE(result);
00141 }
00142
00143 TEST_F(CXWindowsKeyStateTests, pollActiveModifiers_defaultState_returnsZero)
00144 {
00145 CMockKeyMap keyMap;
00146 CMockEventQueue eventQueue;
00147 CXWindowsKeyState keyState(m_display, true, eventQueue, keyMap);
00148
00149 KeyModifierMask actual = keyState.pollActiveModifiers();
00150
00151 ASSERT_EQ(0, actual);
00152 }
00153
00154 TEST_F(CXWindowsKeyStateTests, pollActiveModifiers_shiftKeyDownThenUp_masksAreCorrect)
00155 {
00156 CMockKeyMap keyMap;
00157 CMockEventQueue eventQueue;
00158 CXWindowsKeyState keyState(m_display, true, eventQueue, keyMap);
00159
00160
00161 std::fill(
00162 keyState.m_modifierFromX.begin(), keyState.m_modifierFromX.end(), 0);
00163 keyState.m_modifierFromX[ShiftMapIndex] = KeyModifierShift;
00164
00165 KeyCode key = XKeysymToKeycode(m_display, XK_Shift_L);
00166
00167
00168 XTestFakeKeyEvent(m_display, key, true, CurrentTime);
00169
00170
00171 KeyModifierMask modDown = keyState.pollActiveModifiers();
00172
00173
00174 XTestFakeKeyEvent(m_display, key, false, CurrentTime);
00175
00176
00177 KeyModifierMask modUp = keyState.pollActiveModifiers();
00178
00179 EXPECT_TRUE((modDown & KeyModifierShift) == KeyModifierShift)
00180 << "shift key not in mask - key was not pressed";
00181
00182 EXPECT_TRUE((modUp & KeyModifierShift) == 0)
00183 << "shift key still in mask - make sure no keys are being held down";
00184 }
00185
00186 TEST_F(CXWindowsKeyStateTests, pollActiveGroup_defaultState_returnsZero)
00187 {
00188 CMockKeyMap keyMap;
00189 CMockEventQueue eventQueue;
00190 CXWindowsKeyState keyState(m_display, true, eventQueue, keyMap);
00191
00192 SInt32 actual = keyState.pollActiveGroup();
00193
00194 ASSERT_EQ(0, actual);
00195 }
00196
00197 TEST_F(CXWindowsKeyStateTests, pollActiveGroup_positiveGroup_returnsGroup)
00198 {
00199 CMockKeyMap keyMap;
00200 CMockEventQueue eventQueue;
00201 CXWindowsKeyState keyState(m_display, true, eventQueue, keyMap);
00202
00203 keyState.m_group = 3;
00204
00205 SInt32 actual = keyState.pollActiveGroup();
00206
00207 ASSERT_EQ(3, actual);
00208 }
00209
00210 TEST_F(CXWindowsKeyStateTests, pollActiveGroup_xkb_areEqual)
00211 {
00212 #if HAVE_XKB_EXTENSION
00213 CMockKeyMap keyMap;
00214 CMockEventQueue eventQueue;
00215 CXWindowsKeyState keyState(m_display, true, eventQueue, keyMap);
00216
00217
00218 keyState.m_group = -1;
00219
00220 XkbStateRec state;
00221
00222
00223 if (XkbGetState(m_display, XkbUseCoreKbd, &state) == Success) {
00224 SInt32 actual = keyState.pollActiveGroup();
00225
00226 ASSERT_EQ(state.group, actual);
00227 }
00228 else {
00229 FAIL() << "XkbGetState() returned error " << errno;
00230 }
00231 #else
00232 SUCCEED() << "Xkb extension not installed";
00233 #endif
00234 }
00235