implemented google mock config and gave it a quick try (see: add_newValue_writeWasCalled)

This commit is contained in:
Nick Bolton 2011-05-07 02:12:09 +00:00
parent ae7a1f70e7
commit edeae477e1
10 changed files with 147 additions and 17 deletions

View File

@ -22,6 +22,7 @@
#include "CMSWindowsClipboardHTMLConverter.h"
#include "CLog.h"
#include "CArchMiscWindows.h"
#include "CMSWindowsClipboardFacade.h"
//
// CMSWindowsClipboard
@ -31,7 +32,9 @@ UINT CMSWindowsClipboard::s_ownershipFormat = 0;
CMSWindowsClipboard::CMSWindowsClipboard(HWND window) :
m_window(window),
m_time(0)
m_time(0),
m_facade(new CMSWindowsClipboardFacade()),
m_deleteFacade(true)
{
// add converters, most desired first
m_converters.push_back(new CMSWindowsClipboardUTF16Converter);
@ -47,6 +50,12 @@ CMSWindowsClipboard::CMSWindowsClipboard(HWND window) :
CMSWindowsClipboard::~CMSWindowsClipboard()
{
clearConverters();
// dependency injection causes confusion over ownership, so we need
// logic to decide whether or not we delete the facade. there must
// be a more elegant way of doing this.
if (m_deleteFacade)
delete m_facade;
}
bool
@ -94,12 +103,7 @@ CMSWindowsClipboard::add(EFormat format, const CString& data)
HANDLE win32Data = converter->fromIClipboard(data);
if (win32Data != NULL) {
UINT win32Format = converter->getWin32Format();
if (SetClipboardData(win32Format, win32Data) == NULL) {
// free converted data if we couldn't put it on
// the clipboard.
// nb: couldn't cause this in integ tests.
GlobalFree(win32Data);
}
m_facade->write(win32Data, win32Format);
}
}
}

View File

@ -19,16 +19,19 @@
#define CMSWINDOWSCLIPBOARD_H
#include "IClipboard.h"
#include "CMSWindowsClipboardFacade.h"
#include "stdvector.h"
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
class IMSWindowsClipboardConverter;
class IMSWindowsClipboardFacade;
//! Microsoft windows clipboard implementation
class CMSWindowsClipboard : public IClipboard {
public:
CMSWindowsClipboard(HWND window);
CMSWindowsClipboard(HWND window, IMSWindowsClipboardFacade &facade);
virtual ~CMSWindowsClipboard();
//! Empty clipboard without ownership
@ -58,6 +61,8 @@ public:
virtual bool has(EFormat) const;
virtual CString get(EFormat) const;
void setFacade(IMSWindowsClipboardFacade& facade) { m_facade = &facade; m_deleteFacade = false; }
private:
void clearConverters();
@ -74,6 +79,8 @@ private:
mutable Time m_time;
ConverterList m_converters;
static UINT s_ownershipFormat;
IMSWindowsClipboardFacade* m_facade;
bool m_deleteFacade;
};
//! Clipboard format converter interface

View File

@ -0,0 +1,29 @@
/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2002 Chris Schoeneman, Nick Bolton, Sorin Sbarnea
*
* This package is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* found in the file COPYING that should have accompanied this file.
*
* This package is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "CMSWindowsClipboard.h"
#include "CMSWindowsClipboardFacade.h"
void CMSWindowsClipboardFacade::write(HANDLE win32Data, UINT win32Format)
{
if (SetClipboardData(win32Format, win32Data) == NULL) {
// free converted data if we couldn't put it on
// the clipboard.
// nb: couldn't cause this in integ tests.
GlobalFree(win32Data);
}
}

View File

@ -0,0 +1,30 @@
/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2002 Chris Schoeneman, Nick Bolton, Sorin Sbarnea
*
* This package is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* found in the file COPYING that should have accompanied this file.
*
* This package is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CMSWINDOWSCLIPBOARDFACADE_H
#define CMSWINDOWSCLIPBOARDFACADE_H
#include "IMSWindowsClipboardFacade.h"
#include "IClipboard.h"
class CMSWindowsClipboardFacade : public IMSWindowsClipboardFacade
{
public:
virtual void write(HANDLE win32Data, UINT win32Format);
};
#endif

View File

@ -29,11 +29,13 @@ if (WIN32)
CMSWindowsScreenSaver.h
CMSWindowsUtil.h
CMSWindowsRelauncher.h
IMSWindowsClipboardFacade.h
)
set(src
${inc}
CMSWindowsClipboard.cpp
CMSWindowsClipboardFacade.cpp
CMSWindowsClipboardAnyTextConverter.cpp
CMSWindowsClipboardBitmapConverter.cpp
CMSWindowsClipboardHTMLConverter.cpp

View File

@ -0,0 +1,34 @@
/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2002 Chris Schoeneman, Nick Bolton, Sorin Sbarnea
*
* This package is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* found in the file COPYING that should have accompanied this file.
*
* This package is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef IMWINDOWSCLIPBOARDFACADE
#define IMWINDOWSCLIPBOARDFACADE
#include "IInterface.h"
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
class IMSWindowsClipboardConverter;
class IMSWindowsClipboardFacade : public IInterface
{
public:
virtual void write(HANDLE win32Data, UINT win32Format) = 0;
virtual ~IMSWindowsClipboardFacade() { }
};
#endif

View File

@ -14,10 +14,13 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
include_directories(
../../tools/gtest
../../tools/gtest/include)
../../tools/gtest-1.6.0
../../tools/gtest-1.6.0/include
../../tools/gmock-1.6.0
../../tools/gmock-1.6.0/include)
add_library(gtest STATIC ../../tools/gtest/src/gtest-all.cc)
add_library(gtest STATIC ../../tools/gtest-1.6.0/src/gtest-all.cc)
add_library(gmock STATIC ../../tools/gmock-1.6.0/src/gmock-all.cc)
add_subdirectory(integtests)
add_subdirectory(unittests)

View File

@ -50,7 +50,8 @@ set(inc
../../lib/net
../../lib/platform
../../lib/synergy
../../../tools/gtest/include
../../../tools/gtest-1.6.0/include
../../../tools/gmock-1.6.0/include
)
if (UNIX)
@ -62,4 +63,4 @@ endif()
include_directories(${inc})
add_executable(integtests ${src})
target_link_libraries(integtests
arch base client common io mt net platform server synergy gtest ${libs})
arch base client common io mt net platform server synergy gtest gmock ${libs})

View File

@ -16,8 +16,9 @@
*/
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include "CMSWindowsClipboard.h"
#include "IMSWindowsClipboardFacade.h"
class CMSWindowsClipboardTests : public ::testing::Test
{
@ -41,6 +42,12 @@ private:
}
};
class MockFacade : public IMSWindowsClipboardFacade
{
public:
MOCK_METHOD2(write, void(HANDLE, UINT));
};
TEST_F(CMSWindowsClipboardTests, emptyUnowned_openCalled_returnsTrue)
{
CMSWindowsClipboard clipboard(NULL);
@ -84,6 +91,18 @@ TEST_F(CMSWindowsClipboardTests, add_newValue_valueWasStored)
EXPECT_EQ("synergy rocks!", actual);
}
TEST_F(CMSWindowsClipboardTests, add_newValue_writeWasCalled)
{
MockFacade facade;
EXPECT_CALL(facade, write(testing::_, testing::_));
CMSWindowsClipboard clipboard(NULL);
clipboard.setFacade(facade);
clipboard.open(0);
clipboard.add(IClipboard::kText, "synergy rocks!");
}
TEST_F(CMSWindowsClipboardTests, add_replaceValue_valueWasReplaced)
{
CMSWindowsClipboard clipboard(NULL);

View File

@ -14,7 +14,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
set(src
../../../tools/gtest/src/gtest_main.cc
../../../tools/gtest-1.6.0/src/gtest_main.cc
synergy/CClipboardTests.cpp
)
@ -28,7 +28,8 @@ set(inc
../../lib/net
../../lib/platform
../../lib/synergy
../../../tools/gtest/include
../../../tools/gtest-1.6.0/include
../../../tools/gmock-1.6.0/include
)
if (UNIX)
@ -40,4 +41,4 @@ endif()
include_directories(${inc})
add_executable(unittests ${src})
target_link_libraries(unittests
arch base client common io mt net platform server synergy gtest ${libs})
arch base client common io mt net platform server synergy gtest gmock ${libs})