summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2016-09-28 11:51:35 +0200
committerLiang Qi <liang.qi@qt.io>2016-09-28 11:51:35 +0200
commite918334045612ec2c7c6203845ad05c4a1972e87 (patch)
treeb59bf3a173c6bfa58c3ba9b5bb80df4a093247dc /tests/auto/corelib/kernel/qobject/tst_qobject.cpp
parente3cbf0f1962958457f6e09fcfdc92d8cac4b6511 (diff)
parentcf0119bb69592d58ca7e6a75753799ebae61e4b5 (diff)
Merge remote-tracking branch 'origin/5.6' into 5.7
Conflicts: src/widgets/dialogs/qcolordialog.cpp src/widgets/dialogs/qfiledialog.cpp tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp Change-Id: I34bc8a990f8f526889a95a5c7099ef557b9681ad
Diffstat (limited to 'tests/auto/corelib/kernel/qobject/tst_qobject.cpp')
-rw-r--r--tests/auto/corelib/kernel/qobject/tst_qobject.cpp76
1 files changed, 76 insertions, 0 deletions
diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
index b605b89f34..333305d603 100644
--- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
+++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
@@ -6532,6 +6532,29 @@ signals:
CountedStruct mySignal(const CountedStruct &s1, CountedStruct s2);
};
+class CountedExceptionThrower : public QObject
+{
+ Q_OBJECT
+
+public:
+ explicit CountedExceptionThrower(bool throwException, QObject *parent = Q_NULLPTR)
+ : QObject(parent)
+ {
+ if (throwException)
+ throw ObjectException();
+ ++counter;
+ }
+
+ ~CountedExceptionThrower()
+ {
+ --counter;
+ }
+
+ static int counter;
+};
+
+int CountedExceptionThrower::counter = 0;
+
void tst_QObject::exceptions()
{
#ifndef QT_NO_EXCEPTIONS
@@ -6593,6 +6616,59 @@ void tst_QObject::exceptions()
}
QCOMPARE(countedStructObjectsCount, 0);
+ // Child object reaping in case of exceptions thrown by constructors
+ {
+ QCOMPARE(CountedExceptionThrower::counter, 0);
+
+ try {
+ class ParentObject : public QObject {
+ public:
+ explicit ParentObject(QObject *parent = Q_NULLPTR)
+ : QObject(parent)
+ {
+ new CountedExceptionThrower(false, this);
+ new CountedExceptionThrower(false, this);
+ new CountedExceptionThrower(true, this); // throws
+ }
+ };
+
+ ParentObject p;
+ QFAIL("Exception not thrown");
+ } catch (const ObjectException &) {
+ } catch (...) {
+ QFAIL("Wrong exception thrown");
+ }
+
+ QCOMPARE(CountedExceptionThrower::counter, 0);
+
+ try {
+ QObject o;
+ new CountedExceptionThrower(false, &o);
+ new CountedExceptionThrower(false, &o);
+ new CountedExceptionThrower(true, &o); // throws
+
+ QFAIL("Exception not thrown");
+ } catch (const ObjectException &) {
+ } catch (...) {
+ QFAIL("Wrong exception thrown");
+ }
+
+ QCOMPARE(CountedExceptionThrower::counter, 0);
+
+ try {
+ QObject o;
+ CountedExceptionThrower c1(false, &o);
+ CountedExceptionThrower c2(false, &o);
+ CountedExceptionThrower c3(true, &o); // throws
+
+ QFAIL("Exception not thrown");
+ } catch (const ObjectException &) {
+ } catch (...) {
+ QFAIL("Wrong exception thrown");
+ }
+
+ QCOMPARE(CountedExceptionThrower::counter, 0);
+ }
#else
QSKIP("Needs exceptions");