diff options
Diffstat (limited to 'tests/auto/declarative/qdeclarativeincubator')
3 files changed, 64 insertions, 0 deletions
diff --git a/tests/auto/declarative/qdeclarativeincubator/data/recursiveClear.1.qml b/tests/auto/declarative/qdeclarativeincubator/data/recursiveClear.1.qml new file mode 100644 index 0000000000..748a3f0cbf --- /dev/null +++ b/tests/auto/declarative/qdeclarativeincubator/data/recursiveClear.1.qml @@ -0,0 +1,9 @@ +import QtQuick 2.0 + +Rectangle { + objectName: "switchMe" + signal switchMe + width: 100; height: 100 + color: "green" + Component.onCompleted: switchMe() +} diff --git a/tests/auto/declarative/qdeclarativeincubator/data/recursiveClear.2.qml b/tests/auto/declarative/qdeclarativeincubator/data/recursiveClear.2.qml new file mode 100644 index 0000000000..e96ac00f21 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeincubator/data/recursiveClear.2.qml @@ -0,0 +1,8 @@ +import QtQuick 2.0 + +Rectangle { + objectName: "blue" + width: 100 + height: 100 + color: "blue" +} diff --git a/tests/auto/declarative/qdeclarativeincubator/tst_qdeclarativeincubator.cpp b/tests/auto/declarative/qdeclarativeincubator/tst_qdeclarativeincubator.cpp index f870ffb5cd..52ddf81602 100644 --- a/tests/auto/declarative/qdeclarativeincubator/tst_qdeclarativeincubator.cpp +++ b/tests/auto/declarative/qdeclarativeincubator/tst_qdeclarativeincubator.cpp @@ -78,6 +78,7 @@ private slots: void forceCompletion(); void setInitialState(); void clearDuringCompletion(); + void recursiveClear(); private: QDeclarativeIncubationController controller; @@ -422,10 +423,56 @@ void tst_qdeclarativeincubator::clearDuringCompletion() QPointer<QObject> srt = SelfRegisteringType::me(); incubator.clear(); + QCoreApplication::processEvents(QEventLoop::DeferredDeletion); QVERIFY(incubator.isNull()); QVERIFY(srt.isNull()); } +class Switcher : public QObject +{ + Q_OBJECT +public: + Switcher(QDeclarativeEngine *e) : QObject(), engine(e) { } + + struct MyIncubator : public QDeclarativeIncubator + { + MyIncubator(QDeclarativeIncubator::IncubationMode mode, QObject *s) + : QDeclarativeIncubator(mode), switcher(s) {} + + virtual void setInitialState(QObject *o) { + if (o->objectName() == "switchMe") + connect(o, SIGNAL(switchMe()), switcher, SLOT(switchIt())); + } + + QObject *switcher; + }; + + void start() + { + incubator = new MyIncubator(QDeclarativeIncubator::Synchronous, this); + component = new QDeclarativeComponent(engine, TEST_FILE("recursiveClear.1.qml")); + component->create(*incubator); + } + + QDeclarativeEngine *engine; + MyIncubator *incubator; + QDeclarativeComponent *component; + +public slots: + void switchIt() { + component->deleteLater(); + incubator->clear(); + component = new QDeclarativeComponent(engine, TEST_FILE("recursiveClear.2.qml")); + component->create(*incubator); + } +}; + +void tst_qdeclarativeincubator::recursiveClear() +{ + Switcher switcher(&engine); + switcher.start(); +} + QTEST_MAIN(tst_qdeclarativeincubator) #include "tst_qdeclarativeincubator.moc" |