tst_qhooks: test that it's possible to chain multiple hooks together

Chaining hooks together was mentioned by Ossi in the comments of
d953d9a4. This patch justs add a test that verifies that it works, and
also serves as an informal example for developers looking how to do it.

Change-Id: I53a014d5663c289ea0559e0926ed301f4e5110e6
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Mitch Curtis 2016-11-14 12:16:20 +01:00
parent 1a3a8cf87b
commit f817a995b2

View File

@ -35,10 +35,18 @@ class tst_QHooks: public QObject
Q_OBJECT
private slots:
void cleanup();
void testVersion();
void testAddRemoveObject();
void testChaining();
};
void tst_QHooks::cleanup()
{
qtHookData[QHooks::AddQObject] = 0;
qtHookData[QHooks::RemoveQObject] = 0;
}
void tst_QHooks::testVersion()
{
QVERIFY(qtHookData[QHooks::HookDataVersion] >= 3);
@ -73,5 +81,67 @@ void tst_QHooks::testAddRemoveObject()
QCOMPARE(objectCount, 0);
}
static QVector<QString> hookOrder;
static QHooks::AddQObjectCallback existingAddHook = 0;
static QHooks::RemoveQObjectCallback existingRemoveHook = 0;
static void firstAddHook(QObject *)
{
hookOrder.append(QLatin1String("firstAddHook"));
}
static void firstRemoveHook(QObject *)
{
hookOrder.append(QLatin1String("firstRemoveHook"));
}
static void secondAddHook(QObject *object)
{
if (existingAddHook)
existingAddHook(object);
hookOrder.append(QLatin1String("secondAddHook"));
}
static void secondRemoveHook(QObject *object)
{
if (existingRemoveHook)
existingRemoveHook(object);
hookOrder.append(QLatin1String("secondRemoveHook"));
}
// Tests that it's possible to "chain" hooks together (i.e. have multiple hooks)
void tst_QHooks::testChaining()
{
QCOMPARE(qtHookData[QHooks::AddQObject], (quintptr)0);
QCOMPARE(qtHookData[QHooks::RemoveQObject], (quintptr)0);
// Set the add and remove hooks (could just skip this and go straight to the next step,
// but it's for illustrative purposes).
qtHookData[QHooks::AddQObject] = (quintptr)&firstAddHook;
qtHookData[QHooks::RemoveQObject] = (quintptr)&firstRemoveHook;
// Store them so that we can call them later.
existingAddHook = reinterpret_cast<QHooks::AddQObjectCallback>(qtHookData[QHooks::AddQObject]);
existingRemoveHook = reinterpret_cast<QHooks::RemoveQObjectCallback>(qtHookData[QHooks::RemoveQObject]);
// Overide them with hooks that call them first.
qtHookData[QHooks::AddQObject] = (quintptr)&secondAddHook;
qtHookData[QHooks::RemoveQObject] = (quintptr)&secondRemoveHook;
QObject *obj = new QObject;
QCOMPARE(hookOrder.size(), 2);
QCOMPARE(hookOrder.at(0), QLatin1String("firstAddHook"));
QCOMPARE(hookOrder.at(1), QLatin1String("secondAddHook"));
delete obj;
QCOMPARE(hookOrder.size(), 4);
QCOMPARE(hookOrder.at(2), QLatin1String("firstRemoveHook"));
QCOMPARE(hookOrder.at(3), QLatin1String("secondRemoveHook"));
hookOrder.clear();
}
QTEST_APPLESS_MAIN(tst_QHooks)
#include "tst_qhooks.moc"