diff options
author | Kirill Burtsev <kirill.burtsev@qt.io> | 2020-11-24 20:17:43 +0100 |
---|---|---|
committer | Kirill Burtsev <kirill.burtsev@qt.io> | 2020-11-30 23:11:04 +0100 |
commit | 6c442ddbf584413fa4228aae4cc277887344e20d (patch) | |
tree | 8945fc350571f85e24dd8a2297cbbc4137ae6070 /tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp | |
parent | efd20cafe5df9ac8788870a4e767d250114206a6 (diff) |
Add widget-based test for TouchCancel event
Follow up for 45a65cbeb2
Pick-to: 6.0
Change-Id: Idb4f4eaaa3ee583462430c530f88a4cc32378d6c
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Diffstat (limited to 'tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp')
-rw-r--r-- | tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp | 84 |
1 files changed, 83 insertions, 1 deletions
diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp index a477d9db00..ebdb3b83c4 100644 --- a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp +++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp @@ -146,6 +146,8 @@ static QByteArray msgComparisonFailed(T v1, const char *op, T v2) return s.toLocal8Bit(); } +Q_LOGGING_CATEGORY(lcTests, "qt.widgets.tests") + class tst_QWidget : public QObject { Q_OBJECT @@ -395,6 +397,7 @@ private slots: void touchEventSynthesizedMouseEvent(); void touchUpdateOnNewTouch(); + void touchCancel(); void touchEventsForGesturePendingWidgets(); void styleSheetPropagation(); @@ -609,6 +612,8 @@ tst_QWidget::~tst_QWidget() { if (m_windowsAnimationsEnabled) setWindowsAnimationsEnabled(m_windowsAnimationsEnabled); + + delete m_touchScreen; } void tst_QWidget::initTestCase() @@ -10682,12 +10687,20 @@ public: protected: bool event(QEvent *e) override { + qCDebug(lcTests) << e; switch (e->type()) { case QEvent::TouchBegin: + case QEvent::TouchCancel: case QEvent::TouchUpdate: - case QEvent::TouchEnd: + case QEvent::TouchEnd: { + auto te = static_cast<QTouchEvent *>(e); + touchDevice = const_cast<QPointingDevice *>(te->pointingDevice()); + touchPointStates = te->touchPointStates(); + touchPoints = te->points(); if (e->type() == QEvent::TouchBegin) ++m_touchBeginCount; + else if (e->type() == QEvent::TouchCancel) + ++m_touchCancelCount; else if (e->type() == QEvent::TouchUpdate) ++m_touchUpdateCount; else if (e->type() == QEvent::TouchEnd) @@ -10697,6 +10710,7 @@ protected: e->accept(); else e->ignore(); + } return true; case QEvent::Gesture: ++m_gestureEventCount; @@ -10720,9 +10734,13 @@ protected: public: int m_touchBeginCount = 0; + int m_touchCancelCount = 0; int m_touchUpdateCount = 0; int m_touchEndCount = 0; int m_touchEventCount = 0; + QPointingDevice *touchDevice = nullptr; + QTouchEvent::TouchPoint::States touchPointStates; + QList<QTouchEvent::TouchPoint> touchPoints; int m_gestureEventCount = 0; bool m_acceptTouch = false; int m_mouseEventCount = 0; @@ -10826,6 +10844,70 @@ void tst_QWidget::touchEventSynthesizedMouseEvent() } } +void tst_QWidget::touchCancel() +{ + TouchMouseWidget widget; + widget.setWindowTitle(QLatin1String(QTest::currentTestFunction())); + widget.setAcceptTouch(true); + widget.show(); + QVERIFY(QTest::qWaitForWindowExposed(widget.windowHandle())); + + { // cancel right after press + QTest::touchEvent(&widget, m_touchScreen).press(1, QPoint(20, 21), &widget); + QCOMPARE(widget.m_touchBeginCount, 1); + QCOMPARE(widget.touchDevice, m_touchScreen); + QCOMPARE(widget.touchPoints.size(), 1); + QCOMPARE(widget.touchPointStates, Qt::TouchPointPressed); + QCOMPARE(widget.touchPoints.first().position(), QPointF(20, 21)); + + QWindowSystemInterface::handleTouchCancelEvent(widget.windowHandle(), m_touchScreen); + QTRY_COMPARE(widget.m_touchCancelCount, 1); + QCOMPARE(widget.touchDevice, m_touchScreen); + QCOMPARE(widget.touchPoints.size(), 0); + + // should not propagate, since after cancel there should be only new press + QTest::touchEvent(&widget, m_touchScreen).move(1, QPoint(25, 26), &widget); + QCOMPARE(widget.m_touchUpdateCount, 0); + } + + { // cancel after update + QTest::touchEvent(&widget, m_touchScreen).press(1, QPoint(30, 31), &widget); + QCOMPARE(widget.m_touchBeginCount, 2); + QCOMPARE(widget.touchPoints.size(), 1); + QCOMPARE(widget.touchPointStates, Qt::TouchPointPressed); + QCOMPARE(widget.touchPoints.first().position(), QPointF(30, 31)); + + QTest::touchEvent(&widget, m_touchScreen).move(1, QPoint(20, 21)); + QCOMPARE(widget.m_touchUpdateCount, 1); + QCOMPARE(widget.touchPoints.size(), 1); + QCOMPARE(widget.touchPointStates, Qt::TouchPointMoved); + QCOMPARE(widget.touchPoints.first().position(), QPointF(20, 21)); + + QWindowSystemInterface::handleTouchCancelEvent(widget.windowHandle(), m_touchScreen); + QTRY_COMPARE(widget.m_touchCancelCount, 2); + QCOMPARE(widget.touchDevice, m_touchScreen); + QCOMPARE(widget.touchPoints.size(), 0); + + // should not propagate, since after cancel there should be only new press + QTest::touchEvent(&widget, m_touchScreen).move(1, QPoint(25, 26), &widget); + QCOMPARE(widget.m_touchUpdateCount, 1); + } + + { // proper press/release after multiple cancel events should proceed as usual + QTest::touchEvent(&widget, m_touchScreen).press(2, QPoint(15, 16), &widget).press(3, QPoint(25, 26), &widget); + QCOMPARE(widget.m_touchBeginCount, 3); + QCOMPARE(widget.touchDevice, m_touchScreen); + QCOMPARE(widget.touchPoints.size(), 2); + QCOMPARE(widget.touchPointStates, Qt::TouchPointPressed); + + QTest::touchEvent(&widget, m_touchScreen).release(3, QPoint(30, 30), &widget).release(2, QPoint(10, 10), &widget); + QCOMPARE(widget.m_touchEndCount, 1); + QCOMPARE(widget.touchDevice, m_touchScreen); + QCOMPARE(widget.touchPoints.size(), 2); + QCOMPARE(widget.touchPointStates, Qt::TouchPointReleased); + } +} + void tst_QWidget::touchUpdateOnNewTouch() { TouchMouseWidget widget; |