added failing unit test and event queue DI to ms desks class.

This commit is contained in:
Nick Bolton 2012-07-20 12:24:55 +00:00
parent 34a87502f6
commit de30d04c72
4 changed files with 49 additions and 31 deletions

View File

@ -29,6 +29,7 @@
#include "TMethodJob.h"
#include "CArchMiscWindows.h"
#include <malloc.h>
#include "IEventQueue.h"
// these are only defined when WINVER >= 0x0500
#if !defined(SPI_GETMOUSESPEED)
@ -89,8 +90,9 @@
//
CMSWindowsDesks::CMSWindowsDesks(
bool isPrimary, bool noHooks, HINSTANCE hookLibrary,
const IScreenSaver* screensaver, IJob* updateKeys) :
bool isPrimary, bool noHooks, HINSTANCE hookLibrary,
const IScreenSaver* screensaver, IEventQueue& eventQueue,
IJob* updateKeys) :
m_isPrimary(isPrimary),
m_noHooks(noHooks),
m_is95Family(CArchMiscWindows::isWindows95Family()),
@ -107,7 +109,8 @@ CMSWindowsDesks::CMSWindowsDesks(
m_activeDeskName(),
m_mutex(),
m_deskReady(&m_mutex, false),
m_updateKeys(updateKeys)
m_updateKeys(updateKeys),
m_eventQueue(eventQueue)
{
if (hookLibrary != NULL)
queryHookLibrary(hookLibrary);
@ -138,8 +141,8 @@ CMSWindowsDesks::enable()
// which desk is active and reinstalls the hooks as necessary.
// we wouldn't need this if windows notified us of a desktop
// change but as far as i can tell it doesn't.
m_timer = EVENTQUEUE->newTimer(0.2, NULL);
EVENTQUEUE->adoptHandler(CEvent::kTimer, m_timer,
m_timer = m_eventQueue.newTimer(0.2, NULL);
m_eventQueue.adoptHandler(CEvent::kTimer, m_timer,
new TMethodEventJob<CMSWindowsDesks>(
this, &CMSWindowsDesks::handleCheckDesk));
@ -151,8 +154,8 @@ CMSWindowsDesks::disable()
{
// remove timer
if (m_timer != NULL) {
EVENTQUEUE->removeHandler(CEvent::kTimer, m_timer);
EVENTQUEUE->deleteTimer(m_timer);
m_eventQueue.removeHandler(CEvent::kTimer, m_timer);
m_eventQueue.deleteTimer(m_timer);
m_timer = NULL;
}

View File

@ -34,6 +34,7 @@ class CEventQueueTimer;
class CThread;
class IJob;
class IScreenSaver;
class IEventQueue;
//! Microsoft Windows desk handling
/*!
@ -62,8 +63,10 @@ public:
updated in a thread attached to the current desk.
\p hookLibrary must be a handle to the hook library.
*/
CMSWindowsDesks(bool isPrimary, bool noHooks, HINSTANCE hookLibrary,
const IScreenSaver* screensaver, IJob* updateKeys);
CMSWindowsDesks(
bool isPrimary, bool noHooks, HINSTANCE hookLibrary,
const IScreenSaver* screensaver, IEventQueue& eventQueue,
IJob* updateKeys);
~CMSWindowsDesks();
//! @name manipulators
@ -289,8 +292,10 @@ private:
// hook library stuff
InstallFunc m_install;
UninstallFunc m_uninstall;
InstallScreenSaverFunc m_installScreensaver;
UninstallScreenSaverFunc m_uninstallScreensaver;
InstallScreenSaverFunc
m_installScreensaver;
UninstallScreenSaverFunc
m_uninstallScreensaver;
// keyboard stuff
IJob* m_updateKeys;
@ -298,6 +303,8 @@ private:
// options
bool m_leaveForegroundOption;
IEventQueue& m_eventQueue;
};
#endif

View File

@ -122,6 +122,7 @@ CMSWindowsScreen::CMSWindowsScreen(bool isPrimary, bool noHooks, const CGameDevi
m_desks = new CMSWindowsDesks(
m_isPrimary, m_noHooks,
m_hookLibrary, m_screensaver,
*EVENTQUEUE,
new TMethodJob<CMSWindowsScreen>(this,
&CMSWindowsScreen::updateKeysCB));
m_keyState = new CMSWindowsKeyState(m_desks, getEventTarget());

View File

@ -17,6 +17,10 @@
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#define TEST_ENV
#include "Global.h"
#include "CMSWindowsKeyState.h"
#include "CMSWindowsDesks.h"
#include "CMSWindowsScreen.h"
@ -39,21 +43,19 @@ protected:
// load synrgyhk.dll
m_hookLibrary = m_hookLibraryLoader.openHookLibrary("synrgyhk");
m_screensaver = new CMSWindowsScreenSaver();
m_desks = new CMSWindowsDesks(
true, false, m_hookLibrary, m_screensaver,
new TMethodJob<CMSWindowsKeyStateTests>(
this, &CMSWindowsKeyStateTests::updateKeysCB));
}
virtual void TearDown()
{
delete m_screensaver;
delete m_desks;
}
CMSWindowsDesks* getDesks() const
CMSWindowsDesks* newDesks(IEventQueue& eventQueue)
{
return m_desks;
return new CMSWindowsDesks(
true, false, m_hookLibrary, m_screensaver, eventQueue,
new TMethodJob<CMSWindowsKeyStateTests>(
this, &CMSWindowsKeyStateTests::updateKeysCB));
}
void* getEventTarget() const
@ -65,70 +67,75 @@ private:
void updateKeysCB(void*) { }
HINSTANCE m_hookLibrary;
IScreenSaver* m_screensaver;
CMSWindowsDesks* m_desks;
CMSWindowsHookLibraryLoader m_hookLibraryLoader;
};
TEST_F(CMSWindowsKeyStateTests, disable_nonWin95OS_eventQueueNotUsed)
{
NiceMock<CMockEventQueue> eventQueue;
CMSWindowsDesks* desks = newDesks(eventQueue);
CMockKeyMap keyMap;
CMSWindowsKeyState keyState(getDesks(), getEventTarget(), eventQueue, keyMap);
CMSWindowsKeyState keyState(desks, getEventTarget(), eventQueue, keyMap);
// in anything above win95-family, event handler should not be called.
EXPECT_CALL(eventQueue, removeHandler(_, _)).Times(0);
keyState.disable();
delete desks;
}
TEST_F(CMSWindowsKeyStateTests, testAutoRepeat_noRepeatAndButtonIsZero_resultIsTrue)
{
NiceMock<CMockEventQueue> eventQueue;
CMSWindowsDesks* desks = newDesks(eventQueue);
CMockKeyMap keyMap;
CMSWindowsKeyState keyState(getDesks(), getEventTarget(), eventQueue, keyMap);
CMSWindowsKeyState keyState(desks, getEventTarget(), eventQueue, keyMap);
keyState.setLastDown(1);
bool actual = keyState.testAutoRepeat(true, false, 1);
ASSERT_TRUE(actual);
delete desks;
}
TEST_F(CMSWindowsKeyStateTests, testAutoRepeat_pressFalse_lastDownIsZero)
{
NiceMock<CMockEventQueue> eventQueue;
CMSWindowsDesks* desks = newDesks(eventQueue);
CMockKeyMap keyMap;
CMSWindowsKeyState keyState(getDesks(), getEventTarget(), eventQueue, keyMap);
CMSWindowsKeyState keyState(desks, getEventTarget(), eventQueue, keyMap);
keyState.setLastDown(1);
keyState.testAutoRepeat(false, false, 1);
ASSERT_EQ(0, keyState.getLastDown());
delete desks;
}
TEST_F(CMSWindowsKeyStateTests, saveModifiers_noModifiers_savedModifiers0)
{
NiceMock<CMockEventQueue> eventQueue;
CMSWindowsDesks* desks = newDesks(eventQueue);
CMockKeyMap keyMap;
CMSWindowsKeyState keyState(getDesks(), getEventTarget(), eventQueue, keyMap);
CMSWindowsKeyState keyState(desks, getEventTarget(), eventQueue, keyMap);
keyState.saveModifiers();
ASSERT_EQ(0, keyState.getSavedModifiers());
delete desks;
}
/*
// TODO: fix Assertion failed: s_instance != NULL,
// file ..\..\..\..\src\lib\base\IEventQueue.cpp, line 37
TEST_F(CMSWindowsKeyStateTests, saveModifiers_shiftKeyDown_savedModifiers4)
{
NiceMock<CMockEventQueue> eventQueue;
CMSWindowsDesks* desks = newDesks(eventQueue);
CMockKeyMap keyMap;
CMSWindowsKeyState keyState(getDesks(), getEventTarget(), eventQueue, keyMap);
getDesks()->enable();
getDesks()->fakeKeyEvent(1, 1, true, false);
CMSWindowsKeyState keyState(desks, getEventTarget(), eventQueue, keyMap);
desks->enable();
desks->fakeKeyEvent(1, 1, true, false);
keyState.saveModifiers();
ASSERT_EQ(1, keyState.getSavedModifiers());
delete desks;
}
*/