summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.p.agocs@nokia.com>2012-03-24 10:48:12 +0200
committerQt by Nokia <qt-info@nokia.com>2012-03-26 11:41:07 +0200
commit083052933fefacbc91930bc2cb6505ecf592adaa (patch)
treeff68f32b768d95f4654cdcfe567c8304a5433992 /tests
parent8dac4d367fb53abc95b1054a7b5baa49c9af7a75 (diff)
Test mouse events more thoroughly in QWindow autotest
Apparently there are still issues here and there (e.g. in declarative) with properly recognizing more complex event sequences (like triple clicks). The behavior of qtbase is correct but we need a test case that makes sure the functionality will not regress. Change-Id: I08c558fcfdde0dd06e194b4f0affc6f6896573bf Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/gui/kernel/qwindow/tst_qwindow.cpp123
1 files changed, 118 insertions, 5 deletions
diff --git a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
index f4556f7e32..dc17ec653c 100644
--- a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
+++ b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
@@ -44,6 +44,7 @@
#include <QtTest/QtTest>
#include <QEvent>
+#include <QStyleHints>
// For QSignalSpy slot connections.
Q_DECLARE_METATYPE(Qt::ScreenOrientation)
@@ -65,6 +66,7 @@ private slots:
void orientation();
void close();
void activateAndClose();
+ void mouseEventSequence();
void initTestCase()
{
@@ -258,15 +260,20 @@ public:
if (ignoreMouse) {
event->ignore();
} else {
+ ++mousePressedCount;
+ mouseSequenceSignature += 'p';
mousePressButton = event->button();
mousePressScreenPos = event->screenPos();
}
}
void mouseReleaseEvent(QMouseEvent *event) {
- if (ignoreMouse)
+ if (ignoreMouse) {
event->ignore();
- else
+ } else {
+ ++mouseReleasedCount;
+ mouseSequenceSignature += 'r';
mouseReleaseButton = event->button();
+ }
}
void mouseMoveEvent(QMouseEvent *event) {
if (ignoreMouse) {
@@ -276,6 +283,14 @@ public:
mouseMoveScreenPos = event->screenPos();
}
}
+ void mouseDoubleClickEvent(QMouseEvent *event) {
+ if (ignoreMouse) {
+ event->ignore();
+ } else {
+ ++mouseDoubleClickedCount;
+ mouseSequenceSignature += 'd';
+ }
+ }
void touchEvent(QTouchEvent *event) {
if (ignoreTouch) {
event->ignore();
@@ -299,16 +314,23 @@ public:
}
}
}
+ void resetCounters() {
+ mousePressedCount = mouseReleasedCount = mouseDoubleClickedCount = 0;
+ mouseSequenceSignature = QString();
+ touchPressedCount = touchReleasedCount = touchMovedCount = 0;
+ }
InputTestWindow() {
keyPressCode = keyReleaseCode = 0;
- mousePressButton = mouseReleaseButton = 0;
- touchPressedCount = touchReleasedCount = touchMovedCount = 0;
+ mousePressButton = mouseReleaseButton = mouseMoveButton = 0;
ignoreMouse = ignoreTouch = false;
+ resetCounters();
}
int keyPressCode, keyReleaseCode;
int mousePressButton, mouseReleaseButton, mouseMoveButton;
+ int mousePressedCount, mouseReleasedCount, mouseDoubleClickedCount;
+ QString mouseSequenceSignature;
QPointF mousePressScreenPos, mouseMoveScreenPos;
int touchPressedCount, touchReleasedCount, touchMovedCount;
QEvent::Type touchEventType;
@@ -645,5 +667,96 @@ void tst_QWindow::activateAndClose()
}
}
+void tst_QWindow::mouseEventSequence()
+{
+ int doubleClickInterval = qGuiApp->styleHints()->mouseDoubleClickInterval();
+
+ InputTestWindow window;
+ window.setGeometry(80, 80, 40, 40);
+ window.show();
+ QTest::qWaitForWindowShown(&window);
+
+ ulong timestamp = 0;
+ QPointF local(12, 34);
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
+ QCoreApplication::processEvents();
+ QCOMPARE(window.mousePressedCount, 1);
+ QCOMPARE(window.mouseReleasedCount, 1);
+ QCOMPARE(window.mouseDoubleClickedCount, 0);
+ QCOMPARE(window.mouseSequenceSignature, QLatin1String("pr"));
+
+ window.resetCounters();
+ timestamp += doubleClickInterval;
+
+ // A double click must result in press, release, press, doubleclick, release.
+ // Check that no unexpected event suppression occurs and that the order is correct.
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
+ QCoreApplication::processEvents();
+ QCOMPARE(window.mousePressedCount, 2);
+ QCOMPARE(window.mouseReleasedCount, 2);
+ QCOMPARE(window.mouseDoubleClickedCount, 1);
+ QCOMPARE(window.mouseSequenceSignature, QLatin1String("prpdr"));
+
+ timestamp += doubleClickInterval;
+ window.resetCounters();
+
+ // Triple click = double + single click
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
+ QCoreApplication::processEvents();
+ QCOMPARE(window.mousePressedCount, 3);
+ QCOMPARE(window.mouseReleasedCount, 3);
+ QCOMPARE(window.mouseDoubleClickedCount, 1);
+ QCOMPARE(window.mouseSequenceSignature, QLatin1String("prpdrpr"));
+
+ timestamp += doubleClickInterval;
+ window.resetCounters();
+
+ // Two double clicks.
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
+ QCoreApplication::processEvents();
+ QCOMPARE(window.mousePressedCount, 4);
+ QCOMPARE(window.mouseReleasedCount, 4);
+ QCOMPARE(window.mouseDoubleClickedCount, 2);
+ QCOMPARE(window.mouseSequenceSignature, QLatin1String("prpdrprpdr"));
+
+ timestamp += doubleClickInterval;
+ window.resetCounters();
+
+ // Four clicks, none of which qualifies as a double click.
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
+ timestamp += doubleClickInterval;
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
+ timestamp += doubleClickInterval;
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
+ timestamp += doubleClickInterval;
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::LeftButton);
+ QWindowSystemInterface::handleMouseEvent(&window, timestamp++, local, local, Qt::NoButton);
+ timestamp += doubleClickInterval;
+ QCoreApplication::processEvents();
+ QCOMPARE(window.mousePressedCount, 4);
+ QCOMPARE(window.mouseReleasedCount, 4);
+ QCOMPARE(window.mouseDoubleClickedCount, 0);
+ QCOMPARE(window.mouseSequenceSignature, QLatin1String("prprprpr"));
+}
+
#include <tst_qwindow.moc>
-QTEST_MAIN(tst_QWindow);
+QTEST_MAIN(tst_QWindow)