summaryrefslogtreecommitdiffstats
path: root/Tests/CMakeGUI
diff options
context:
space:
mode:
authorKyle Edwards <kyle.edwards@kitware.com>2020-09-25 18:58:44 (GMT)
committerKyle Edwards <kyle.edwards@kitware.com>2020-09-28 13:46:35 (GMT)
commit7cd95d99965bf59e2ba8e5cb2835fb9d5d1b3abe (patch)
tree0b357ab71c21fa4bb521c42a2aed2cfb01e5853b /Tests/CMakeGUI
parent1b03ac7da76c05bfa60e5fcf95aa2bfdf64f27cf (diff)
downloadCMake-7cd95d99965bf59e2ba8e5cb2835fb9d5d1b3abe.zip
CMake-7cd95d99965bf59e2ba8e5cb2835fb9d5d1b3abe.tar.gz
CMake-7cd95d99965bf59e2ba8e5cb2835fb9d5d1b3abe.tar.bz2
Tests: Add CatchShow helper for CMake GUI tests
Diffstat (limited to 'Tests/CMakeGUI')
-rw-r--r--Tests/CMakeGUI/CMakeLists.txt21
-rw-r--r--Tests/CMakeGUI/CatchShow.cxx25
-rw-r--r--Tests/CMakeGUI/CatchShow.h41
-rw-r--r--Tests/CMakeGUI/CatchShowTest.cxx49
-rw-r--r--Tests/CMakeGUI/CatchShowTest.h15
5 files changed, 149 insertions, 2 deletions
diff --git a/Tests/CMakeGUI/CMakeLists.txt b/Tests/CMakeGUI/CMakeLists.txt
index 2a2ee1a..b94afe5 100644
--- a/Tests/CMakeGUI/CMakeLists.txt
+++ b/Tests/CMakeGUI/CMakeLists.txt
@@ -10,10 +10,20 @@ include_directories(
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
diff --git a/Tests/CMakeGUI/CatchShow.cxx b/Tests/CMakeGUI/CatchShow.cxx
new file mode 100644
index 0000000..aee2d9d
--- /dev/null
+++ b/Tests/CMakeGUI/CatchShow.cxx
@@ -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;
+}
diff --git a/Tests/CMakeGUI/CatchShow.h b/Tests/CMakeGUI/CatchShow.h
new file mode 100644
index 0000000..0254c15
--- /dev/null
+++ b/Tests/CMakeGUI/CatchShow.h
@@ -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);
+ }
+ };
+}
diff --git a/Tests/CMakeGUI/CatchShowTest.cxx b/Tests/CMakeGUI/CatchShowTest.cxx
new file mode 100644
index 0000000..acea8ea
--- /dev/null
+++ b/Tests/CMakeGUI/CatchShowTest.cxx
@@ -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)
diff --git a/Tests/CMakeGUI/CatchShowTest.h b/Tests/CMakeGUI/CatchShowTest.h
new file mode 100644
index 0000000..6da2163
--- /dev/null
+++ b/Tests/CMakeGUI/CatchShowTest.h
@@ -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();
+};