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:
parent
0d3f0b581c
commit
f0e5ff83a1
|
@ -0,0 +1,6 @@
|
|||
import Qt.test 1.0
|
||||
|
||||
DeferredByParentChild {
|
||||
id: root
|
||||
childValue: 10
|
||||
}
|
|
@ -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");
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue