From 6b317359ba90fcc19ccbc52e412e87a6e16bbe80 Mon Sep 17 00:00:00 2001 From: Povilas Kanapickas Date: Thu, 7 Jan 2021 23:43:48 +0200 Subject: [PATCH 1/7] gui: List all source files explicitly for the lupdate tool This will allow us to remove the last dependency on gui.pro --- src/gui/lang.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/lang.cmd b/src/gui/lang.cmd index 44185934..fbab95cd 100644 --- a/src/gui/lang.cmd +++ b/src/gui/lang.cmd @@ -1 +1 @@ -lupdate -noobsolete gui.pro -ts gui.ts \ No newline at end of file +lupdate -noobsolete src/* -ts gui.ts From 1d5fcfa3af7cbfb6a466faea068055461b972b8e Mon Sep 17 00:00:00 2001 From: Povilas Kanapickas Date: Thu, 7 Jan 2021 23:43:49 +0200 Subject: [PATCH 2/7] gui: Remove qmake project --- src/gui/gui.pro | 162 ------------------------------------------------ 1 file changed, 162 deletions(-) delete mode 100644 src/gui/gui.pro diff --git a/src/gui/gui.pro b/src/gui/gui.pro deleted file mode 100644 index 14a2407f..00000000 --- a/src/gui/gui.pro +++ /dev/null @@ -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 From 01b97d0c2a99dd4c1f6835cd85007b124db47d7b Mon Sep 17 00:00:00 2001 From: Povilas Kanapickas Date: Thu, 7 Jan 2021 23:43:50 +0200 Subject: [PATCH 3/7] gui: Explicitly set the lists of source files --- src/gui/CMakeLists.txt | 104 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 102 insertions(+), 2 deletions(-) diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 428bde8c..8c725f3d 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -6,8 +6,107 @@ set (CMAKE_AUTORCC ON) set (CMAKE_AUTOUIC ON) set (CMAKE_INCLUDE_CURRENT_DIR ON) -file (GLOB GUI_SOURCE_FILES src/*.cpp src/*.h) -file (GLOB GUI_UI_FILES src/*.ui) +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/KeySequence.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/KeySequence.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) set (GUI_RC_FILES res/win/Barrier.rc) @@ -15,6 +114,7 @@ endif() add_executable (barrier WIN32 ${GUI_SOURCE_FILES} + ${GUI_HEADER_FILES} ${GUI_UI_FILES} ${GUI_RC_FILES} res/Barrier.qrc From acc54de922939b0f2a2659966f07b6385a9bf598 Mon Sep 17 00:00:00 2001 From: Povilas Kanapickas Date: Thu, 7 Jan 2021 23:43:51 +0200 Subject: [PATCH 4/7] src: Extract test CMake setup to separate file --- src/test/CMakeLists.txt => cmake/gtest.cmake | 15 ++++++--------- src/CMakeLists.txt | 5 ++++- 2 files changed, 10 insertions(+), 10 deletions(-) rename src/test/CMakeLists.txt => cmake/gtest.cmake (80%) diff --git a/src/test/CMakeLists.txt b/cmake/gtest.cmake similarity index 80% rename from src/test/CMakeLists.txt rename to cmake/gtest.cmake index e1b1ecc1..e83491c0 100644 --- a/src/test/CMakeLists.txt +++ b/cmake/gtest.cmake @@ -24,14 +24,14 @@ if (BARRIER_USE_EXTERNAL_GTEST) ) else() include_directories( - ../../ext/gtest - ../../ext/gtest/include - ../../ext/gmock - ../../ext/gmock/include + ../ext/gtest + ../ext/gtest/include + ../ext/gmock + ../ext/gmock/include ) - add_library(gtest STATIC ../../ext/gtest/src/gtest-all.cc) - add_library(gmock STATIC ../../ext/gmock/src/gmock-all.cc) + add_library(gtest STATIC ../ext/gtest/src/gtest-all.cc) + add_library(gmock STATIC ../ext/gmock/src/gmock-all.cc) set(GTEST_LIBRARIES gtest) set(GMOCK_LIBRARIES gmock) @@ -42,6 +42,3 @@ else() set_target_properties(gmock PROPERTIES COMPILE_FLAGS "-w") endif() endif() - -add_subdirectory(integtests) -add_subdirectory(unittests) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 37c698b2..cc44fb25 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -20,8 +20,11 @@ include_directories (${CMAKE_CURRENT_BINARY_DIR}/lib) add_subdirectory(lib) add_subdirectory(cmd) +include(../cmake/gtest.cmake) + if (BARRIER_BUILD_TESTS) - add_subdirectory(test) + add_subdirectory(test/integtests) + add_subdirectory(test/unittests) endif() if (BARRIER_BUILD_GUI) From 3f387bdad0ed843486d97b8b94da6fcc13021171 Mon Sep 17 00:00:00 2001 From: Povilas Kanapickas Date: Thu, 7 Jan 2021 23:43:52 +0200 Subject: [PATCH 5/7] gui: Fix incorrect parameter order in KeySequence::appendKey() --- src/gui/src/KeySequence.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/src/KeySequence.h b/src/gui/src/KeySequence.h index 42e124e4..73e81bac 100644 --- a/src/gui/src/KeySequence.h +++ b/src/gui/src/KeySequence.h @@ -32,7 +32,7 @@ class KeySequence public: QString toString() const; - bool appendKey(int modifiers, int key); + bool appendKey(int key, int modifiers); bool appendMouseButton(int button); bool isMouseButton() const; bool valid() const { return m_IsValid; } From 1c434df87a1da74869e27ea3f7e85e545f50f981 Mon Sep 17 00:00:00 2001 From: Povilas Kanapickas Date: Thu, 7 Jan 2021 23:43:53 +0200 Subject: [PATCH 6/7] gui: Remove unnecessary accessor to private member in KeySequence --- src/gui/src/KeySequence.cpp | 8 ++++---- src/gui/src/KeySequence.h | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/gui/src/KeySequence.cpp b/src/gui/src/KeySequence.cpp index 2d7f9b5a..a94aac28 100644 --- a/src/gui/src/KeySequence.cpp +++ b/src/gui/src/KeySequence.cpp @@ -152,12 +152,12 @@ bool KeySequence::appendKey(int key, int modifiers) void KeySequence::loadSettings(QSettings& settings) { - sequence().clear(); + m_Sequence.clear(); int num = settings.beginReadArray("keys"); for (int i = 0; i < num; i++) { settings.setArrayIndex(i); - sequence().append(settings.value("key", 0).toInt()); + m_Sequence.append(settings.value("key", 0).toInt()); } settings.endArray(); @@ -168,10 +168,10 @@ void KeySequence::loadSettings(QSettings& settings) void KeySequence::saveSettings(QSettings& settings) const { settings.beginWriteArray("keys"); - for (int i = 0; i < sequence().size(); i++) + for (int i = 0; i < m_Sequence.size(); i++) { settings.setArrayIndex(i); - settings.setValue("key", sequence()[i]); + settings.setValue("key", m_Sequence[i]); } settings.endArray(); } diff --git a/src/gui/src/KeySequence.h b/src/gui/src/KeySequence.h index 73e81bac..9c73029a 100644 --- a/src/gui/src/KeySequence.h +++ b/src/gui/src/KeySequence.h @@ -44,7 +44,6 @@ class KeySequence private: void setValid(bool b) { m_IsValid = b; } void setModifiers(int i) { m_Modifiers = i; } - QList& sequence() { return m_Sequence; } private: QList m_Sequence; From 88c0c030f8e4cc8583e7012fd32e5ed08dfc505f Mon Sep 17 00:00:00 2001 From: Povilas Kanapickas Date: Thu, 7 Jan 2021 23:43:54 +0200 Subject: [PATCH 7/7] gui: Add tests for KeySequence serialization --- CMakeLists.txt | 3 + src/gui/CMakeLists.txt | 31 +++++++- src/gui/test/KeySequenceTests.cpp | 126 ++++++++++++++++++++++++++++++ src/gui/test/main.cpp | 23 ++++++ 4 files changed, 181 insertions(+), 2 deletions(-) create mode 100644 src/gui/test/KeySequenceTests.cpp create mode 100644 src/gui/test/main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 49f33471..c56b30be 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -430,4 +430,7 @@ endif() else() message (STATUS "NOT configuring the installer") endif() + +enable_testing() + add_subdirectory (src) diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 8c725f3d..50920945 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -6,6 +6,15 @@ set (CMAKE_AUTORCC ON) set (CMAKE_AUTOUIC ON) set (CMAKE_INCLUDE_CURRENT_DIR ON) +# files that are used both in tests and the app +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 @@ -23,7 +32,6 @@ set(GUI_SOURCE_FILES src/IpcClient.cpp src/Ipc.cpp src/IpcReader.cpp - src/KeySequence.cpp src/KeySequenceWidget.cpp src/LogWindow.cpp src/main.cpp @@ -67,7 +75,6 @@ set(GUI_HEADER_FILES src/IpcClient.h src/Ipc.h src/IpcReader.h - src/KeySequence.h src/KeySequenceWidget.h src/LogWindow.h src/MainWindow.h @@ -113,6 +120,8 @@ if (WIN32) endif() add_executable (barrier WIN32 + ${GUI_COMMON_SOURCE_FILES} + ${GUI_COMMON_HEADER_FILES} ${GUI_SOURCE_FILES} ${GUI_HEADER_FILES} ${GUI_UI_FILES} @@ -151,3 +160,21 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux" OR ${CMAKE_SYSTEM_NAME} MATCHES "BSD") install (TARGETS barrier DESTINATION bin) 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() diff --git a/src/gui/test/KeySequenceTests.cpp b/src/gui/test/KeySequenceTests.cpp new file mode 100644 index 00000000..669d8674 --- /dev/null +++ b/src/gui/test/KeySequenceTests.cpp @@ -0,0 +1,126 @@ +/* barrier -- mouse and keyboard sharing utility + Copyright (C) 2021 Povilas Kanapickas + + 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 . +*/ + +#include "../src/KeySequence.h" +#include +#include + +#include +#include +#include + +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> {}; + +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))); diff --git a/src/gui/test/main.cpp b/src/gui/test/main.cpp new file mode 100644 index 00000000..b57dd767 --- /dev/null +++ b/src/gui/test/main.cpp @@ -0,0 +1,23 @@ +/* barrier -- mouse and keyboard sharing utility + Copyright (C) 2021 Povilas Kanapickas + + 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 . +*/ + +#include + +int main(int argc, char **argv) +{ + testing::InitGoogleTest(&argc, argv); + return (RUN_ALL_TESTS() == 1) ? 1 : 0; +}