diff options
Diffstat (limited to 'tests/auto/corelib/kernel/qobject/tst_qobject.cpp')
-rw-r--r-- | tests/auto/corelib/kernel/qobject/tst_qobject.cpp | 89 |
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" |