From d2857ba596f334daca665aacfa074f71fc8ecdb4 Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Thu, 21 Jun 2012 15:49:10 +1000 Subject: Add tests for clicking and dragging with right and middle buttons. Task-number: QTBUG-24461 Change-Id: I2c8b3455cb3aead5df7dfd85f65eb633a552b881 Reviewed-by: Martin Jones --- tests/auto/quick/qquickitem/tst_qquickitem.cpp | 63 ++++++++ .../auto/quick/qquickmousearea/data/clicktwice.qml | 1 + .../quick/qquickmousearea/data/doubleclick.qml | 1 + .../quick/qquickmousearea/tst_qquickmousearea.cpp | 178 ++++++++++++++++++--- 4 files changed, 222 insertions(+), 21 deletions(-) (limited to 'tests/auto/quick') diff --git a/tests/auto/quick/qquickitem/tst_qquickitem.cpp b/tests/auto/quick/qquickitem/tst_qquickitem.cpp index 47f9ff4fed..c1c8067b02 100644 --- a/tests/auto/quick/qquickitem/tst_qquickitem.cpp +++ b/tests/auto/quick/qquickitem/tst_qquickitem.cpp @@ -166,6 +166,8 @@ private slots: void paintOrder_data(); void paintOrder(); + void acceptedMouseButtons(); + private: enum PaintOrderOp { @@ -1665,6 +1667,67 @@ void tst_qquickitem::paintOrder() QCOMPARE(items, expected); } +void tst_qquickitem::acceptedMouseButtons() +{ + TestItem item; + QCOMPARE(item.acceptedMouseButtons(), Qt::MouseButtons(Qt::NoButton)); + + QQuickCanvas canvas; + item.setSize(QSizeF(200,100)); + item.setParentItem(canvas.rootItem()); + + QTest::mousePress(&canvas, Qt::LeftButton, 0, QPoint(50, 50)); + QTest::mouseRelease(&canvas, Qt::LeftButton, 0, QPoint(50, 50)); + QCOMPARE(item.pressCount, 0); + QCOMPARE(item.releaseCount, 0); + + QTest::mousePress(&canvas, Qt::RightButton, 0, QPoint(50, 50)); + QTest::mouseRelease(&canvas, Qt::RightButton, 0, QPoint(50, 50)); + QCOMPARE(item.pressCount, 0); + QCOMPARE(item.releaseCount, 0); + + QTest::mousePress(&canvas, Qt::MiddleButton, 0, QPoint(50, 50)); + QTest::mouseRelease(&canvas, Qt::MiddleButton, 0, QPoint(50, 50)); + QCOMPARE(item.pressCount, 0); + QCOMPARE(item.releaseCount, 0); + + item.setAcceptedMouseButtons(Qt::LeftButton); + QCOMPARE(item.acceptedMouseButtons(), Qt::MouseButtons(Qt::LeftButton)); + + QTest::mousePress(&canvas, Qt::LeftButton, 0, QPoint(50, 50)); + QTest::mouseRelease(&canvas, Qt::LeftButton, 0, QPoint(50, 50)); + QCOMPARE(item.pressCount, 1); + QCOMPARE(item.releaseCount, 1); + + QTest::mousePress(&canvas, Qt::RightButton, 0, QPoint(50, 50)); + QTest::mouseRelease(&canvas, Qt::RightButton, 0, QPoint(50, 50)); + QCOMPARE(item.pressCount, 1); + QCOMPARE(item.releaseCount, 1); + + QTest::mousePress(&canvas, Qt::MiddleButton, 0, QPoint(50, 50)); + QTest::mouseRelease(&canvas, Qt::MiddleButton, 0, QPoint(50, 50)); + QCOMPARE(item.pressCount, 1); + QCOMPARE(item.releaseCount, 1); + + item.setAcceptedMouseButtons(Qt::RightButton | Qt::MiddleButton); + QCOMPARE(item.acceptedMouseButtons(), Qt::MouseButtons(Qt::RightButton | Qt::MiddleButton)); + + QTest::mousePress(&canvas, Qt::LeftButton, 0, QPoint(50, 50)); + QTest::mouseRelease(&canvas, Qt::LeftButton, 0, QPoint(50, 50)); + QCOMPARE(item.pressCount, 1); + QCOMPARE(item.releaseCount, 1); + + QTest::mousePress(&canvas, Qt::RightButton, 0, QPoint(50, 50)); + QTest::mouseRelease(&canvas, Qt::RightButton, 0, QPoint(50, 50)); + QCOMPARE(item.pressCount, 2); + QCOMPARE(item.releaseCount, 2); + + QTest::mousePress(&canvas, Qt::MiddleButton, 0, QPoint(50, 50)); + QTest::mouseRelease(&canvas, Qt::MiddleButton, 0, QPoint(50, 50)); + QCOMPARE(item.pressCount, 3); + QCOMPARE(item.releaseCount, 3); +} + QTEST_MAIN(tst_qquickitem) diff --git a/tests/auto/quick/qquickmousearea/data/clicktwice.qml b/tests/auto/quick/qquickmousearea/data/clicktwice.qml index 002d1b9047..7fd10b27f3 100644 --- a/tests/auto/quick/qquickmousearea/data/clicktwice.qml +++ b/tests/auto/quick/qquickmousearea/data/clicktwice.qml @@ -7,6 +7,7 @@ Item { property int released: 0 MouseArea { + objectName: "mousearea" width: 200; height: 200 onPressed: { root.pressed++ } onClicked: { root.clicked++ } diff --git a/tests/auto/quick/qquickmousearea/data/doubleclick.qml b/tests/auto/quick/qquickmousearea/data/doubleclick.qml index 1030d0c33e..3c0e99bacb 100644 --- a/tests/auto/quick/qquickmousearea/data/doubleclick.qml +++ b/tests/auto/quick/qquickmousearea/data/doubleclick.qml @@ -7,6 +7,7 @@ Item { property int released: 0 MouseArea { + objectName: "mousearea" width: 200; height: 200 onClicked: { root.clicked++ } onDoubleClicked: { root.doubleClicked++ } diff --git a/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp b/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp index 2457ba727a..4b778745b3 100644 --- a/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp +++ b/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp @@ -50,23 +50,28 @@ #include "../../shared/util.h" #include -//#define OLDWAY - class tst_QQuickMouseArea: public QQmlDataTest { Q_OBJECT private slots: void dragProperties(); void resetDrag(); + void dragging_data() { acceptedButton_data(); } void dragging(); + void invalidDrag_data() { rejectedButton_data(); } + void invalidDrag(); void setDragOnPressed(); void updateMouseAreaPosOnClick(); void updateMouseAreaPosOnResize(); void noOnClickedWithPressAndHold(); void onMousePressRejected(); void pressedCanceledOnWindowDeactivate(); + void doubleClick_data() { acceptedButton_data(); } void doubleClick(); + void clickTwice_data() { acceptedButton_data(); } void clickTwice(); + void invalidClick_data() { rejectedButton_data(); } + void invalidClick(); void pressedOrdering(); void preventStealing(); void clickThrough(); @@ -77,9 +82,39 @@ private slots: void onWheel(); private: + void acceptedButton_data(); + void rejectedButton_data(); + QQuickView *createView(); }; +Q_DECLARE_METATYPE(Qt::MouseButton) +Q_DECLARE_METATYPE(Qt::MouseButtons) + +void tst_QQuickMouseArea::acceptedButton_data() +{ + QTest::addColumn("acceptedButtons"); + QTest::addColumn("button"); + + QTest::newRow("left") << Qt::MouseButtons(Qt::LeftButton) << Qt::LeftButton; + QTest::newRow("right") << Qt::MouseButtons(Qt::RightButton) << Qt::RightButton; + QTest::newRow("middle") << Qt::MouseButtons(Qt::MiddleButton) << Qt::MiddleButton; + + QTest::newRow("left (left|right)") << Qt::MouseButtons(Qt::LeftButton | Qt::RightButton) << Qt::LeftButton; + QTest::newRow("right (right|middle)") << Qt::MouseButtons(Qt::RightButton | Qt::MiddleButton) << Qt::RightButton; + QTest::newRow("middle (left|middle)") << Qt::MouseButtons(Qt::LeftButton | Qt::MiddleButton) << Qt::MiddleButton; +} + +void tst_QQuickMouseArea::rejectedButton_data() +{ + QTest::addColumn("acceptedButtons"); + QTest::addColumn("button"); + + QTest::newRow("middle (left|right)") << Qt::MouseButtons(Qt::LeftButton | Qt::RightButton) << Qt::MiddleButton; + QTest::newRow("left (right|middle)") << Qt::MouseButtons(Qt::RightButton | Qt::MiddleButton) << Qt::LeftButton; + QTest::newRow("right (left|middle)") << Qt::MouseButtons(Qt::LeftButton | Qt::MiddleButton) << Qt::RightButton; +} + void tst_QQuickMouseArea::dragProperties() { QQuickView *canvas = createView(); @@ -195,9 +230,11 @@ void tst_QQuickMouseArea::resetDrag() delete canvas; } - void tst_QQuickMouseArea::dragging() { + QFETCH(Qt::MouseButtons, acceptedButtons); + QFETCH(Qt::MouseButton, button); + QQuickView *canvas = createView(); canvas->setSource(testFileUrl("dragging.qml")); @@ -211,6 +248,8 @@ void tst_QQuickMouseArea::dragging() QVERIFY(mouseRegion != 0); QVERIFY(drag != 0); + mouseRegion->setAcceptedButtons(acceptedButtons); + // target QQuickItem *blackRect = canvas->rootObject()->findChild("blackrect"); QVERIFY(blackRect != 0); @@ -218,12 +257,7 @@ void tst_QQuickMouseArea::dragging() QVERIFY(!drag->active()); -#ifdef OLDWAY - QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0); - QGuiApplication::sendEvent(canvas, &pressEvent); -#else - QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(100,100)); -#endif + QTest::mousePress(canvas, button, 0, QPoint(100,100)); QVERIFY(!drag->active()); QCOMPARE(blackRect->x(), 50.0); @@ -241,13 +275,8 @@ void tst_QQuickMouseArea::dragging() QCOMPARE(blackRect->x(), 72.0); QCOMPARE(blackRect->y(), 72.0); -#ifdef OLDWAY - QMouseEvent releaseEvent(QEvent::MouseButtonRelease, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0); - QGuiApplication::sendEvent(canvas, &releaseEvent); -#else - QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(122,122)); + QTest::mouseRelease(canvas, button, 0, QPoint(122,122)); QTest::qWait(50); -#endif QVERIFY(!drag->active()); QCOMPARE(blackRect->x(), 72.0); @@ -256,6 +285,61 @@ void tst_QQuickMouseArea::dragging() delete canvas; } +void tst_QQuickMouseArea::invalidDrag() +{ + QFETCH(Qt::MouseButtons, acceptedButtons); + QFETCH(Qt::MouseButton, button); + + QQuickView *canvas = createView(); + + canvas->setSource(testFileUrl("dragging.qml")); + canvas->show(); + canvas->requestActivateWindow(); + QTest::qWait(20); + QVERIFY(canvas->rootObject() != 0); + + QQuickMouseArea *mouseRegion = canvas->rootObject()->findChild("mouseregion"); + QQuickDrag *drag = mouseRegion->drag(); + QVERIFY(mouseRegion != 0); + QVERIFY(drag != 0); + + mouseRegion->setAcceptedButtons(acceptedButtons); + + // target + QQuickItem *blackRect = canvas->rootObject()->findChild("blackrect"); + QVERIFY(blackRect != 0); + QVERIFY(blackRect == drag->target()); + + QVERIFY(!drag->active()); + + QTest::mousePress(canvas, button, 0, QPoint(100,100)); + + QVERIFY(!drag->active()); + QCOMPARE(blackRect->x(), 50.0); + QCOMPARE(blackRect->y(), 50.0); + + // First move event triggers drag, second is acted upon. + // This is due to possibility of higher stacked area taking precedence. + + QTest::mouseMove(canvas, QPoint(111,111)); + QTest::qWait(50); + QTest::mouseMove(canvas, QPoint(122,122)); + QTest::qWait(50); + + QVERIFY(!drag->active()); + QCOMPARE(blackRect->x(), 50.0); + QCOMPARE(blackRect->y(), 50.0); + + QTest::mouseRelease(canvas, button, 0, QPoint(122,122)); + QTest::qWait(50); + + QVERIFY(!drag->active()); + QCOMPARE(blackRect->x(), 50.0); + QCOMPARE(blackRect->y(), 50.0); + + delete canvas; +} + void tst_QQuickMouseArea::setDragOnPressed() { QQuickView *canvas = createView(); @@ -509,26 +593,34 @@ void tst_QQuickMouseArea::pressedCanceledOnWindowDeactivate() delete canvas; } + void tst_QQuickMouseArea::doubleClick() { + QFETCH(Qt::MouseButtons, acceptedButtons); + QFETCH(Qt::MouseButton, button); + QQuickView *canvas = createView(); canvas->setSource(testFileUrl("doubleclick.qml")); canvas->show(); canvas->requestActivateWindow(); QVERIFY(canvas->rootObject() != 0); + QQuickMouseArea *mouseArea = canvas->rootObject()->findChild("mousearea"); + QVERIFY(mouseArea); + mouseArea->setAcceptedButtons(acceptedButtons); + // The sequence for a double click is: // press, release, (click), press, double click, release - QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0); + QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(100, 100), button, button, 0); QGuiApplication::sendEvent(canvas, &pressEvent); - QMouseEvent releaseEvent(QEvent::MouseButtonRelease, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0); + QMouseEvent releaseEvent(QEvent::MouseButtonRelease, QPoint(100, 100), button, button, 0); QGuiApplication::sendEvent(canvas, &releaseEvent); QCOMPARE(canvas->rootObject()->property("released").toInt(), 1); QGuiApplication::sendEvent(canvas, &pressEvent); - pressEvent = QMouseEvent(QEvent::MouseButtonDblClick, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0); + pressEvent = QMouseEvent(QEvent::MouseButtonDblClick, QPoint(100, 100), button, button, 0); QGuiApplication::sendEvent(canvas, &pressEvent); QGuiApplication::sendEvent(canvas, &releaseEvent); @@ -542,16 +634,23 @@ void tst_QQuickMouseArea::doubleClick() // QTBUG-14832 void tst_QQuickMouseArea::clickTwice() { + QFETCH(Qt::MouseButtons, acceptedButtons); + QFETCH(Qt::MouseButton, button); + QQuickView *canvas = createView(); canvas->setSource(testFileUrl("clicktwice.qml")); canvas->show(); canvas->requestActivateWindow(); QVERIFY(canvas->rootObject() != 0); - QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0); + QQuickMouseArea *mouseArea = canvas->rootObject()->findChild("mousearea"); + QVERIFY(mouseArea); + mouseArea->setAcceptedButtons(acceptedButtons); + + QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(100, 100), button, button, 0); QGuiApplication::sendEvent(canvas, &pressEvent); - QMouseEvent releaseEvent(QEvent::MouseButtonRelease, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0); + QMouseEvent releaseEvent(QEvent::MouseButtonRelease, QPoint(100, 100), button, button, 0); QGuiApplication::sendEvent(canvas, &releaseEvent); QCOMPARE(canvas->rootObject()->property("pressed").toInt(), 1); @@ -559,7 +658,7 @@ void tst_QQuickMouseArea::clickTwice() QCOMPARE(canvas->rootObject()->property("clicked").toInt(), 1); QGuiApplication::sendEvent(canvas, &pressEvent); - pressEvent = QMouseEvent(QEvent::MouseButtonDblClick, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0); + pressEvent = QMouseEvent(QEvent::MouseButtonDblClick, QPoint(100, 100), button, button, 0); QGuiApplication::sendEvent(canvas, &pressEvent); QGuiApplication::sendEvent(canvas, &releaseEvent); @@ -570,6 +669,43 @@ void tst_QQuickMouseArea::clickTwice() delete canvas; } +void tst_QQuickMouseArea::invalidClick() +{ + QFETCH(Qt::MouseButtons, acceptedButtons); + QFETCH(Qt::MouseButton, button); + + QQuickView *canvas = createView(); + canvas->setSource(testFileUrl("doubleclick.qml")); + canvas->show(); + canvas->requestActivateWindow(); + QVERIFY(canvas->rootObject() != 0); + + QQuickMouseArea *mouseArea = canvas->rootObject()->findChild("mousearea"); + QVERIFY(mouseArea); + mouseArea->setAcceptedButtons(acceptedButtons); + + // The sequence for a double click is: + // press, release, (click), press, double click, release + QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(100, 100), button, button, 0); + QGuiApplication::sendEvent(canvas, &pressEvent); + + QMouseEvent releaseEvent(QEvent::MouseButtonRelease, QPoint(100, 100), button, button, 0); + QGuiApplication::sendEvent(canvas, &releaseEvent); + + QCOMPARE(canvas->rootObject()->property("released").toInt(), 0); + + QGuiApplication::sendEvent(canvas, &pressEvent); + pressEvent = QMouseEvent(QEvent::MouseButtonDblClick, QPoint(100, 100), button, button, 0); + QGuiApplication::sendEvent(canvas, &pressEvent); + QGuiApplication::sendEvent(canvas, &releaseEvent); + + QCOMPARE(canvas->rootObject()->property("clicked").toInt(), 0); + QCOMPARE(canvas->rootObject()->property("doubleClicked").toInt(), 0); + QCOMPARE(canvas->rootObject()->property("released").toInt(), 0); + + delete canvas; +} + void tst_QQuickMouseArea::pressedOrdering() { QQuickView *canvas = createView(); -- cgit v1.2.3