aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorUnai IRIGOYEN <u.irigoyen@gmail.com>2019-11-04 21:45:29 +0100
committerUlf Hermann <ulf.hermann@qt.io>2020-08-22 22:44:32 +0200
commit1876bd4215ccf5bbaa6f571177db889ba4bc8eff (patch)
treec0f6305b305119d7c509f1ef4cee908f62b689f3 /tests
parent3d195d33ece3f8fd7cd7d8e6163fe038fc7fc036 (diff)
Add override behaviors to QQmlListProperty
[ChangeLog][QQmlListProperty] When overriding a QQmlListProperty in a derived QML type, the default behavior is to append the derived class elements to the base class ones. This introduces a macro to allow replacing the base type contents either always or if the property is not the default one. Fixes: QTBUG-77529 Change-Id: Ib1abbf52e341c043344c347c612928b47856fb3e Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysAppendBaseContainer.qml5
-rw-r--r--tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysAppendOverridenContainer.qml5
-rw-r--r--tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysReplaceBaseContainer.qml5
-rw-r--r--tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysReplaceOverridenContainer.qml5
-rw-r--r--tests/auto/qml/qqmlproperty/data/ListOverrideReplaceIfNotDefaultBaseContainer.qml6
-rw-r--r--tests/auto/qml/qqmlproperty/data/ListOverrideReplaceIfNotDefaultOverridenContainer.qml6
-rw-r--r--tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp59
7 files changed, 90 insertions, 1 deletions
diff --git a/tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysAppendBaseContainer.qml b/tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysAppendBaseContainer.qml
new file mode 100644
index 0000000000..36f2b4ee85
--- /dev/null
+++ b/tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysAppendBaseContainer.qml
@@ -0,0 +1,5 @@
+import Test 1.0
+
+MyContainer {
+ children: [MyQmlObject {}, MyQmlObject {}, MyQmlObject {}]
+}
diff --git a/tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysAppendOverridenContainer.qml b/tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysAppendOverridenContainer.qml
new file mode 100644
index 0000000000..1c5bd5ea54
--- /dev/null
+++ b/tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysAppendOverridenContainer.qml
@@ -0,0 +1,5 @@
+import Test 1.0
+
+ListOverrideAlwaysAppendBaseContainer {
+ children: [MyQmlObject {}, MyQmlObject {}]
+}
diff --git a/tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysReplaceBaseContainer.qml b/tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysReplaceBaseContainer.qml
new file mode 100644
index 0000000000..02085762e6
--- /dev/null
+++ b/tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysReplaceBaseContainer.qml
@@ -0,0 +1,5 @@
+import Test 1.0
+
+MyAlwaysReplaceBehaviorContainer {
+ children: [MyQmlObject {}, MyQmlObject {}, MyQmlObject {}]
+}
diff --git a/tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysReplaceOverridenContainer.qml b/tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysReplaceOverridenContainer.qml
new file mode 100644
index 0000000000..3d4ac36a3c
--- /dev/null
+++ b/tests/auto/qml/qqmlproperty/data/ListOverrideAlwaysReplaceOverridenContainer.qml
@@ -0,0 +1,5 @@
+import Test 1.0
+
+ListOverrideAlwaysReplaceBaseContainer {
+ children: [MyQmlObject {}, MyQmlObject {}]
+}
diff --git a/tests/auto/qml/qqmlproperty/data/ListOverrideReplaceIfNotDefaultBaseContainer.qml b/tests/auto/qml/qqmlproperty/data/ListOverrideReplaceIfNotDefaultBaseContainer.qml
new file mode 100644
index 0000000000..fda1677531
--- /dev/null
+++ b/tests/auto/qml/qqmlproperty/data/ListOverrideReplaceIfNotDefaultBaseContainer.qml
@@ -0,0 +1,6 @@
+import Test 1.0
+
+MyReplaceIfNotDefaultBehaviorContainer {
+ children: [MyQmlObject {}, MyQmlObject {}, MyQmlObject {}]
+ defaultList: [MyQmlObject {}, MyQmlObject {}, MyQmlObject {}]
+}
diff --git a/tests/auto/qml/qqmlproperty/data/ListOverrideReplaceIfNotDefaultOverridenContainer.qml b/tests/auto/qml/qqmlproperty/data/ListOverrideReplaceIfNotDefaultOverridenContainer.qml
new file mode 100644
index 0000000000..7d16378774
--- /dev/null
+++ b/tests/auto/qml/qqmlproperty/data/ListOverrideReplaceIfNotDefaultOverridenContainer.qml
@@ -0,0 +1,6 @@
+import Test 1.0
+
+ListOverrideReplaceIfNotDefaultBaseContainer {
+ children: [MyQmlObject {}, MyQmlObject {}]
+ defaultList: [MyQmlObject {}, MyQmlObject {}]
+}
diff --git a/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp b/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp
index adaba5ccfd..4523cd029e 100644
--- a/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp
+++ b/tests/auto/qml/qqmlproperty/tst_qqmlproperty.cpp
@@ -90,10 +90,11 @@ class MyContainer : public QObject
{
Q_OBJECT
Q_PROPERTY(QQmlListProperty<MyQmlObject> children READ children)
+
public:
MyContainer() {}
- QQmlListProperty<MyQmlObject> children() { return QQmlListProperty<MyQmlObject>(this, m_children); }
+ QQmlListProperty<MyQmlObject> children() { return QQmlListProperty<MyQmlObject>(this, &m_children); }
static MyAttached *qmlAttachedProperties(QObject *o) {
return new MyAttached(o);
@@ -106,6 +107,35 @@ private:
QML_DECLARE_TYPE(MyContainer);
QML_DECLARE_TYPEINFO(MyContainer, QML_HAS_ATTACHED_PROPERTIES)
+class MyReplaceIfNotDefaultBehaviorContainer : public MyContainer
+{
+ Q_OBJECT
+ Q_PROPERTY(QQmlListProperty<MyQmlObject> defaultList READ defaultList)
+
+ QML_LIST_PROPERTY_ASSIGN_BEHAVIOR_REPLACE_IF_NOT_DEFAULT
+ Q_CLASSINFO("DefaultProperty", "defaultList")
+public:
+ MyReplaceIfNotDefaultBehaviorContainer() {}
+
+ QQmlListProperty<MyQmlObject> defaultList() { return QQmlListProperty<MyQmlObject>(this, &m_defaultList); }
+
+private:
+ QList<MyQmlObject*> m_defaultList;
+};
+
+QML_DECLARE_TYPE(MyReplaceIfNotDefaultBehaviorContainer);
+
+class MyAlwaysReplaceBehaviorContainer : public MyContainer
+{
+ Q_OBJECT
+
+ QML_LIST_PROPERTY_ASSIGN_BEHAVIOR_REPLACE
+public:
+ MyAlwaysReplaceBehaviorContainer() {}
+};
+
+QML_DECLARE_TYPE(MyAlwaysReplaceBehaviorContainer);
+
class tst_qqmlproperty : public QQmlDataTest
{
Q_OBJECT
@@ -131,6 +161,7 @@ private slots:
// Functionality
void writeObjectToList();
void writeListToList();
+ void listOverrideBehavior();
//writeToReadOnly();
@@ -1663,6 +1694,30 @@ void tst_qqmlproperty::writeListToList()
QCOMPARE(container->children()->size(), 1);*/
}
+void tst_qqmlproperty::listOverrideBehavior()
+{
+ QQmlComponent alwaysAppendContainerComponent(&engine, testFileUrl("ListOverrideAlwaysAppendOverridenContainer.qml"));
+ QScopedPointer<QObject> alwaysAppendObject(alwaysAppendContainerComponent.create());
+ MyContainer *alwaysAppendContainer = qobject_cast<MyContainer*>(alwaysAppendObject.data());
+ QVERIFY(alwaysAppendContainer != nullptr);
+ QQmlListReference alwaysAppendChildrenList(alwaysAppendContainer, "children");
+ QCOMPARE(alwaysAppendChildrenList.count(), 5);
+ QQmlComponent replaceIfNotDefaultContainerComponent(&engine, testFileUrl("ListOverrideReplaceIfNotDefaultOverridenContainer.qml"));
+ QScopedPointer<QObject> replaceIfNotDefaultObject(replaceIfNotDefaultContainerComponent.create());
+ MyReplaceIfNotDefaultBehaviorContainer *replaceIfNotDefaultContainer = qobject_cast<MyReplaceIfNotDefaultBehaviorContainer*>(replaceIfNotDefaultObject.data());
+ QVERIFY(replaceIfNotDefaultContainer != nullptr);
+ QQmlListReference replaceIfNotDefaultDefaultList(replaceIfNotDefaultContainer, "defaultList");
+ QCOMPARE(replaceIfNotDefaultDefaultList.count(), 5);
+ QQmlListReference replaceIfNotDefaultChildrenList(replaceIfNotDefaultContainer, "children");
+ QCOMPARE(replaceIfNotDefaultChildrenList.count(), 2);
+ QQmlComponent alwaysReplaceContainerComponent(&engine, testFileUrl("ListOverrideAlwaysReplaceOverridenContainer.qml"));
+ QScopedPointer<QObject> alwaysReplaceObject(alwaysReplaceContainerComponent.create());
+ MyContainer *alwaysReplaceContainer = qobject_cast<MyContainer*>(alwaysReplaceObject.data());
+ QVERIFY(alwaysReplaceContainer != nullptr);
+ QQmlListReference alwaysReplaceChildrenList(alwaysReplaceContainer, "children");
+ QCOMPARE(alwaysReplaceChildrenList.count(), 2);
+}
+
void tst_qqmlproperty::urlHandling_data()
{
QTest::addColumn<QByteArray>("input");
@@ -2158,6 +2213,8 @@ void tst_qqmlproperty::initTestCase()
qmlRegisterType<MyQmlObject>("Test",1,0,"MyQmlObject");
qmlRegisterType<PropertyObject>("Test",1,0,"PropertyObject");
qmlRegisterType<MyContainer>("Test",1,0,"MyContainer");
+ qmlRegisterType<MyReplaceIfNotDefaultBehaviorContainer>("Test",1,0,"MyReplaceIfNotDefaultBehaviorContainer");
+ qmlRegisterType<MyAlwaysReplaceBehaviorContainer>("Test",1,0,"MyAlwaysReplaceBehaviorContainer");
}
// QTBUG-60908