From 25c5ace02747753c524960abbf6fb81de1d11c6d Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Mon, 9 Nov 2020 18:49:23 +0100 Subject: DesignerSupport: Add more tests for QQuickDesignerSupport This patch adds a few more test cases. Change-Id: Ia2c4e016db57ef9cc6fccc1d4cfba6154068a5ff Reviewed-by: Fabian Kosmale --- .../qquickdesignersupport/data/bindingTest.qml | 20 +++ .../qquickdesignersupport.pro | 3 +- .../tst_qquickdesignersupport.cpp | 163 +++++++++++++++++++++ 3 files changed, 185 insertions(+), 1 deletion(-) create mode 100644 tests/auto/quick/qquickdesignersupport/data/bindingTest.qml (limited to 'tests') 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(property.read()); + list.append(object); + } else if (isObject(property)) { + property.write(objectToVariant(object)); + + if (QQuickItem *item = qobject_cast(object)) + if (QQuickItem *newParentItem = qobject_cast(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 view(new QQuickView); @@ -599,6 +661,107 @@ void tst_qquickdesignersupport::testComponentOnCompleteSignal() } +void tst_qquickdesignersupport::testSimpleBindings() +{ + QScopedPointer 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(rootItem, QLatin1String("text")); + QVERIFY(text); + + QQuickItem *item = findItem(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 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(rootItem, QLatin1String("text")); + QVERIFY(text); + + QQuickItem *item = findItem(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("true")); + QCOMPARE(text->property("font.italic").value(), QColor("false")); + QCOMPARE(text->property("font.underline").value(), QColor("false")); + + QQmlProperty property(text, "font.capitalization"); +} + +void tst_qquickdesignersupport::testItemReparenting() +{ + + QScopedPointer 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(rootItem, QLatin1String("text")); + QVERIFY(text); + + QQuickItem *item = findItem(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" -- cgit v1.2.3