aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorThomas Hartmann <thomas.hartmann@qt.io>2020-11-09 18:49:23 +0100
committerThomas Hartmann <thomas.hartmann@qt.io>2020-11-11 11:46:08 +0100
commit25c5ace02747753c524960abbf6fb81de1d11c6d (patch)
tree2c470ac88db0b899cbcacfbe2da45a393d53b482 /tests
parentf0908255c9921371d886eff0b8ce245929b50d88 (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')
-rw-r--r--tests/auto/quick/qquickdesignersupport/data/bindingTest.qml20
-rw-r--r--tests/auto/quick/qquickdesignersupport/qquickdesignersupport.pro3
-rw-r--r--tests/auto/quick/qquickdesignersupport/tst_qquickdesignersupport.cpp163
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"