summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/corelib/kernel/qobject/tst_qobject.cpp')
-rw-r--r--tests/auto/corelib/kernel/qobject/tst_qobject.cpp89
1 files changed, 87 insertions, 2 deletions
diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
index cefbf6a17b..581644b19f 100644
--- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
+++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
@@ -141,6 +141,7 @@ private slots:
void returnValue2();
void connectVirtualSlots();
void connectFunctorArgDifference();
+ void disconnectDoesNotLeakFunctor();
};
class SenderObject : public QObject
@@ -4892,8 +4893,6 @@ void tst_QObject::connectCxx0xTypeMatching()
QVERIFY(QObject::connect(&obj, &Foo::const_signal_vi, &obj, &Foo::slot_vi));
QVERIFY(QObject::connect(&obj, &Foo::signal_vi, &obj, &Foo::const_slot_vi));
QVERIFY(QObject::connect(&obj, &Foo::signal_vi, &obj, &Foo::const_slot_v));
-
- QVERIFY(true); //compilation only test
}
class StringVariant : public QObject
@@ -5571,5 +5570,91 @@ void tst_QObject::connectFunctorArgDifference()
QVERIFY(true);
}
+static int countedStructObjectsCount = 0;
+struct CountedStruct
+{
+ CountedStruct() { ++countedStructObjectsCount; }
+ CountedStruct(const CountedStruct &) { ++countedStructObjectsCount; }
+ CountedStruct &operator=(const CountedStruct &) { return *this; }
+ ~CountedStruct() { --countedStructObjectsCount; }
+ void operator()() const {}
+};
+
+void tst_QObject::disconnectDoesNotLeakFunctor()
+{
+ QCOMPARE(countedStructObjectsCount, 0);
+ {
+ QMetaObject::Connection c;
+ {
+ CountedStruct s;
+ QCOMPARE(countedStructObjectsCount, 1);
+ QTimer timer;
+
+ c = connect(&timer, &QTimer::timeout, s);
+ QVERIFY(c);
+ QCOMPARE(countedStructObjectsCount, 2);
+ QVERIFY(QObject::disconnect(c));
+ QCOMPARE(countedStructObjectsCount, 1);
+ }
+ QCOMPARE(countedStructObjectsCount, 0);
+ }
+ QCOMPARE(countedStructObjectsCount, 0);
+ {
+ QMetaObject::Connection c1, c2;
+ {
+ CountedStruct s;
+ QCOMPARE(countedStructObjectsCount, 1);
+ QTimer timer;
+
+ c1 = connect(&timer, &QTimer::timeout, s);
+ QVERIFY(c1);
+ c2 = c1;
+ QVERIFY(c2);
+ QCOMPARE(countedStructObjectsCount, 2);
+ QVERIFY(QObject::disconnect(c1));
+ // functor object has been destroyed
+ QCOMPARE(countedStructObjectsCount, 1);
+ }
+ QCOMPARE(countedStructObjectsCount, 0);
+ }
+ QCOMPARE(countedStructObjectsCount, 0);
+ {
+ CountedStruct s;
+ QCOMPARE(countedStructObjectsCount, 1);
+ QTimer timer;
+
+ QMetaObject::Connection c = connect(&timer, &QTimer::timeout, s);
+ QVERIFY(c);
+ QCOMPARE(countedStructObjectsCount, 2);
+ QVERIFY(QObject::disconnect(c));
+ QCOMPARE(countedStructObjectsCount, 1);
+ }
+ QCOMPARE(countedStructObjectsCount, 0);
+ {
+ QTimer timer;
+
+ QMetaObject::Connection c = connect(&timer, &QTimer::timeout, CountedStruct());
+ QVERIFY(c);
+ QCOMPARE(countedStructObjectsCount, 1); // only one instance, in Qt internals
+ QVERIFY(QObject::disconnect(c));
+ QCOMPARE(countedStructObjectsCount, 0); // functor being destroyed
+ }
+ QCOMPARE(countedStructObjectsCount, 0);
+ {
+#if defined(Q_COMPILER_LAMBDA)
+ CountedStruct s;
+ QCOMPARE(countedStructObjectsCount, 1);
+ QTimer timer;
+
+ QMetaObject::Connection c = connect(&timer, &QTimer::timeout, [s](){});
+ QVERIFY(c);
+ QCOMPARE(countedStructObjectsCount, 2);
+ QVERIFY(QObject::disconnect(c));
+ QCOMPARE(countedStructObjectsCount, 1);
+#endif // Q_COMPILER_LAMBDA
+ }
+ QCOMPARE(countedStructObjectsCount, 0);
+}
+
QTEST_MAIN(tst_QObject)
#include "tst_qobject.moc"