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
|
Q_OBJECT
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
void cleanup();
|
||||||
void testVersion();
|
void testVersion();
|
||||||
void testAddRemoveObject();
|
void testAddRemoveObject();
|
||||||
|
void testChaining();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void tst_QHooks::cleanup()
|
||||||
|
{
|
||||||
|
qtHookData[QHooks::AddQObject] = 0;
|
||||||
|
qtHookData[QHooks::RemoveQObject] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
void tst_QHooks::testVersion()
|
void tst_QHooks::testVersion()
|
||||||
{
|
{
|
||||||
QVERIFY(qtHookData[QHooks::HookDataVersion] >= 3);
|
QVERIFY(qtHookData[QHooks::HookDataVersion] >= 3);
|
||||||
@ -73,5 +81,67 @@ void tst_QHooks::testAddRemoveObject()
|
|||||||
QCOMPARE(objectCount, 0);
|
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)
|
QTEST_APPLESS_MAIN(tst_QHooks)
|
||||||
#include "tst_qhooks.moc"
|
#include "tst_qhooks.moc"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user