mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-09 15:20:56 -06:00
Tests: Add CatchShow helper for CMake GUI tests
This commit is contained in:
@@ -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
|
||||
|
||||
25
Tests/CMakeGUI/CatchShow.cxx
Normal file
25
Tests/CMakeGUI/CatchShow.cxx
Normal 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;
|
||||
}
|
||||
41
Tests/CMakeGUI/CatchShow.h
Normal file
41
Tests/CMakeGUI/CatchShow.h
Normal 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);
|
||||
}
|
||||
};
|
||||
}
|
||||
49
Tests/CMakeGUI/CatchShowTest.cxx
Normal file
49
Tests/CMakeGUI/CatchShowTest.cxx
Normal 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)
|
||||
15
Tests/CMakeGUI/CatchShowTest.h
Normal file
15
Tests/CMakeGUI/CatchShowTest.h
Normal 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();
|
||||
};
|
||||
Reference in New Issue
Block a user