diff options
author | Aaron Kennedy <aaron.kennedy@nokia.com> | 2009-10-07 13:33:32 (GMT) |
---|---|---|
committer | Aaron Kennedy <aaron.kennedy@nokia.com> | 2009-10-08 03:25:50 (GMT) |
commit | 60a5afb67efcefa74cf452379dcef46b83daa265 (patch) | |
tree | 322711feaaad46c8c1945e6fab99f2b5ba805f4d /tests | |
parent | d07270161ef3d1c4b3ed29110a16eaff54333fd5 (diff) | |
download | Qt-60a5afb67efcefa74cf452379dcef46b83daa265.zip Qt-60a5afb67efcefa74cf452379dcef46b83daa265.tar.gz Qt-60a5afb67efcefa74cf452379dcef46b83daa265.tar.bz2 |
Self deleting binding test
Diffstat (limited to 'tests')
4 files changed, 63 insertions, 0 deletions
diff --git a/tests/auto/declarative/qmlecmascript/data/selfDeletingBinding.2.qml b/tests/auto/declarative/qmlecmascript/data/selfDeletingBinding.2.qml new file mode 100644 index 0000000..58cf805 --- /dev/null +++ b/tests/auto/declarative/qmlecmascript/data/selfDeletingBinding.2.qml @@ -0,0 +1,17 @@ +import Qt.test 1.0 + +MyQmlContainer { + property bool triggerDelete: false + + children: [ + MyQmlObject { + // Will trigger deletion on binding assignment + deleteOnSet: Math.max(0, 1) + }, + + MyQmlObject { + // Will trigger deletion on binding assignment, but after component creation + deleteOnSet: if (triggerDelete) 1; else 0; + } + ] +} diff --git a/tests/auto/declarative/qmlecmascript/data/selfDeletingBinding.qml b/tests/auto/declarative/qmlecmascript/data/selfDeletingBinding.qml new file mode 100644 index 0000000..074851a --- /dev/null +++ b/tests/auto/declarative/qmlecmascript/data/selfDeletingBinding.qml @@ -0,0 +1,18 @@ +import Qt.test 1.0 + +MyQmlContainer { + property bool triggerDelete: false + + children: [ + MyQmlObject { + // Will trigger deletion during binding evaluation + stringProperty: {deleteMe(), "Hello"} + }, + + MyQmlObject { + // Will trigger deletion during binding evaluation, but after component creation + stringProperty: if (triggerDelete) { deleteMe(), "Hello" } else { "World" } + } + + ] +} diff --git a/tests/auto/declarative/qmlecmascript/testtypes.h b/tests/auto/declarative/qmlecmascript/testtypes.h index ffc8fec..e6c2c20 100644 --- a/tests/auto/declarative/qmlecmascript/testtypes.h +++ b/tests/auto/declarative/qmlecmascript/testtypes.h @@ -23,6 +23,7 @@ class MyQmlObject : public QObject Q_OBJECT Q_ENUMS(MyEnum) Q_ENUMS(MyEnum2) + Q_PROPERTY(int deleteOnSet READ deleteOnSet WRITE setDeleteOnSet); Q_PROPERTY(bool trueProperty READ trueProperty CONSTANT) Q_PROPERTY(bool falseProperty READ falseProperty CONSTANT) Q_PROPERTY(QString stringProperty READ stringProperty WRITE setStringProperty NOTIFY stringChanged) @@ -61,6 +62,9 @@ public: static MyQmlAttachedObject *qmlAttachedProperties(QObject *o) { return new MyQmlAttachedObject(o); } + + int deleteOnSet() const { return 1; } + void setDeleteOnSet(int v) { if(v) delete this; } signals: void basicSignal(); void argumentSignal(int a, QString b, qreal c); @@ -68,6 +72,7 @@ signals: void objectChanged(); public slots: + void deleteMe() { delete this; } void method() { m_methodCalled = true; } void method(int a) { if(a == 163) m_methodIntCalled = true; } void setString(const QString &s) { m_string = s; } diff --git a/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp b/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp index 51f1ce7..6bc88c0 100644 --- a/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp +++ b/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp @@ -59,6 +59,7 @@ private slots: void dynamicCreation(); void dynamicDestruction(); void objectToString(); + void selfDeletingBinding(); private: QmlEngine engine; @@ -686,6 +687,28 @@ void tst_qmlecmascript::objectToString() QVERIFY(object->stringProperty().endsWith(", \"objName\")")); } +/* +Tests bindings that indirectly cause their own deletion work. + +This test is best run under valgrind to ensure no invalid memory access occur. +*/ +void tst_qmlecmascript::selfDeletingBinding() +{ + { + QmlComponent component(&engine, TEST_FILE("selfDeletingBinding.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + object->setProperty("triggerDelete", true); + } + + { + QmlComponent component(&engine, TEST_FILE("selfDeletingBinding.2.qml")); + QObject *object = component.create(); + QVERIFY(object != 0); + object->setProperty("triggerDelete", true); + } +} + QTEST_MAIN(tst_qmlecmascript) #include "tst_qmlecmascript.moc" |