• Main Page
  • Classes
  • Files
  • File List

CXWindowsKeyStateTests.cpp

00001 /*
00002  * synergy -- mouse and keyboard sharing utility
00003  * Copyright (C) 2012 Bolton Software Ltd.
00004  * Copyright (C) 2011 Nick Bolton
00005  *
00006  * This package is free software; you can redistribute it and/or
00007  * modify it under the terms of the GNU General Public License
00008  * found in the file COPYING that should have accompanied this file.
00009  *
00010  * This package is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013  * GNU General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU General Public License
00016  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
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         // open the display only once for the entire test suite
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     // set mock modifier mapping
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     // fake shift key down (without using synergy)
00168     XTestFakeKeyEvent(m_display, key, true, CurrentTime);
00169 
00170     // function under test (1st call)
00171     KeyModifierMask modDown = keyState.pollActiveModifiers();
00172 
00173     // fake shift key up (without using synergy)
00174     XTestFakeKeyEvent(m_display, key, false, CurrentTime);
00175 
00176     // function under test (2nd call)
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     // reset the group
00218     keyState.m_group = -1;
00219 
00220     XkbStateRec state;
00221 
00222     // compare pollActiveGroup() with XkbGetState()
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 

Generated on Tue May 21 2013 00:00:06 for Synergy by  doxygen 1.7.1