Merge pull request #1009 from p12tic/gui-keysequence-tests

Add tests for KeySequence
This commit is contained in:
Povilas Kanapickas 2021-01-07 23:51:31 +02:00 committed by GitHub
commit f1aab806af
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 297 additions and 181 deletions

View File

@ -430,4 +430,7 @@ endif()
else() else()
message (STATUS "NOT configuring the installer") message (STATUS "NOT configuring the installer")
endif() endif()
enable_testing()
add_subdirectory (src) add_subdirectory (src)

View File

@ -24,14 +24,14 @@ if (BARRIER_USE_EXTERNAL_GTEST)
) )
else() else()
include_directories( include_directories(
../../ext/gtest ../ext/gtest
../../ext/gtest/include ../ext/gtest/include
../../ext/gmock ../ext/gmock
../../ext/gmock/include ../ext/gmock/include
) )
add_library(gtest STATIC ../../ext/gtest/src/gtest-all.cc) add_library(gtest STATIC ../ext/gtest/src/gtest-all.cc)
add_library(gmock STATIC ../../ext/gmock/src/gmock-all.cc) add_library(gmock STATIC ../ext/gmock/src/gmock-all.cc)
set(GTEST_LIBRARIES gtest) set(GTEST_LIBRARIES gtest)
set(GMOCK_LIBRARIES gmock) set(GMOCK_LIBRARIES gmock)
@ -42,6 +42,3 @@ else()
set_target_properties(gmock PROPERTIES COMPILE_FLAGS "-w") set_target_properties(gmock PROPERTIES COMPILE_FLAGS "-w")
endif() endif()
endif() endif()
add_subdirectory(integtests)
add_subdirectory(unittests)

View File

@ -20,8 +20,11 @@ include_directories (${CMAKE_CURRENT_BINARY_DIR}/lib)
add_subdirectory(lib) add_subdirectory(lib)
add_subdirectory(cmd) add_subdirectory(cmd)
include(../cmake/gtest.cmake)
if (BARRIER_BUILD_TESTS) if (BARRIER_BUILD_TESTS)
add_subdirectory(test) add_subdirectory(test/integtests)
add_subdirectory(test/unittests)
endif() endif()
if (BARRIER_BUILD_GUI) if (BARRIER_BUILD_GUI)

View File

@ -6,15 +6,124 @@ set (CMAKE_AUTORCC ON)
set (CMAKE_AUTOUIC ON) set (CMAKE_AUTOUIC ON)
set (CMAKE_INCLUDE_CURRENT_DIR ON) set (CMAKE_INCLUDE_CURRENT_DIR ON)
file (GLOB GUI_SOURCE_FILES src/*.cpp src/*.h) # files that are used both in tests and the app
file (GLOB GUI_UI_FILES src/*.ui) set(GUI_COMMON_SOURCE_FILES
src/KeySequence.cpp
)
set(GUI_COMMON_HEADER_FILES
src/KeySequence.h
)
set(GUI_SOURCE_FILES
src/AboutDialog.cpp
src/Action.cpp
src/ActionDialog.cpp
src/AddClientDialog.cpp
src/AppConfig.cpp
src/BarrierLocale.cpp
src/BaseConfig.cpp
src/CommandProcess.cpp
src/DataDownloader.cpp
src/DisplayIsValid.cpp
src/Fingerprint.cpp
src/Hotkey.cpp
src/HotkeyDialog.cpp
src/IpcClient.cpp
src/Ipc.cpp
src/IpcReader.cpp
src/KeySequenceWidget.cpp
src/LogWindow.cpp
src/main.cpp
src/MainWindow.cpp
src/NewScreenWidget.cpp
src/QBarrierApplication.cpp
src/QUtility.cpp
src/Screen.cpp
src/ScreenSettingsDialog.cpp
src/ScreenSetupModel.cpp
src/ScreenSetupView.cpp
src/ServerConfig.cpp
src/ServerConfigDialog.cpp
src/SettingsDialog.cpp
src/SetupWizard.cpp
src/SslCertificate.cpp
src/TrashScreenWidget.cpp
src/VersionChecker.cpp
src/ZeroconfBrowser.cpp
src/ZeroconfRegister.cpp
src/ZeroconfServer.cpp
src/ZeroconfService.cpp
src/ZeroconfThread.cpp
)
set(GUI_HEADER_FILES
src/AboutDialog.h
src/ActionDialog.h
src/Action.h
src/AddClientDialog.h
src/AppConfig.h
src/BarrierLocale.h
src/BaseConfig.h
src/CommandProcess.h
src/DataDownloader.h
src/DisplayIsValid.h
src/ElevateMode.h
src/Fingerprint.h
src/HotkeyDialog.h
src/Hotkey.h
src/IpcClient.h
src/Ipc.h
src/IpcReader.h
src/KeySequenceWidget.h
src/LogWindow.h
src/MainWindow.h
src/NewScreenWidget.h
src/ProcessorArch.h
src/QBarrierApplication.h
src/QUtility.h
src/Screen.h
src/ScreenSettingsDialog.h
src/ScreenSetupModel.h
src/ScreenSetupView.h
src/ServerConfigDialog.h
src/ServerConfig.h
src/SettingsDialog.h
src/SetupWizard.h
src/ShutdownCh.h
src/SslCertificate.h
src/TrashScreenWidget.h
src/VersionChecker.h
src/ZeroconfBrowser.h
src/ZeroconfRecord.h
src/ZeroconfRegister.h
src/ZeroconfServer.h
src/ZeroconfService.h
src/ZeroconfThread.h
)
set(GUI_UI_FILES
src/AboutDialogBase.ui
src/ActionDialogBase.ui
src/AddClientDialogBase.ui
src/HotkeyDialogBase.ui
src/LogWindowBase.ui
src/MainWindowBase.ui
src/ScreenSettingsDialogBase.ui
src/ServerConfigDialogBase.ui
src/SettingsDialogBase.ui
src/SetupWizardBase.ui
)
if (WIN32) if (WIN32)
set (GUI_RC_FILES res/win/Barrier.rc) set (GUI_RC_FILES res/win/Barrier.rc)
endif() endif()
add_executable (barrier WIN32 add_executable (barrier WIN32
${GUI_COMMON_SOURCE_FILES}
${GUI_COMMON_HEADER_FILES}
${GUI_SOURCE_FILES} ${GUI_SOURCE_FILES}
${GUI_HEADER_FILES}
${GUI_UI_FILES} ${GUI_UI_FILES}
${GUI_RC_FILES} ${GUI_RC_FILES}
res/Barrier.qrc res/Barrier.qrc
@ -51,3 +160,21 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux" OR ${CMAKE_SYSTEM_NAME} MATCHES "BSD") elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux" OR ${CMAKE_SYSTEM_NAME} MATCHES "BSD")
install (TARGETS barrier DESTINATION bin) install (TARGETS barrier DESTINATION bin)
endif() endif()
if (BARRIER_BUILD_TESTS)
set(GUI_TEST_SOURCE_FILES
test/KeySequenceTests.cpp
test/main.cpp
)
add_executable(guiunittests
${GUI_TEST_SOURCE_FILES}
${GUI_COMMON_SOURCE_FILES}
${GUI_COMMON_HEADER_FILES}
)
add_test(guiunittests guiunittests)
target_include_directories(guiunittests PUBLIC ../../ext)
target_link_libraries(guiunittests gtest gmock Qt5::Core Qt5::Widgets Qt5::Network pthread)
endif()

View File

@ -1,162 +0,0 @@
QT += widgets \
network
TEMPLATE = app
TARGET = barrier
DEFINES += VERSION_STAGE=\\\"$$QMAKE_VERSION_STAGE\\\"
DEFINES += VERSION_REVISION=\\\"$$QMAKE_VERSION_REVISION\\\"
DEFINES -= UNICODE
DEFINES += _MBCS
DEPENDPATH += . \
res
INCLUDEPATH += . \
src \
../lib/shared/
FORMS += src/MainWindowBase.ui \
src/AboutDialogBase.ui \
src/ServerConfigDialogBase.ui \
src/ScreenSettingsDialogBase.ui \
src/ActionDialogBase.ui \
src/HotkeyDialogBase.ui \
src/SettingsDialogBase.ui \
src/SetupWizardBase.ui \
src/AddClientDialogBase.ui \
src/ActivationDialog.ui \
src/CancelActivationDialog.ui \
src/FailedLoginDialog.ui
SOURCES += src/main.cpp \
src/MainWindow.cpp \
src/AboutDialog.cpp \
src/ServerConfig.cpp \
src/ServerConfigDialog.cpp \
src/ScreenSetupView.cpp \
src/Screen.cpp \
src/ScreenSetupModel.cpp \
src/NewScreenWidget.cpp \
src/TrashScreenWidget.cpp \
src/ScreenSettingsDialog.cpp \
src/BaseConfig.cpp \
src/HotkeyDialog.cpp \
src/ActionDialog.cpp \
src/Hotkey.cpp \
src/Action.cpp \
src/KeySequence.cpp \
src/KeySequenceWidget.cpp \
src/SettingsDialog.cpp \
src/AppConfig.cpp \
src/QBarrierApplication.cpp \
src/VersionChecker.cpp \
src/SetupWizard.cpp \
src/IpcClient.cpp \
src/IpcReader.cpp \
src/Ipc.cpp \
src/BarrierLocale.cpp \
src/QUtility.cpp \
src/ZeroconfServer.cpp \
src/ZeroconfThread.cpp \
src/ZeroconfRegister.cpp \
src/ZeroconfBrowser.cpp \
src/ZeroconfService.cpp \
src/DataDownloader.cpp \
src/AddClientDialog.cpp \
src/CommandProcess.cpp \
src/CoreInterface.cpp \
src/Fingerprint.cpp \
src/SslCertificate.cpp \
src/WebClient.cpp \
src/ActivationNotifier.cpp \
src/ActivationDialog.cpp \
src/CancelActivationDialog.cpp \
src/FailedLoginDialog.cpp \
../lib/shared/SerialKey.cpp \
src/LicenseManager.cpp
HEADERS += src/MainWindow.h \
src/AboutDialog.h \
src/ServerConfig.h \
src/ServerConfigDialog.h \
src/ScreenSetupView.h \
src/Screen.h \
src/ScreenSetupModel.h \
src/NewScreenWidget.h \
src/TrashScreenWidget.h \
src/ScreenSettingsDialog.h \
src/BaseConfig.h \
src/HotkeyDialog.h \
src/ActionDialog.h \
src/Hotkey.h \
src/Action.h \
src/KeySequence.h \
src/KeySequenceWidget.h \
src/SettingsDialog.h \
src/AppConfig.h \
src/QBarrierApplication.h \
src/VersionChecker.h \
src/SetupWizard.h \
src/IpcClient.h \
src/IpcReader.h \
src/Ipc.h \
src/BarrierLocale.h \
src/QUtility.h \
src/ZeroconfServer.h \
src/ZeroconfThread.h \
src/ZeroconfRegister.h \
src/ZeroconfRecord.h \
src/ZeroconfBrowser.h \
src/ZeroconfService.h \
src/DataDownloader.h \
src/AddClientDialog.h \
src/CommandProcess.h \
src/ProcessorArch.h \
src/CoreInterface.h \
src/Fingerprint.h \
src/SslCertificate.h \
src/WebClient.h \
src/ActivationNotifier.h \
src/ElevateMode.h \
src/ActivationDialog.h \
src/CancelActivationDialog.h \
src/FailedLoginDialog.h \
../lib/shared/EditionType.h \
../lib/shared/SerialKey.h \
src/LicenseManager.h
RESOURCES += res/Barrier.qrc
RC_FILE = res/win/Barrier.rc
macx {
QMAKE_INFO_PLIST = res/mac/Info.plist
TARGET = Barrier
QBARRIER_ICON.files = res/mac/Barrier.icns
QBARRIER_ICON.path = Contents/Resources
QMAKE_BUNDLE_DATA += QBARRIER_ICON
LIBS += $$MACX_LIBS
}
unix:!macx:LIBS += -ldns_sd
debug {
OBJECTS_DIR = tmp/debug
MOC_DIR = tmp/debug
RCC_DIR = tmp/debug
}
release {
OBJECTS_DIR = tmp/release
MOC_DIR = tmp/release
RCC_DIR = tmp/release
}
win32-msvc2015 {
LIBS += -lAdvapi32
QMAKE_LFLAGS += /NODEFAULTLIB:LIBCMT
}
win32-msvc* {
contains(QMAKE_HOST.arch, x86):{
QMAKE_LFLAGS *= /MACHINE:X86
LIBS += -L"$$(BONJOUR_SDK_HOME)/Lib/Win32" -ldnssd
}
contains(QMAKE_HOST.arch, x86_64):{
QMAKE_LFLAGS *= /MACHINE:X64
LIBS += -L"$$(BONJOUR_SDK_HOME)/Lib/x64" -ldnssd
}
}
win32 {
Debug:DESTDIR = ../../bin/Debug
Release:DESTDIR = ../../bin/Release
INCLUDEPATH += "$$(BONJOUR_SDK_HOME)/Include"
}
else:DESTDIR = ../../bin

View File

@ -1 +1 @@
lupdate -noobsolete gui.pro -ts gui.ts lupdate -noobsolete src/* -ts gui.ts

View File

@ -152,12 +152,12 @@ bool KeySequence::appendKey(int key, int modifiers)
void KeySequence::loadSettings(QSettings& settings) void KeySequence::loadSettings(QSettings& settings)
{ {
sequence().clear(); m_Sequence.clear();
int num = settings.beginReadArray("keys"); int num = settings.beginReadArray("keys");
for (int i = 0; i < num; i++) for (int i = 0; i < num; i++)
{ {
settings.setArrayIndex(i); settings.setArrayIndex(i);
sequence().append(settings.value("key", 0).toInt()); m_Sequence.append(settings.value("key", 0).toInt());
} }
settings.endArray(); settings.endArray();
@ -168,10 +168,10 @@ void KeySequence::loadSettings(QSettings& settings)
void KeySequence::saveSettings(QSettings& settings) const void KeySequence::saveSettings(QSettings& settings) const
{ {
settings.beginWriteArray("keys"); settings.beginWriteArray("keys");
for (int i = 0; i < sequence().size(); i++) for (int i = 0; i < m_Sequence.size(); i++)
{ {
settings.setArrayIndex(i); settings.setArrayIndex(i);
settings.setValue("key", sequence()[i]); settings.setValue("key", m_Sequence[i]);
} }
settings.endArray(); settings.endArray();
} }

View File

@ -32,7 +32,7 @@ class KeySequence
public: public:
QString toString() const; QString toString() const;
bool appendKey(int modifiers, int key); bool appendKey(int key, int modifiers);
bool appendMouseButton(int button); bool appendMouseButton(int button);
bool isMouseButton() const; bool isMouseButton() const;
bool valid() const { return m_IsValid; } bool valid() const { return m_IsValid; }
@ -44,7 +44,6 @@ class KeySequence
private: private:
void setValid(bool b) { m_IsValid = b; } void setValid(bool b) { m_IsValid = b; }
void setModifiers(int i) { m_Modifiers = i; } void setModifiers(int i) { m_Modifiers = i; }
QList<int>& sequence() { return m_Sequence; }
private: private:
QList<int> m_Sequence; QList<int> m_Sequence;

View File

@ -0,0 +1,126 @@
/* barrier -- mouse and keyboard sharing utility
Copyright (C) 2021 Povilas Kanapickas <povilas@radix.lt>
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 LICENSE 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 "../src/KeySequence.h"
#include <gtest/gtest.h>
#include <cstdio>
#include <QtCore/QFile>
#include <QtCore/QSettings>
#include <QtCore/QTemporaryFile>
namespace {
auto s_key_sequence_test_keys = {
Qt::Key_Space,
Qt::Key_Escape,
Qt::Key_Tab,
Qt::Key_Backtab,
Qt::Key_Backspace,
Qt::Key_Return,
Qt::Key_Insert,
Qt::Key_Delete,
Qt::Key_Pause,
Qt::Key_Print,
Qt::Key_SysReq,
Qt::Key_Home,
Qt::Key_End,
Qt::Key_Left,
Qt::Key_Up,
Qt::Key_Right,
Qt::Key_Down,
Qt::Key_Comma,
Qt::Key_Semicolon,
Qt::Key_PageUp,
Qt::Key_PageDown,
Qt::Key_CapsLock,
Qt::Key_NumLock,
Qt::Key_ScrollLock,
Qt::Key_Help,
Qt::Key_Enter,
Qt::Key_Clear,
Qt::Key_Back,
Qt::Key_Forward,
Qt::Key_Stop,
Qt::Key_Refresh,
Qt::Key_VolumeDown,
Qt::Key_VolumeMute,
Qt::Key_VolumeUp,
Qt::Key_MediaPlay,
Qt::Key_MediaStop,
Qt::Key_MediaPrevious,
Qt::Key_MediaNext,
Qt::Key_HomePage,
Qt::Key_Favorites,
Qt::Key_Search,
Qt::Key_Standby,
Qt::Key_LaunchMail,
Qt::Key_LaunchMedia,
Qt::Key_Launch0,
Qt::Key_Launch1,
Qt::Key_Select,
};
QString getTemporaryFilename()
{
QTemporaryFile temp_file;
temp_file.open();
return temp_file.fileName();
}
}
class KeySequenceLoadSaveTestFixture :
public ::testing::TestWithParam<std::tr1::tuple<Qt::Key, QSettings::Format>> {};
TEST_P(KeySequenceLoadSaveTestFixture, SupportsSpecialSymbols)
{
int key = std::tr1::get<0>(GetParam());
QSettings::Format format = std::tr1::get<1>(GetParam());
auto filename = getTemporaryFilename();
{
QSettings settings(filename, format);
KeySequence sequence;
sequence.appendKey(key, 0);
sequence.appendKey(key, 0);
settings.beginGroup("test");
sequence.saveSettings(settings);
settings.endGroup();
}
{
QSettings settings(filename, format);
KeySequence sequence;
settings.beginGroup("test");
sequence.loadSettings(settings);
settings.endGroup();
const auto& data = sequence.sequence();
ASSERT_EQ(data.size(), 2);
ASSERT_EQ(data[0], key);
ASSERT_EQ(data[1], key);
}
QFile::remove(filename);
}
INSTANTIATE_TEST_CASE_P(
KeySequenceLoadSaveTests,
KeySequenceLoadSaveTestFixture,
::testing::Combine(::testing::ValuesIn(s_key_sequence_test_keys),
::testing::Values(QSettings::NativeFormat, QSettings::IniFormat)));

23
src/gui/test/main.cpp Normal file
View File

@ -0,0 +1,23 @@
/* barrier -- mouse and keyboard sharing utility
Copyright (C) 2021 Povilas Kanapickas <povilas@radix.lt>
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 LICENSE 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 <gtest/gtest.h>
int main(int argc, char **argv)
{
testing::InitGoogleTest(&argc, argv);
return (RUN_ALL_TESTS() == 1) ? 1 : 0;
}