diff --git a/gui/tests/CMakeLists.txt b/gui/tests/CMakeLists.txt index aed9389..3dc8e5a 100644 --- a/gui/tests/CMakeLists.txt +++ b/gui/tests/CMakeLists.txt @@ -1 +1,2 @@ -declare_test(simple_graph simple_graph simple_graph/main.cpp "sciqlopgui;TestUtils;Qt5::Test") +subdirs(GUITestUtils) +declare_test(simple_graph simple_graph simple_graph/main.cpp "sciqlopgui;TestUtils;GUITestUtils;Qt5::Test") diff --git a/gui/tests/GUITestUtils/CMakeLists.txt b/gui/tests/GUITestUtils/CMakeLists.txt new file mode 100644 index 0000000..9948619 --- /dev/null +++ b/gui/tests/GUITestUtils/CMakeLists.txt @@ -0,0 +1,10 @@ +FILE (GLOB_RECURSE GUITestUtilsSources + GUITestUtils.h + GUITestUtils.cpp +) + +add_library(GUITestUtils ${GUITestUtilsSources}) +target_link_libraries(GUITestUtils Qt5::Gui Qt5::Widgets Qt5::Test sciqlopgui) +target_include_directories(GUITestUtils PUBLIC + $/ +) diff --git a/gui/tests/GUITestUtils/GUITestUtils.cpp b/gui/tests/GUITestUtils/GUITestUtils.cpp new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/gui/tests/GUITestUtils/GUITestUtils.cpp diff --git a/gui/tests/GUITestUtils/GUITestUtils.h b/gui/tests/GUITestUtils/GUITestUtils.h new file mode 100644 index 0000000..fd2ed51 --- /dev/null +++ b/gui/tests/GUITestUtils/GUITestUtils.h @@ -0,0 +1,134 @@ +#ifndef GUITESTUTILS_H +#define GUITESTUTILS_H + +#include +#include +#include +#include +#include +#include +#include + +#include + +QPoint center(QWidget* widget) +{ + return QPoint{widget->width()/2,widget->height()/2}; +} + +HAS_METHOD(viewport) + +HAS_METHOD(topLevelItem) + +template +void mouseMove(T* widget, QPoint pos, Qt::MouseButton mouseModifier) +{ + QCursor::setPos(widget->mapToGlobal(pos)); + QMouseEvent event(QEvent::MouseMove, pos, Qt::NoButton, mouseModifier, Qt::NoModifier); + if constexpr(has_viewport) + { + qApp->sendEvent(widget->viewport(), &event); + } + else + { + qApp->sendEvent(widget, &event); + } + qApp->processEvents(); +} + + +template +void setMouseTracking(T* widget) +{ + if constexpr(has_viewport) + { + widget->viewport()->setMouseTracking(true); + } + else + { + widget->setMouseTracking(true); + } +} + +template <> +void setMouseTracking(QCustomPlot* widget) +{ + widget->setMouseTracking(true); +} + +template +auto getItem(T* widget, T2 itemIndex) +{ + if constexpr(has_topLevelItem) + { + return widget->topLevelItem(itemIndex); + } + else + { + return widget->item(itemIndex); + } +} + +#define SELECT_ITEM(widget, itemIndex, item)\ + auto item = getItem(widget, itemIndex);\ +{\ + auto itemCenterPos = widget->visualItemRect(item).center();\ + QTest::mouseClick(widget->viewport(), Qt::LeftButton, Qt::NoModifier, itemCenterPos);\ + QVERIFY(widget->selectedItems().size() > 0);\ + QVERIFY(widget->selectedItems().contains(item));\ + } + + +#define GET_CHILD_WIDGET_FOR_GUI_TESTS(parent, child, childType, childName)\ + childType* child = parent.findChild(childName); \ + QVERIFY(child!=Q_NULLPTR); \ + setMouseTracking(child); + +template +void dragnDropItem(T1* sourceWidget, T2* destWidget, T3* item, T4* destItem=Q_NULLPTR) +{ + auto itemCenterPos = sourceWidget->visualItemRect(item).center(); + if constexpr(has_viewport) + { + QTest::mousePress(sourceWidget->viewport(), Qt::LeftButton, Qt::NoModifier, itemCenterPos); + } + else + { + QTest::mousePress(sourceWidget, Qt::LeftButton, Qt::NoModifier, itemCenterPos); + } + mouseMove(sourceWidget,itemCenterPos, Qt::LeftButton); + itemCenterPos+=QPoint(0,-10); + QTimer::singleShot(100,[destWidget,destItem](){ + mouseMove(destWidget, destWidget->rect().center(),Qt::LeftButton); + mouseMove(destWidget, destWidget->rect().center()+QPoint(0,-10),Qt::LeftButton); + if constexpr(!std::is_same_v) + { + auto destItemCenterPos = destWidget->visualItemRect(destItem).center(); + QTest::mouseRelease(destWidget, Qt::LeftButton, Qt::NoModifier, destItemCenterPos); + } + else if constexpr(has_viewport) + { + QTest::mouseRelease(destWidget->viewport(), Qt::LeftButton); + } + else + { + QTest::mouseRelease(destWidget, Qt::LeftButton); + } + QTest::mouseRelease(destWidget->viewport(), Qt::LeftButton); + }); + mouseMove(sourceWidget,itemCenterPos,Qt::LeftButton); +} + +#define PREPARE_GUI_TEST(main_widget)\ + main_widget.setGeometry(QRect(QPoint(QApplication::desktop()->geometry().center() - QPoint(250, 250)),\ + QSize(500, 500)));\ + main_widget.show();\ + qApp->setActiveWindow(&main_widget);\ + QVERIFY(QTest::qWaitForWindowActive(&main_widget)) + +#define GET_CHILD_WIDGET_FOR_GUI_TESTS(parent, child, childType, childName)\ + childType* child = parent.findChild(childName); \ + QVERIFY(child!=Q_NULLPTR); \ + setMouseTracking(child); + +#endif diff --git a/gui/tests/simple_graph/main.cpp b/gui/tests/simple_graph/main.cpp index 9a01f44..cc7fd54 100644 --- a/gui/tests/simple_graph/main.cpp +++ b/gui/tests/simple_graph/main.cpp @@ -3,14 +3,16 @@ #include #include #include +#include +#include #include #include #include #include - +#include class A_SimpleGraph : public QObject { Q_OBJECT @@ -24,12 +26,22 @@ public: private slots: void scrolls_with_mouse_wheel() { - VisualizationGraphWidget w{Q_NULLPTR}; + VisualizationGraphWidget w; + PREPARE_GUI_TEST(w); auto provider = std::make_shared>(); auto range = DateTimeRange::fromDateTime(QDate(2018,8,7),QTime(14,00), - QDate(2018,8,7),QTime(16,00)); + QDate(2018,8,7),QTime(16,00)); auto var = static_cast(qApp)->variableController().createVariable("V1", {{"","scalar"}}, provider, range); + while(!static_cast(qApp)->variableController().isReady(var))QCoreApplication::processEvents(); w.addVariable(var, range); + GET_CHILD_WIDGET_FOR_GUI_TESTS(w,plot,QCustomPlot,"widget"); + auto cent = center(static_cast(plot)); + for(auto i=0;i<10;i++) + { + QTest::mousePress(plot, Qt::LeftButton, Qt::NoModifier, cent, 10); + QTest::mouseMove(plot, {cent.x()+100,cent.y()},10); + QTest::mouseRelease(plot,Qt::LeftButton); + } while(!static_cast(qApp)->variableController().isReady(var))QCoreApplication::processEvents(); } };