tst_qquickmenu::popup: Make test less flaky

This test is very flaky when running it locally with the Material style.

Part of this has to do with the popup's x position sometimes being half
a pixel away from the intended location. Fix this by tolerating this
0.5 pixel difference. The reason behind this difference is currently
unknown.

Another issue is that we don't wait for the menu to close before
attempting to open it again.

Pick-to: 6.9 6.8
Fixes: QTBUG-133566
Change-Id: I08e68a87d477e6b3a9ea0b5b3350e5c8dc57919b
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
This commit is contained in:
Oliver Eftevaag 2025-02-07 14:04:36 +01:00 committed by Mitch Curtis
parent af41bb104d
commit cc6f5c40da
1 changed files with 20 additions and 11 deletions

View File

@ -1175,11 +1175,10 @@ void tst_QQuickMenu::popup()
const qreal elevenOrLeftMargin = qMax(qreal(11), menu->leftMargin()); const qreal elevenOrLeftMargin = qMax(qreal(11), menu->leftMargin());
const qreal twentyTwoOrTopMargin = qMax(qreal(22), menu->topMargin()); const qreal twentyTwoOrTopMargin = qMax(qreal(22), menu->topMargin());
// If the Menu has large margins, it may be moved to stay within them. // If the Menu has large margins, it may be moved to stay within them.
// QTBUG-75503: QTRY_COMPARE doesn't use qFuzzyCompare() in all cases, static QString errorStringXPos("The menu's x position was %1 and differed too much from %2");
// meaning a lot of these comparisons could trigger a 10 second wait; static QString errorStringYPos("The menu's y position was %1 and differed too much from %2");
// use QTRY_VERIFY and qFuzzyCompare instead. QTRY_VERIFY2(qAbs(menu->x() - elevenOrLeftMargin) <= 0.5, qPrintable(errorStringXPos.arg(menu->x()).arg(elevenOrLeftMargin)));
QTRY_VERIFY(qFuzzyCompare(menu->x(), elevenOrLeftMargin)); QTRY_VERIFY2(qAbs(menu->y() - twentyTwoOrTopMargin) <= 0.5, qPrintable(errorStringYPos.arg(menu->y()).arg(twentyTwoOrTopMargin)));
QTRY_VERIFY(qFuzzyCompare(menu->y(), twentyTwoOrTopMargin));
menu->close(); menu->close();
QVERIFY(QMetaObject::invokeMethod(window, "popupAtPos", Q_ARG(QVariant, QPointF(33, 44)))); QVERIFY(QMetaObject::invokeMethod(window, "popupAtPos", Q_ARG(QVariant, QPointF(33, 44))));
@ -1203,8 +1202,10 @@ void tst_QQuickMenu::popup()
QCOMPARE(menu->parentItem(), button); QCOMPARE(menu->parentItem(), button);
QCOMPARE(menu->currentIndex(), -1); QCOMPARE(menu->currentIndex(), -1);
QCOMPARE(menu->contentItem()->property("currentIndex").toInt(), -1); QCOMPARE(menu->contentItem()->property("currentIndex").toInt(), -1);
QTRY_VERIFY(qFuzzyCompare(menu->x(), button->mapFromScene(QPointF(elevenOrLeftMargin, twentyTwoOrTopMargin)).x())); QTRY_VERIFY2(qAbs(menu->x() - button->mapFromScene(QPointF(elevenOrLeftMargin, twentyTwoOrTopMargin)).x()) <= 0.5,
QTRY_VERIFY(qFuzzyCompare(menu->y(), button->mapFromScene(QPointF(elevenOrLeftMargin, twentyTwoOrTopMargin)).y())); qPrintable(errorStringXPos.arg(menu->x()).arg(button->mapFromScene(QPointF(elevenOrLeftMargin, twentyTwoOrTopMargin)).x())));
QTRY_VERIFY2(qAbs(menu->y() - button->mapFromScene(QPointF(elevenOrLeftMargin, twentyTwoOrTopMargin)).y()) <= 0.5,
qPrintable(errorStringYPos.arg(menu->y()).arg(button->mapFromScene(QPointF(elevenOrLeftMargin, twentyTwoOrTopMargin)).y())));
menu->close(); menu->close();
menu->setParentItem(nullptr); menu->setParentItem(nullptr);
@ -1228,6 +1229,7 @@ void tst_QQuickMenu::popup()
QTRY_VERIFY(qFuzzyCompare(menu->y(), -44)); QTRY_VERIFY(qFuzzyCompare(menu->y(), -44));
QCOMPARE(menu->popupItem()->mapToGlobal({0,0}).toPoint(), button->mapToGlobal({-33, -44}).toPoint()); QCOMPARE(menu->popupItem()->mapToGlobal({0,0}).toPoint(), button->mapToGlobal({-33, -44}).toPoint());
menu->close(); menu->close();
QTRY_VERIFY(!menu->isVisible());
const qreal twelveOrLeftMargin = qMax(qreal(12), menu->leftMargin()); const qreal twelveOrLeftMargin = qMax(qreal(12), menu->leftMargin());
cursorPos = window->mapToGlobal(QPoint(twelveOrLeftMargin, window->height() / 2)); cursorPos = window->mapToGlobal(QPoint(twelveOrLeftMargin, window->height() / 2));
@ -1242,9 +1244,10 @@ void tst_QQuickMenu::popup()
QCOMPARE(menu->currentIndex(), menuItems.indexOf(menuItem)); QCOMPARE(menu->currentIndex(), menuItems.indexOf(menuItem));
QCOMPARE(menu->contentItem()->property("currentIndex").toInt(), menuItems.indexOf(menuItem)); QCOMPARE(menu->contentItem()->property("currentIndex").toInt(), menuItems.indexOf(menuItem));
QTRY_VERIFY(menu->isOpened()); QTRY_VERIFY(menu->isOpened());
QVERIFY(qFuzzyCompare(menu->x(), twelveOrLeftMargin)); QTRY_VERIFY2(qAbs(menu->x() - twelveOrLeftMargin) <= 0.5, qPrintable(errorStringXPos.arg(menu->x()).arg(twelveOrLeftMargin)));
QVERIFY(qFuzzyCompare(menu->y(), window->height() / 2 - menu->topPadding() - menuItem->y())); QTRY_VERIFY(qFuzzyCompare(menu->y(), window->height() / 2 - menu->topPadding() - menuItem->y()));
menu->close(); menu->close();
QTRY_VERIFY(!menu->isVisible());
QVERIFY(QMetaObject::invokeMethod(window, "popupItemAtPos", Q_ARG(QVariant, QPointF(33, window->height() / 3)), Q_ARG(QVariant, QVariant::fromValue(menuItem)))); QVERIFY(QMetaObject::invokeMethod(window, "popupItemAtPos", Q_ARG(QVariant, QPointF(33, window->height() / 3)), Q_ARG(QVariant, QVariant::fromValue(menuItem))));
QCOMPARE(menu->currentIndex(), menuItems.indexOf(menuItem)); QCOMPARE(menu->currentIndex(), menuItems.indexOf(menuItem));
@ -1253,6 +1256,7 @@ void tst_QQuickMenu::popup()
QVERIFY(qFuzzyCompare(menu->x(), 33)); QVERIFY(qFuzzyCompare(menu->x(), 33));
QVERIFY(qFuzzyCompare(menu->y(), window->height() / 3 - menu->topPadding() - menuItem->y())); QVERIFY(qFuzzyCompare(menu->y(), window->height() / 3 - menu->topPadding() - menuItem->y()));
menu->close(); menu->close();
QTRY_VERIFY(!menu->isVisible());
QVERIFY(QMetaObject::invokeMethod(window, "popupItemAtCoord", Q_ARG(QVariant, 55), Q_ARG(QVariant, window->height() / 3 * 2), Q_ARG(QVariant, QVariant::fromValue(menuItem)))); QVERIFY(QMetaObject::invokeMethod(window, "popupItemAtCoord", Q_ARG(QVariant, 55), Q_ARG(QVariant, window->height() / 3 * 2), Q_ARG(QVariant, QVariant::fromValue(menuItem))));
QCOMPARE(menu->currentIndex(), menuItems.indexOf(menuItem)); QCOMPARE(menu->currentIndex(), menuItems.indexOf(menuItem));
@ -1261,6 +1265,7 @@ void tst_QQuickMenu::popup()
QVERIFY(qFuzzyCompare(menu->x(), 55)); QVERIFY(qFuzzyCompare(menu->x(), 55));
QVERIFY(qFuzzyCompare(menu->y(), window->height() / 3 * 2 - menu->topPadding() - menuItem->y())); QVERIFY(qFuzzyCompare(menu->y(), window->height() / 3 * 2 - menu->topPadding() - menuItem->y()));
menu->close(); menu->close();
QTRY_VERIFY(!menu->isVisible());
menu->setParentItem(nullptr); menu->setParentItem(nullptr);
QVERIFY(QMetaObject::invokeMethod(window, "popupItemAtParentCursor", Q_ARG(QVariant, QVariant::fromValue(button)), Q_ARG(QVariant, QVariant::fromValue(menuItem)))); QVERIFY(QMetaObject::invokeMethod(window, "popupItemAtParentCursor", Q_ARG(QVariant, QVariant::fromValue(button)), Q_ARG(QVariant, QVariant::fromValue(menuItem))));
@ -1268,9 +1273,11 @@ void tst_QQuickMenu::popup()
QCOMPARE(menu->currentIndex(), menuItems.indexOf(menuItem)); QCOMPARE(menu->currentIndex(), menuItems.indexOf(menuItem));
QCOMPARE(menu->contentItem()->property("currentIndex").toInt(), menuItems.indexOf(menuItem)); QCOMPARE(menu->contentItem()->property("currentIndex").toInt(), menuItems.indexOf(menuItem));
QTRY_VERIFY(menu->isOpened()); QTRY_VERIFY(menu->isOpened());
QVERIFY(qFuzzyCompare(menu->x(), button->mapFromScene(QPoint(twelveOrLeftMargin, window->height() / 2)).x())); QTRY_VERIFY2(qAbs(menu->x() - button->mapFromScene(QPoint(twelveOrLeftMargin, window->height() / 2)).x()) <= 0.5,
QVERIFY(qFuzzyCompare(menu->y(), button->mapFromScene(QPoint(twelveOrLeftMargin, window->height() / 2)).y() - menu->topPadding() - menuItem->y())); qPrintable(errorStringXPos.arg(menu->x()).arg(button->mapFromScene(QPoint(twelveOrLeftMargin, window->height() / 2)).x())));
QTRY_VERIFY(qFuzzyCompare(menu->y(), button->mapFromScene(QPoint(twelveOrLeftMargin, window->height() / 2)).y() - menu->topPadding() - menuItem->y()));
menu->close(); menu->close();
QTRY_VERIFY(!menu->isVisible());
menu->setParentItem(nullptr); menu->setParentItem(nullptr);
QVERIFY(QMetaObject::invokeMethod(window, "popupItemAtParentPos", Q_ARG(QVariant, QVariant::fromValue(button)), Q_ARG(QVariant, QPointF(-11, -22)), Q_ARG(QVariant, QVariant::fromValue(menuItem)))); QVERIFY(QMetaObject::invokeMethod(window, "popupItemAtParentPos", Q_ARG(QVariant, QVariant::fromValue(button)), Q_ARG(QVariant, QPointF(-11, -22)), Q_ARG(QVariant, QVariant::fromValue(menuItem))));
@ -1282,6 +1289,7 @@ void tst_QQuickMenu::popup()
QVERIFY(qFuzzyCompare(menu->y(), -22 - menu->topPadding() - menuItem->y())); QVERIFY(qFuzzyCompare(menu->y(), -22 - menu->topPadding() - menuItem->y()));
QCOMPARE(menu->popupItem()->mapToGlobal({0,0}).toPoint(), button->mapToGlobal({-11, -22 - menu->topPadding() - menuItem->y()}).toPoint()); QCOMPARE(menu->popupItem()->mapToGlobal({0,0}).toPoint(), button->mapToGlobal({-11, -22 - menu->topPadding() - menuItem->y()}).toPoint());
menu->close(); menu->close();
QTRY_VERIFY(!menu->isVisible());
menu->setParentItem(nullptr); menu->setParentItem(nullptr);
QVERIFY(QMetaObject::invokeMethod(window, "popupItemAtParentCoord", Q_ARG(QVariant, QVariant::fromValue(button)), Q_ARG(QVariant, -33), Q_ARG(QVariant, -44), Q_ARG(QVariant, QVariant::fromValue(menuItem)))); QVERIFY(QMetaObject::invokeMethod(window, "popupItemAtParentCoord", Q_ARG(QVariant, QVariant::fromValue(button)), Q_ARG(QVariant, -33), Q_ARG(QVariant, -44), Q_ARG(QVariant, QVariant::fromValue(menuItem))));
@ -1293,6 +1301,7 @@ void tst_QQuickMenu::popup()
QVERIFY(qFuzzyCompare(menu->y(), -44 - menu->topPadding() - menuItem->y())); QVERIFY(qFuzzyCompare(menu->y(), -44 - menu->topPadding() - menuItem->y()));
QCOMPARE(menu->popupItem()->mapToGlobal({0,0}).toPoint(), button->mapToGlobal({-33, -44 - menu->topPadding() - menuItem->y()}).toPoint()); QCOMPARE(menu->popupItem()->mapToGlobal({0,0}).toPoint(), button->mapToGlobal({-33, -44 - menu->topPadding() - menuItem->y()}).toPoint());
menu->close(); menu->close();
QTRY_VERIFY(!menu->isVisible());
} }
QCursor::setPos(oldCursorPos); QCursor::setPos(oldCursorPos);