summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@digia.com>2013-01-03 14:20:01 +0100
committerFrederik Gladhorn <frederik.gladhorn@digia.com>2013-01-04 11:12:05 +0100
commitca2f44680cb97e7a7c46ee0ab26654822fe65e2d (patch)
treeb9d85ad8ec1b18a6aa56b7657812cf3791bdf72e /tests/auto/corelib/kernel/qobject/tst_qobject.cpp
parent28a21d98ef8d880a6dd86ee19dd803424bb5eae1 (diff)
parent83188c6499ccdc87c0a2c468bb497e287f5db369 (diff)
Merge branch 'stable' into dev
Conflicts: examples/widgets/painting/shared/shared.pri src/corelib/tools/qharfbuzz_p.h src/corelib/tools/qunicodetools.cpp src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp src/plugins/platforms/windows/qwindowsfontdatabase.cpp Change-Id: Ibc9860abf570e5ce8b052fb88feb73ec35e64bd3
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"