#ifndef GUITESTUTILS_H #define GUITESTUTILS_H #include #include #include #include #include #include #include #include #include #include template QPoint center(T* widget) { return QPoint{widget->width()/2,widget->height()/2}; } HAS_METHOD(viewport) template static inline constexpr bool is_QWidgetOrDerived = std::is_base_of::value; template using viewport_type = decltype(std::declval().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) { if constexpr(is_QWidgetOrDerived>) { qApp->sendEvent(widget->viewport(), &event); } else { qApp->sendEvent(widget, &event); } } else { qApp->sendEvent(widget, &event); } qApp->processEvents(); } template void setMouseTracking(T* widget) { if constexpr(has_viewport) { if constexpr(is_QWidgetOrDerived>) { widget->viewport()->setMouseTracking(true); } else { widget->setMouseTracking(true); } } else { 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); } template void scroll_graph(T* w, int dx) { auto cent = center(w); QTest::mousePress(w, Qt::LeftButton, Qt::NoModifier, cent, 1); mouseMove(w, {cent.x() + dx, cent.y()}, Qt::LeftButton); QTest::mouseRelease(w, Qt::LeftButton); } ALIAS_TEMPLATE_FUNCTION(isReady, static_cast(qApp)->variableController().isReady) void waitForVar(std::shared_ptr var) { while (!isReady(var)) QCoreApplication::processEvents(); } template bool prepare_gui_test(T* w) { w->setGeometry(QRect(QPoint(QApplication::desktop()->geometry().center() - QPoint(250, 250)), QSize(500, 500))); w->show(); qApp->setActiveWindow(w); return QTest::qWaitForWindowActive(w); } #define GET_CHILD_WIDGET_FOR_GUI_TESTS(parent, child, childType, childName)\ childType* child = parent.findChild(childName); \ QVERIFY(child!=Q_NULLPTR); \ setMouseTracking(child); #endif