aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/qml/qmlcppcodegen
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2025-01-22 10:59:36 +0100
committerUlf Hermann <ulf.hermann@qt.io>2025-01-24 20:30:23 +0100
commit3108c58b97074b68ba48f452955727c67c4f77bc (patch)
tree34a367b34b83897698915f6582fe8f732a15a29f /tests/auto/qml/qmlcppcodegen
parent99052f73d7a1d4e36af07bf26472c3785e9f2fdb (diff)
QtQml: Add conversion code for QQmlListProperty to other lists
We have the same conversion code already for lists of value types and JavaScript arrays. Specialize the common cases of QObjectList and QQmlListProperty<QObject>. Pick-to: 6.9 6.8 Fixes: QTBUG-133047 Change-Id: I10826d4a965e18471a486e19befef961ec9a4a6e Reviewed-by: Olivier De Cannière <olivier.decanniere@qt.io>
Diffstat (limited to 'tests/auto/qml/qmlcppcodegen')
-rw-r--r--tests/auto/qml/qmlcppcodegen/CMakeLists.txt2
-rw-r--r--tests/auto/qml/qmlcppcodegen/data/listConversion.qml19
-rw-r--r--tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp60
3 files changed, 74 insertions, 7 deletions
diff --git a/tests/auto/qml/qmlcppcodegen/CMakeLists.txt b/tests/auto/qml/qmlcppcodegen/CMakeLists.txt
index d2e248ec8a..48a89a409c 100644
--- a/tests/auto/qml/qmlcppcodegen/CMakeLists.txt
+++ b/tests/auto/qml/qmlcppcodegen/CMakeLists.txt
@@ -15,6 +15,7 @@ qt_internal_add_test(tst_qmlcppcodegen
LIBRARIES
Qt::Qml
Qt::QmlPrivate
+ Qt::QmlMetaPrivate
Qt::GuiPrivate
codegen_test_module
codegen_test_moduleplugin
@@ -34,6 +35,7 @@ qt_internal_add_test(tst_qmlcppcodegen_interpreted
LIBRARIES
Qt::Qml
Qt::QmlPrivate
+ Qt::QmlMetaPrivate
Qt::GuiPrivate
codegen_test_module
codegen_test_moduleplugin
diff --git a/tests/auto/qml/qmlcppcodegen/data/listConversion.qml b/tests/auto/qml/qmlcppcodegen/data/listConversion.qml
index ca86d9a1d6..8920658f86 100644
--- a/tests/auto/qml/qmlcppcodegen/data/listConversion.qml
+++ b/tests/auto/qml/qmlcppcodegen/data/listConversion.qml
@@ -14,4 +14,23 @@ BirthdayParty {
property list<QtObject> o: self.guests
property list<string> s: self.guestNames
property list<var> v: self.stuffs
+
+ component DataSource : QtObject {
+ property list<int> numbers: [1, 2]
+ property list<QtObject> objects: [
+ QtObject { objectName: "a" },
+ QtObject { objectName: "b" }
+ ]
+ property list<Binding> bindings: [
+ Binding { objectName: "c" },
+ Binding { objectName: "d" }
+ ]
+ }
+
+ property DataSource src: DataSource {}
+ property list<int> numbers: src.numbers
+ property list<QtObject> objects: src.objects
+ property list<Binding> bindings: src.bindings
+ property list<QtObject> objectsFromBindings: src.bindings
+ property list<Binding> nulls: src.objects
}
diff --git a/tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp b/tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp
index 4217206307..673155119b 100644
--- a/tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp
+++ b/tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp
@@ -15,12 +15,15 @@
#include <data/weathermoduleurl.h>
#include <data/withlength.h>
-#include <QtQml/private/qqmlengine_p.h>
-#include <QtQml/private/qqmlpropertycachecreator_p.h>
+#include <private/qqmlbind_p.h>
+#include <private/qqmlengine_p.h>
+#include <private/qqmlpropertycachecreator_p.h>
+
+#include <QtTest/qsignalspy.h>
+#include <QtTest/qtest.h>
-#include <QtTest>
-#include <QtQml>
#include <QtGui/qcolor.h>
+#include <QtGui/qfont.h>
#include <QtGui/qpa/qplatformdialoghelper.h>
#if QT_CONFIG(process)
@@ -3154,9 +3157,19 @@ void tst_QmlCppCodegen::listAsArgument()
void tst_QmlCppCodegen::listConversion()
{
QQmlEngine e;
- QQmlComponent c(&e, QUrl(u"qrc:/qt/qml/TestTypes/listConversion.qml"_s));
- QVERIFY2(c.isReady(), qPrintable(c.errorString()));
- QScopedPointer<QObject> o(c.create());
+ QQmlComponent component(&e, QUrl(u"qrc:/qt/qml/TestTypes/listConversion.qml"_s));
+ QVERIFY2(component.isReady(), qPrintable(component.errorString()));
+
+ QTest::ignoreMessage(
+ QtWarningMsg,
+ QRegularExpression(u"Cannot append QObject\\(0x[0-9a-f]+, name = \"a\"\\) "
+ "to a QML list of QQmlBind\\*"_s));
+ QTest::ignoreMessage(
+ QtWarningMsg,
+ QRegularExpression(u"Cannot append QObject\\(0x[0-9a-f]+, name = \"b\"\\) "
+ "to a QML list of QQmlBind\\*"_s));
+
+ QScopedPointer<QObject> o(component.create());
QVERIFY(!o.isNull());
QQmlListProperty<QObject> list = o->property("o").value<QQmlListProperty<QObject>>();
@@ -3177,6 +3190,39 @@ void tst_QmlCppCodegen::listConversion()
QVariant::fromValue<qsizetype>(3),
QVariant::fromValue<Person *>(nullptr)
}));
+
+ QCOMPARE(o->property("numbers").value<QList<int>>(), (QList<int>{1, 2}));
+ auto objects = o->property("objects").value<QQmlListProperty<QObject>>();
+ QCOMPARE(objects.count(&objects), 2);
+
+ const QObject *a = objects.at(&objects, 0);
+ QVERIFY(a);
+ QCOMPARE(a->objectName(), u"a"_s);
+
+ const QObject *b = objects.at(&objects, 1);
+ QVERIFY(b);
+ QCOMPARE(b->objectName(), u"b"_s);
+
+ auto bindings = o->property("bindings").value<QQmlListProperty<QQmlBind>>();
+ QCOMPARE(bindings.count(&bindings), 2);
+
+ const QQmlBind *c = bindings.at(&bindings, 0);
+ QVERIFY(c);
+ QCOMPARE(c->objectName(), u"c"_s);
+
+ const QQmlBind *d = bindings.at(&bindings, 1);
+ QVERIFY(d);
+ QCOMPARE(d->objectName(), u"d"_s);
+
+ auto objectsFromBindings = o->property("objectsFromBindings").value<QQmlListProperty<QObject>>();
+ QCOMPARE(objectsFromBindings.count(&objectsFromBindings), 2);
+ QCOMPARE(objectsFromBindings.at(&objectsFromBindings, 0), c);
+ QCOMPARE(objectsFromBindings.at(&objectsFromBindings, 1), d);
+
+ auto nulls = o->property("nulls").value<QQmlListProperty<QQmlBind>>();
+ QCOMPARE(nulls.count(&nulls), 2);
+ QCOMPARE(nulls.at(&nulls, 0), nullptr);
+ QCOMPARE(nulls.at(&nulls, 1), nullptr);
}
void tst_QmlCppCodegen::listIndices()