diff options
-rw-r--r-- | src/testlib/qtestmouse.h | 43 | ||||
-rw-r--r-- | tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp | 6 |
2 files changed, 22 insertions, 27 deletions
diff --git a/src/testlib/qtestmouse.h b/src/testlib/qtestmouse.h index 865b967b34..3e43434a50 100644 --- a/src/testlib/qtestmouse.h +++ b/src/testlib/qtestmouse.h @@ -84,13 +84,16 @@ namespace QTest // to depend on platform themes. static const int mouseDoubleClickInterval = 500; -/*! \internal - - This function mocks all mouse events by bypassing the windowing system. The - result is that the mouse events do not come from the system via Qt platform - plugins, but are created on the spot and immediately available for processing - by Qt. -*/ + /*! \internal + This function creates a QPA mouse event of type specified by \a action + and calls QWindowSystemInterface::handleMouseEvent(), simulating the + windowing system and bypassing the platform plugin. \a delay is the + amount of time to be added to the simulated clock so that + QInputEvent::timestamp() will be greater than that of the previous + event. We expect all event-handling code to rely on the event + timestamps, not the system clock; therefore tests can be run faster + than real-time. + */ static void mouseEvent(MouseAction action, QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey, QPoint pos, int delay=-1) { @@ -106,10 +109,7 @@ namespace QTest if (delay == -1 || delay < defaultMouseDelay()) delay = defaultMouseDelay(); - if (delay > 0) { - QTest::qWait(delay); - lastMouseTimestamp += delay; - } + lastMouseTimestamp += qMax(1, delay); if (pos.isNull()) pos = QPoint(window->width() / 2, window->height() / 2); @@ -127,28 +127,28 @@ namespace QTest case MouseDClick: qtestMouseButtons.setFlag(button, true); qt_handleMouseEvent(w, pos, global, qtestMouseButtons, button, QEvent::MouseButtonPress, - stateKey, ++lastMouseTimestamp); + stateKey, lastMouseTimestamp); qtestMouseButtons.setFlag(button, false); qt_handleMouseEvent(w, pos, global, qtestMouseButtons, button, QEvent::MouseButtonRelease, - stateKey, ++lastMouseTimestamp); + stateKey, lastMouseTimestamp); Q_FALLTHROUGH(); case MousePress: case MouseClick: qtestMouseButtons.setFlag(button, true); qt_handleMouseEvent(w, pos, global, qtestMouseButtons, button, QEvent::MouseButtonPress, - stateKey, ++lastMouseTimestamp); + stateKey, lastMouseTimestamp); if (action == MousePress) break; Q_FALLTHROUGH(); case MouseRelease: qtestMouseButtons.setFlag(button, false); qt_handleMouseEvent(w, pos, global, qtestMouseButtons, button, QEvent::MouseButtonRelease, - stateKey, ++lastMouseTimestamp); + stateKey, lastMouseTimestamp); lastMouseTimestamp += mouseDoubleClickInterval; // avoid double clicks being generated break; case MouseMove: qt_handleMouseEvent(w, pos, global, qtestMouseButtons, Qt::NoButton, QEvent::MouseMove, - stateKey, ++lastMouseTimestamp); + stateKey, lastMouseTimestamp); break; default: QTEST_ASSERT(false); @@ -193,10 +193,7 @@ namespace QTest if (delay == -1 || delay < defaultMouseDelay()) delay = defaultMouseDelay(); - if (delay > 0) { - QTest::qWait(delay); - lastMouseTimestamp += delay; - } + lastMouseTimestamp += qMax(1, delay); if (action == MouseClick) { mouseEvent(MousePress, widget, button, stateKey, pos); @@ -226,17 +223,13 @@ namespace QTest break; case MouseMove: QCursor::setPos(widget->mapToGlobal(pos)); -#ifdef Q_OS_MAC - QTest::qWait(20); -#else qApp->processEvents(); -#endif return; default: QTEST_ASSERT(false); } QMouseEvent me(meType, pos, widget->mapToGlobal(pos), button, meButton, stateKey, QPointingDevice::primaryPointingDevice()); - me.setTimestamp(++lastMouseTimestamp); + me.setTimestamp(lastMouseTimestamp); if (action == MouseRelease) // avoid double clicks being generated lastMouseTimestamp += mouseDoubleClickInterval; diff --git a/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp b/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp index 32003f2124..9c3b1066a7 100644 --- a/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp +++ b/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp @@ -206,14 +206,16 @@ void tst_QToolButton::task176137_autoRepeatOfAction() QSignalSpy spy(&action,SIGNAL(triggered())); QTest::mousePress (toolButton, Qt::LeftButton); - QTest::mouseRelease (toolButton, Qt::LeftButton, {}, QPoint (), 2000); + QTest::qWait(2000); + QTest::mouseRelease (toolButton, Qt::LeftButton, {}, {}); QCOMPARE(spy.count(),1); // try again with auto repeat toolButton->setAutoRepeat (true); QSignalSpy repeatSpy(&action,SIGNAL(triggered())); // new spy QTest::mousePress (toolButton, Qt::LeftButton); - QTest::mouseRelease (toolButton, Qt::LeftButton, {}, QPoint (), 3000); + QTest::qWait(3000); + QTest::mouseRelease (toolButton, Qt::LeftButton, {}, {}); const qreal expected = (3000 - toolButton->autoRepeatDelay()) / toolButton->autoRepeatInterval() + 1; //we check that the difference is small (on some systems timers are not super accurate) qreal diff = (expected - repeatSpy.count()) / expected; |