diff options
Diffstat (limited to 'tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp')
-rw-r--r-- | tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp | 163 |
1 files changed, 114 insertions, 49 deletions
diff --git a/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp b/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp index 37ce0fd394..fa33f3f626 100644 --- a/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp +++ b/tests/auto/quick/qquickmousearea/tst_qquickmousearea.cpp @@ -89,6 +89,8 @@ private slots: void cursorShape(); #endif void moveAndReleaseWithoutPress(); + void nestedStopAtBounds(); + void nestedStopAtBounds_data(); private: void acceptedButton_data(); @@ -130,7 +132,7 @@ void tst_QQuickMouseArea::dragProperties() window->setSource(testFileUrl("dragproperties.qml")); window->show(); - window->requestActivate(); + QTest::qWaitForWindowExposed(window); QVERIFY(window->rootObject() != 0); QQuickMouseArea *mouseRegion = window->rootObject()->findChild<QQuickMouseArea*>("mouseregion"); @@ -216,7 +218,7 @@ void tst_QQuickMouseArea::resetDrag() window->rootContext()->setContextProperty("haveTarget", QVariant(true)); window->setSource(testFileUrl("dragreset.qml")); window->show(); - window->requestActivate(); + QTest::qWaitForWindowExposed(window); QVERIFY(window->rootObject() != 0); QQuickMouseArea *mouseRegion = window->rootObject()->findChild<QQuickMouseArea*>("mouseregion"); @@ -248,7 +250,7 @@ void tst_QQuickMouseArea::dragging() window->setSource(testFileUrl("dragging.qml")); window->show(); - window->requestActivate(); + QTest::qWaitForWindowExposed(window); QVERIFY(QTest::qWaitForWindowExposed(window)); QVERIFY(window->rootObject() != 0); @@ -274,20 +276,22 @@ void tst_QQuickMouseArea::dragging() // First move event triggers drag, second is acted upon. // This is due to possibility of higher stacked area taking precedence. - + // The item is moved relative to the position of the mouse when the drag + // was triggered, this prevents a sudden change in position when the drag + // threshold is exceeded. QTest::mouseMove(window, QPoint(111,111), 50); QTest::mouseMove(window, QPoint(116,116), 50); QTest::mouseMove(window, QPoint(122,122), 50); QTRY_VERIFY(drag->active()); - QTRY_COMPARE(blackRect->x(), 72.0); - QCOMPARE(blackRect->y(), 72.0); + QTRY_COMPARE(blackRect->x(), 61.0); + QCOMPARE(blackRect->y(), 61.0); QTest::mouseRelease(window, button, 0, QPoint(122,122)); QTRY_VERIFY(!drag->active()); - QCOMPARE(blackRect->x(), 72.0); - QCOMPARE(blackRect->y(), 72.0); + QCOMPARE(blackRect->x(), 61.0); + QCOMPARE(blackRect->y(), 61.0); delete window; } @@ -301,8 +305,7 @@ void tst_QQuickMouseArea::invalidDrag() window->setSource(testFileUrl("dragging.qml")); window->show(); - window->requestActivate(); - QTest::qWait(20); + QTest::qWaitForWindowExposed(window); QVERIFY(window->rootObject() != 0); QQuickMouseArea *mouseRegion = window->rootObject()->findChild<QQuickMouseArea*>("mouseregion"); @@ -353,8 +356,7 @@ void tst_QQuickMouseArea::setDragOnPressed() window->setSource(testFileUrl("setDragOnPressed.qml")); window->show(); - window->requestActivate(); - QTest::qWait(20); + QTest::qWaitForWindowExposed(window); QVERIFY(window->rootObject() != 0); QQuickMouseArea *mouseArea = qobject_cast<QQuickMouseArea *>(window->rootObject()); @@ -382,14 +384,14 @@ void tst_QQuickMouseArea::setDragOnPressed() QTest::qWait(50); QVERIFY(drag->active()); - QCOMPARE(target->x(), 72.0); + QCOMPARE(target->x(), 61.0); QCOMPARE(target->y(), 50.0); QTest::mouseRelease(window, Qt::LeftButton, 0, QPoint(122,122)); QTest::qWait(50); QVERIFY(!drag->active()); - QCOMPARE(target->x(), 72.0); + QCOMPARE(target->x(), 61.0); QCOMPARE(target->y(), 50.0); delete window; @@ -408,7 +410,7 @@ void tst_QQuickMouseArea::updateMouseAreaPosOnClick() QQuickView *window = createView(); window->setSource(testFileUrl("updateMousePosOnClick.qml")); window->show(); - window->requestActivate(); + QTest::qWaitForWindowExposed(window); QVERIFY(window->rootObject() != 0); QQuickMouseArea *mouseRegion = window->rootObject()->findChild<QQuickMouseArea*>("mouseregion"); @@ -437,7 +439,7 @@ void tst_QQuickMouseArea::updateMouseAreaPosOnResize() QQuickView *window = createView(); window->setSource(testFileUrl("updateMousePosOnResize.qml")); window->show(); - window->requestActivate(); + QTest::qWaitForWindowExposed(window); QVERIFY(window->rootObject() != 0); QQuickMouseArea *mouseRegion = window->rootObject()->findChild<QQuickMouseArea*>("mouseregion"); @@ -474,7 +476,7 @@ void tst_QQuickMouseArea::noOnClickedWithPressAndHold() QQuickView *window = createView(); window->setSource(testFileUrl("clickandhold.qml")); window->show(); - window->requestActivate(); + QTest::qWaitForWindowExposed(window); QVERIFY(window->rootObject() != 0); QQuickMouseArea *mouseArea = qobject_cast<QQuickMouseArea*>(window->rootObject()->children().first()); QVERIFY(mouseArea); @@ -507,7 +509,7 @@ void tst_QQuickMouseArea::noOnClickedWithPressAndHold() QQuickView *window = createView(); window->setSource(testFileUrl("noclickandhold.qml")); window->show(); - window->requestActivate(); + QTest::qWaitForWindowExposed(window); QVERIFY(window->rootObject() != 0); QMouseEvent pressEvent(QEvent::MouseButtonPress, QPoint(100, 100), Qt::LeftButton, Qt::LeftButton, 0); @@ -531,7 +533,7 @@ void tst_QQuickMouseArea::onMousePressRejected() QQuickView *window = createView(); window->setSource(testFileUrl("rejectEvent.qml")); window->show(); - window->requestActivate(); + QTest::qWaitForWindowExposed(window); QVERIFY(window->rootObject() != 0); QVERIFY(window->rootObject()->property("enabled").toBool()); @@ -568,7 +570,7 @@ void tst_QQuickMouseArea::pressedCanceledOnWindowDeactivate() QQuickView *window = createView(); window->setSource(testFileUrl("pressedCanceled.qml")); window->show(); - window->requestActivate(); + QTest::qWaitForWindowExposed(window); QVERIFY(window->rootObject() != 0); QVERIFY(!window->rootObject()->property("pressed").toBool()); QVERIFY(!window->rootObject()->property("canceled").toBool()); @@ -581,16 +583,14 @@ void tst_QQuickMouseArea::pressedCanceledOnWindowDeactivate() QVERIFY(!window->rootObject()->property("canceled").toBool()); QVERIFY(!window->rootObject()->property("released").toBool()); - QTest::qWait(200); + QWindow *secondWindow = qvariant_cast<QWindow*>(window->rootObject()->property("secondWindow")); + secondWindow->setProperty("visible", true); + QTest::qWaitForWindowActive(secondWindow); - QEvent windowDeactivateEvent(QEvent::WindowDeactivate); - QGuiApplication::sendEvent(window, &windowDeactivateEvent); QVERIFY(!window->rootObject()->property("pressed").toBool()); QVERIFY(window->rootObject()->property("canceled").toBool()); QVERIFY(!window->rootObject()->property("released").toBool()); - QTest::qWait(200); - //press again QGuiApplication::sendEvent(window, &pressEvent); QVERIFY(window->rootObject()->property("pressed").toBool()); @@ -617,7 +617,7 @@ void tst_QQuickMouseArea::doubleClick() QQuickView *window = createView(); window->setSource(testFileUrl("doubleclick.qml")); window->show(); - window->requestActivate(); + QTest::qWaitForWindowExposed(window); QVERIFY(window->rootObject() != 0); QQuickMouseArea *mouseArea = window->rootObject()->findChild<QQuickMouseArea *>("mousearea"); @@ -655,7 +655,7 @@ void tst_QQuickMouseArea::clickTwice() QQuickView *window = createView(); window->setSource(testFileUrl("clicktwice.qml")); window->show(); - window->requestActivate(); + QTest::qWaitForWindowExposed(window); QVERIFY(window->rootObject() != 0); QQuickMouseArea *mouseArea = window->rootObject()->findChild<QQuickMouseArea *>("mousearea"); @@ -692,7 +692,7 @@ void tst_QQuickMouseArea::invalidClick() QQuickView *window = createView(); window->setSource(testFileUrl("doubleclick.qml")); window->show(); - window->requestActivate(); + QTest::qWaitForWindowExposed(window); QVERIFY(window->rootObject() != 0); QQuickMouseArea *mouseArea = window->rootObject()->findChild<QQuickMouseArea *>("mousearea"); @@ -726,7 +726,7 @@ void tst_QQuickMouseArea::pressedOrdering() QQuickView *window = createView(); window->setSource(testFileUrl("pressedOrdering.qml")); window->show(); - window->requestActivate(); + QTest::qWaitForWindowExposed(window); QVERIFY(window->rootObject() != 0); QCOMPARE(window->rootObject()->property("value").toString(), QLatin1String("base")); @@ -754,7 +754,7 @@ void tst_QQuickMouseArea::preventStealing() window->setSource(testFileUrl("preventstealing.qml")); window->show(); - window->requestActivate(); + QTest::qWaitForWindowExposed(window); QVERIFY(window->rootObject() != 0); QQuickFlickable *flickable = qobject_cast<QQuickFlickable*>(window->rootObject()); @@ -818,7 +818,7 @@ void tst_QQuickMouseArea::clickThrough() QQuickView *window = createView(); window->setSource(testFileUrl("clickThrough.qml")); window->show(); - window->requestActivate(); + QTest::qWaitForWindowExposed(window); QVERIFY(window->rootObject() != 0); QTest::mousePress(window, Qt::LeftButton, 0, QPoint(100,100)); @@ -853,7 +853,7 @@ void tst_QQuickMouseArea::clickThrough() window = createView(); window->setSource(testFileUrl("clickThrough2.qml")); window->show(); - window->requestActivate(); + QTest::qWaitForWindowExposed(window); QVERIFY(window->rootObject() != 0); QTest::mousePress(window, Qt::LeftButton, 0, QPoint(100,100)); @@ -1012,8 +1012,7 @@ void tst_QQuickMouseArea::disableAfterPress() QQuickView *window = createView(); window->setSource(testFileUrl("dragging.qml")); window->show(); - window->requestActivate(); - QTest::qWait(20); + QTest::qWaitForWindowExposed(window); QVERIFY(window->rootObject() != 0); QQuickMouseArea *mouseArea = window->rootObject()->findChild<QQuickMouseArea*>("mouseregion"); @@ -1050,8 +1049,8 @@ void tst_QQuickMouseArea::disableAfterPress() QTRY_COMPARE(mousePositionSpy.count(), 2); QVERIFY(drag->active()); - QCOMPARE(blackRect->x(), 72.0); - QCOMPARE(blackRect->y(), 72.0); + QCOMPARE(blackRect->x(), 61.0); + QCOMPARE(blackRect->y(), 61.0); mouseArea->setEnabled(false); @@ -1063,8 +1062,8 @@ void tst_QQuickMouseArea::disableAfterPress() QTRY_COMPARE(mousePositionSpy.count(), 4); QVERIFY(drag->active()); - QCOMPARE(blackRect->x(), 94.0); - QCOMPARE(blackRect->y(), 94.0); + QCOMPARE(blackRect->x(), 83.0); + QCOMPARE(blackRect->y(), 83.0); QVERIFY(mouseArea->pressed()); QVERIFY(mouseArea->hovered()); @@ -1074,8 +1073,8 @@ void tst_QQuickMouseArea::disableAfterPress() QTRY_COMPARE(mouseReleaseSpy.count(), 1); QVERIFY(!drag->active()); - QCOMPARE(blackRect->x(), 94.0); - QCOMPARE(blackRect->y(), 94.0); + QCOMPARE(blackRect->x(), 83.0); + QCOMPARE(blackRect->y(), 83.0); QVERIFY(!mouseArea->pressed()); QVERIFY(!mouseArea->hovered()); // since hover is not enabled @@ -1162,7 +1161,7 @@ void tst_QQuickMouseArea::transformedMouseArea() QQuickView *window = createView(); window->setSource(testFileUrl("transformedMouseArea.qml")); window->show(); - window->requestActivate(); + QTest::qWaitForWindowExposed(window); QVERIFY(window->rootObject() != 0); QQuickMouseArea *mouseArea = window->rootObject()->findChild<QQuickMouseArea *>("mouseArea"); @@ -1280,7 +1279,7 @@ void tst_QQuickMouseArea::pressedMultipleButtons() QQuickView *view = createView(); view->setSource(testFileUrl("simple.qml")); view->show(); - view->requestActivate(); + QTest::qWaitForWindowExposed(view); QVERIFY(view->rootObject() != 0); QQuickMouseArea *mouseArea = view->rootObject()->findChild<QQuickMouseArea *>("mousearea"); @@ -1317,7 +1316,7 @@ void tst_QQuickMouseArea::changeAxis() view->setSource(testFileUrl("changeAxis.qml")); view->show(); - view->requestActivate(); + QTest::qWaitForWindowExposed(view); QTRY_VERIFY(view->rootObject() != 0); QQuickMouseArea *mouseRegion = view->rootObject()->findChild<QQuickMouseArea*>("mouseregion"); @@ -1346,25 +1345,25 @@ void tst_QQuickMouseArea::changeAxis() QTest::mouseMove(view, QPoint(122, 122)); QTRY_VERIFY(drag->active()); - QCOMPARE(blackRect->x(), 72.0); - QCOMPARE(blackRect->y(), 72.0); + QCOMPARE(blackRect->x(), 61.0); + QCOMPARE(blackRect->y(), 61.0); QCOMPARE(drag->axis(), QQuickDrag::XAndYAxis); /* When blackRect.x becomes bigger than 75, the drag axis is changed to * Drag.YAxis by the QML code. Verify that this happens, and that the drag * movement is effectively constrained to the Y axis. */ - QTest::mouseMove(view, QPoint(133, 133)); + QTest::mouseMove(view, QPoint(144, 144)); QTRY_COMPARE(blackRect->x(), 83.0); QTRY_COMPARE(blackRect->y(), 83.0); QTRY_COMPARE(drag->axis(), QQuickDrag::YAxis); - QTest::mouseMove(view, QPoint(144, 144)); + QTest::mouseMove(view, QPoint(155, 155)); QTRY_COMPARE(blackRect->y(), 94.0); QCOMPARE(blackRect->x(), 83.0); - QTest::mouseRelease(view, Qt::LeftButton, 0, QPoint(144, 144)); + QTest::mouseRelease(view, Qt::LeftButton, 0, QPoint(155, 155)); QTRY_VERIFY(!drag->active()); QCOMPARE(blackRect->x(), 83.0); @@ -1409,7 +1408,7 @@ void tst_QQuickMouseArea::moveAndReleaseWithoutPress() window->setSource(testFileUrl("moveAndReleaseWithoutPress.qml")); window->show(); - window->requestActivate(); + QTest::qWaitForWindowExposed(window); QVERIFY(QTest::qWaitForWindowExposed(window)); QObject *root = window->rootObject(); @@ -1426,6 +1425,72 @@ void tst_QQuickMouseArea::moveAndReleaseWithoutPress() delete window; } +void tst_QQuickMouseArea::nestedStopAtBounds_data() +{ + QTest::addColumn<bool>("transpose"); + QTest::addColumn<bool>("invert"); + + QTest::newRow("left") << false << false; + QTest::newRow("right") << false << true; + QTest::newRow("top") << true << false; + QTest::newRow("bottom") << true << true; +} + +void tst_QQuickMouseArea::nestedStopAtBounds() +{ + QFETCH(bool, transpose); + QFETCH(bool, invert); + + QQuickView view; + view.setSource(testFileUrl("nestedStopAtBounds.qml")); + view.show(); + view.requestActivate(); + QVERIFY(QTest::qWaitForWindowExposed(&view)); + QVERIFY(view.rootObject()); + + QQuickMouseArea *outer = view.rootObject()->findChild<QQuickMouseArea*>("outer"); + QVERIFY(outer); + + QQuickMouseArea *inner = outer->findChild<QQuickMouseArea*>("inner"); + QVERIFY(inner); + inner->drag()->setAxis(transpose ? QQuickDrag::YAxis : QQuickDrag::XAxis); + inner->setX(invert ? 100 : 0); + inner->setY(invert ? 100 : 0); + + const int threshold = qApp->styleHints()->startDragDistance(); + + QPoint position(200, 200); + int &axis = transpose ? position.ry() : position.rx(); + + // drag toward the aligned boundary. Outer mouse area dragged. + QTest::mousePress(&view, Qt::LeftButton, 0, position); + QTest::qWait(10); + axis += invert ? threshold * 2 : -threshold * 2; + QTest::mouseMove(&view, position); + axis += invert ? threshold : -threshold; + QTest::mouseMove(&view, position); + QCOMPARE(outer->drag()->active(), true); + QCOMPARE(inner->drag()->active(), false); + QTest::mouseRelease(&view, Qt::LeftButton, 0, position); + + QVERIFY(!outer->drag()->active()); + + axis = 200; + outer->setX(50); + outer->setY(50); + + // drag away from the aligned boundary. Inner mouse area dragged. + QTest::mousePress(&view, Qt::LeftButton, 0, position); + QTest::qWait(10); + axis += invert ? -threshold * 2 : threshold * 2; + QTest::mouseMove(&view, position); + axis += invert ? -threshold : threshold; + QTest::mouseMove(&view, position); + QCOMPARE(outer->drag()->active(), false); + QCOMPARE(inner->drag()->active(), true); + QTest::mouseRelease(&view, Qt::LeftButton, 0, position); +} + QTEST_MAIN(tst_QQuickMouseArea) #include "tst_qquickmousearea.moc" |