diff options
author | Aaron Kennedy <aaron.kennedy@nokia.com> | 2011-10-05 18:15:03 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-10-06 07:55:45 +0200 |
commit | 6028d8ebceccc4edd7c31ba0d16773ae866336c3 (patch) | |
tree | 630de9c420b10b7f3b4146f2847962a878e915d4 /tests/auto/declarative/qdeclarativeincubator | |
parent | 466fe00e80fe80c0babc7b895882926c0a34b785 (diff) |
Always delete object if incubator is cancelled
Change-Id: Iad04340bac9d1345069e540e6bf9dbf671ce9226
Reviewed-on: http://codereview.qt-project.org/6088
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
Diffstat (limited to 'tests/auto/declarative/qdeclarativeincubator')
4 files changed, 79 insertions, 0 deletions
diff --git a/tests/auto/declarative/qdeclarativeincubator/data/clearDuringCompletion.qml b/tests/auto/declarative/qdeclarativeincubator/data/clearDuringCompletion.qml new file mode 100644 index 0000000000..556f460d58 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeincubator/data/clearDuringCompletion.qml @@ -0,0 +1,6 @@ +import Qt.test 1.0 + +SelfRegistering { + property variant a: CompletionRegistering {} + property variant b: CompletionRegistering {} +} diff --git a/tests/auto/declarative/qdeclarativeincubator/testtypes.cpp b/tests/auto/declarative/qdeclarativeincubator/testtypes.cpp index c1f07acb76..3ff15a71af 100644 --- a/tests/auto/declarative/qdeclarativeincubator/testtypes.cpp +++ b/tests/auto/declarative/qdeclarativeincubator/testtypes.cpp @@ -58,7 +58,32 @@ void SelfRegisteringType::clearMe() m_me = 0; } +CompletionRegisteringType *CompletionRegisteringType::m_me = 0; +CompletionRegisteringType::CompletionRegisteringType() +{ +} + +void CompletionRegisteringType::classBegin() +{ +} + +void CompletionRegisteringType::componentComplete() +{ + m_me = this; +} + +CompletionRegisteringType *CompletionRegisteringType::me() +{ + return m_me; +} + +void CompletionRegisteringType::clearMe() +{ + m_me = 0; +} + void registerTypes() { qmlRegisterType<SelfRegisteringType>("Qt.test", 1,0, "SelfRegistering"); + qmlRegisterType<CompletionRegisteringType>("Qt.test", 1,0, "CompletionRegistering"); } diff --git a/tests/auto/declarative/qdeclarativeincubator/testtypes.h b/tests/auto/declarative/qdeclarativeincubator/testtypes.h index a023410d1a..85ee4a6a9b 100644 --- a/tests/auto/declarative/qdeclarativeincubator/testtypes.h +++ b/tests/auto/declarative/qdeclarativeincubator/testtypes.h @@ -42,6 +42,7 @@ #define TESTTYPES_H #include <QtCore/qobject.h> +#include <QDeclarativeParserStatus> class SelfRegisteringType : public QObject { @@ -62,6 +63,22 @@ private: int m_v; }; +class CompletionRegisteringType : public QObject, public QDeclarativeParserStatus +{ +Q_OBJECT +public: + CompletionRegisteringType(); + + virtual void classBegin(); + virtual void componentComplete(); + + static CompletionRegisteringType *me(); + static void clearMe(); + +private: + static CompletionRegisteringType *m_me; +}; + void registerTypes(); #endif // TESTTYPES_H diff --git a/tests/auto/declarative/qdeclarativeincubator/tst_qdeclarativeincubator.cpp b/tests/auto/declarative/qdeclarativeincubator/tst_qdeclarativeincubator.cpp index e7fc77784b..f870ffb5cd 100644 --- a/tests/auto/declarative/qdeclarativeincubator/tst_qdeclarativeincubator.cpp +++ b/tests/auto/declarative/qdeclarativeincubator/tst_qdeclarativeincubator.cpp @@ -77,6 +77,7 @@ private slots: void noIncubationController(); void forceCompletion(); void setInitialState(); + void clearDuringCompletion(); private: QDeclarativeIncubationController controller; @@ -395,6 +396,36 @@ void tst_qdeclarativeincubator::setInitialState() } } +void tst_qdeclarativeincubator::clearDuringCompletion() +{ + CompletionRegisteringType::clearMe(); + SelfRegisteringType::clearMe(); + + QDeclarativeComponent component(&engine, TEST_FILE("clearDuringCompletion.qml")); + QVERIFY(component.isReady()); + + QDeclarativeIncubator incubator; + component.create(incubator); + + QCOMPARE(incubator.status(), QDeclarativeIncubator::Loading); + QVERIFY(CompletionRegisteringType::me() == 0); + + while (CompletionRegisteringType::me() == 0 && incubator.isLoading()) { + bool b = false; + controller.incubateWhile(&b); + } + + QVERIFY(CompletionRegisteringType::me() != 0); + QVERIFY(SelfRegisteringType::me() != 0); + QVERIFY(incubator.isLoading()); + + QPointer<QObject> srt = SelfRegisteringType::me(); + + incubator.clear(); + QVERIFY(incubator.isNull()); + QVERIFY(srt.isNull()); +} + QTEST_MAIN(tst_qdeclarativeincubator) #include "tst_qdeclarativeincubator.moc" |