Test case for tapping on stacked mouse areas
authorDaniel d'Andrada <daniel.dandrada@canonical.com>
Wed, 19 Dec 2012 17:29:49 +0000 (15:29 -0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Wed, 9 Jan 2013 17:42:42 +0000 (18:42 +0100)
Shows bug where the bottom mouse area could get a double click event out
of a single tap.

Change-Id: I4907a1506db2b4ccc5299d698c6e05fd02db963c
Reviewed-by: Shawn Rutledge <shawn.rutledge@digia.com>

tests/auto/quick/touchmouse/data/twoMouseAreas.qml [new file with mode: 0644]
tests/auto/quick/touchmouse/tst_touchmouse.cpp

diff --git a/tests/auto/quick/touchmouse/data/twoMouseAreas.qml b/tests/auto/quick/touchmouse/data/twoMouseAreas.qml
new file mode 100644 (file)
index 0000000..a02a6a4
--- /dev/null
@@ -0,0 +1,33 @@
+import QtQuick 2.0
+
+Rectangle {
+    width: 320
+    height: 480
+    color: "#0c6d49"
+    objectName: "top rect"
+
+    Rectangle {
+        id: greyRectangle
+        objectName: "grey rect"
+        anchors {
+            left: parent.left
+            right: parent.right
+            top: parent.top
+        }
+        height: parent.height / 2
+        color: "grey"
+    }
+
+    MouseArea {
+        objectName: "rear mouseArea"
+        anchors.fill: parent
+    }
+
+    MouseArea {
+        objectName: "front mouseArea"
+        anchors.fill: greyRectangle
+        onPressed: {
+            mouse.accepted = false;
+        }
+    }
+}
index 1af70e3..fc4d0c4 100644 (file)
@@ -160,6 +160,8 @@ private slots:
     void flickableOnPinch();
     void mouseOnFlickableOnPinch();
 
+    void tapOnDismissiveTopMouseAreaClicksBottomOne();
+
 private:
     QQuickView *createView();
     QTouchDevice *device;
@@ -918,6 +920,53 @@ void tst_TouchMouse::mouseOnFlickableOnPinch()
     pinchSequence.release(0, p, window).commit();
 }
 
+/*
+   Regression test for the following use case:
+   You have two mouse areas, on on top of the other.
+   1 - You tap the top one.
+   2 - That top mouse area receives a mouse press event but doesn't accept it
+   Expected outcome:
+     3 - the bottom mouse area gets clicked (besides press and release mouse events)
+   Bogus outcome:
+     3 - the bottom mouse area gets double clicked.
+ */
+void tst_TouchMouse::tapOnDismissiveTopMouseAreaClicksBottomOne()
+{
+    QQuickView *window = createView();
+
+    window->setSource(testFileUrl("twoMouseAreas.qml"));
+    window->show();
+    window->requestActivate();
+    QVERIFY(QTest::qWaitForWindowExposed(window));
+    QVERIFY(window->rootObject() != 0);
+
+    QQuickMouseArea *bottomMouseArea =
+        window->rootObject()->findChild<QQuickMouseArea*>("rear mouseArea");
+
+    QSignalSpy bottomClickedSpy(bottomMouseArea, SIGNAL(clicked(QQuickMouseEvent*)));
+    QSignalSpy bottomDoubleClickedSpy(bottomMouseArea,
+                                      SIGNAL(doubleClicked(QQuickMouseEvent*)));
+
+    // tap the front mouse area (see qml file)
+    QPoint p1(20, 20);
+    QTest::touchEvent(window, device).press(0, p1, window);
+    QTest::qWait(1);
+    QTest::touchEvent(window, device).release(0, p1, window);
+
+    QCOMPARE(bottomClickedSpy.count(), 1);
+    QCOMPARE(bottomDoubleClickedSpy.count(), 0);
+    QTest::qWait(15);
+
+    QTest::touchEvent(window, device).press(0, p1, window);
+    QTest::qWait(1);
+    QTest::touchEvent(window, device).release(0, p1, window);
+
+    QCOMPARE(bottomClickedSpy.count(), 1);
+    QCOMPARE(bottomDoubleClickedSpy.count(), 1);
+
+    delete window;
+}
+
 QTEST_MAIN(tst_TouchMouse)
 
 #include "tst_touchmouse.moc"