Browse Source

Tests: Add CatchShow helper for CMake GUI tests

Kyle Edwards 5 years ago
parent
commit
7cd95d9996

+ 19 - 2
Tests/CMakeGUI/CMakeLists.txt

@@ -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 - 0
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;
+}

+ 41 - 0
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);
+    }
+  };
+}

+ 49 - 0
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)

+ 15 - 0
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();
+};