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:
parent
1a3a8cf87b
commit
f817a995b2
@ -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"
|
||||
|
Loading…
x
Reference in New Issue
Block a user