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 <richard.gustavsen@qt.io>
This commit is contained in:
Christian Ehrlicher 2017-12-23 14:07:48 +01:00
parent 0901d4290f
commit 52f1692b84

View File

@ -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("<b>NEW</b>"));
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<int> sizes = sp.sizes();
QWidget *sibling = srcIndex == -1 ? (new QLabel("<b>NEW</b>", &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);
}