diff options
author | Chris Adams <christopher.adams@nokia.com> | 2012-05-09 12:21:41 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-05-16 02:14:57 +0200 |
commit | 14e247e4b94df17ed62750b4468c2ac25aabe30f (patch) | |
tree | 59784d82bbc05887c6c11e7babdf9cc5575c345a /tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp | |
parent | b22496ba74c0106d949b970fb799fd3fa81243c4 (diff) |
Fix composite type property support
The metatype changes caused a regression in composite type properties
for which there was no autotest. In particular, declarative previously
used the transitional QMetaType::registerType() function, whose
implementation specifies a zero-size, which means that accessing a
property of that type via QObject::property would fail.
This commit adds some unit tests to track the issue, and also fixes the
implementation of QQmlEnginePrivate::registerCompositeType to use the
updated metatype registration functions.
Task-number: QTBUG-25697
Change-Id: Ic4abc1711aee8cf4a50a2ef1769465ef73f5d022
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@nokia.com>
Diffstat (limited to 'tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp')
-rw-r--r-- | tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp b/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp index a65693bb8f..3957dee062 100644 --- a/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp +++ b/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp @@ -135,6 +135,7 @@ private slots: void noContext(); void assignEmptyVariantMap(); void warnOnInvalidBinding(); + void registeredCompositeTypeProperty(); void copy(); private: @@ -189,6 +190,73 @@ void tst_qqmlproperty::qmlmetaproperty() delete obj; } +void tst_qqmlproperty::registeredCompositeTypeProperty() +{ + // Composite type properties + { + QQmlEngine engine; + QQmlComponent component(&engine, testFileUrl("registeredCompositeTypeProperty.qml")); + QObject *obj = component.create(); + QVERIFY(obj); + + // create property accessors and check types. + QQmlProperty p1(obj, "first"); + QQmlProperty p2(obj, "second"); + QQmlProperty p3(obj, "third"); + QVERIFY(p1.propertyType() == p2.propertyType()); + QVERIFY(p1.propertyType() != p3.propertyType()); + + // check that the values are retrievable from CPP + QVariant first = obj->property("first"); + QVariant second = obj->property("second"); + QVariant third = obj->property("third"); + QVERIFY(first.isValid()); + QVERIFY(second.isValid()); + QVERIFY(third.isValid()); + // ensure that conversion from qobject-derived-ptr to qobject-ptr works. + QVERIFY(first.value<QObject*>()); + QVERIFY(second.value<QObject*>()); + QVERIFY(third.value<QObject*>()); + + // check that the values retrieved via QQmlProperty match. + QCOMPARE(p1.read(), first); + QCOMPARE(p2.read(), second); + QCOMPARE(p3.read(), third); + + delete obj; + } + + // List-of-composite-type type properties + { + QQmlEngine engine; + QQmlComponent component(&engine, testFileUrl("registeredCompositeTypeProperty.qml")); + QObject *obj = component.create(); + QVERIFY(obj); + + // create list property accessors and check types + QQmlProperty lp1(obj, "fclist"); + QQmlProperty lp2(obj, "sclistOne"); + QQmlProperty lp3(obj, "sclistTwo"); + QVERIFY(lp1.propertyType() != lp2.propertyType()); + QVERIFY(lp2.propertyType() == lp3.propertyType()); + + // check that the list values are retrievable from CPP + QVariant firstList = obj->property("fclist"); + QVariant secondList = obj->property("sclistOne"); + QVariant thirdList = obj->property("sclistTwo"); + QVERIFY(firstList.isValid()); + QVERIFY(secondList.isValid()); + QVERIFY(thirdList.isValid()); + + // check that the values retrieved via QQmlProperty match. + QCOMPARE(lp1.read(), firstList); + QCOMPARE(lp2.read(), secondList); + QCOMPARE(lp3.read(), thirdList); + + delete obj; + } +} + class PropertyObject : public QObject { Q_OBJECT |