diff options
author | Gatis Paeglis <gatis.paeglis@qt.io> | 2017-10-30 16:49:37 +0100 |
---|---|---|
committer | Gatis Paeglis <gatis.paeglis@qt.io> | 2018-01-29 21:19:58 +0000 |
commit | ac0ad5c69ce9a00ebe5377da40a26b43353fae58 (patch) | |
tree | cbabfb51aad4546b7fc9532a4397adb533564a7c /tests | |
parent | 678aae2c43726635053fede2a6c3875508cc3599 (diff) |
tests: cleanup tst_QMenu::QTBUG47515_widgetActionEnterLeave
- Allocate widgets on stack. The previous version was inconsistent (some
widets were managed by QScopedPointer and some were simply leaking).
- Use QTest::mouseMove(QWindow *)
- "This test fails on OS X on CI" was a clear indication that test is
flaky, the new implementation can reliably reproduce issue which is
now tracked in QTBUG-63031.
Task-number: QTBUG-63031
Change-Id: I59965ef8fa8edca17c8a73901d81e9efc7da3c5b
Reviewed-by: Gatis Paeglis <gatis.paeglis@qt.io>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp | 121 |
1 files changed, 70 insertions, 51 deletions
diff --git a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp index 15e2d9fa11..3b8d69c6fd 100644 --- a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp +++ b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp @@ -111,9 +111,8 @@ private slots: void QTBUG7411_submenus_activate(); void QTBUG30595_rtl_submenu(); void QTBUG20403_nested_popup_on_shortcut_trigger(); -#ifndef QT_NO_CURSOR void QTBUG47515_widgetActionEnterLeave(); -#endif + void QTBUG_10735_crashWithDialog(); #ifdef Q_OS_MAC void QTBUG_37933_ampersands_data(); @@ -1231,79 +1230,99 @@ public: int move, enter, leave; }; -#ifndef QT_NO_CURSOR void tst_QMenu::QTBUG47515_widgetActionEnterLeave() { +#if !QT_CONFIG(cursor) + QSKIP("This test requires QCursor API"); +#else if (QGuiApplication::platformName() == QLatin1String("cocoa")) - QSKIP("This test fails on OS X on CI"); + QSKIP("See QTBUG-63031"); - const QPoint center = QGuiApplication::primaryScreen()->availableGeometry().center(); - const QPoint cursorPos = center - QPoint(100, 100); + QPoint screenCenter = QGuiApplication::primaryScreen()->availableGeometry().center(); + QPoint pointOutsideMenu = screenCenter - QPoint(100, 100); - QScopedPointer<QMenu> menu1(new QMenu("Menu1")); - QScopedPointer<QMenu> menu2(new QMenu("Menu2")); + QMenu menu("Menu1"); + QMenu submenu("Menu2"); - QWidgetAction *wA1 = new QWidgetAction(menu1.data()); - MyWidget *w1 = new MyWidget(menu1.data()); - wA1->setDefaultWidget(w1); + QWidgetAction menuAction(&menu); + MyWidget w1(&menu); + menuAction.setDefaultWidget(&w1); - QWidgetAction *wA2 = new QWidgetAction(menu2.data()); - MyWidget *w2 = new MyWidget(menu2.data()); - wA2->setDefaultWidget(w2); + QWidgetAction submenuAction(&submenu); + MyWidget w2(&submenu); + submenuAction.setDefaultWidget(&w2); - QAction *nextMenuAct = menu1->addMenu(menu2.data()); + QAction *nextMenuAct = menu.addMenu(&submenu); - menu1->addAction(wA1); - menu2->addAction(wA2); + menu.addAction(&menuAction); + submenu.addAction(&submenuAction); // Root menu { - QCursor::setPos(cursorPos); - QCoreApplication::processEvents(); - - menu1->popup(center); - QVERIFY(QTest::qWaitForWindowExposed(menu1.data())); + QCursor::setPos(pointOutsideMenu); + QTRY_COMPARE(QCursor::pos(), pointOutsideMenu); + menu.popup(screenCenter); + QVERIFY(QTest::qWaitForWindowExposed(&menu)); - QCursor::setPos(w1->mapToGlobal(w1->rect().center())); - QVERIFY(w1->isVisible()); - QTRY_COMPARE(w1->leave, 0); - QTRY_COMPARE(w1->enter, 1); + w1.enter = 0; + w1.leave = 0; + QPoint w1Center = w1.rect().center(); + const QPoint w1CenterGlobal = w1.mapToGlobal(w1Center); + QCursor::setPos(w1CenterGlobal); + QTRY_COMPARE(QCursor::pos(), w1CenterGlobal); + QVERIFY(w1.isVisible()); + QTRY_COMPARE(w1.leave, 0); + QTRY_COMPARE(w1.enter, 1); // Check whether leave event is not delivered on mouse move - w1->move = 0; - QCursor::setPos(w1->mapToGlobal(w1->rect().center()) + QPoint(1, 1)); - QTRY_COMPARE(w1->move, 1); - QTRY_COMPARE(w1->leave, 0); - QTRY_COMPARE(w1->enter, 1); - - QCursor::setPos(cursorPos); - QTRY_COMPARE(w1->leave, 1); - QTRY_COMPARE(w1->enter, 1); + w1.move = 0; + QWidget *nativeParent = w1.nativeParentWidget(); + QVERIFY(nativeParent); + QWindow *window = nativeParent->windowHandle(); + QVERIFY(window); + QTest::mouseMove(window, w1.mapTo(nativeParent, w1Center + QPoint(1, 1))); + QTRY_COMPARE(w1.move, 1); + QTRY_COMPARE(w1.leave, 0); + QTRY_COMPARE(w1.enter, 1); + + QCursor::setPos(pointOutsideMenu); + QTRY_COMPARE(QCursor::pos(), pointOutsideMenu); + QTRY_COMPARE(w1.leave, 1); + QTRY_COMPARE(w1.enter, 1); } // Submenu { - menu1->setActiveAction(nextMenuAct); - QVERIFY(QTest::qWaitForWindowExposed(menu2.data())); + menu.setActiveAction(nextMenuAct); + QVERIFY(QTest::qWaitForWindowExposed(&submenu)); - QCursor::setPos(w2->mapToGlobal(w2->rect().center())); - QVERIFY(w2->isVisible()); - QTRY_COMPARE(w2->leave, 0); - QTRY_COMPARE(w2->enter, 1); + QPoint w2Center = w2.rect().center(); + const QPoint w2CenterGlobal = w2.mapToGlobal(w2Center); + QCursor::setPos(w2CenterGlobal); + QTRY_COMPARE(QCursor::pos(), w2CenterGlobal); + + QVERIFY(w2.isVisible()); + QTRY_COMPARE(w2.leave, 0); + QTRY_COMPARE(w2.enter, 1); // Check whether leave event is not delivered on mouse move - w2->move = 0; - QCursor::setPos(w2->mapToGlobal(w2->rect().center()) + QPoint(1, 1)); - QTRY_COMPARE(w2->move, 1); - QTRY_COMPARE(w2->leave, 0); - QTRY_COMPARE(w2->enter, 1); - - QCursor::setPos(cursorPos); - QTRY_COMPARE(w2->leave, 1); - QTRY_COMPARE(w2->enter, 1); + w2.move = 0; + QWidget *nativeParent = w2.nativeParentWidget(); + QVERIFY(nativeParent); + QWindow *window = nativeParent->windowHandle(); + QVERIFY(window); + QTest::mouseMove(window, w2.mapTo(nativeParent, w2Center + QPoint(1, 1))); + QTRY_COMPARE(w2.move, 1); + QTRY_COMPARE(w2.leave, 0); + QTRY_COMPARE(w2.enter, 1); + + QCursor::setPos(pointOutsideMenu); + QTRY_COMPARE(QCursor::pos(), pointOutsideMenu); + QTRY_COMPARE(w2.leave, 1); + QTRY_COMPARE(w2.enter, 1); } +#endif // QT_NO_CURSOR } -#endif // !QT_NO_CURSOR class MyMenu : public QMenu { |