diff options
author | Thomas Hartmann <thomas.hartmann@qt.io> | 2020-11-09 18:49:23 +0100 |
---|---|---|
committer | Thomas Hartmann <thomas.hartmann@qt.io> | 2020-11-11 11:46:08 +0100 |
commit | 25c5ace02747753c524960abbf6fb81de1d11c6d (patch) | |
tree | 2c470ac88db0b899cbcacfbe2da45a393d53b482 /tests | |
parent | f0908255c9921371d886eff0b8ce245929b50d88 (diff) |
DesignerSupport: Add more tests for QQuickDesignerSupport
This patch adds a few more test cases.
Change-Id: Ia2c4e016db57ef9cc6fccc1d4cfba6154068a5ff
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'tests')
3 files changed, 185 insertions, 1 deletions
diff --git a/tests/auto/quick/qquickdesignersupport/data/bindingTest.qml b/tests/auto/quick/qquickdesignersupport/data/bindingTest.qml new file mode 100644 index 0000000000..8d3e7dfa37 --- /dev/null +++ b/tests/auto/quick/qquickdesignersupport/data/bindingTest.qml @@ -0,0 +1,20 @@ +import QtQuick 2.9 +import QtQuick.Window 2.3 + +Rectangle { + id: rect + width: 640 + height: 480 + color: "red" + objectName: "root" + + Text { + objectName: "text" + text: qsTr("Some Text") + rect.width + font.bold: true + font.italic: false + } + Item { + objectName: "item" + } +} diff --git a/tests/auto/quick/qquickdesignersupport/qquickdesignersupport.pro b/tests/auto/quick/qquickdesignersupport/qquickdesignersupport.pro index 6212a996f1..cd44631e7c 100644 --- a/tests/auto/quick/qquickdesignersupport/qquickdesignersupport.pro +++ b/tests/auto/quick/qquickdesignersupport/qquickdesignersupport.pro @@ -16,4 +16,5 @@ DISTFILES += \ data/test.qml \ data/componentTest.qml \ data/Component01.qml \ - data/Component02.qml + data/Component02.qml \ + data/bindingTest.qml diff --git a/tests/auto/quick/qquickdesignersupport/tst_qquickdesignersupport.cpp b/tests/auto/quick/qquickdesignersupport/tst_qquickdesignersupport.cpp index a4ef25be92..555128e5da 100644 --- a/tests/auto/quick/qquickdesignersupport/tst_qquickdesignersupport.cpp +++ b/tests/auto/quick/qquickdesignersupport/tst_qquickdesignersupport.cpp @@ -62,8 +62,70 @@ private slots: void testNotifyPropertyChangeCallBack(); void testFixResourcePathsForObjectCallBack(); void testComponentOnCompleteSignal(); + void testSimpleBindings(); + void testDotProperties(); + void testItemReparenting(); }; + +static bool isList(const QQmlProperty &property) +{ + return property.propertyTypeCategory() == QQmlProperty::List; +} + +static bool isObject(const QQmlProperty &property) +{ + return property.isValid() && (property.propertyTypeCategory() == QQmlProperty::Object + || !strcmp(property.propertyTypeName(), "QVariant")); +} + +static QVariant objectToVariant(QObject *object) +{ + return QVariant::fromValue(object); +} + +void addToNewProperty(QObject *object, QObject *newParent, const QByteArray &newParentProperty) +{ + QQmlProperty property(newParent, QString::fromUtf8(newParentProperty)); + + if (object) + object->setParent(newParent); + + if (isList(property)) { + QQmlListReference list = qvariant_cast<QQmlListReference>(property.read()); + list.append(object); + } else if (isObject(property)) { + property.write(objectToVariant(object)); + + if (QQuickItem *item = qobject_cast<QQuickItem *>(object)) + if (QQuickItem *newParentItem = qobject_cast<QQuickItem *>(newParent)) + item->setParentItem(newParentItem); + } + + Q_ASSERT(objectToVariant(object).isValid()); +} + +static void removeObjectFromList(const QQmlProperty &property, QObject *objectToBeRemoved, QQmlEngine * engine) +{ + QQmlListReference listReference(property.object(), property.name().toUtf8(), engine); + + int count = listReference.count(); + + QObjectList objectList; + + for (int i = 0; i < count; i ++) { + QObject *listItem = listReference.at(i); + if (listItem && listItem != objectToBeRemoved) + objectList.append(listItem); + } + + listReference.clear(); + + for (QObject *object : objectList) + listReference.append(object); +} + + void tst_qquickdesignersupport::customData() { QScopedPointer<QQuickView> view(new QQuickView); @@ -599,6 +661,107 @@ void tst_qquickdesignersupport::testComponentOnCompleteSignal() } +void tst_qquickdesignersupport::testSimpleBindings() +{ + QScopedPointer<QQuickView> view(new QQuickView); + view->engine()->setOutputWarningsToStandardError(false); + view->setSource(testFileUrl("bindingTest.qml")); + + QVERIFY(view->errors().isEmpty()); + QQuickItem *rootItem = view->rootObject(); + QVERIFY(rootItem); + + QQuickItem *text = findItem<QQuickItem>(rootItem, QLatin1String("text")); + QVERIFY(text); + + QQuickItem *item = findItem<QQuickItem>(rootItem, QLatin1String("item")); + QVERIFY(item); + + QQuickDesignerSupportProperties::registerNodeInstanceMetaObject(item, view->engine()); + QQuickDesignerSupportProperties::registerNodeInstanceMetaObject(text, view->engine()); + + QQuickDesignerSupportProperties::registerCustomData(item); + QQuickDesignerSupportProperties::registerCustomData(text); + + QVERIFY(QQuickDesignerSupportProperties::hasBindingForProperty(text, + QQmlEngine::contextForObject(text), + "text", + nullptr)); + + QQuickDesignerSupportProperties::doResetProperty(text, QQmlEngine::contextForObject(text), "text"); + + + QQuickDesignerSupportProperties::setPropertyBinding(text, + QQmlEngine::contextForObject(text), + "text", + "qsTr(\"someText\")"); + + QVERIFY(QQuickDesignerSupportProperties::hasBindingForProperty(text, + QQmlEngine::contextForObject(text), + "text", + nullptr)); +} + +void tst_qquickdesignersupport::testDotProperties() +{ + QScopedPointer<QQuickView> view(new QQuickView); + view->engine()->setOutputWarningsToStandardError(false); + view->setSource(testFileUrl("bindingTest.qml")); + + QVERIFY(view->errors().isEmpty()); + QQuickItem *rootItem = view->rootObject(); + QVERIFY(rootItem); + + QQuickItem *text = findItem<QQuickItem>(rootItem, QLatin1String("text")); + QVERIFY(text); + + QQuickItem *item = findItem<QQuickItem>(rootItem, QLatin1String("item")); + QVERIFY(item); + + QQuickDesignerSupportProperties::registerNodeInstanceMetaObject(item, view->engine()); + QQuickDesignerSupportProperties::registerNodeInstanceMetaObject(text, view->engine()); + + QQuickDesignerSupportProperties::registerCustomData(item); + QQuickDesignerSupportProperties::registerCustomData(text); + + QCOMPARE(text->property("font.bold").value<QColor>(), QColor("true")); + QCOMPARE(text->property("font.italic").value<QColor>(), QColor("false")); + QCOMPARE(text->property("font.underline").value<QColor>(), QColor("false")); + + QQmlProperty property(text, "font.capitalization"); +} + +void tst_qquickdesignersupport::testItemReparenting() +{ + + QScopedPointer<QQuickView> view(new QQuickView); + view->engine()->setOutputWarningsToStandardError(false); + view->setSource(testFileUrl("bindingTest.qml")); + + QVERIFY(view->errors().isEmpty()); + QQuickItem *rootItem = view->rootObject(); + QVERIFY(rootItem); + + QQuickItem *text = findItem<QQuickItem>(rootItem, QLatin1String("text")); + QVERIFY(text); + + QQuickItem *item = findItem<QQuickItem>(rootItem, QLatin1String("item")); + QVERIFY(item); + + QQuickDesignerSupportProperties::registerNodeInstanceMetaObject(item, view->engine()); + QQuickDesignerSupportProperties::registerNodeInstanceMetaObject(text, view->engine()); + + QQuickDesignerSupportProperties::registerCustomData(item); + QQuickDesignerSupportProperties::registerCustomData(text); + + + QCOMPARE(text->parentItem(), rootItem); + QQmlProperty childrenProperty(rootItem, "children"); + removeObjectFromList(childrenProperty, text, view->engine()); + addToNewProperty(text, item, "children"); + QCOMPARE(text->parentItem(), item); +} + QTEST_MAIN(tst_qquickdesignersupport) #include "tst_qquickdesignersupport.moc" |