summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/global/qhooks/tst_qhooks.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/corelib/global/qhooks/tst_qhooks.cpp')
-rw-r--r--tests/auto/corelib/global/qhooks/tst_qhooks.cpp70
1 files changed, 70 insertions, 0 deletions
diff --git a/tests/auto/corelib/global/qhooks/tst_qhooks.cpp b/tests/auto/corelib/global/qhooks/tst_qhooks.cpp
index f0685d64c5..5fa7566e86 100644
--- a/tests/auto/corelib/global/qhooks/tst_qhooks.cpp
+++ b/tests/auto/corelib/global/qhooks/tst_qhooks.cpp
@@ -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"