summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGatis Paeglis <gatis.paeglis@qt.io>2018-02-28 11:39:21 +0100
committerGatis Paeglis <gatis.paeglis@qt.io>2018-03-01 19:41:10 +0000
commitb3e91b66b9175c1c3ff5f73f3ac231f74f9bf932 (patch)
tree7b59a95efa8c1cf84c5615490c1471bd032f210e /src
parent635b5115c4d3f18ed5a9a924444232520eb6bbe5 (diff)
qtestlib: fix support for pressing multiple mouse buttons
After a37785ec7638e7485112b87dd7e767881fecc114 went in, it become apparent that multi mouse button state handling in qtestlib is non-existent, for details see QTBUG-64030 and QTBUG-63786. What happened behind the scenes often was not what one would expect based on the provided QTest::mouse* input sequence - events went missing, incorrect events were generated, each subsequent test function started with a state set from the function that run earlier. It is easy to see how a minor change in one test could easily affect outcome of other tests. With a37785ec7638e7485112b87dd7e767881fecc114, Qt platform plugins are now responsible for sending explicit mouse button type and state information; qtestlib should take full responsibility now as well. But using the new API from a37785ec7 alone in qtestlib is not sufficient. We need to reset mouse state between each new test function run (we do this at function scope as that fits with the current qtestlib API user expectations). This patch implements the necessary reseting logic. Updated tst_qwindow.cpp::generatedMouseMove() to use QTest::mouse* APIs. That test requires pressing multiple buttons, it was not possible with QTest::mouse* APIs before this patch. Added an auto test for multiple mouse button pressing/release in tests/auto/testlib/selftests/mouse/. And few other tests which are currently QSKIP-ed, but should be considered when re-designing qtestlib APIs. Task-number: QTBUG-64030 Change-Id: I39fdcbc73a467a7463ce2aed622bf22484095635 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/testlib/qtestcase.cpp6
-rw-r--r--src/testlib/qtestmouse.h26
2 files changed, 24 insertions, 8 deletions
diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp
index 497470464f..7e9c03dbd4 100644
--- a/src/testlib/qtestcase.cpp
+++ b/src/testlib/qtestcase.cpp
@@ -268,6 +268,11 @@ static bool isValidSlot(const QMetaMethod &sl)
|| name == "init" || name == "cleanup");
}
+namespace QTestPrivate
+{
+ Q_TESTLIB_EXPORT Qt::MouseButtons qtestMouseButtons = Qt::NoButton;
+}
+
namespace QTest
{
class WatchDog;
@@ -1074,6 +1079,7 @@ bool TestMethods::invokeTest(int index, const char *data, WatchDog *watchDog) co
QTestDataSetter s(curDataIndex >= dataCount ? static_cast<QTestData *>(0)
: table.testData(curDataIndex));
+ QTestPrivate::qtestMouseButtons = Qt::NoButton;
if (watchDog)
watchDog->beginTest();
invokeTestOnData(index);
diff --git a/src/testlib/qtestmouse.h b/src/testlib/qtestmouse.h
index fa524fd8ca..e2835828a1 100644
--- a/src/testlib/qtestmouse.h
+++ b/src/testlib/qtestmouse.h
@@ -68,11 +68,16 @@ Q_GUI_EXPORT void qt_handleMouseEvent(QWindow *window, const QPointF &local, con
Qt::MouseButtons state, Qt::MouseButton button,
QEvent::Type type, Qt::KeyboardModifiers mods, int timestamp);
+namespace QTestPrivate
+{
+ extern Q_TESTLIB_EXPORT Qt::MouseButtons qtestMouseButtons;
+}
+
namespace QTest
{
enum MouseAction { MousePress, MouseRelease, MouseClick, MouseDClick, MouseMove };
- extern Q_TESTLIB_EXPORT Qt::MouseButton lastMouseButton;
+ extern Q_TESTLIB_EXPORT Qt::MouseButton lastMouseButton; // ### unsued
extern Q_TESTLIB_EXPORT int lastMouseTimestamp;
// This value is used to emulate timestamps to avoid creating double clicks by mistake.
@@ -117,30 +122,35 @@ namespace QTest
QPointF global = window->mapToGlobal(pos);
QPointer<QWindow> w(window);
+ using namespace QTestPrivate;
switch (action)
{
case MouseDClick:
- qt_handleMouseEvent(w, pos, global, button, button, QEvent::MouseButtonPress,
+ qtestMouseButtons.setFlag(button, true);
+ qt_handleMouseEvent(w, pos, global, qtestMouseButtons, button, QEvent::MouseButtonPress,
stateKey, ++lastMouseTimestamp);
- qt_handleMouseEvent(w, pos, global, Qt::NoButton, button, QEvent::MouseButtonRelease,
+ qtestMouseButtons.setFlag(button, false);
+ qt_handleMouseEvent(w, pos, global, qtestMouseButtons, button, QEvent::MouseButtonRelease,
stateKey, ++lastMouseTimestamp);
Q_FALLTHROUGH();
case MousePress:
case MouseClick:
- qt_handleMouseEvent(w, pos, global, button, button, QEvent::MouseButtonPress,
+ qtestMouseButtons.setFlag(button, true);
+ qt_handleMouseEvent(w, pos, global, qtestMouseButtons, button, QEvent::MouseButtonPress,
stateKey, ++lastMouseTimestamp);
- lastMouseButton = button;
+ lastMouseButton = button; // ### unsued
if (action == MousePress)
break;
Q_FALLTHROUGH();
case MouseRelease:
- qt_handleMouseEvent(w, pos, global, Qt::NoButton, button, QEvent::MouseButtonRelease,
+ qtestMouseButtons.setFlag(button, false);
+ qt_handleMouseEvent(w, pos, global, qtestMouseButtons, button, QEvent::MouseButtonRelease,
stateKey, ++lastMouseTimestamp);
lastMouseTimestamp += mouseDoubleClickInterval; // avoid double clicks being generated
- lastMouseButton = Qt::NoButton;
+ lastMouseButton = Qt::NoButton; // ### unsued
break;
case MouseMove:
- qt_handleMouseEvent(w, pos, global, lastMouseButton, Qt::NoButton, QEvent::MouseMove,
+ qt_handleMouseEvent(w, pos, global, qtestMouseButtons, Qt::NoButton, QEvent::MouseMove,
stateKey, ++lastMouseTimestamp);
break;
default: