From 18ea028a81b64f7ccc78d7d58f39ce18424de564 Mon Sep 17 00:00:00 2001 From: Shawn Rutledge Date: Wed, 21 Oct 2020 19:11:45 +0200 Subject: Make tst_QQuickMultiPointTouchArea::inFlickable() more debuggable It was all-white despite having two items that react to events, which makes it hard to see what's failing when it fails. Use loops rather than tedious repetitive hard-coded moves to improve readability. "ensure that mouse events do not fall through to the Flickable" must include having the MPTA "eat" the mouse press. Change-Id: Ibca14709afbd561f03a62d74d10e6cae94ab302e Reviewed-by: Shawn Rutledge --- .../qquickmultipointtoucharea/data/inFlickable.qml | 70 ++++++++--- .../tst_qquickmultipointtoucharea.cpp | 129 +++++++-------------- 2 files changed, 97 insertions(+), 102 deletions(-) diff --git a/tests/auto/quick/qquickmultipointtoucharea/data/inFlickable.qml b/tests/auto/quick/qquickmultipointtoucharea/data/inFlickable.qml index 9c9132d0b0..32733613b3 100644 --- a/tests/auto/quick/qquickmultipointtoucharea/data/inFlickable.qml +++ b/tests/auto/quick/qquickmultipointtoucharea/data/inFlickable.qml @@ -1,31 +1,65 @@ import QtQuick 2.0 -Flickable { +Rectangle { + id: root width: 240 height: 320 - contentWidth: width - contentHeight: height * 2 - property int cancelCount: 0 property int touchCount: 0 - MultiPointTouchArea { + Rectangle { + id: verticalScrollDecorator + anchors.right: parent.right + anchors.margins: 2 + color: flick.moving ? "goldenrod" : "cyan" + border.color: "black" + border.width: 1 + width: 5 + radius: 2 + antialiasing: true + height: flick.height * (flick.height / flick.contentHeight) - (width - anchors.margins) * 2 + y: -flick.contentY * (flick.height / flick.contentHeight) + } + + Flickable { + id: flick anchors.fill: parent - minimumTouchPoints: 2 - maximumTouchPoints: 2 - onGestureStarted: { - if ((Math.abs(point2.x - point2.startX) > gesture.dragThreshold/2) && (Math.abs(point1.x - point1.startX) > gesture.dragThreshold/2)) { - gesture.grab() + contentWidth: width + contentHeight: height * 2 + + MultiPointTouchArea { + anchors.fill: parent + minimumTouchPoints: 2 + maximumTouchPoints: 2 + onGestureStarted: { + if ((Math.abs(point2.x - point2.startX) > gesture.dragThreshold/2) && + (Math.abs(point1.x - point1.startX) > gesture.dragThreshold/2)) { + gesture.grab() + } } - } - touchPoints: [ - TouchPoint { id: point1; objectName: "point1" }, - TouchPoint { id: point2; objectName: "point2" } - ] + touchPoints: [ + TouchPoint { id: point1; objectName: "point1" }, + TouchPoint { id: point2; objectName: "point2" } + ] + + onCanceled: root.cancelCount = touchPoints.length + onTouchUpdated: root.touchCount = touchPoints.length - onCanceled: cancelCount = touchPoints.length - onTouchUpdated: touchCount = touchPoints.length + Text { + text: "①" + font.pixelSize: 30 + visible: point1.pressed + x: point1.x - width / 2; y: point1.y - height / 2 + } + + Text { + text: "②" + font.pixelSize: 30 + color: "darkgreen" + visible: point2.pressed + x: point2.x - width / 2; y: point2.y - height / 2 + } + } } } - diff --git a/tests/auto/quick/qquickmultipointtoucharea/tst_qquickmultipointtoucharea.cpp b/tests/auto/quick/qquickmultipointtoucharea/tst_qquickmultipointtoucharea.cpp index 1cb5591519..70f5460c44 100644 --- a/tests/auto/quick/qquickmultipointtoucharea/tst_qquickmultipointtoucharea.cpp +++ b/tests/auto/quick/qquickmultipointtoucharea/tst_qquickmultipointtoucharea.cpp @@ -577,7 +577,7 @@ void tst_QQuickMultiPointTouchArea::inFlickable() QScopedPointer window(createAndShowView("inFlickable.qml")); QVERIFY(window->rootObject() != nullptr); - QQuickFlickable *flickable = qobject_cast(window->rootObject()); + QQuickFlickable *flickable = window->rootObject()->findChild(); QVERIFY(flickable != nullptr); QQuickMultiPointTouchArea *mpta = window->rootObject()->findChild(); @@ -592,25 +592,20 @@ void tst_QQuickMultiPointTouchArea::inFlickable() QPoint p1(20,100); QPoint p2(40,100); - //moving one point vertically + // moving one point vertically QTest::touchEvent(window.data(), device).press(0, p1); QQuickTouchUtils::flush(window.data()); - p1 += QPoint(0,15); - QTest::touchEvent(window.data(), device).move(0, p1); - QQuickTouchUtils::flush(window.data()); - - p1 += QPoint(0,15); - QTest::touchEvent(window.data(), device).move(0, p1); - QQuickTouchUtils::flush(window.data()); - - p1 += QPoint(0,15); - QTest::touchEvent(window.data(), device).move(0, p1); - QQuickTouchUtils::flush(window.data()); - - p1 += QPoint(0,15); - QTest::touchEvent(window.data(), device).move(0, p1); - QQuickTouchUtils::flush(window.data()); + QPoint delta(0, 15); + for (int i = 0; i < 4; ++i) { + if (lcTests().isDebugEnabled()) + QTest::qWait(250); + p1 += delta; + QTest::touchEvent(window.data(), device).move(0, p1); + QQuickTouchUtils::flush(window.data()); + qCDebug(lcTests, "after drag %d to %d,%d contentY is %lf", + i, p1.x(), p1.y(), flickable->contentY()); + } QVERIFY(flickable->contentY() < 0); QCOMPARE(point11->pressed(), false); @@ -621,7 +616,7 @@ void tst_QQuickMultiPointTouchArea::inFlickable() QTRY_VERIFY(!flickable->isMoving()); - //moving two points vertically + // moving two points vertically p1 = QPoint(20,100); QTest::touchEvent(window.data(), device).press(0, p1).press(1, p2); QTest::mousePress(window.data(), Qt::LeftButton, Qt::NoModifier, p1); @@ -629,34 +624,25 @@ void tst_QQuickMultiPointTouchArea::inFlickable() QCOMPARE(point11->pressed(), true); QCOMPARE(point12->pressed(), true); - QCOMPARE(flickable->property("cancelCount").toInt(), 0); - QCOMPARE(flickable->property("touchCount").toInt(), 2); - - p1 += QPoint(0,15); p2 += QPoint(0,15); - QTest::touchEvent(window.data(), device).move(0, p1).move(1, p2); - QTest::mouseMove(window.data(), p1); - QQuickTouchUtils::flush(window.data()); - - p1 += QPoint(0,15); p2 += QPoint(0,15); - QTest::touchEvent(window.data(), device).move(0, p1).move(1, p2); - QTest::mouseMove(window.data(), p1); - QQuickTouchUtils::flush(window.data()); - - p1 += QPoint(0,15); p2 += QPoint(0,15); - QTest::touchEvent(window.data(), device).move(0, p1).move(1, p2); - QTest::mouseMove(window.data(), p1); - QQuickTouchUtils::flush(window.data()); - - p1 += QPoint(0,15); p2 += QPoint(0,15); - QTest::touchEvent(window.data(), device).move(0, p1).move(1, p2); - QTest::mouseMove(window.data(), p1); - QQuickTouchUtils::flush(window.data()); + QCOMPARE(window->rootObject()->property("cancelCount").toInt(), 0); + QCOMPARE(window->rootObject()->property("touchCount").toInt(), 2); + + for (int i = 0; i < 4; ++i) { + if (lcTests().isDebugEnabled()) + QTest::qWait(250); + p1 += delta; p2 += delta; + QTest::touchEvent(window.data(), device).move(0, p1).move(1, p2); + QTest::mouseMove(window.data(), p1); + QQuickTouchUtils::flush(window.data()); + qCDebug(lcTests, "after drags %d to %d,%d and %d,%d contentY is %lf", + i, p1.x(), p1.y(), p2.x(), p2.y(), flickable->contentY()); + } QVERIFY(flickable->contentY() < 0); QCOMPARE(point11->pressed(), false); QCOMPARE(point12->pressed(), false); - QCOMPARE(flickable->property("cancelCount").toInt(), 2); - QCOMPARE(flickable->property("touchCount").toInt(), 0); + QCOMPARE(window->rootObject()->property("cancelCount").toInt(), 2); + QCOMPARE(window->rootObject()->property("touchCount").toInt(), 0); QTest::touchEvent(window.data(), device).release(0, p1).release(1, p2); QTest::mouseRelease(window.data(), Qt::LeftButton, Qt::NoModifier, p1); @@ -664,57 +650,32 @@ void tst_QQuickMultiPointTouchArea::inFlickable() QTRY_VERIFY(!flickable->isMoving()); - //moving two points horizontally, then one point vertically + // moving two points horizontally, then two points vertically p1 = QPoint(20,100); p2 = QPoint(40,100); QTest::touchEvent(window.data(), device).press(0, p1).press(1, p2); QQuickTouchUtils::flush(window.data()); // ensure that mouse events do not fall through to the Flickable mpta->setMaximumTouchPoints(3); + mpta->setAcceptedMouseButtons(Qt::LeftButton); QTest::mousePress(window.data(), Qt::LeftButton, Qt::NoModifier, p1); QCOMPARE(point11->pressed(), true); QCOMPARE(point12->pressed(), true); - p1 += QPoint(15,0); p2 += QPoint(15,0); - QTest::touchEvent(window.data(), device).move(0, p1).move(1, p2); - QTest::mouseMove(window.data(), p1); - QQuickTouchUtils::flush(window.data()); - - p1 += QPoint(15,0); p2 += QPoint(15,0); - QTest::touchEvent(window.data(), device).move(0, p1).move(1, p2); - QTest::mouseMove(window.data(), p1); - QQuickTouchUtils::flush(window.data()); - - p1 += QPoint(15,0); p2 += QPoint(15,0); - QTest::touchEvent(window.data(), device).move(0, p1).move(1, p2); - QTest::mouseMove(window.data(), p1); - QQuickTouchUtils::flush(window.data()); - - p1 += QPoint(15,0); p2 += QPoint(15,0); - QTest::touchEvent(window.data(), device).move(0, p1).move(1, p2); - QTest::mouseMove(window.data(), p1); - QQuickTouchUtils::flush(window.data()); - - p1 += QPoint(0,15); p2 += QPoint(0,15); - QTest::touchEvent(window.data(), device).move(0, p1).move(1, p2); - QTest::mouseMove(window.data(), p1); - QQuickTouchUtils::flush(window.data()); - - p1 += QPoint(0,15); p2 += QPoint(0,15); - QTest::touchEvent(window.data(), device).move(0, p1).move(1, p2); - QTest::mouseMove(window.data(), p1); - QQuickTouchUtils::flush(window.data()); - - p1 += QPoint(0,15); p2 += QPoint(0,15); - QTest::touchEvent(window.data(), device).move(0, p1).move(1, p2); - QTest::mouseMove(window.data(), p1); - QQuickTouchUtils::flush(window.data()); - - p1 += QPoint(0,15); p2 += QPoint(0,15); - QTest::touchEvent(window.data(), device).move(0, p1).move(1, p2); - QTest::mouseMove(window.data(), p1); - QQuickTouchUtils::flush(window.data()); + delta = QPoint(15, 0); + for (int i = 0; i < 8; ++i) { + if (lcTests().isDebugEnabled()) + QTest::qWait(250); + if (i == 4) + delta = QPoint(0, 15); + p1 += delta; p2 += delta; + QTest::touchEvent(window.data(), device).move(0, p1).move(1, p2); + QTest::mouseMove(window.data(), p1); + QQuickTouchUtils::flush(window.data()); + qCDebug(lcTests, "after drags %d to %d,%d and %d,%d contentY is %lf", + i, p1.x(), p1.y(), p2.x(), p2.y(), flickable->contentY()); + } QCOMPARE(flickable->contentY(), qreal(0)); QCOMPARE(point11->pressed(), true); @@ -816,7 +777,7 @@ void tst_QQuickMultiPointTouchArea::inFlickableWithPressDelay() // QTBUG-78818 QScopedPointer window(createAndShowView("inFlickable.qml")); QVERIFY(window->rootObject() != nullptr); - QQuickFlickable *flickable = qobject_cast(window->rootObject()); + QQuickFlickable *flickable = window->rootObject()->findChild(); QVERIFY(flickable != nullptr); flickable->setPressDelay(50); @@ -856,7 +817,7 @@ void tst_QQuickMultiPointTouchArea::inFlickableWithPressDelay() // QTBUG-78818 qCDebug(lcTests, "Flickable stole grab from MPTA after %d moves", i); QCOMPARE(devPriv->pointById(0)->exclusiveGrabber, flickable); QCOMPARE(point11->pressed(), false); - QVERIFY(flickable->property("cancelCount").toInt() > 0); // actually 2 because 2 touchPoints are declared... but only one was really cancelled + QVERIFY(window->rootObject()->property("cancelCount").toInt() > 0); // actually 2 because 2 touchPoints are declared... but only one was really cancelled // drag a little more and the Flickable moves p1 += QPoint(0,1); -- cgit v1.2.3