tst_qqmlecmascript: Check that parent can defer child class properties

It is arguably a bad idea to defer properties which might get defined in
child classes, but checking it in the engine would be expensive: We
cannot simply check that the property exist, as we might want to defer
attached properties.
So for now, we add a test to document and verify the behavior.

Change-Id: I264b136638c4ecddfa52b6687797cb981d9b531e
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
This commit is contained in:
Fabian Kosmale 2021-08-25 14:16:29 +02:00
parent 0d3f0b581c
commit f0e5ff83a1
4 changed files with 48 additions and 0 deletions

View File

@ -0,0 +1,6 @@
import Qt.test 1.0
DeferredByParentChild {
id: root
childValue: 10
}

View File

@ -469,6 +469,7 @@ void registerTypes()
qmlRegisterSingletonType<TestTypeCppSingleton>("Test", 1, 0, "TestTypeCppSingleton", testTypeCppProvider);
qmlRegisterType<MyDeferredObject>("Qt.test", 1,0, "MyDeferredObject");
qmlRegisterType<DeferredChild>("Qt.test", 1,0, "DeferredChild");
qmlRegisterType<DeferredByParentChild>("Qt.test", 1,0, "DeferredByParentChild");
qmlRegisterType<MyVeryDeferredObject>("Qt.test", 1,0, "MyVeryDeferredObject");
qmlRegisterType<MyQmlContainer>("Qt.test", 1,0, "MyQmlContainer");
qmlRegisterExtendedType<MyBaseExtendedObject, BaseExtensionObject>("Qt.test", 1,0, "MyBaseExtendedObject");

View File

@ -435,6 +435,32 @@ class DeferredChild : public NonDeferredBased
Q_CLASSINFO("DeferredPropertyNames", "baseValue")
};
class ChildDeferringParent : public QObject
{
Q_OBJECT
Q_CLASSINFO("DeferredPropertyNames", "childValue")
};
class DeferredByParentChild : public ChildDeferringParent
{
Q_OBJECT
Q_PROPERTY(int childValue READ childValue WRITE setchildValue NOTIFY childValueChanged)
signals:
void childValueChanged();
public:
int childValue() const { return m_childValue; }
void setchildValue(int i) {
if (i == m_childValue)
return;
m_childValue = i;
emit childValueChanged();
}
private:
int m_childValue = 0;
};
class MyVeryDeferredObject : public QObject
{
Q_OBJECT

View File

@ -101,6 +101,7 @@ private slots:
void dependenciesWithFunctions();
void deferredProperties();
void deferredPropertiesParent();
void deferredPropertiesByParent();
void deferredPropertiesErrors();
void deferredPropertiesInComponents();
void deferredPropertiesInDestruction();
@ -1229,6 +1230,20 @@ void tst_qqmlecmascript::deferredPropertiesParent()
qmlExecuteDeferred(object);
QCOMPARE(object->baseValue(), 10);
}
void tst_qqmlecmascript::deferredPropertiesByParent()
{
QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("deferredPropertiesChild.qml"));
QScopedPointer<QObject> obj(component.create());
QVERIFY2(obj, qPrintable(component.errorString()));
DeferredByParentChild *object = qobject_cast<DeferredByParentChild *>(obj.data());
QVERIFY(object != nullptr);
QCOMPARE(object->childValue(), 0);
qmlExecuteDeferred(object);
QCOMPARE(object->childValue(), 10);
}
// Check errors on deferred properties are correctly emitted
void tst_qqmlecmascript::deferredPropertiesErrors()
{