Tests: Add CatchShow helper for CMake GUI tests

This commit is contained in:
Kyle Edwards
2020-09-25 14:58:44 -04:00
parent 1b03ac7da7
commit 7cd95d9996
5 changed files with 149 additions and 2 deletions

View File

@@ -8,12 +8,22 @@ include_directories(
${CMake_BINARY_DIR}/Source/QtDialog
)
set(MOC_SRCS)
qt5_wrap_cpp(MOC_SRCS
CatchShow.h
)
add_library(CMakeGUITestLib STATIC ${MOC_SRCS}
CatchShow.cxx
CatchShow.h
)
target_link_libraries(CMakeGUITestLib Qt5::Core Qt5::Gui Qt5::Widgets)
set(MOC_SRCS)
qt5_wrap_cpp(MOC_SRCS
CMakeGUITest.h
)
add_executable(CMakeGUITest CMakeGUITest.cxx ${MOC_SRCS})
target_link_libraries(CMakeGUITest CMakeGUIMainLib Qt5::Core Qt5::Test Qt5::Widgets)
target_link_libraries(CMakeGUITest CMakeGUIMainLib CMakeGUITestLib Qt5::Core Qt5::Test Qt5::Widgets)
target_compile_definitions(CMakeGUITest PRIVATE
"CMakeGUITest_SOURCE_DIR=\"${CMAKE_CURRENT_SOURCE_DIR}\""
"CMakeGUITest_BINARY_DIR=\"${CMAKE_CURRENT_BINARY_DIR}\""
@@ -35,11 +45,18 @@ function(add_cmake_gui_lib_test name)
${_t_MOC_SOURCES}
)
add_executable(${name} ${_t_SOURCES} ${MOC_SRCS})
target_link_libraries(${name} CMakeGUILib Qt5::Core Qt5::Test Qt5::Widgets)
target_link_libraries(${name} CMakeGUILib CMakeGUITestLib Qt5::Core Qt5::Test Qt5::Widgets)
add_test(NAME "CMakeGUILib.${name}" COMMAND ${name})
endfunction()
add_cmake_gui_lib_test(CatchShow
SOURCES
CatchShowTest.cxx
CatchShowTest.h
MOC_SOURCES
CatchShowTest.h
)
add_cmake_gui_lib_test(QCMakeCacheModel
SOURCES
QCMakeCacheModelTest.cxx

View File

@@ -0,0 +1,25 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
#include "CatchShow.h"
#include <QCoreApplication>
CatchShow::CatchShow(QObject* parent)
: QObject(parent)
{
QCoreApplication::instance()->installEventFilter(this);
}
bool CatchShow::eventFilter(QObject* obj, QEvent* event)
{
if (this->m_callback && event->type() == QEvent::Show) {
this->m_callback(obj);
}
return this->QObject::eventFilter(obj, event);
}
int CatchShow::count() const
{
return this->m_count;
}

View File

@@ -0,0 +1,41 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
#pragma once
#include <functional>
#include <memory>
#include <QObject>
#include <QWidget>
class CatchShow : public QObject
{
Q_OBJECT
public:
CatchShow(QObject* parent = nullptr);
template <typename T, typename F>
void setCallback(F&& func);
bool eventFilter(QObject* obj, QEvent* event) override;
int count() const;
private:
std::function<void(QObject* obj)> m_callback;
int m_count = 0;
};
template <typename T, typename F>
void CatchShow::setCallback(F&& func)
{
this->m_callback = [this, func](QObject* obj) {
auto* d = qobject_cast<T*>(obj);
if (d) {
QMetaObject::invokeMethod(obj,
[this, func, d]() {
++this->m_count;
func(d);
},
Qt::QueuedConnection);
}
};
}

View File

@@ -0,0 +1,49 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
#include "CatchShowTest.h"
#include <QMessageBox>
#include <QtTest>
#include "CatchShow.h"
CatchShowTest::CatchShowTest(QObject* parent)
: QObject(parent)
{
}
void CatchShowTest::catchShow()
{
bool have = false;
CatchShow catcher;
catcher.setCallback<QMessageBox>([&have](QMessageBox* box) {
have = true;
box->accept();
});
QCOMPARE(catcher.count(), 0);
QCOMPARE(have, false);
{
QDialog dialog;
dialog.show();
QCOMPARE(catcher.count(), 0);
QCOMPARE(have, false);
}
{
have = false;
QMessageBox::critical(nullptr, "Error", "This is an error");
QCOMPARE(catcher.count(), 1);
QCOMPARE(have, true);
}
{
have = false;
QMessageBox::information(nullptr, "Info", "This is information");
QCOMPARE(catcher.count(), 2);
QCOMPARE(have, true);
}
}
QTEST_MAIN(CatchShowTest)

View File

@@ -0,0 +1,15 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
#pragma once
#include <QObject>
class CatchShowTest : public QObject
{
Q_OBJECT
public:
CatchShowTest(QObject* parent = nullptr);
private slots:
void catchShow();
};