From 679ad1d22e359c9ef647a0f649f4fb51d47f9978 Mon Sep 17 00:00:00 2001 From: Axel Spoerl Date: Fri, 30 Dec 2022 10:15:51 +0100 Subject: [PATCH] Stabilize tst_QSpinBox::sizeHint() The test function used to flake on Linux occasionally. 8e6ede7cd131682161180bfab0cc46686674709b provided a fix. While it seemed to work, further analysis has shown that the root cause is event sequence in case of multiple paint events. This patch re-engineers the test function: 1. Allocate test widget on the stack instead of the heap. 2. Send layout requests posted by QHBoxLayout constructor and QLayout::addWidget() before showing the widget. 3. Remove calls to QCoreApplication::processEvents(). They are unnessecary, because - the size hint request counter is supposed to increase (by any number) - QTRY_VERIFY processes events anyway until the counter increases or it times out. Change-Id: I54998483725cbdd4899ba6f5469d7dae0980ab1d Reviewed-by: Friedemann Kleint (cherry picked from commit 71e67dec957d41d55ae03f32613a80394c928352) Reviewed-by: Qt Cherry-pick Bot --- .../widgets/widgets/qspinbox/tst_qspinbox.cpp | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp b/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp index fd34d26e10e..928d7f9c4eb 100644 --- a/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp +++ b/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp @@ -1152,34 +1152,32 @@ public: void tst_QSpinBox::sizeHint() { - QWidget *widget = new QWidget; - QHBoxLayout *layout = new QHBoxLayout(widget); - widget->setLayout(layout); + QWidget widget; + QHBoxLayout *layout = new QHBoxLayout(&widget); + sizeHint_SpinBox *spinBox = new sizeHint_SpinBox; layout->addWidget(spinBox); - widget->show(); - QVERIFY(QTest::qWaitForWindowExposed(widget)); + // Make sure all layout requests posted by the QHBoxLayout constructor and addWidget + // are processed before the widget is shown + QCoreApplication::sendPostedEvents(&widget, QEvent::LayoutRequest); + widget.show(); + QVERIFY(QTest::qWaitForWindowExposed(&widget)); // Prefix spinBox->sizeHintRequests = 0; spinBox->setPrefix(QLatin1String("abcdefghij")); - qApp->processEvents(); QTRY_VERIFY(spinBox->sizeHintRequests > 0); // Suffix spinBox->sizeHintRequests = 0; spinBox->setSuffix(QLatin1String("abcdefghij")); - qApp->processEvents(); QTRY_VERIFY(spinBox->sizeHintRequests > 0); // Range spinBox->sizeHintRequests = 0; spinBox->setRange(0, 1234567890); spinBox->setValue(spinBox->maximum()); - qApp->processEvents(); QTRY_VERIFY(spinBox->sizeHintRequests > 0); - - delete widget; } void tst_QSpinBox::taskQTBUG_5008_textFromValueAndValidate()