From 52f1692b8451ac5b1e6fc059211e843bacc5c245 Mon Sep 17 00:00:00 2001 From: Christian Ehrlicher Date: Sat, 23 Dec 2017 14:07:48 +0100 Subject: tst_QSplitter::replaceWidget: explicit wait for events Wait a little bit longer for the visibility and resize events. By directly waiting for the incoming events with QTRY_COMPARE we give the test some more time to deliver the expected events. Also move the check for the expectedResizeCount/expectedPaintCount before the geometry check for better debugging. Task-number: QTBUG-64639 Change-Id: I712e432aa8f8d35dd199adf88af3653009528b57 Reviewed-by: Richard Moe Gustavsen --- .../widgets/widgets/qsplitter/tst_qsplitter.cpp | 57 +++++++++++++++------- 1 file changed, 39 insertions(+), 18 deletions(-) (limited to 'tests/auto/widgets/widgets/qsplitter') diff --git a/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp b/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp index 80c12c0bd2..cad7bd69d7 100644 --- a/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp +++ b/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp @@ -658,13 +658,34 @@ public: class EventCounterSpy : public QObject { public: - EventCounterSpy(QWidget *parentWidget) : QObject(parentWidget) + EventCounterSpy(QWidget *obj) : objectToWatch(obj) { } + ~EventCounterSpy() + { + removeEventFilter(); + } + + void installEventFilter() + { + if (needRemoveEventFilter) + return; + needRemoveEventFilter = true; + qApp->installEventFilter(this); + } + + void removeEventFilter() + { + if (!needRemoveEventFilter) + return; + needRemoveEventFilter = false; + qApp->removeEventFilter(this); + } + bool eventFilter(QObject *watched, QEvent *event) override { // Watch for events in the parent widget and all its children - if (watched == parent() || watched->parent() == parent()) { + if (watched == objectToWatch || watched->parent() == objectToWatch) { if (event->type() == QEvent::Resize) resizeCount++; else if (event->type() == QEvent::Paint) @@ -676,6 +697,8 @@ public: int resizeCount = 0; int paintCount = 0; + bool needRemoveEventFilter = false; + QObject *objectToWatch; }; void tst_QSplitter::replaceWidget_data() @@ -733,31 +756,30 @@ void tst_QSplitter::replaceWidget() // to set a shorter label. QLabel *newWidget = new QLabel(QLatin1String("NEW")); - EventCounterSpy *ef = new EventCounterSpy(&sp); - qApp->installEventFilter(ef); + EventCounterSpy ef(&sp); + ef.installEventFilter(); const QWidget *res = sp.replaceWidget(index, newWidget); QTest::qWait(100); // Give visibility and resizing some time - qApp->removeEventFilter(ef); // Check if (index < 0 || index >= count) { QVERIFY(!res); QVERIFY(!newWidget->parentWidget()); - QCOMPARE(ef->resizeCount, 0); - QCOMPARE(ef->paintCount, 0); + QCOMPARE(ef.resizeCount, 0); + QCOMPARE(ef.paintCount, 0); } else { QCOMPARE(res, oldWidget); QVERIFY(!res->parentWidget()); QVERIFY(!res->isVisible()); + const int expectedResizeCount = visible ? 1 : 0; // new widget only + const int expectedPaintCount = visible && !collapsed ? 2 : 0; // splitter and new widget + QTRY_COMPARE(ef.resizeCount, expectedResizeCount); + QTRY_COMPARE(ef.paintCount, expectedPaintCount); QCOMPARE(newWidget->parentWidget(), &sp); QCOMPARE(newWidget->isVisible(), visible); if (visible && !collapsed) QCOMPARE(newWidget->geometry(), oldGeom); QCOMPARE(newWidget->size().isEmpty(), !visible || collapsed); - const int expectedResizeCount = visible ? 1 : 0; // new widget only - const int expectedPaintCount = visible && !collapsed ? 2 : 0; // splitter and new widget - QCOMPARE(ef->resizeCount, expectedResizeCount); - QCOMPARE(ef->paintCount, expectedPaintCount); delete res; } QCOMPARE(sp.count(), count); @@ -797,25 +819,24 @@ void tst_QSplitter::replaceWidgetWithSplitterChild() const QList sizes = sp.sizes(); QWidget *sibling = srcIndex == -1 ? (new QLabel("NEW", &sp)) : sp.widget(srcIndex); - EventCounterSpy *ef = new EventCounterSpy(&sp); - qApp->installEventFilter(ef); + EventCounterSpy ef(&sp); + ef.installEventFilter(); const QWidget *res = sp.replaceWidget(dstIndex, sibling); QTest::qWait(100); // Give visibility and resizing some time - qApp->removeEventFilter(ef); QVERIFY(!res); if (srcIndex == -1) { // Create and replace before recalc. The sibling is scheduled to be // added after replaceWidget(), when QSplitter receives a child event. - QVERIFY(ef->resizeCount > 0); - QVERIFY(ef->paintCount > 0); + QTRY_VERIFY(ef.resizeCount > 0); + QTRY_VERIFY(ef.paintCount > 0); QCOMPARE(sp.count(), count + 1); QCOMPARE(sp.sizes().mid(0, count), sizes); QCOMPARE(sp.sizes().last(), sibling->width()); } else { // No-op for the rest - QCOMPARE(ef->resizeCount, 0); - QCOMPARE(ef->paintCount, 0); + QCOMPARE(ef.resizeCount, 0); + QCOMPARE(ef.paintCount, 0); QCOMPARE(sp.count(), count); QCOMPARE(sp.sizes(), sizes); } -- cgit v1.2.3