diff options
Diffstat (limited to 'tests/auto/core/nodes/tst_nodes.cpp')
-rw-r--r-- | tests/auto/core/nodes/tst_nodes.cpp | 116 |
1 files changed, 87 insertions, 29 deletions
diff --git a/tests/auto/core/nodes/tst_nodes.cpp b/tests/auto/core/nodes/tst_nodes.cpp index d65e20708..c39638754 100644 --- a/tests/auto/core/nodes/tst_nodes.cpp +++ b/tests/auto/core/nodes/tst_nodes.cpp @@ -26,6 +26,10 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED + #include <QtTest/QTest> #include <Qt3DCore/qnode.h> #include <Qt3DCore/qentity.h> @@ -40,6 +44,7 @@ #include <Qt3DCore/qpropertynoderemovedchange.h> #include <Qt3DCore/private/qnodecreatedchangegenerator_p.h> #include <Qt3DCore/private/qaspectengine_p.h> +#include <Qt3DCore/private/qaspectengine_p.h> #include <private/qabstractaspect_p.h> #include <private/qpostman_p.h> @@ -92,6 +97,7 @@ private slots: void checkConstructionWithNonRootParent(); // QTBUG-73986 void checkConstructionAsListElement(); void checkSceneIsSetOnConstructionWithParent(); // QTBUG-69352 + void checkSubNodePostConstructIsCalledWhenReferincingNodeProperty(); // QTBUG-79350 void appendingComponentToEntity(); void appendingParentlessComponentToEntityWithoutScene(); @@ -290,22 +296,15 @@ public slots: if (!attribute->parent()) attribute->setParent(this); - if (d->m_changeArbiter != nullptr) { - const auto change = Qt3DCore::QPropertyNodeAddedChangePtr::create(id(), attribute); - change->setPropertyName("attribute"); - d->notifyObservers(change); - } + d->updateNode(attribute, "attribute", Qt3DCore::PropertyValueAdded); } } void removeAttribute(MyQNode *attribute) { Qt3DCore::QNodePrivate *d = Qt3DCore::QNodePrivate::get(this); - if (d->m_changeArbiter != nullptr) { - const auto change = Qt3DCore::QPropertyNodeRemovedChangePtr::create(id(), attribute); - change->setPropertyName("attribute"); - d->notifyObservers(change); - } + d->updateNode(attribute, "attribute", Qt3DCore::PropertyValueRemoved); + m_attributes.removeOne(attribute); // Remove bookkeeping connection d->unregisterDestructionHelper(attribute); @@ -384,11 +383,7 @@ public: if (!attribute->parent()) attribute->setParent(this); - if (d->m_changeArbiter != nullptr) { - const auto change = Qt3DCore::QPropertyNodeAddedChangePtr::create(id(), attribute); - change->setPropertyName("attribute"); - d->notifyObservers(change); - } + d->updateNode(attribute, "attribute", Qt3DCore::PropertyValueRemoved); } } @@ -435,6 +430,29 @@ public: } }; +class MyFakeMaterial : public Qt3DCore::QComponent +{ + Q_OBJECT +public: + explicit MyFakeMaterial(Qt3DCore::QNode *parent = nullptr) + : QComponent(parent) + , m_effect(new MyQNode(this)) + , m_technique(new MyQNode(m_effect)) + , m_renderPass(new MyQNode(m_technique)) + { + } + + void setArbiter(Qt3DCore::QAbstractArbiter *arbiter) + { + Q_ASSERT(arbiter); + Qt3DCore::QComponentPrivate::get(this)->setArbiter(arbiter); + } + + MyQNode *m_effect; + MyQNode *m_technique; + MyQNode *m_renderPass; +}; + class TestAspectPrivate; class TestAspect : public Qt3DCore::QAbstractAspect { @@ -928,6 +946,7 @@ void tst_Nodes::checkParentChangeFromExistingBackendParentToNewlyCreatedParent() // GIVEN ObserverSpy spy; Qt3DCore::QAspectEngine engine; + engine.setRunMode(Qt3DCore::QAspectEngine::Manual); QScopedPointer<MyQEntity> root(new MyQEntity()); root->setArbiterAndEngine(&spy, &engine); auto aspect = new TestAspect; @@ -937,6 +956,7 @@ void tst_Nodes::checkParentChangeFromExistingBackendParentToNewlyCreatedParent() MyQNode *child2(new MyQNode(root.data())); QCoreApplication::processEvents(); + engine.processFrame(); // Due to the way we create root, it has a backend QVERIFY(Qt3DCore::QNodePrivate::get(root.data())->m_hasBackendNode == true); @@ -967,6 +987,7 @@ void tst_Nodes::checkParentChangeFromExistingBackendParentToNewlyCreatedParent() // WHEN QCoreApplication::processEvents(); + engine.processFrame(); // THEN QCOMPARE(spy.events.size(), 2); @@ -1043,6 +1064,7 @@ void tst_Nodes::checkParentChangeFromExistingBackendParentToNewlyCreatedParent() // WHEN QCoreApplication::processEvents(); + engine.processFrame(); // THEN QCOMPARE(spy.events.size(), 2); @@ -1221,6 +1243,7 @@ void tst_Nodes::checkAllBackendCreationDoneInSingleFrame() // GIVEN ObserverSpy spy; Qt3DCore::QAspectEngine engine; + engine.setRunMode(Qt3DCore::QAspectEngine::Manual); auto aspect = new TestAspect; engine.registerAspect(aspect); @@ -1253,6 +1276,7 @@ void tst_Nodes::checkAllBackendCreationDoneInSingleFrame() // WHEN QCoreApplication::processEvents(); + engine.processFrame(); // THEN - both children have their backend nodes actually created. QCOMPARE(aspect->events.count(), 2); @@ -1544,20 +1568,8 @@ void tst_Nodes::checkConstructionAsListElement() QCoreApplication::processEvents(); QCOMPARE(root->children().count(), 1); - QCOMPARE(spy.events.size(), 2); // 1 child added change, 1 property change - - const auto newChildEvent = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QPropertyNodeAddedChange>(); - QVERIFY(!newChildEvent.isNull()); - QCOMPARE(newChildEvent->subjectId(), root->id()); - QCOMPARE(newChildEvent->propertyName(), "children"); - QCOMPARE(newChildEvent->addedNodeId(), node->id()); - - // Ensure second and last event is property set change - const auto propertyEvent = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QPropertyNodeAddedChange>(); - QVERIFY(!propertyEvent.isNull()); - QCOMPARE(propertyEvent->subjectId(), root->id()); - QCOMPARE(propertyEvent->propertyName(), "attribute"); - QCOMPARE(newChildEvent->addedNodeId(), node->id()); + QCOMPARE(spy.dirtyNodes.size(), 1); // 1 property change + QCOMPARE(spy.dirtySubNodes.size(), 1); // 1 child added change } void tst_Nodes::checkSceneIsSetOnConstructionWithParent() @@ -1606,6 +1618,52 @@ void tst_Nodes::checkSceneIsSetOnConstructionWithParent() QCOMPARE(spy.dirtySubNodes.size(), 5); // 5 entities changed } +void tst_Nodes::checkSubNodePostConstructIsCalledWhenReferincingNodeProperty() +{ + // GIVEN + ObserverSpy spy; + Qt3DCore::QAspectEngine engine; + Qt3DCore::QScene scene(&engine); + QScopedPointer<MyQNode> root(new MyQNode()); + + // WHEN + root->setArbiterAndScene(&spy, &scene); + root->setSimulateBackendCreated(true); + + // THEN + QVERIFY(Qt3DCore::QNodePrivate::get(root.data())->scene() != nullptr); + + // WHEN + Qt3DCore::QEntity *subTreeRoot = new Qt3DCore::QEntity(root.data()); + QCoreApplication::processEvents(); + + // THEN + QVERIFY(Qt3DCore::QNodePrivate::get(subTreeRoot)->m_hasBackendNode); + + // WHEN + MyFakeMaterial *material = new MyFakeMaterial(subTreeRoot); + subTreeRoot->addComponent(material); + + // THEN + QVERIFY(Qt3DCore::QNodePrivate::get(material)->m_hasBackendNode); + QVERIFY(Qt3DCore::QNodePrivate::get(material->m_effect)->m_hasBackendNode); + QVERIFY(Qt3DCore::QNodePrivate::get(material->m_technique)->m_hasBackendNode); + QVERIFY(Qt3DCore::QNodePrivate::get(material->m_renderPass)->m_hasBackendNode); + + // WHEN + MyQNode *fakeRenderState = new MyQNode(material); + Qt3DCore::QNodePrivate *dPtr = Qt3DCore::QNodePrivate::get(fakeRenderState); + + // THEN + QVERIFY(!dPtr->m_hasBackendNode); + + // WHEN + material->m_renderPass->addAttribute(fakeRenderState); + + // THEN + QVERIFY(dPtr->m_hasBackendNode); +} + void tst_Nodes::appendingParentlessComponentToEntityWithoutScene() { // GIVEN |